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命令行
