【MySQL必知必会】第十四章 使用子查询

1、查询(query):任何SQL语句都是查询。但此属于一般指SELECT语句。

2、子查询(subquery):嵌套在其他查询中的查询。

  目标:查询订购物品TNT2的用户信息。

  前提:有三个表,orderitems表存储物品的订单编号和物品信息,orders表存储订单编号和客户ID,customers表存储客户ID和客户信息。

  分解:

  1、检索包含物品TNT2的所有订单编号。

  2、检索步骤1返回的订单编号的关联的客户ID。

  3、检索步骤2返回的客户ID的客户信息。

  分步查询:

  输入:

  SELECT order_num

  FROM orderitems

  WHERE prod_id = 'TNT2';

  输出:

  order_num

  201

  205

 

  输入:

  SELECT  cust_id

  FROM  orders

  WHERE  order_num IN (201,205);

  输出:

  cust_id

  101

  103

 

  输入:

  SELECT  cust_name,cust_contact

  FROM  customers

  WHERE  cust_id IN (101,103);

  输出:

  cust_name  cust_conctact

  Coy Peter    Y Lee

  New Ketter   Y Sam

 

  嵌套查询:

  输入:

  SELECT  cust_name,cust_contact

  FROM  customers

  WHERE  cust_id IN (SELECT  cust_id

              FROM  orders

              WHERE  order_num IN (SELECT order_num

                            FROM orderitems

                            WHERE prod_id = 'TNT2'));

  输出:

  cust_name  cust_conctact

  Coy Peter    Y Lee

  New Ketter   Y Sam

 

  注:在WHERE子句中使用子查询,应保证SELECT语句和WHERE子句中列的数目相同。

3、作为计算字段使用子查询

  输入:

  SELECT cust_name,

      cust_state,

      (SELECT COUNT(*)

       FROM orders

        WHERE  orders.cust_id=customers.cust_id) AS orders

  FROM custmers

  ORDER BY cust_name;

  输出:

  cust_name  cust_state  orders

  R Fudd    MI      3

  Wascals    AZ      2

  分析:orders是一个计算字段,由圆括号里的子查询建立,该子查询调用了2次,每检索到一个客户调用一次。可以看到子查询中的WHERE子句使用了全限定名,因为此处要区分字段的来源。

4、相关子查询(correlated subquery):涉及外部查询的子查询。

  任何时候,只要列名具有多意性,就要必须使用这种语法(表名和列名由一个句点分隔)。上面再customers表中使用了orders表就是相关子查询,须用全限定名。

posted @ 2017-05-21 14:42  名称简单点  阅读(307)  评论(0编辑  收藏  举报