內(nèi)連接
- 語(yǔ)法
SELECT 字段列表 FROM A表 INNER JOIN B表 ON 關(guān)聯(lián)條件 WHERE 等其他子句; -
示范
SELECT e.employee_id, e.last_name, e.department_id, d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id);
image.png
外連接(OUTER JOIN)
- 左外連接
- 語(yǔ)法
A SELECT 字段列表 FROM A表 LEFT JOIN B表 ON 關(guān)聯(lián)條件 WHERE 等其他子句; -
示范
SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id) ;
image.png
左連接會(huì)把join左邊的表左右數(shù)據(jù)都顯示出來(lái),右邊表符合條件的顯示出來(lái)
- 右外連接
- 語(yǔ)法
FROM A表 RIGHT JOIN B表 ON 關(guān)聯(lián)條件 WHERE 等其他子句; -
示范
SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id) ;
image.png
滿(mǎn)外連接(FULL OUTER JOIN)
滿(mǎn)外連接的結(jié)果 = 左右表匹配的數(shù)據(jù) + 左表沒(méi)有匹配到的數(shù)據(jù) + 右表沒(méi)有匹配到的數(shù)據(jù)。
SQL99是支持滿(mǎn)外連接的。使用FULL JOIN 或 FULL OUTER JOIN來(lái)實(shí)現(xiàn)。
需要注意的是,MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNION RIGHT join代替。
union的使用
- union
合并查詢(xún)結(jié)果 利用UNION關(guān)鍵字,可以給出多條SELECT語(yǔ)句,并將它們的結(jié)果組合成單個(gè)結(jié)果集。合并
時(shí),兩個(gè)表對(duì)應(yīng)的列數(shù)和數(shù)據(jù)類(lèi)型必須相同,并且相互對(duì)應(yīng)。各個(gè)SELECT語(yǔ)句之間使用UNION或UNION ALL關(guān)鍵字分隔。 - 語(yǔ)法格式
SELECT column,... FROM table1 UNION [ALL] SELECT column,... FROM table2
UNION 操作符返回兩個(gè)查詢(xún)的結(jié)果集的并集,去除重復(fù)記錄。 - UNION ALL
UNION ALL操作符返回兩個(gè)查詢(xún)的結(jié)果集的并集。對(duì)于兩個(gè)結(jié)果集的重復(fù)部分,不去重。
注意:執(zhí)行UNION ALL語(yǔ)句時(shí)所需要的資源比UNION語(yǔ)句少。如果明確知道合并數(shù)據(jù)后的結(jié)果數(shù)據(jù)
不存在重復(fù)數(shù)據(jù),或者不需要去除重復(fù)的數(shù)據(jù),則盡量使用UNION ALL語(yǔ)句,以提高數(shù)據(jù)查詢(xún)的效
率。
7種sql join的實(shí)現(xiàn)
image.png
- 代碼實(shí)現(xiàn)
中圖:內(nèi)連接 A∩B SELECT employee_id,last_name,department_name FROM employees e JOIN departments d ON e.`department_id` = d.`department_id`;
左上圖:左外連接 SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id`;
右上圖:右外連接 SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id`;
左中圖:A - A∩B SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE d.`department_id` IS NULL
右中圖:B-A∩BSELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id` WHERE e.`department_id` IS NULL
左中圖 + 右中圖 A ∪B- A∩B 或者 (A - A∩B) ∪ (B - A∩B) SELECT employee_id,last_name,department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE d.`department_id` IS NULL UNION ALL SELECT employee_id,last_name,department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id` WHERE e.`department_id` IS NULL