chapter14:使用子查询

子查询

即嵌套在其他查询中的查询。

利用子查询进行过滤

例:

  1. 检索包含物品TNT2的所有订单的编号。
  2. 检索具有前一步骤列出的订单编号的所有客户的ID。
  3. 检索前一步骤返回的所有客户ID的客户信息。

把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE子句。

第一步:

SELECT order_num
FROM orderitems
WHERE prod_id = 'TNT2';

第二步:查询具有订单20005和20007的客户ID。

SELECT cust_id
FROM orders
WHERE order_num IN (20005,20007);

现在,把第一个查询变为子查询组合两个查询:

SELECT cust_id
FROM orders
WHERE order_num IN (SELECT
                    FROM orderitems
                    WHERE prod_id = 'TNT2');

!:在SELECT语句中,子查询总是从内向外处理。

以上得到了订购物品TNT2的所有客户的ID。下一步是检索这些客户ID的客户信息:

SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (10001,10004);

将WHERE子句转换为子查询:

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'));

作为计算字段使用子查询

例:假如需要显示customers表中每个客户的订单总数。订单与相应客户ID存储在orders表中。步骤:

  1. 从customers表中检索客户列表。
  2. 对于检索出的每个客户,统计其在orders表中的订单数目。
SELECT cust_name,
       cust_state,
       (SELECT COUNT(*)
        FROM orders
        WHERE orders.cust_id = customers.custid) AS orders
FROM cusomers
ORDER BY cust_name;

相关子查询(correlatedsubquery):涉及外部查询的子查询。这种类型的子查询称为相关子查询。任何时候只要列名可能有多义性,就必须使用这种语法(表名和列名由一个句点分隔)。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • SQL与MySQL简介 数据库基础 从SQL的角度来看,数据库就是一个以某种有组织的方式存储的数据集合。我们可以采...
    heming阅读 3,133评论 1 8
  • 关系型数据库和SQL SQL语言的三个部分DML:Data Manipulation Language,数据操纵语...
    Awey阅读 1,967评论 0 13
  • 2017/3/14 RDBMS:关系型数据库管理系统 关系模型独立于语言 SQL有几种不同类型的语言:数据定义语言...
    ancherl阅读 1,653评论 0 6
  • Mysql 必知必会 查询 检索多个列SELECT prod_id, prod_name, prod_pri...
    yoomaz阅读 663评论 0 1
  • 既然生活的走道儿无章可循,何必揣着复杂,不如挥挥衣袖如流水落花 既然爱你无法自拔,何必藏掖着牵挂,不如趁着袅袅炊烟...
    张大Q阅读 224评论 0 1