zoukankan      html  css  js  c++  java
  • 《MySQL必知必会学习笔记》:子查询

    子查询

    在開始了解子查询之前,首先做下准备工作,建立3个表,

    • 一个是customers表,当中包含:客户名字、客户ID、客户Tel等。
    • 一个是orders表,当中包含:订单号、客户ID、订单时间等。

    • 一个是ordersitems表,当中包含:订单物品、订单号、物品数量。

    准备工作

    1、建表

    建customers表的命令例如以下,其他的表与之相似:

    create table customers(cust_name varchar(10),cust_id int(10),cust_tel varchar(10));
    

    2、插入内容

    为customers表插入内容的命令例如以下,其他的与子相似:

    insert into customers values('wu',2,'1387234');
    

    最后三个表的内容截图例如以下:

    子查询

    前面我们所学的东西都是简单的查询,即从单个数据库表中检索数据的单条语句。

    究竟什么是子查询呢?通过以下这个样例,相信我们就更好的理解了。

    上面我们建了三个表,分别为customers/orders/ordersitems.

    如今,假如,我们想看下订购了物品 apple的全部客户信息,应该如何检索呢?

    以下列出详细的步骤:

    • 第一步:在ordersitems表中找出包含有apple的订单号order_id.
    • 第二步:依据上一步查找的结果,找出订单号为order_id的客户ID(cust_id).
    • 最后:依据上一步查找的结果,在customers表中依据客户ID(cust_id)找出客户信息。

    如今我们依照步骤来查询下,观察下结果:

    从上面能够看出,我们就是依照步骤,将第一步的结果当做第二步的条件来进行查询。将第二步的结果直接作为第三步的条件来进行查询,最后得到终于的结果。

    如今,我们分别把第一个子查询(返回订单号的那一个)变为子查询组合到第二个查询中。

    第一个查询的代码例如以下:

    select order_id from ordersitems where content='apple';
    

    作为子查询组合到第二个查询后的代码例如以下:

    select cust_id from orders where order_id in (
        select order_id from ordersitems where content='apple'
    );
    

    结果例如以下,从结果能够看出。与我们单个查询的结果是一致的:

    如今。我们就把上面的查询作为子查询组合到第三个查询中。代码例如以下:

    select cust_name,cust_tel from customers where cust_id in(
        select cust_id from orders where order_id in(
            select order_id from ordersitems where content='apple')
        )
    );
    

    注意:包含子查询的select语句难以阅读和调试。特别是他们较为复杂时。如上所看到的把子查询分解为多行而且适当地进行缩进,能极大地简化子查询的使用。

    在where子句中使用子查询能够编写出功能非常强而且非常灵活的SQL语句。对于能嵌套的子查询的数目没有限制,只是在实际使用时因为性能的限制,不能嵌套太多的子查询。

    注意:在子查询中。列必须匹配

    作为计算字段使用子查询

    上面介绍的都是作为条件使用子查询。以下就介绍下作为计算字段使用子查询。

    还是以一个样例来进行说明。
    假如须要显示customers表中每一个客户的订单总数。

    为运行这个操作,过程例如以下:

    • 从customers表中检索客户列表
    • 对于检索出的每一个客户。统计其在orders表中的订单数目。

    比如:查询客户id=1的订单数的命令例如以下:

    select count(*) as order_total from orders where cust_id=1;
    

    将上面的命令作为字段的子查询的代码例如以下:

    select cust_name,cust_tel,(select count(*) from orders where orders.cust_id==customers.cust_id) from customers ;
    

    小结

    子查询能够理解为嵌套,这里方便理解一点。可是在我们使用子查询的过程中。要先分步骤来完毕,然后将子查询一个一个的组合起来,直到这个子查询增加之后得到的结果是符合要求的。然后继续将下一个子查询组合进行直至完毕全部的子查询都全部正确的增加。

  • 相关阅读:
    bzoj千题计划202:bzoj3191: [JLOI2013]卡牌游戏
    bzoj千题计划201:bzoj1820: [JSOI2010]Express Service 快递服务
    bzoj千题计划200:bzoj3106: [cqoi2013]棋盘游戏
    bzoj千题计划199:bzoj1055: [HAOI2008]玩具取名
    NOIP2017 小凯的疑惑
    Codeforces 837E. Vasya's Function
    bzoj1084: [SCOI2005]最大子矩阵
    bzoj4247: 挂饰
    Codeforces Round #276 (Div. 1) A. Bits
    bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7193812.html
Copyright © 2011-2022 走看看