1. 程式人生 > 其它 >mysql 查詢部門及其所有子部門列表_多表查詢

mysql 查詢部門及其所有子部門列表_多表查詢

技術標籤:mysql 查詢部門及其所有子部門列表

樣例資料庫:(來源傳智播客)

表:emp

7a41f65850ed925534e41c52d1bdf220.png

表:dept

626bf573b5993d2076deb7a155534a46.png

連線查詢

內連線查詢

隱式內連線

使用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 欄位列表 from 表1         left [outer] join 表2                 on 條件;

例子

 -- 查詢所有員工資訊,如果員工有部門,則查詢部門名稱,沒有部門,則不顯示部門名稱 SELECT t1.*, t2.name FROM emp t1          LEFT JOIN dept t2                    ON t1.dept_id = t2.id;

右外連線

查詢的是右表所有資料以及其交集部分。

語法:

 select 欄位列表 from 表1          right join 表2                     on 條件;

例子

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

全外連線

查詢的是右表所有資料以及其交集部分。(mysql沒有full outer join,用union代替)

語法:(分別將左右外連線的結果取並集)

 select 欄位列表 from 表1          right join 表2                     on 條件; union select 欄位列表 from 表1          left join 表2                     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. 子查詢是一個表(將子查詢結果看成一個新表,起一個別名)