暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

多表查询

Hello 帅帅 2021-02-05
323

样例数据库:(来源传智播客)

表:emp

表:dept

连接查询

内连接查询

隐式内连接

使用where条件消除无用数据

查询员工表的名称,性别。部门表的名称

     select t1.NAME 姓名, t1.gender 性别, t2.NAME 部门
    from emp t1,
    dept t2
    where t1.dept_id = t2.id;

    显式内连接

    语法:

       select 字段列表 
      from 表名1 join 表名2
      on 条件

      例子

         SELECT *
        FROM emp
        INNER JOIN dept
        ON emp.dept_id = dept.id;

        外链接查询

        左外连接

        查询的是左表所有数据以及其交集部分。

        语法:

           select 字段列表
          from1
          left [outer] join2
          on 条件;

          例子

             -- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称
            SELECT t1.*, t2.name
            FROM emp t1
            LEFT JOIN dept t2
            ON t1.dept_id = t2.id;

            右外连接

            查询的是右表所有数据以及其交集部分。

            语法:

               select 字段列表
              from1
              right join2
              on 条件;

              例子

                 SELECT *
                FROM dept t2
                RIGHT JOIN emp t1
                ON t1.dept_id = t2.id;

                全外连接

                查询的是右表所有数据以及其交集部分。(mysql没有full outer join,用union代替)

                语法:(分别将左右外连接的结果取并集)

                   select 字段列表
                  from1
                  right join2
                  on 条件;
                  union
                  select 字段列表
                  from1
                  left join2
                  on 条件;

                  例子

                     SELECT t1.*, t2.name
                    FROM emp t1
                    LEFT JOIN dept t2
                    ON t1.dept_id = t2.id
                    union
                    SELECT t1.*, t2.name
                    FROM emp t1
                    right JOIN dept t2
                    ON t1.dept_id = t2.id;

                    总结

                    1. 内连接:查询的是两表交集部分。

                      1. 隐式内连接:无join语句,仅用where判断

                      2. 显式内连接:使用inner join … on

                    2. 外连接

                      1. 左外连接:查询的是左表所有数据以及其交集部分。

                      2. 右外连接:查询的是右表所有数据以及其交集部分。

                      3. 全外连接:两表并集

                    子查询

                    子查询的结果是单行单列

                    将查询结果当成一个值

                    例:

                       -- 查询工资最高的员工信息
                      SELECT *
                      FROM emp
                      WHERE emp.salary = (
                      SELECT MAX(salary)
                      FROM emp);
                      -- 查询员工工资小于平均工资的人
                      SELECT *
                      FROM emp
                      WHERE emp.salary < (
                      SELECT AVG(salary)
                      FROM emp);

                      子查询的结果是多行单列

                      使用关键字关键字:in

                      例:

                         -- 查询'财务部'和'市场部'所有的员工信息
                        SELECT *
                        FROM emp
                        WHERE dept_id IN (
                        SELECT id
                        FROM dept
                        WHERE NAME = '财务部'
                        OR NAME = '市场部');

                        子查询的结果是多行多列

                        将查询结果当成一个表

                        例:

                           -- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息
                          -- 子查询
                          SELECT *
                          FROM dept t1,
                          (SELECT *
                          FROM emp
                          WHERE emp.join_date > '2011-11-11') t2
                          WHERE t1.id = t2.dept_id;

                          -- 普通内连接
                          SELECT *
                          FROM emp t1,
                          dept t2
                          WHERE t1.dept_id = t2.id
                          AND t1.join_date > '2011-11-11';

                          总结

                          1. 子查询是一个值(将子查询结果看成一个值)

                          2. 子查询是一个列(用in关键字判断是否满足)

                          3. 子查询是一个表(将子查询结果看成一个新表,起一个别名)


                          文章转载自Hello 帅帅,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论