更新時間:2021-01-08 17:39:11 來源:動力節點 瀏覽1688次
SQL join 用于根據兩個或多個表中的列之間的關系,從這些表中查詢數據。Join 和 Key有時為了得到完整的結果,我們需要從兩個或更多的表中獲取結果。我們就需要執行 join。下面我們一起來看看SQL的 7種join方式。
數據庫中的表可通過鍵將彼此聯系起來。主鍵(Primary Key)是一個列,在這個列中的每一行的值都是唯一的。在表中,每個主鍵的值都是唯一的。這樣做的目的是在不重復每個表中的所有數據的情況下,把表間的數據交叉捆綁在一起。
下面我們創建部門表tbl_dept和員工表tbl_emp對上述7種方式進行逐一實現:
部門表:主鍵id、部門名稱deptName,部門樓層locAdd
mysql> CREATE TABLE `tbl_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 DEFAULT CHARSET=utf8;
員工表:主鍵id,姓名name、所屬部門deptId
mysql> CREATE TABLE `tbl_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`)
-> #CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `tbl_dept` (`id`)
-> ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
然后插入一些測試數據:
mysql> INSERT INTO tbl_dept(deptName,locAdd) VALUES('技術部',11);
Query OK, 1 row affected (0.07 sec)
mysql> INSERT INTO tbl_dept(deptName,locAdd) VALUES('美工部',12);
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO tbl_dept(deptName,locAdd) VALUES('總裁辦',13);
Query OK, 1 row affected (0.06 sec)
mysql> INSERT INTO tbl_dept(deptName,locAdd) VALUES('人力資源',14);
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO tbl_dept(deptName,locAdd) VALUES('后勤組',15);
Query OK, 1 row affected (0.10 sec)
mysql> insert into tbl_emp(name,deptId) values('jack',1);
Query OK, 1 row affected (0.11 sec)
mysql> insert into tbl_emp(name,deptId) values('tom',1);
Query OK, 1 row affected (0.08 sec)
mysql> insert into tbl_emp(name,deptId) values('alice',2);
Query OK, 1 row affected (0.08 sec)
mysql> insert into tbl_emp(name,deptId) values('john',3);
Query OK, 1 row affected (0.13 sec)
mysql> insert into tbl_emp(name,deptId) values('faker',4);
Query OK, 1 row affected (0.10 sec)
mysql> insert into tbl_emp(name) values('mlxg');
Query OK, 1 row affected (0.13 sec)
mysql> select * from tbl_dept;
+----+----------+--------+
| id | deptName | locAdd |
+----+----------+--------+
| 1 | 技術部 | 11 |
| 2 | 美工部 | 12 |
| 3 | 總裁辦 | 13 |
| 4 | 人力資源 | 14 |
| 5 | 后勤組 | 15 |
+----+----------+--------+
5 rows in set (0.00 sec)
mysql> select * from tbl_emp;
+----+-------+--------+
| id | name | deptId |
+----+-------+--------+
| 1 | jack | 1 |
| 2 | tom | 1 |
| 3 | alice | 2 |
| 4 | john | 3 |
| 5 | faker | 4 |
| 7 | ning | NULL |
| 8 | mlxg | NULL |
+----+-------+--------+
7 rows in set (0.00 sec)
1、左連接(A獨有+AB共有)
查詢所有部門以及各部門的員工數:
mysql> select t1.id,t1.deptName,count(t2.name) as emps from tbl_dept t1 left join tbl_emp t2 on t2.deptId=t1.id group by deptName order by id;
+----+----------+------+
| id | deptName | emps |
+----+----------+------+
| 1 | 技術部 | 2 |
| 2 | 美工部 | 1 |
| 3 | 總裁辦 | 1 |
| 4 | 人力資源 | 1 |
| 5 | 后勤組 | 0 |
+----+----------+------+
5 rows in set (0.00 sec)
2、右連接(B獨有+AB共有)
查詢所有員工及其所屬部門:
mysql> select t2.id,t2.name,t1.deptName from tbl_dept t1 right join tbl_emp t2 on t2.deptId=t1.id;
+----+-------+----------+
| id | name | deptName |
+----+-------+----------+
| 1 | jack | 技術部 |
| 2 | tom | 技術部 |
| 3 | alice | 美工部 |
| 4 | john | 總裁辦 |
| 5 | faker | 人力資源 |
| 7 | ning | NULL |
| 8 | mlxg | NULL |
+----+-------+----------+
7 rows in set (0.04 sec)
3、內連接(AB共有)
查詢兩表共有的數據:
mysql> select deptName,t2.name empName from tbl_dept t1 inner join tbl_emp t2 on t1.id=t2.deptId;
+----------+---------+
| deptName | empName |
+----------+---------+
| 技術部 | jack |
| 技術部 | tom |
| 美工部 | alice |
| 總裁辦 | john |
| 人力資源 | faker |
+----------+---------+
4、A獨有
即在(A獨有+AB共有)的基礎之上排除B即可(通過b.id is null即可實現):
mysql> select a.deptName,b.name empName from tbl_dept a left join tbl_emp b on a.id=b.deptId where b.id is null;
+----------+---------+
| deptName | empName |
+----------+---------+
| 后勤組 | NULL |
+----------+---------+
5、B獨有
與(A獨有)同理:
mysql> select a.name empName,b.deptName from tbl_emp a left join tbl_dept b on a.deptId=b.id where b.id is null;
+---------+----------+
| empName | deptName |
+---------+----------+
| ning | NULL |
| mlxg | NULL |
+---------+----------+
6、A獨有+B獨有
使用union將(A獨有)和(B獨有)聯合在一起:
mysql> select a.deptName,b.name empName from tbl_dept a left join tbl_emp b on a.id=b.deptId where b.id is null union select b.deptName,a.name emptName from tbl_emp a left join tbl_dept b on a.deptId=b.id where b.id is null;
+----------+---------+
| deptName | empName |
+----------+---------+
| 后勤組 | NULL |
| NULL | ning |
| NULL | mlxg |
+----------+---------+
7、A獨有+AB公共+B獨有
使用union(可去重)聯合(A獨有+AB公共)和(B獨有+AB公共)
mysql> select a.deptName,b.name empName from tbl_dept a left join tbl_emp b on a.id=b.deptId union select a.deptName,b.name empName from tbl_dept a right join tbl_emp b on a.id=b.deptId;
+----------+---------+
| deptName | empName |
+----------+---------+
| 技術部 | jack |
| 技術部 | tom |
| 美工部 | alice |
| 總裁辦 | john |
| 人力資源 | faker |
| 后勤組 | NULL |
| NULL | ning |
| NULL | mlxg |
+----------+---------+
以上就是SQL的7種Join方式及其實現,其主要目的還是從MySQL數據庫的表中查詢相關的數據,根據不同的數據需要采用不同的join方式。想要深入學習MySQL的小伙伴抓緊來本站的MySQL教程開始學習吧!
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習