MySQL中关于JOIN的用法全解
一、一張圖看懂 MySQL 的各種 JOIN 用法
二、準備表和數據,測試
1、創建兩個表測試
CREATE TABLE `forlan_class`(`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',`class_name` varchar(200) DEFAULT NULL COMMENT '班級名稱',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='班級信息表';CREATE TABLE `forlan_student`(`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',`student_name` varchar(200) DEFAULT NULL COMMENT '學生名稱',`class_type` bigint(20) NOT NULL DEFAULT -1 COMMENT '班級類型',PRIMARY KEY (`id`) USING BTREE,KEY `idx_class`(`class_type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='學生信息表';
2、插入forlan_class數據
±—±-----------+
| id | class_name |
±—±-----------+
| 1 | 初級班 |
| 2 | 中級班 |
| 3 | 高級班 |
| 4 | 大師班 |
| 5 | 成神班 |
| 6 | 神仙班 |
±—±-----------+
3、插入forlan_student數據
±—±-------------±-----------+
| id | student_name | class_type |
±—±-------------±-----------+
| 1 | 小偉 | 1 |
| 2 | 大偉 | 5 |
| 3 | 小明 | 2 |
| 4 | 小紅 | 3 |
| 5 | 小白 | 4 |
| 6 | 小黑 | 4 |
| 7 | 小燕 | 2 |
| 8 | 黑化 | 100 |
±—±-------------±-----------+
三、常用類型
1、內連接
四種方式:INNER JOIN、JOIN、WHERE、STRAIGHT_JOIN
SELECT * FROM forlan_student A INNER JOIN forlan_class B ON A.class_type=B.id;
SELECT * FROM forlan_student A JOIN forlan_class B ON A.class_type=B.id;
SELECT * FROM forlan_student A,forlan_class B WHERE A.class_type=B.id;
SELECT * FROM forlan_student A STRAIGHT_JOIN forlan_class B ON A.class_type=B.id;
±—±-------------±-----------±—±-----------+
| id | student_name | class_type | id | class_name |
±—±-------------±-----------±—±-----------+
| 1 | 小偉 | 1 | 1 | 初級班 |
| 3 | 小明 | 2 | 2 | 中級班 |
| 7 | 小燕 | 2 | 2 | 中級班 |
| 4 | 小紅 | 3 | 3 | 高級班 |
| 5 | 小白 | 4 | 4 | 大師班 |
| 6 | 小黑 | 4 | 4 | 大師班 |
| 2 | 大偉 | 5 | 5 | 成神班 |
±—±-------------±-----------±—±-----------+
7 rows in set (0.08 sec)
2、左連接:Left JOIN
SELECT * FROM forlan_student A LEFT JOIN forlan_class B ON A.class_type=B.id;
±—±-------------±-----------±-----±-----------+
| id | student_name | class_type | id | class_name |
±—±-------------±-----------±-----±-----------+
| 1 | 小偉 | 1 | 1 | 初級班 |
| 3 | 小明 | 2 | 2 | 中級班 |
| 7 | 小燕 | 2 | 2 | 中級班 |
| 4 | 小紅 | 3 | 3 | 高級班 |
| 5 | 小白 | 4 | 4 | 大師班 |
| 6 | 小黑 | 4 | 4 | 大師班 |
| 2 | 大偉 | 5 | 5 | 成神班 |
| 8 | 黑化 | 100 | NULL | NULL |
±—±-------------±-----------±-----±-----------+
8 rows in set (0.04 sec)
3、右連接:Right JOIN
SELECT * FROM forlan_student A RIGHT JOIN forlan_class B ON A.class_type=B.id;
±-----±-------------±-----------±—±-----------+
| id | student_name | class_type | id | class_name |
±-----±-------------±-----------±—±-----------+
| 1 | 小偉 | 1 | 1 | 初級班 |
| 3 | 小明 | 2 | 2 | 中級班 |
| 7 | 小燕 | 2 | 2 | 中級班 |
| 4 | 小紅 | 3 | 3 | 高級班 |
| 5 | 小白 | 4 | 4 | 大師班 |
| 6 | 小黑 | 4 | 4 | 大師班 |
| 2 | 大偉 | 5 | 5 | 成神班 |
| NULL | NULL | NULL | 6 | 神仙班 |
±-----±-------------±-----------±—±-----------+
8 rows in set (0.04 sec)
4、外連接
Mysql不支持Outer JOIN,有些地方叫Full JOIN
SELECT * FROM forlan_student A Full JOIN forlan_class B ON A.class_type=B.id WHERE A.Key IS NULL OR B.Key IS NULL;
采用(A LEFT JOIN B)UNION(A RIGHT JOIN B)
如果是3張以上表,以此類推
(A LEFT JOIN B LEFT JOIN C)UNION(A LEFT JOIN B RIGHT JOIN C)UNION(A RIGHT JOIN B RIGHT JOIN C)
說明:沒有all關鍵字,mysql會在查詢的時候給臨時表加上distinct的關鍵字
SELECT * FROM forlan_student A LEFT JOIN forlan_class B ON A.class_type=B.id
UNION
SELECT * FROM forlan_student A RIGHT JOIN forlan_class B ON A.class_type=B.id;
±-----±-------------±-----------±-----±-----------+
| id | student_name | class_type | id | class_name |
±-----±-------------±-----------±-----±-----------+
| 1 | 小偉 | 1 | 1 | 初級班 |
| 3 | 小明 | 2 | 2 | 中級班 |
| 7 | 小燕 | 2 | 2 | 中級班 |
| 4 | 小紅 | 3 | 3 | 高級班 |
| 5 | 小白 | 4 | 4 | 大師班 |
| 6 | 小黑 | 4 | 4 | 大師班 |
| 2 | 大偉 | 5 | 5 | 成神班 |
| 8 | 黑化 | 100 | NULL | NULL |
| NULL | NULL | NULL | 6 | 神仙班 |
±-----±-------------±-----------±-----±-----------+
9 rows in set (0.13 sec)
5、左連接-內連接
SELECT * FROM forlan_student A LEFT JOIN forlan_class B ON A.class_type=B.id WHERE B.id IS NULL;
±—±-------------±-----------±-----±-----------+
| id | student_name | class_type | id | class_name |
±—±-------------±-----------±-----±-----------+
| 8 | 黑化 | 100 | NULL | NULL |
±—±-------------±-----------±-----±-----------+
1 row in set (0.07 sec)
6、右連接-內連接
SELECT * FROM forlan_student A RIGHT JOIN forlan_class B ON A.class_type=B.id WHERE A.id IS NULL;
±-----±-------------±-----------±—±-----------+
| id | student_name | class_type | id | class_name |
±-----±-------------±-----------±—±-----------+
| NULL | NULL | NULL | 6 | 神仙班 |
±-----±-------------±-----------±—±-----------+
1 row in set (0.06 sec)
7、外連接-內連接
SELECT * FROM forlan_student A LEFT JOIN forlan_class B ON A.class_type=B.id WHERE B.id IS NULL
UNION
SELECT * FROM forlan_student A RIGHT JOIN forlan_class B ON A.class_type=B.id WHERE A.id IS NULL;
±-----±-------------±-----------±-----±-----------+
| id | student_name | class_type | id | class_name |
±-----±-------------±-----------±-----±-----------+
| 8 | 黑化 | 100 | NULL | NULL |
| NULL | NULL | NULL | 6 | 神仙班 |
±-----±-------------±-----------±-----±-----------+
2 rows in set (0.11 sec)
四、拓展
1、迪卡爾積:CROSS JOIN
將A,B表的每一條記錄拼在一起,如果A表有8條記錄,B表有6條記錄,笛卡爾積產生的結果就有8*6條記錄
SELECT * FROM forlan_student CROSS JOIN forlan_class;
SELECT * FROM forlan_student,forlan_class;
SELECT * FROM forlan_student INNER JOIN forlan_class;
SELECT * FROM forlan_student NATURE JOIN forlan_class;
SELECT * FROM forlan_student NATURA JOIN forlan_class;
±—±-------------±-----------±—±-----------+
| id | student_name | class_type | id | class_name |
±—±-------------±-----------±—±-----------+
| 1 | 小偉 | 1 | 1 | 初級班 |
| 1 | 小偉 | 1 | 2 | 中級班 |
| 1 | 小偉 | 1 | 3 | 高級班 |
| 1 | 小偉 | 1 | 4 | 大師班 |
| 1 | 小偉 | 1 | 5 | 成神班 |
| 1 | 小偉 | 1 | 6 | 神仙班 |
| 2 | 大偉 | 5 | 1 | 初級班 |
| 2 | 大偉 | 5 | 2 | 中級班 |
| 2 | 大偉 | 5 | 3 | 高級班 |
| 2 | 大偉 | 5 | 4 | 大師班 |
| 2 | 大偉 | 5 | 5 | 成神班 |
| 2 | 大偉 | 5 | 6 | 神仙班 |
| 3 | 小明 | 2 | 1 | 初級班 |
| 3 | 小明 | 2 | 2 | 中級班 |
| 3 | 小明 | 2 | 3 | 高級班 |
| 3 | 小明 | 2 | 4 | 大師班 |
| 3 | 小明 | 2 | 5 | 成神班 |
| 3 | 小明 | 2 | 6 | 神仙班 |
| 4 | 小紅 | 3 | 1 | 初級班 |
| 4 | 小紅 | 3 | 2 | 中級班 |
| 4 | 小紅 | 3 | 3 | 高級班 |
| 4 | 小紅 | 3 | 4 | 大師班 |
| 4 | 小紅 | 3 | 5 | 成神班 |
| 4 | 小紅 | 3 | 6 | 神仙班 |
| 5 | 小白 | 4 | 1 | 初級班 |
| 5 | 小白 | 4 | 2 | 中級班 |
| 5 | 小白 | 4 | 3 | 高級班 |
| 5 | 小白 | 4 | 4 | 大師班 |
| 5 | 小白 | 4 | 5 | 成神班 |
| 5 | 小白 | 4 | 6 | 神仙班 |
| 6 | 小黑 | 4 | 1 | 初級班 |
| 6 | 小黑 | 4 | 2 | 中級班 |
| 6 | 小黑 | 4 | 3 | 高級班 |
| 6 | 小黑 | 4 | 4 | 大師班 |
| 6 | 小黑 | 4 | 5 | 成神班 |
| 6 | 小黑 | 4 | 6 | 神仙班 |
| 7 | 小燕 | 2 | 1 | 初級班 |
| 7 | 小燕 | 2 | 2 | 中級班 |
| 7 | 小燕 | 2 | 3 | 高級班 |
| 7 | 小燕 | 2 | 4 | 大師班 |
| 7 | 小燕 | 2 | 5 | 成神班 |
| 7 | 小燕 | 2 | 6 | 神仙班 |
| 8 | 黑化 | 100 | 1 | 初級班 |
| 8 | 黑化 | 100 | 2 | 中級班 |
| 8 | 黑化 | 100 | 3 | 高級班 |
| 8 | 黑化 | 100 | 4 | 大師班 |
| 8 | 黑化 | 100 | 5 | 成神班 |
| 8 | 黑化 | 100 | 6 | 神仙班 |
±—±-------------±-----------±—±-----------+
48 rows in set (0.08 sec)
2、自然鏈接:NATURAL JOIN
自然連接就是USING子句的簡化版,找出兩個表中相同的列作為連接條件進行連接
SELECT * FROM forlan_student NATURAL JOIN forlan_class;
±—±-------------±-----------±-----------+
| id | student_name | class_type | class_name |
±—±-------------±-----------±-----------+
| 1 | 小偉 | 1 | 初級班 |
| 2 | 大偉 | 5 | 中級班 |
| 3 | 小明 | 2 | 高級班 |
| 4 | 小紅 | 3 | 大師班 |
| 5 | 小白 | 4 | 成神班 |
| 6 | 小黑 | 4 | 神仙班 |
±—±-------------±-----------±-----------+
6 rows in set (0.10 sec)
總結
以上是生活随笔為你收集整理的MySQL中关于JOIN的用法全解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 堆大小_适当的Java堆大小的
- 下一篇: jcmd:一个可以全部统治的JDK命令行