• MYSQL 学习笔记记录整理之三:子查询


    1、利用子查询进行过滤
    eg:假如需要列出订购物品TNT2的所有客户,具体步骤:
    检索包含物品TNT2的所有订单编号
    检索具有前一步骤列出的订单编号的所有客户的ID
    检索前一步骤返回的所有客户ID的客户信息
    上述每个步骤都可以单独作为一个查询来执行,可以把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE语句。也可以使用子查询把3个查询组合成一条语句。
    select order_num FROM orderitems WHERE prod_id=‘TNT2';
    输出结果为:
    order_num:20005,20007
     
    下一步,查询具有订单20005和20007的客户ID。
    SELECT cust_id from orders where order_num IN(20005,20007);
    输出结果:
    cust_id:10001,10004
     
    现在,把第一个查询(返回订单号的那一个)变为子查询组合两个查询。请看:
    SELECT cust_id from orders where order_num IN(select order_num FROM orderitems WHERE prod_id=‘TNT2');
    输出结果为:
    cust_id:10001,10004
     
    分析:在SELECT语句中,子查询总是从内向外处理。在处理上面的语句时,mysql
    实际执行了两个操作。
     
    现在得到了订购物品TNT2的所有客户ID,下一步是检索这些客户ID的客户信息,检索两列的SQL语句为:
    SELECT cust_name ,cust_contact from customers where cust_Id in(10001,10004);
    上面,可以把其中的where子句转换为子查询而不是硬编码这些客户ID。
    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'));
     
    分析:为了执行上面的select 语句,mysql实际上必须执行3条SELECT语句。最里边的子查询返回订单号列表,此列表用于其外面的子查询的WHERE子句。外面的子查询返回客户ID列表,此客户ID列表用于最外层查询的WHERE子句。最外层查询确实返回所需的数据。
    不过,在实际使用时由于性能的限制,不能嵌套太多的子查询。
    注意:列必须匹配。在WHERE子句中使用子查询,应该保证SELECT语句具有与WHERE子句中相同数目的列,通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。虽然子查询一般与IN操作符结合使用,但也可以用于测试等于(=)、不等于(<>)等。
     
    2、作为计算字段使用子查询
    使用子查询的另一种方法就是创建计算字段。假如需要显示customers表中每个客户的订单总数,为了执行这个操作,遵循下面的步骤:
    从customers表中检索客户列表
    对于检索出的每个客户,统计其在orders表中的订单数目。
     
    例如:下面的代码对客户10001的订单进行计数。
    SELECT COUNT(*) AS orders FROM orders WHERE cust_id=10001;
     
    为了对每个客户执行COUNT(*)计算,应该将COUNT(*)作为一个子查询,请看下面:
     
    SELECT cust_name,cust_state,
    (SELECT COUNT(*) FROM orders
    WHERE orders.cust_id=customers.cust_id) AS orders
    from customers
    order by cust_name;
    分析:这条SELECT 语句对customers表中的每个客户返回3列: cust_name,cust_state,orders。orders是一个计算字段,它是由圆括号的子查询建立,该子查询对检索出的每个客户执行一次。在此例子汇总,该子查询执行了5次,因此检索出了5个客户。
     
    小结:子查询最常见的使用是在WHERE子句的IN操作符中,以及用来填充计算列。
  • 相关阅读:
    ExtJs005继承
    ExtJs004define定义类
    ExtJS笔记
    解决vscode-pandoc插件生成pdf中文显示问题
    UDP学习笔记(.NET)
    WPF类库不能添加资源词典(xaml)的解决办法
    解决win10下获取操作系统版本为6.2.900(win8)的问题
    [转] Unit Test 访问Internal类型和方法
    VS2017使用小技巧(持续更新。。。)
    [转]Github遇到Permanently added the RSA host key for IP address '192.30.252.128' to the list of known host
  • 原文地址:https://www.cnblogs.com/by170628/p/7954724.html
Copyright © 2020-2023  润新知