常見連接類型
分類
本文中使用數據庫環境:MySQL 5.7
SQL joins 經典圖
準備SQL語句
CREATE TABLE `t_emp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`deptId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`) ,
KEY `fk_dept_id`(`deptId`)
)ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8;
CREATE TABLE `t_dept` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`deptName` varchar(30) DEFAULT NULL,
`locAdd` varchar(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8;
INSERT INTO t_dept(deptName,locAdd) VALUES('研發部', 21);
INSERT INTO t_dept(deptName,locAdd) VALUES('人力資源部', 22);
INSERT INTO t_dept(deptName,locAdd) VALUES('市場部', 23);
INSERT INTO t_dept(deptName,locAdd) VALUES('后勤部', 24);
INSERT INTO t_dept(deptName,locAdd) VALUES('總經辦', 25);
INSERT INTO t_emp(NAME, deptId) VALUES('張三', 1);
INSERT INTO t_emp(NAME, deptId) VALUES('李四', 1);
INSERT INTO t_emp(NAME, deptId) VALUES('王五', 1);
INSERT INTO t_emp(NAME, deptId) VALUES('趙六', 2);
INSERT INTO t_emp(NAME, deptId) VALUES('劉一', 2);
INSERT INTO t_emp(NAME, deptId) VALUES('錢七', 3);
INSERT INTO t_emp(NAME, deptId) VALUES('關八', 4);
INSERT INTO t_emp(NAME, deptId) VALUES('孫九', 51);
交叉連接(cross join)
交叉聯接也稱作笛卡爾積。交叉連接返回左表中的所有行,左表中的每一行與右表中的所有行組合。
實現方式:
(1)隱式交叉連接(沒有CROSS JOIN)
select * from t_dept td ,t_emp te ;
(2)顯式交叉連接
select * from t_dept td cross join t_emp te ;
結果:
笛卡爾積結果
內連接 (inner join)
內連接是最常用的連接操作。從數學的角度講就是求兩個表的交集;從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄。 一般內連接on條件都使用=,所以讓大家覺得內連接就是等值連接。
實現方式:
select * from t_dept td inner join t_emp te on td .id > te.id ;
結果:
備注:只是說明一個例子,可能沒有實際業務意義。
1.1.1.6. 等值連接 (equijoin)
等值連接是關系運算-連接運算的一種常用的連接方式。是條件連接(或稱θ連接)在連接運算符為“=”號時,即θ=0時的一個特例;等值連接是一種特殊內連接。
常見的實現方式:
select * from t_dept td inner join t_emp te on td .id = te.deptId ;
select * from t_dept td, t_emp te where td .id = te.deptId ;
select * from t_dept td join t_emp te on td .id = te.deptId ;
結果如下:
自然連接(natural join)
自然連接是一種特殊的等值連接,它要求兩個關系中進行比較的分量必須是相同的屬性組(字段),并且在結果中把重復的屬性列去掉。
實現方式:
select * from t_dept td natural join t_emp te
結果:
左連接(left join)
左連接的含義就是求兩個表左表和右表的交集外加左表剩下的數據。依舊從笛卡爾積的角度講,就是先從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表中剩余的記錄。
實現方式:
select * from t_dept td left join t_emp te on td .id = te.deptId ;
結果:
右連接
右連接RIGHT JOIN就是求兩個表左和右表的交集外加右表B剩下的數據。再次從笛卡爾積的角度描述,右連接就是從笛卡爾積中挑出ON子句條件成立的記錄,然后加上右表中剩余的記錄。
實現方式:
select * from t_dept td right join t_emp te on td .id = te.deptId ;
結果:
全連接
全外連接就是求兩個表A和B集合的并集。從笛卡爾積的角度講就是從笛卡爾積中挑出ON子句條件成立的記錄,然后加上左表中剩余的記錄,最后加上右表中剩余的記錄。另外MySQL不支持OUTER JOIN,但是我們可以對左連接和右連接的結果做 UNION 操作來實現。
實現方式:
select * from t_dept td left join t_emp te on td .id = te.deptId
union
select * from t_dept td right join t_emp te on td .id = te.deptId ;
結果:






