1. 程式人生 > >5分鐘學會MySql的那些左連線、左外連線、內連線等等

5分鐘學會MySql的那些左連線、左外連線、內連線等等

首先,我們新建兩個表(員工表,和部門表)

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.deptId 
UNION 
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 NULL 
UNION
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;