• 第十四章 使用子查询


    学习目的:
    了解是子查询以及如何使用它们。
     
    子查询:
    查询(query)任何SQL语句都是查询。但此术语一般指SELECT语句。
     
    SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询。
     
    利用子查询进行过滤:
    Q:检索出订购物品TNT2的所有客户。
     
    问题分析:
    (3)检索前一步骤返回的所有客户ID的客户信息。
    SELECE cust_name
    FROM customers
    WHERE  cust_id = (
    SELECT cust_id,
    FROM orders
    WHERE  order_num =  (
    SELECT order_num
    FROM orderitems
    WHERE prod_id =  'TNT2 '
    )
    )
    (2)检索具有前一步骤列出的订单编号的客户ID。
    SELECT cust_id,
    FROM orders
    WHERE  order_num =  (
    SELECT order_num
    FROM orderitems
    WHERE prod_id =  'TNT2 '
    )
    (1)检索出包含物品TNT2的所有订单编号。
    SELECT order_num
    FROM orderitems
    WHERE prod_id =  'TNT2 '
     
    #子查询。Q检索出订购物品TNT2的所有客户。
     
    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 '));
     
    格式化SQL:包含子查询的SELECT语句难以阅读和调试,特别它们较为复杂时更是如此。如上所示把子查询分解为多行并且适当地进行缩进,能极大简化子查询的使用。
     
    在WHERE子句中使用子查询能够编写出功能性很强并且很灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。
     
    列必须匹配:
    在WHERE子句中使用子查询,应该保证SELECT语句具有与WHERE子句中相同数目的列。
     
    作为计算字段使用子查询:【还需要研究】
    使用子查询的另一种方法是创建计算字段。
    Q:需要显示customers表中每个客户的订单总数。订单和相应的客户ID存储在orders表中。
     
    问题分析:
    (1)从customers表中检索客户列表
    (2)对于检索出的每个客户,统计其在orders表中的订单数目。
     
    #作为计算字段使用子查询。Q检索customers表中每个客户的订单总数。????
    SELECT COUNT(*) AS orders
    FROM orders
    WHERE cust_id = 10001;
     
    SELECT cust_name,
           cust_state,
           (SELECT COUNT(*)
            FROM orders
            WHERE orders.cus_id = customers.cust_id) AS orders
    FROM customers
    ORDER BY cust_name;
     
     
    相关子查询(correleted subquery)涉及外部查询的子查询。
    这种类型的子查询称为相关子查询。任何时候只有列名可能有多义性,就必须使用这种语法(表名和列名由一个句点分个)。
     
    如果不完全限定列名,MySQL将假定你是对orders表中的cust_id进行 自身比较。而SELECT COUNT(*) FROM orders WHERE cust_id = cust_id; 总是返回orders表中的订单总数(因为MySQL查看每个订单的cust_id 是否与本身匹配,当然,它们总是匹配的)。
     
    逐渐增加子查询来建立查询:
    用子查询测试和调试查询很有技巧性,特别是在这些语句的复查性不断增加的情况下更是如此。用子查询建立(和测试)查询最可靠的方式是逐渐进行,这与MySQL处理它们的方法相同。
    首先,建立和测试最内层的查询。然后,用硬编码数据建立和测试外层查询,并且仅在确认它正常后才嵌入子查询。这时,再次测试它。
    对于要增加的每个子查询,重复这些步骤。这样做仅给构造查询增加了一点点时间,但节省了以后(找出查询为什么不正常)的大量时间,并且极大提高了查询一开始就正常工作的可能性。
     
     
              

  • 相关阅读:
    悲观锁乐观锁实战
    悲观锁
    乐观锁
    mysql数据库怎么设置乐观锁
    猴子吃桃问题
    算法题
    面试总结
    分布式系统理论(二):一致性协议Paxos
    职工工资管理
    79-WordSearch
  • 原文地址:https://www.cnblogs.com/mumulin99/p/9838392.html
Copyright © 2020-2023  润新知