1. 程式人生 > 其它 >MySQL高階之 JOIN查詢

MySQL高階之 JOIN查詢

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 DEFAULT
CHARSET=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_name
FROM 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