mysql 查詢部門及其所有子部門列表_多表查詢
阿新 • • 發佈:2021-02-11
技術標籤:mysql 查詢部門及其所有子部門列表
樣例資料庫:(來源傳智播客)
表: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 欄位列表 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;
總結
內連線:查詢的是兩表交集部分。
隱式內連線:無join語句,僅用where判斷
顯式內連線:使用inner join … on
外連線
左外連線:查詢的是左表所有資料以及其交集部分。
右外連線:查詢的是右表所有資料以及其交集部分。
全外連線:兩表並集
子查詢
子查詢的結果是單行單列
將查詢結果當成一個值
例:
-- 查詢工資最高的員工資訊 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';
總結
子查詢是一個值(將子查詢結果看成一個值)
子查詢是一個列(用in關鍵字判斷是否滿足)
子查詢是一個表(將子查詢結果看成一個新表,起一個別名)