mysql多表查詢

多表查詢分類
     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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章