zoukankan      html  css  js  c++  java
  • 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操作符中,以及用来填充计算列。
  • 相关阅读:
    判断开始时间不能小于结束时间
    angular1.0使用echarts点刷新再次调用echarts方法
    解决angular4.0打包后不能再继续打包
    html拼接+layer按钮
    angular.js+echarts
    nginx配置
    NET_Framework_4.0installer.rar
    IIS6.0开启gzip压缩
    IIS的应用程序池优化方法
    远程桌面连接电脑后键盘失灵解决
  • 原文地址:https://www.cnblogs.com/by170628/p/7954724.html
Copyright © 2011-2022 走看看