码迷,mamicode.com
首页 > 数据库 > 详细

《sql必知必会》

时间:2015-05-28 00:40:06      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:

 

  1. 主键:
    1)任意两行都不具有相同的主键值:
    2)每个行都必须具有一个或多个主键值(主键列不允许NULL值)
    3)主键列中的值不允许修改或更新;
    4)主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)
  2. 在指定一条ORDER BY 子句里,应保证它是SELECT语句中最后一条子句。
  3. 按多个列排序:
    SELECT prod_id,prod_price,prod_name
    FROM Products
    ORDER BY prod_price, prod_name;
  4. 指定排序方向:
    数据库默认的排序方式为升序排序;
    为了进行降序排序,可以指定DESC关键字。
    SELECT prod_id, prod_price, prod_name
    FROM Products
    ORDER BY prod_price DESC;
    如果想在多个列上进行降序排序,必须对列指定DESC关键字。
  5. 拼接字段:
    Mysql用法:concat函数用于拼接,关键字AS赋予别名

    mysql> select concat ( vend_name, ‘(‘, vend_country, ‘)‘) as vend_title

      -> from Vendors

      -> order by vend_name;

      +--------------------------------+

      |             vend_title             |

      +--------------------------------+

      | Bear Emporium(USA)      |

      | Bears R Us(USA)            |

      | Doll House Inc.(USA)      |

      | Fun and Games(England) |

      | Furball Inc.(USA)            |

      | Jouets et ours(France)      |

      +--------------------------------+

      6 rows in set (0.00 sec)

  6. 执行算术运算
    mysql> select prod_id, quantity, item_price, quantity*item_price as expanded_price

      -> from OrderItems

      -> where order_num = 20008;

      +---------+----------+------------+----------------+

      | prod_id | quantity | item_price | expanded_price |

      +---------+----------+------------+----------------+

      | RGAN01  |        5 |       4.99 |          24.95 |

      | BR03    |        5 |      11.99 |          59.95 |

      | BNBG01  |       10 |       3.49 |          34.90 |

      | BNBG02  |       10 |       3.49 |          34.90 |

      | BNBG03  |       10 |       3.49 |          34.90 |

      +---------+----------+------------+----------------+

      5 rows in set (0.02 sec)

  7. 与SQL语句不一样,SQL函数是不可移植的。
  8. 聚集函数(aggregate function)  运行在行组上(行,或者记录)上,计算和返回单个值的函数。

    函数 说明
    AVG() 返回某列的平均值
    COUNT() 返回某列的行数
    MAX() 返回某列的最大值
    MIN() 返回某列的最小值
    SUM() 返回某列值之和
    注:表格里虽然某列某列,实质是作用于行上的,“对于该列的所有行的平均值,行数,最大值,最小值,和”
    mysql> SELECT prod_price

      -> FROM Products;

      +------------+

      | prod_price |

      +------------+

      |       5.99 |

      |       8.99 |

      |      11.99 |

      |       3.49 |

      |       3.49 |

      |       3.49 |

      |       4.99 |

      |       9.49 |

      |       9.49 |

      +------------+

      9 rows in set (0.00 sec)


      mysql> select avg(prod_price) as avg_price

      -> from Products;

      +-----------+

      | avg_price |

      +-----------+

      |  6.823333 |

      +-----------+

      1 row in set (0.00 sec)

    mysql> SELECT AVG(prod_price) AS avg_price

      -> from Products

      -> where vend_id = ‘DLL01‘;

      +-----------+

      | avg_price |

      +-----------+

      |  3.865000 |

      +-----------+

      1 row in set (0.00 sec)


      mysql> SELECT COUNT(*)

      -> FROM Products;

      +----------+

      | COUNT(*) |

      +----------+

      |        9 |

      +----------+

      1 row in set (0.00 sec)

    注:
    1)使用COUNT(*)对表中行的数目进行计数,不管列表中包含的是空值还是非空值。
    2)使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。

      mysql> SELECT COUNT(cust_email) AS num_cus

      -> FROM Customers;

      +---------+

      | num_cus |

      +---------+

      |       3 |

      +---------+

      1 row in set (0.02 sec)

      mysql> SELECT MAX(prod_price) AS max_price

      -> FROM Products;

      +-----------+

      | max_price |

      +-----------+

      |     11.99 |

      +-----------+

      1 row in set (0.00 sec)

    注:可以观察发现,聚集函数通过对所有行或者所有非空行或者符合where条件的所有(非空)行进行操作,结果集为只有一行数据。如果跟结果集为多行的查询一起,则会很怪异。如下:

    mysql> SELECT prod_name, MAX(prod_price) AS price

      -> FROM Products;

      +-------------------+-------+

      | prod_name         | price |

      +-------------------+-------+

      | 8 inch teddy bear | 11.99 |

      +-------------------+-------+

      1 row in set (0.00 sec)

      (注:上面的是错误的用法,具体对比看下面的全表,就能发现错误)

      mysql> SELECT prod_name, prod_price

      -> FROM Products;

      +---------------------+------------+

      | prod_name           | prod_price |

      +---------------------+------------+

      | 8 inch teddy bear   |       5.99 |

      | 12 inch teddy bear  |       8.99 |

      | 18 inch teddy bear  |      11.99 |

      | Fish bean bag toy   |       3.49 |

      | Bird bean bag toy   |       3.49 |

      | Rabbit bean bag toy |       3.49 |

      | Raggedy Ann         |       4.99 |

      | King doll           |       9.49 |

      | Queen doll          |       9.49 |

      +---------------------+------------+

      9 rows in set (0.01 sec)
    又一例子
    mysql> select vend_id, count(*) as num_prods

        -> from Products;
    +---------+-----------+
    | vend_id | num_prods |
    +---------+-----------+
    | BRS01   |         9 |
    +---------+-----------+
    1 row in set (0.00 sec)
    mysql> select vend_id
        -> from Products;
    +---------+
    | vend_id |
    +---------+
    | BRS01   |
    | BRS01   |
    | BRS01   |
    | DLL01   |
    | DLL01   |
    | DLL01   |
    | DLL01   |
    | FNG01   |
    | FNG01   |
    +---------+
    9 rows in set (0.00 sec)
    接上注又注:但是结果集同为一行的聚集函数作为查询则不会出错(即组合不同的聚集函数)
    技术分享
    接上注又再注:又一个错误的用法,集合==行?

    mysql> SELECT prod_name, prod_price

        -> FROM Products

        -> WHERE prod_price = MAX(prod_price);

    ERROR 1111 (HY000): Invalid use of group function

    mysql> SELECT prod_name, prod_price

        -> FROM Products

        -> WHERE MAX(prod_price);

    ERROR 1111 (HY000): Invalid use of group function

    WHY?

     

  9. 聚集不同值:
    对所有的行执行计算,指定ALL参数或不给参数(ALL为默认)
    只不含不同的值,指定DISTINCT参数
  10. 分组:

    mysql> SELECT cust_id, COUNT(cust_name) AS COUNT
        -> FROM Customers
        -> Where cust_name = ‘Fun4All‘;
    +------------+-------+
    | cust_id    | COUNT |
    +------------+-------+
    | 1000000003 |     2 |
    +------------+-------+
    1 row in set (0.01 sec)
    mysql> SELECT cust_id, COUNT(cust_name) AS count
        -> FROM Customers
        -> WHERE cust_name = ‘Fun4All‘
        -> GROUP BY cust_id;
    +------------+-------+
    | cust_id    | count |
    +------------+-------+
    | 1000000003 |     1 |
    | 1000000004 |     1 |
    +------------+-------+
    2 rows in set (0.01 sec)
    (注:GROUP BY对COUNT函数起到很重要的作用,COUNT根据GOUP BY的分组来计算)

     

  11. GROUP BY 子句指示DBMS分组数据,然后对每个组而不是整个结果集进行聚集。
  12. 过滤分组
    WHERE 过滤行,而HAVING过滤分组
    技术分享
  13. 使用HAVING和WHERE
    HAVING与WHERE非常类似,如果不指定GROUP BY,则大多数DBMS将把它们作为相同的东西对待。应该仅在GROUP BY 子句结合才使用HAVING,而WHERE子句用于标准的行级过滤。
  14. SELECT 子句顺序
    子句 说明 是否必须使用
    SELECT 要返回的列或表达式 是
    FROM 从中检索数据的表 仅在从表选择数据时使用
    WHERE 行级过滤 否
    GROUP BY 分组说明 仅在按组计算聚集时使用
    HAVING 组级过滤 否
    ORDER BY 输出排序顺序 否
    1. (SELECT COUNT(*)
  15. 作为计算字段使用子查询
    看一个经典段子,好好品味一下:
    SELECT cust_name,
    cust_state,
    (SELECT COUNT(*)
                     FROM Orders
                     WHERE Orders.cust_id = Customers.cust_id) AS
    orders 
    FROM Customers
    ORDER BY cust_name;
    结果:
    cust_name                           cust_state                   orders
    ------------------------------       ---------------                -----------
    Fun4All                               IN                               1
    Fun4All                               AZ                              1
    Kids Place                           OH                             0
    The Toy Store                     IL                               1
    Village Toys                        MI                              2
    该子查询对检索出的每个客户执行一次。在此例中,该子查询执行了5次,因为检索出了5个客户。
  16. 笛卡儿积(cartesian product)由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
    mysql> SELECT vend_name
        -> FROM Vendors;
    +-----------------+
    | vend_name       |
    +-----------------+
    | Bears R Us      |
    | Bear Emporium   |
    | Doll House Inc. |
    | Furball Inc.    |
    | Fun and Games   |
    | Jouets et ours  |
    +-----------------+
    6 rows in set (0.00 sec)
    mysql> SELECT prod_name
        -> FROM Products;
    +---------------------+
    | prod_name           |
    +---------------------+
    | 8 inch teddy bear   |
    | 12 inch teddy bear  |
    | 18 inch teddy bear  |
    | Fish bean bag toy   |
    | Bird bean bag toy   |
    | Rabbit bean bag toy |
    | Raggedy Ann         |
    | King doll           |
    | Queen doll          |
    +---------------------+
    9 rows in set (0.01 sec)
    mysql> SELECT vend_name, prod_name, prod_price
        -> FROM Vendors, Products;
    +-----------------+---------------------+------------+
    | vend_name       | prod_name           | prod_price |
    +-----------------+---------------------+------------+
    | Bears R Us      | 8 inch teddy bear   |       5.99 |
    | Bear Emporium   | 8 inch teddy bear   |       5.99 |
    | Doll House Inc. | 8 inch teddy bear   |       5.99 |
    | Furball Inc.    | 8 inch teddy bear   |       5.99 |
    | Fun and Games   | 8 inch teddy bear   |       5.99 |
    | Jouets et ours  | 8 inch teddy bear   |       5.99 |
    | Bears R Us      | 12 inch teddy bear  |       8.99 |
    | Bear Emporium   | 12 inch teddy bear  |       8.99 |
    | Doll House Inc. | 12 inch teddy bear  |       8.99 |
    | Furball Inc.    | 12 inch teddy bear  |       8.99 |
    | Fun and Games   | 12 inch teddy bear  |       8.99 |
    | Jouets et ours  | 12 inch teddy bear  |       8.99 |
    | Bears R Us      | 18 inch teddy bear  |      11.99 |
    | Bear Emporium   | 18 inch teddy bear  |      11.99 |
    | Doll House Inc. | 18 inch teddy bear  |      11.99 |
    | Furball Inc.    | 18 inch teddy bear  |      11.99 |
    | Fun and Games   | 18 inch teddy bear  |      11.99 |
    | Jouets et ours  | 18 inch teddy bear  |      11.99 |
    | Bears R Us      | Fish bean bag toy   |       3.49 |
    | Bear Emporium   | Fish bean bag toy   |       3.49 |
    | Doll House Inc. | Fish bean bag toy   |       3.49 |
    | Furball Inc.    | Fish bean bag toy   |       3.49 |
    | Fun and Games   | Fish bean bag toy   |       3.49 |
    | Jouets et ours  | Fish bean bag toy   |       3.49 |
    | Bears R Us      | Bird bean bag toy   |       3.49 |
    | Bear Emporium   | Bird bean bag toy   |       3.49 |
    | Doll House Inc. | Bird bean bag toy   |       3.49 |
    | Furball Inc.    | Bird bean bag toy   |       3.49 |
    | Fun and Games   | Bird bean bag toy   |       3.49 |
    | Jouets et ours  | Bird bean bag toy   |       3.49 |
    | Bears R Us      | Rabbit bean bag toy |       3.49 |
    | Bear Emporium   | Rabbit bean bag toy |       3.49 |
    | Doll House Inc. | Rabbit bean bag toy |       3.49 |
    | Furball Inc.    | Rabbit bean bag toy |       3.49 |
    | Fun and Games   | Rabbit bean bag toy |       3.49 |
    | Jouets et ours  | Rabbit bean bag toy |       3.49 |
    | Bears R Us      | Raggedy Ann         |       4.99 |
    | Bear Emporium   | Raggedy Ann         |       4.99 |
    | Doll House Inc. | Raggedy Ann         |       4.99 |
    | Furball Inc.    | Raggedy Ann         |       4.99 |
    | Fun and Games   | Raggedy Ann         |       4.99 |
    | Jouets et ours  | Raggedy Ann         |       4.99 |
    | Bears R Us      | King doll           |       9.49 |
    | Bear Emporium   | King doll           |       9.49 |
    | Doll House Inc. | King doll           |       9.49 |
    | Furball Inc.    | King doll           |       9.49 |
    | Fun and Games   | King doll           |       9.49 |
    | Jouets et ours  | King doll           |       9.49 |
    | Bears R Us      | Queen doll          |       9.49 |
    | Bear Emporium   | Queen doll          |       9.49 |
    | Doll House Inc. | Queen doll          |       9.49 |
    | Furball Inc.    | Queen doll          |       9.49 |
    | Fun and Games   | Queen doll          |       9.49 |
    | Jouets et ours  | Queen doll          |       9.49 |
    +-----------------+---------------------+------------+
    54 rows in set (0.01 sec)
     
     
    mysql> SELECT vend_name, Vendors.vend_id, Products.vend_id, prod_name
        -> FROM Vendors, Products
        -> WHERE Vendors.vend_id = Products.vend_id;
    +-----------------+---------+---------+---------------------+
    | vend_name       | vend_id | vend_id | prod_name           |
    +-----------------+---------+---------+---------------------+
    | Bears R Us      | BRS01   | BRS01   | 8 inch teddy bear   |
    | Bears R Us      | BRS01   | BRS01   | 12 inch teddy bear  |
    | Bears R Us      | BRS01   | BRS01   | 18 inch teddy bear  |
    | Doll House Inc. | DLL01   | DLL01   | Fish bean bag toy   |
    | Doll House Inc. | DLL01   | DLL01   | Bird bean bag toy   |
    | Doll House Inc. | DLL01   | DLL01   | Rabbit bean bag toy |
    | Doll House Inc. | DLL01   | DLL01   | Raggedy Ann         |
    | Fun and Games   | FNG01   | FNG01   | King doll           |
    | Fun and Games   | FNG01   | FNG01   | Queen doll          |
    +-----------------+---------+---------+---------------------+
    9 rows in set (0.00 sec)
     
    mysql> SELECT cust_id, cust_name, cust_contact
        -> FROM Customers;
    +------------+---------------+--------------------+
    | cust_id    | cust_name     | cust_contact       |
    +------------+---------------+--------------------+
    | 1000000001 | Village Toys  | John Smith         |
    | 1000000002 | Kids Place    | Michelle Green     |
    | 1000000003 | Fun4All       | Jim Jones          |
    | 1000000004 | Fun4All       | Denise L. Stephens |
    | 1000000005 | The Toy Store | Kim Howard         |
    +------------+---------------+--------------------+
    5 rows in set (0.01 sec)
  17. 联结多个表
    对于多表联结,外键相等作为WHERE条件是最基本的过滤条件,(因为除外键相等的这部分“行”外,都是联结所带来的无效的“行”)——自然联结
  18. 自联结
    看一个很屌的例子,充分说明了自联结的好处。
    技术分享
    说明:这个例子找到cust_contact为‘Jim Jones’的客户的cust_name。妙在cust_name是可以重名的,即两个客户可以叫同一个名字。这个例子就是在查询某个cust_name的信息,而cust_name是从cust_contact处得来。如果不用自联结,where cust_contact = ‘Jim Jones‘得到的结果集是完全不一样的。
  19. UNION
    利用UNION,可给出多条SELECT语句,将它们的结果组合成单个结果集。
    UNION的使用:只要在每条SELECT语句之间放上关键字UNION。
    mysql> SELECT cust_name, cust_contact, cust_email
        -> FROM Customers
        -> WHERE cust_state IN(‘IL‘, ‘IN‘,‘MI‘)
        -> UNION
        -> SELECT cust_name, cust_contact, cust_email
        -> FROM Customers
        -> WHERE cust_name = ‘Fun4All‘;
    +---------------+--------------------+-----------------------+
    | cust_name     | cust_contact       | cust_email            |
    +---------------+--------------------+-----------------------+
    | Village Toys  | John Smith         | sales@villagetoys.com |
    | Fun4All       | Jim Jones          | jjones@fun4all.com    |
    | The Toy Store | Kim Howard         | NULL                  |
    | Fun4All       | Denise L. Stephens | dstephens@fun4all.com |
    +---------------+--------------------+-----------------------+
    4 rows in set (0.01 sec)
    UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)
  20. 插入更新删除
    mysql> INSERT INTO Customers(cust_id,
        -> cust_name,
        -> cust_address,
        -> cust_city,
        -> cust_state,
        -> cust_zip,
        -> cust_country,
        -> cust_contact,
        -> cust_email)
        -> VALUES(‘1000000006‘,‘Toy Land‘,‘123 Any Street‘,
        -> ‘New York‘,
        -> ‘NY‘,
        -> ‘11111‘,
        -> ‘USA‘,
        -> NULL,
        -> NULL);
    Query OK, 1 row affected (0.03 sec)
     
     
    mysql> UPDATE Customers
        -> SET cust_email = ‘kim@thetoystore.com‘
        -> WHERE cust_id = ‘1000000005‘;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
     
     
    mysql> DELETE FROM Customers
        -> WHERE cust_id = ‘1000000006‘;
    Query OK, 1 row affected (0.00 sec)
     
    mysql> SELECT *
        -> FROM Customers
        -> WHERE cust_id = ‘1000000006‘;
    Empty set (0.00 sec)


  21.  

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 





《sql必知必会》

标签:

原文地址:http://www.cnblogs.com/codetravel/p/4534600.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!