暑期自學 Day 13 | 資料庫 (六)- 多表查詢

Borris發表於2020-05-26

內連線

隱式內連線
  • 使用 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 協議》,轉載必須註明作者和本文連結

相關文章