最近項目用到了幾次sql join查詢 來滿足銀行變態的需求;正好晚上自學時,看到了相關視頻,所以記錄下相關知識,下次再用時,根據如下圖片,便可知道 怎么寫sql;
注意點: 在join操作中的 on ... where ... 應該放哪些條件;目前理解 on 后放2表關聯部分;where后放最終數據篩選部分;
1.下圖為各種join操作的圖表解釋及sql語句
2.自測
- 建表:分別為 分數表(sc),及學生表(student);關系為 student.student_id=sc.id ;語句如下:
-
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for sc -- ---------------------------- DROP TABLE IF EXISTS `sc`; CREATE TABLE `sc` ( `id` int(11) NOT NULL, `score` int(255) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of sc -- ---------------------------- INSERT INTO `sc` VALUES (10, 40); INSERT INTO `sc` VALUES (11, 20); INSERT INTO `sc` VALUES (12, 30); SET FOREIGN_KEY_CHECKS = 1;
-
DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(11) NOT NULL, `student_id` int(11) NULL DEFAULT NULL, `name` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact; -- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES (0, 12, 'b'); INSERT INTO `student` VALUES (1, 11, 'a'); INSERT INTO `student` VALUES (3, 13, 'c'); SET FOREIGN_KEY_CHECKS = 1;
-
- 建表數據結果如下:
-
可以根據圖表中的sql 語句進行相關join查詢測試;
3.簡單測試2個結果:
測試第一個join 語句如下:
select student.student_id,sc.score from student LEFT JOIN sc on student.student_id=sc.id
結果為:
測試第二個join 語句如下:
select student.student_id,sc.score from student LEFT JOIN sc on student.student_id=sc.id WHERE sc.id is null
結果為:;解析:在 第一個語句的基礎上加上 WHERE sc.id is null ;只保留sc.id 為 nul的數據,而這個數據 只有 student 和 sc 非交集部分才有;
重點為 mysql 沒有 full outer join 或者 full join;導致 要想完成 圖中的 6,7部分,必須使用 圖中1和4 或 1和5 的 union 來實現;
測試第6個join 語句如下:
select student.student_id,sc.score from student left JOIN sc on student.student_id=sc.id UNION select student.student_id,sc.score from student RIGHT JOIN sc on student.student_id=sc.id
結果為:
測試第7個join 語句如下:
select student.student_id,sc.score from student left JOIN sc on student.student_id=sc.id WHERE sc.id is null UNION select student.student_id,sc.score from student RIGHT JOIN sc on student.student_id=sc.id WHERE student.student_id is null
結果為: