MySQL高階之 JOIN查詢
阿新 • • 發佈:2021-08-22
JOIN查詢關係圖:
練習資料庫表SQL指令碼:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`myemployees` /*!40100 DEFAULT CHARACTER SET gb2312 */; USE `myemployees`; /*Table structure for table `departments` */ DROP TABLE IF EXISTS `departments`; CREATE TABLE `departments` ( `department_id` int(4) NOT NULL AUTO_INCREMENT, `department_name`varchar(30) DEFAULT NULL, `manager_id` int(6) DEFAULT NULL, `location_id` int(4) DEFAULT NULL, PRIMARY KEY (`department_id`), KEY `loc_id_fk` (`location_id`), CONSTRAINT `loc_id_fk` FOREIGN KEY (`location_id`) REFERENCES `locations` (`location_id`) ) ENGINE=InnoDB AUTO_INCREMENT=271 DEFAULTCHARSET=gb2312;
資料自行新增
1、內連線:查詢出多個表中滿足條件的資料,返回兩個結果集的交集
SELECT employee_id, last_name, e.department_id, department_name FROM employees e INNER JOIN departments d ON e.`department_id` = d.`department_id`;
2、左外連線:不僅將多個表中滿足條件的資料查詢出來,還將 “左表”中不滿足條件的資料也查詢出來
SELECT employee_id, last_name, e.department_id, department_nameFROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id`;
3、右外連線:不僅將多個表中滿足條件的資料查詢出來,還將 “右表”中不滿足條件的資料也查詢出來
SELECT employee_id, last_name, d.department_id, department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id`;
4、查詢左表中特有的資料,左外連線連線過來的就是左表中特有的資料(A差集B)
SELECT employee_id, last_name, e.department_id, d.department_id, department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE e.`department_id` IS NULL;
5、查詢右表中特有的資料,右外連線連線過來的就是左表中特有的資料(B差集A)
SELECT employee_id, last_name, e.department_id, d.department_id, department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id` WHERE e.`department_id` IS NULL;
6、滿外連線 :不僅將多個表中滿足條件的資料查詢出來,還將 “左右表”中不滿足條件的資料也查詢出來(A + B + …)
-- Oracle 中可以使用 full join ... on ... 但是 MySQL 不支援
-- UNION : 連線多個表的結果集
SELECT employee_id, last_name, department_id FROM employees WHERE department_id IN (60, 90) UNION ALL -- 不去重 SELECT employee_id, last_name, department_id FROM employees WHERE department_id IN(90, 100);
A、B表中交集的部分不重複顯示
SELECT employee_id, last_name, e.department_id, department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` UNION -- 去重 SELECT employee_id, last_name, d.department_id, department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id`;
7、去交集,也就是每個進行一次差集,然後將兩個差集滿外連線起來
SELECT employee_id, last_name, e.department_id, d.department_id, department_name FROM employees e LEFT JOIN departments d ON e.`department_id` = d.`department_id` WHERE e.`department_id` IS NULL UNION SELECT employee_id, last_name, e.department_id, d.department_id, department_name FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id` WHERE e.`department_id` IS NULL;
本文來自部落格園,作者:Vermeer,轉載請註明原文連結:https://www.cnblogs.com/Alay/p/15171861.html