MySQL-多表查询-子查询(标量、列)

子查询

  • 概述

    • 介绍:SQL语句中嵌套select语句,称为嵌套查询,又称子查询
    • 形式:select * from t1 where column1 = (select column1 from t2.....)
    • 子查询外部语句就可以insert/update/delete/select的任何一个,最常见的是select
  • 分类

    • 标量子查询
      • 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式
        •  
      • 常用符号:=、<>、>、>=、<、<=
      • 具体演示代码如下
        • -- todo 子查询
          -- 标量子查询
          -- A.查询“教研部”的所有员工信息
          -- a.查询 教研部 的部门id
          select tb_dept.id
          from tb_dept
          where name = '教研部';
          -- b.再查询该部门id下的员工信息
          select *
          from tb_emp
          where dept_id = 2;
          -- 最终语句如下
          select *
          from tb_emp
          where dept_id = (select id from tb_dept where name = '教研部');
          -- select id from tb_dept where name = '教研部'   该语句属于子查询
          
          -- B.查询在“东方白”入职后的员工信息
          -- a.查询’东方白‘的入职时间
          select entrydate
          from tb_emp
          where name = '方东白';
          -- b.查询在方东白入职之后的员工信息
          select *
          from tb_emp
          where entrydate > '2012-11-01';
          -- 最终语句如下
          select *
          from tb_emp
          where entrydate > (select entrydate
                             from tb_emp
                             where name = '方东白')
          -- 子查询的语句
          # select entrydate
          # from tb_emp
          # where name = '方东白'
    • 列子查询
      • 子查询返回的结果为一列(可以是多行)、

        •  

      • 常用符号:in、not in等
      • 具体演示代码如下
        • -- todo 列子查询
          -- A.查询’教研部‘和’咨询部‘员工的所有信息
          -- a.获取两部门的部门id
          select id
          from tb_dept
          where name = '教研部'
             or name = '咨询部';
          -- b.根据部门id,查询该部门下的员工id
          select *
          from tb_emp
          where dept_id in (2, 3);
          -- 合并后的查询语句
          select *
          from tb_emp
          where dept_id in (select id
                            from tb_dept
                            where name = '教研部'
                               or name = '咨询部');
    • 行子查询
      • 子查询返回的结果为一行(可以是多列)

        • 具体演示代码如下

          • -- todo 行查询
            -- A.查询与‘韦一笑’的入职日期及职位都相同的员工信息
            -- a.查询‘韦一笑’ 的入职日期 及 职位
            select entrydate, job
            from tb_emp
            where name = '韦一笑';
            -- b.查询与‘韦一笑’的入职日期及职位相同的员工信息
            select *
            from tb_emp
            where entrydate = '2007-01-01'
              and job = 2;
            
            select *
            from tb_emp
            where (entrydate, job) = ('2007-01-01', 2);
            
            -- 合并查询语句
            select *
            from tb_emp
            where (entrydate, job) = (select entrydate, job
                                      from tb_emp
                                      where name = '韦一笑');
    • 表子查询
      • 子查询返回的结果为多行多列,常作为临时表

        • 常用的操作符:in

          •  具体操作代码

          • -- todo 表子查询
            -- A.查询入职日期是’2006-01-01‘之后的员工信息,及部门名称
            -- a.查询入职日期为’2006-01-01‘之后的员工信息
            select *
            from tb_emp
            where entrydate > '2006-01-01';
            -- b.查询这部分员工信息及其部门名称
            select *
            from (select *
                  from tb_emp
                  where entrydate > '2006-01-01') e,
                 tb_dept d
            where e.dept_id = d.id;
            # select *
            # from tb_emp
            # where entrydate > '2006-01-01' 为子查询

             

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值