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操作符中,以及用来填充计算列。
  • 相关阅读:
    thinkphp5 tp5 命名空间 报错 Namespace declaration statement has to be the very first statement in the script
    开启 php 错误 提示 php-fpm 重启 nginx 500错误 解决办法 wdlinux lnmp 一键包 php脚本无法解析执行
    js 设置 cookie 定时 弹出层 提示层 下次访问 不再显示 弹窗 getCookie setCookie setTimeout
    php 二维数组 转字符串 implode 方便 mysql in 查询
    nginx 重启 ps -ef|grep nginx kill -HUP 主进程号
    jquery bootstrap help-block input 表单 提示 帮助 信息
    jquery 倒计时 60秒 短信 验证码 js ajax 获取
    jQuery如何获取同一个类标签的所有的值 遍历
    linux下C语言文件操作相关函数
    gcc,gdb用法
  • 原文地址:https://www.cnblogs.com/by170628/p/7954724.html
Copyright © 2011-2022 走看看