MySQL-7:多表查询

作者: Deque | 来源:发表于2019-04-03 00:40 被阅读0次

    今日内容

    1.多表查询

    2.事务

    3.DCL

    多表查询:

    • 查询语法:
        select 
            列名列表
        from
            表名列表
        where....
    
    • 数据准备(数据库表以及数据的创建):

         # 新增数据
         INSERT INTO dept (NAME) VALUES('开发部'),('市场部'),('财务部');
         
         # 创建员工表
         CREATE TABLE emp(
          id INT PRIMARY KEY AUTO_INCREMENT,
          NAME VARCHAR(10),
          gender CHAR(1), -- 性别
          salary DOUBLE, -- 工资
          join_date DATE, -- 入职日期
          dept_id INT,
          FOREIGN KEY(dept_id) REFERENCES dept(id) -- 外键
         );
          
      # 新增数据
      INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2014-02-24',1);
      INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',4200,'2015-03-15',2);
      INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('沙师弟','男',3600,'2013-02-24',2);
      INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2013-02-24',2);
      INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','男',5400,'2018-08-08',3);
      INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','男',6100,'2019-01-01',1);
      
    • 笛卡尔积

      • 有两个集合a,b,取这两个集合的所以组成情况
      • 要完成多表查询,需要消除无用的数据
    • 多表查询分类
      1.内链接查询:
      (1)隐式内链接:使用 where 条件,消除无用的数据。

      • 例子:
    -- 查询员工表的名称,性别。部门表的名称
    
    -- 正规写法 方便添加注释(符合企业sql规范)
    SELECT
       t1.name, -- 员工表的姓名
       t1.gender, -- 员工表的性别
       t2.name -- 部门表的名称
    FROM
       emp t1,
       dept t2
    WHERE
       t1.dept_id=t2.id;
    
    

    (2)显式内链接

    • 语法:
      select 字段列表 from 表明 inner join 表明2 on 条件
    • 例如:
    -- 查询员工表的名称,性别。部门表的名称(使用显式内链接) 
    SELECT * FROM emp [INNER] JOIN dept ON emp.dept_id = dept.id;
    
    -- INNER 是可选操作,可以直接使用 JOIN ON 如下:
    SELECT * FROM emp JOIN dept ON emp.dept_id = dept.id;
    
    

    (3)内链接查询注意事项:

    • 从哪些表中查询数据
    • 条件是什么?
    • 查询哪些字段?

    2.外链接查询:
    (1)左外连接:

    • 语法:select 字段列表 from 表1 left [outer] join 表2 on 条件
    • 查询的是左表所有数据以及其交集部分。


      左外连接,图片来自互联网
     -- 左外连接 (LEFT JOIN ON)
     SELECT
        t1.*,
        t2.name
     FROM
        emp t1
    LEFT JOIN
        dept t2
     ON
        t1.dept_id = t2.id;
    

    (2)右外连接:

    • 语法:select 字段列表 from 表1 right [outer] join 表2 on 条件
    • 查询的是右表所有数据以及其交集部分。


      右外连接,图片来自互联网
     -- 右外连接 (RIGHT JOIN ON)
    SELECT
        t1.*,
        t2.name
    FROM
        dept t2
    RIGHT JOIN
        emp t1
     ON
        t1.dept_id = t2.id;
    

    3.子查询:

    • 概念:查询中嵌套查询,称嵌套查询为子查询。
         -- 子查询
         -- 查询工资最高的员工的信息
    
         -- 1、查询最高的工资是多少?
         SELECT MAX(salary) FROM emp;
    
        -- 查询的结果是 9000
    
         -- 2.查询员工信息,并且工资等于最高的
         SELECT * FROM emp WHERE emp.salary=9000;
         
         -- 一条SQL就能完成
        SELECT * FROM emp WHERE emp.salary=(
            SELECT MAX(salary) FROM emp
            );
    
    
    • 子查询的不同情况
      1、子查询的结果是单行单列的:
      • 子查询可以作为条件,使用运算符(>、<、>=、<=、=)去判断。
    -- 查询员工工资小于平均工资的人
    SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
    

    2、子查询的结果是多行单列的:

    • 可以使用运算符IN来判断
    -- 查询‘财务部’和'市场部'所有的员工信息
    -- 1、先查询财务部的id
    SELECT id FROM dept WHERE name='财务部' OR name='市场部';
    -- 2、再根据ID查询信息
    SELECT * FROM emp WHERE dept_id = 3 OR dept_id=2;
    
    -- 其中第二条语句可以改写成如下:(相当与上面这条 )
    SELECT * FROM emp WHERE dept_id IN(3,2);
    
    -- 子查询
    SELECT * FROM emp WHERE dept_id IN(SELECT id FROM dept WHERE name='财务部' OR name='市场部');
    

    3、子查询的结果是多行多列的:

    • 子查询可以作为一张虚拟表来进行查询
    -- 多行多列
    -- 例:查询员工入职日期是2015年-11-11之后的员工信息和部门信息(子查询)
    -- 括号里的叫做虚拟表
    SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.join_date > '2015-11-11') t2
    WHERE t1.id = t2.dept_id;
    
    -- 例:查询员工入职日期是2015年-11-11之后的员工信息和部门信息(普通内链接查询)
    SELECT * FROM emp t1, dept t2 
    WHERE t1.dept_id = t2.id AND t1.join_date > '2015-11-11';
    

    事务

    DCL

    相关文章

      网友评论

        本文标题:MySQL-7:多表查询

        本文链接:https://www.haomeiwen.com/subject/ipuobqtx.html