多表查詢分類
1.內連接
2.外連接
3.子查詢
笛卡爾積
有兩個集合A、B,取這兩個集合的所有組成情況
要完成多表查詢,需要消除無用的笛卡爾積數據
內連接
1.隱式內連接:
2.顯示內連接
隱式內連接
使用where條件消除無用數據
-- 查詢所有員工信息和對應的部門信息
SELECT * FROM dept,emp WHERE emp.dept_id = dept.id;
-- 查詢員工的名稱,性別。以及所在部門
SELECT
emp.`name` 姓名,
emp.gender 性別,
dept.`name` 部門
FROM
dept,emp
WHERE
emp.dept_id=dept.id;
SELECT
t1.`name`,
t1.gender,
t2.`name`
FROM
emp t1, -- 起別名
dept t2
WHERE
t1.dept_id=t2.id;
顯示內連接
-- 語法:select 字段列表 from 表名1 [inner] join 表名2 on 條件
SELECT
t1.`name`,
t1.gender,
t2.`name`
FROM
emp t1
INNER/*INNER 可以省略*/ JOIN
dept t2
ON
t1.dept_id = t2.id;
-- 多對多 查詢 所有有角色的用戶(role:角色表 user:用戶表 user_role:中間表)
SELECT
`user`.*,`role`.*
FROM
`user`
JOIN
user_role
ON
`user`.`id`=user_role.`UID`
JOIN
`role`
ON
`role`.`ID`=user_role.`RID`
外連接
1.左外連接
2.右外連接
左外連接
-- 語法: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; -- 交集部分
-- 多對多 查詢 所有有角色的用戶(role:角色表 user:用戶表 user_role:中間表)
SELECT
`role`.*,`user`.*
FROM
`role`
LEFT OUTER JOIN
user_role
ON
`role`.`ID`=user_role.`RID`
LEFT OUTER JOIN
`user`
ON
`user`.`id`=user_role.`UID`
右外連接
-- 語法:select 字段列表 from 表名1 right [outer] join 表名2 on 條件
-- 右外連接查詢的是右表所有數據以及其交集部分
SELECT
t1.*,
t2.`name`
FROM
emp t1 -- 左表
RIGHT JOIN
dept t2 -- 右表
ON
t1.dept_id = t2.id; -- 交集部分
子查詢
查詢中嵌套查詢,被嵌套的查詢爲子查詢
分類:
1.子查詢的結果是單行單列
子查詢可以作爲條件,使用運算符去判斷。
2.子查詢的結果是多行單列
3.子查詢的結果是多行多列
子查詢的結果是多行多列可以作爲一場虛擬表進行查詢
子查詢的結果是單行單列
查詢工資最高的員工信息
SELECT * FROM emp WHERE emp.salary=(SELECT MAX(salary) FROM emp);
子查詢的結果是多行單列
-- 查詢市場部和財務部的所有員工信息
SELECT
*
FROM
emp
WHERE
emp.dept_id
IN (
SELECT
dept.id
FROM
dept
WHERE
dept.`name`
IN('市場部','財務部')
);
子查詢的結果是多行多列
-- 查詢員工入職日期是2011-11-11日之後的員工信息
SELECT * FROM emp WHERE emp.join_date > '2011-11-11';
-- 查詢員工入職日期是2011-11-11日之後的員工信息和部門信息
SELECT
*
FROM
(SELECT * FROM emp WHERE emp.join_date > '2011-11-11') t1
LEFT JOIN
dept
ON
t1.dept_id = dept.id;