5分鐘學會MySql的那些左連線、左外連線、內連線等等
阿新 • • 發佈:2019-02-12
首先,我們新建兩個表(員工表,和部門表)
DROP DATABASE db0206; CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`tbl_dept`( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30), `locAdd` VARCHAR(40), PRIMARY KEY (`id`) ) ENGINE=INNODB CHARSET=utf8; CREATE TABLE `db0206`.`tbl_emp`( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(20), `deptId` INT(11), PRIMARY KEY (`id`), CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES tbl_dept(id) ) ENGINE=INNODB CHARSET=utf8; /*插入資料*/ INSERT INTO tbl_dept(deptName,locAdd) VALUES('RD',11); INSERT INTO tbl_dept(deptName,locAdd) VALUES('HR',12); INSERT INTO tbl_dept(deptName,locAdd) VALUES('MK',13); INSERT INTO tbl_dept(deptName,locAdd) VALUES('MIS',14); INSERT INTO tbl_dept(deptName,locAdd) VALUES('FD',15); INSERT INTO tbl_emp(NAME,deptId) VALUES('z3',1); INSERT INTO tbl_emp(NAME,deptId) VALUES('z4',1); INSERT INTO tbl_emp(NAME,deptId) VALUES('z5',1); INSERT INTO tbl_emp(NAME,deptId) VALUES('w5',2); INSERT INTO tbl_emp(NAME,deptId) VALUES('w6',2); INSERT INTO tbl_emp(NAME,deptId) VALUES('s7',3); INSERT INTO tbl_emp(NAME,deptId) VALUES('s8',4);
然後,得到兩表是這樣的
開始愉快的學習吧
1.內連線(內連線就是兩張表中都包含的資料,因為部門表包含了員工表,所以內連線就是上圖中綠色部分)
SELECT * FROM tbl_dept a INNER JOIN tbl_emp b ON a.id = b.deptId;
可以看出它把員工表中的所有資料都查詢出來了,而且連著部門表中相對應的資料也查詢出來了
2.左外連線(左外連線就是查詢join左邊表中的所有資料,並且把join右邊表中對應的資料查詢出來)
SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId;(會查詢上圖中橙色部分和綠色部分 )
從上圖中可以看出,由於部門表在join的右邊,所以查詢會把部門表中所有的資料查詢出來。而員工表中沒有對應的部門只能顯示null了。
如果我們把員工表放join的左邊呢?
SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId=b.id;(查詢綠色部分)
這樣只能把員工表和與之對應的部門表的資料給查詢出來了,多餘的部門就沒有查出來了。就是這麼簡單
3.右外連線(與左外連線正好相反,它查詢的是join右邊的部分)
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id = b.deptId;(查詢綠色部分4左連線(其實就是在左外連線在後面加了一個where條件,查詢只存在於join左邊表的內容)
SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId WHERE b.deptId IS NULL;(圖中橙色部分)
5.右連線(和左連線相反,查詢只存在於join右邊表的資料)
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id = b.deptId WHERE a.id IS NULL;(由於部門表包含了所有的員工表,所以查出來的是空)
6.-- 全連線(查詢倆張表的全部內容)
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id=b.deptIdUNION
SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId;(其實就是一個左外連線加一個右外連線,所以把圖中橙色部分和綠色部分都查出來了)
7.-- (兩張表中都沒有同時出現的資料集)
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id=b.deptId WHERE a.id IS NULLUNION
SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId WHERE b.deptId IS NULL;(也就是圖中橙色部分)
完整程式碼如下
DROP DATABASE db0206;
CREATE DATABASE db0206;
USE db0206;
CREATE TABLE `db0206`.`tbl_dept`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`deptName` VARCHAR(30),
`locAdd` VARCHAR(40),
PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8;
CREATE TABLE `db0206`.`tbl_emp`(
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20),
`deptId` INT(11),
PRIMARY KEY (`id`),
CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES tbl_dept(id)
) ENGINE=INNODB CHARSET=utf8;
/*插入資料*/
INSERT INTO tbl_dept(deptName,locAdd) VALUES('RD',11);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('HR',12);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('MK',13);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('MIS',14);
INSERT INTO tbl_dept(deptName,locAdd) VALUES('FD',15);
INSERT INTO tbl_emp(NAME,deptId) VALUES('z3',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('z4',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('z5',1);
INSERT INTO tbl_emp(NAME,deptId) VALUES('w5',2);
INSERT INTO tbl_emp(NAME,deptId) VALUES('w6',2);
INSERT INTO tbl_emp(NAME,deptId) VALUES('s7',3);
INSERT INTO tbl_emp(NAME,deptId) VALUES('s8',4);
-- 內連線(查詢兩個表都存在的內容)
SELECT * FROM tbl_dept a INNER JOIN tbl_emp b ON a.id = b.deptId;
-- 左外連線(查詢join左邊表的全部內容)
SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId;
SELECT * FROM tbl_dept LEFT JOIN tbl_emp ON tbl_dept.id = tbl_emp.deptId;
SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId=b.id;
SELECT * FROM tbl_emp LEFT JOIN tbl_dept ON tbl_emp.deptId=tbl_dept.id;
-- 右外連線(查詢join右邊表的全部內容)
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id = b.deptId;
SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id;
-- 左連線(查詢只存在於join左邊表的內容)
SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId WHERE b.deptId IS NULL;
SELECT * FROM tbl_emp a LEFT JOIN tbl_dept b ON a.deptId = b.id WHERE b.id IS NULL;
-- 右連線(查詢只存在於join右邊表的內容)
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id = b.deptId WHERE a.id IS NULL;
SELECT * FROM tbl_emp a RIGHT JOIN tbl_dept b ON a.deptId = b.id WHERE a.deptId IS NULL;
-- 全連線(查詢倆張表的全部內容)
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id=b.deptId
UNION
SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId;
-- 兩張表中都沒有出現的資料集
SELECT * FROM tbl_dept a RIGHT JOIN tbl_emp b ON a.id=b.deptId WHERE a.id IS NULL
UNION
SELECT * FROM tbl_dept a LEFT JOIN tbl_emp b ON a.id=b.deptId WHERE b.deptId IS NULL;