暑期自学 Day 13 | 数据库 (六)- 多表查询

内连接

隐式内连接
  • 使用 where 关键字消除无用数据
  • 例子:
    SELECT
      t1.name, -- 员工姓名
      t1.gender, -- 员工性别
      t2.name, -- 部门名称
    FROM
      emp t1, -- 员工表命名为t1
      dept t2, -- 部门表命名为t2
    WHERE
      t1.`dept_id`  = t2.`id`; -- 员工表中部门id和部门表主键id匹配
显式内连接
  • SELECT 字段 FROM 表名1 INNER JOIN 表名2 ON 条件
  • 例子
    SELECT
      *
    FROM
      emp t1
    INNER JOIN
      dept t2
    ON
      t1.`dept_id` = dept.`id`;

外连接

  • 左外连接
    • 查询左表所有数据和其交集部分
    • SELECT 字段 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
  • 右外连接
    • 查询右表所有数据和其交集部分
    • SELECT 字段 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
  • 如果所查询数据和另一表交集为空,则相应的列数据显示为 NULL

子查询

  • 查询中嵌套查询
  • 例:查询工资最高的员工信息
    SELECT
      emp.`id`,
      emp.`name`
    FROM
      emp
    WHERE
      emp.`salary` = (SELECT max(salary) FROM emp);
子查询不同情况
  • 结果单行单列

    • 看上面的例子
  • 结果多行单列

    • 例子:查询财务部和市场部所有员工信息。由于要查两个部门,需要用到 IN 关键词限定部门的范围
      SELECT
        emp.`id`,
        emp.`name`
      FROM
        emp
      WHERE
        dept.`id`
      IN -- 多行查询的关键,查询出这两个部门的信息
        SELECT
            dept.`id`
        FROM
            dept
        WHERE
            dept.`name` = `财务部`
        OR
            dept.`name` = `市场部`;
  • 结果多行多列

    • 用子查询创建一张虚拟表参与查询

    • 例子:查询2011年11月11日后入职的员工信息和部门信息

    • 子查询

      SELECT
        * 
      FROM
        dept t1,
        SELECT
            *
        FROM
            emp
        WHERE
            emp.`join_date` > `2011-11-11` t2
      WHERE
        t1.`id`
      INNER JOIN
        t2.`dept_id`;
    • 普通内连接

      SELECT
        *
      FROM
        emp t1,
        dept t2
      WHERE
        t1.`dept_id` = t2.`id`
      AND
        t1.`join_date` > `2011-11-11`;
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!