0.結論
-
兩個表在,join時,首先做一個笛卡爾積,on后面的條件是對這個笛卡爾積做一個過濾形成一張臨時表,如果沒有where就直接返回結果,如果有where就對上一步的臨時表再進行過濾。
-
先on,再join,再where
-
在使用left join時,on和where條件的區別如下:
-
1、on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
-
2、where條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉
-
1.數據準備
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class`
(`c_id` int DEFAULT NULL COMMENT '班級ID',`c_name` varchar(50) DEFAULT NULL COMMENT '班級名'
);DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`
(`s_id` int DEFAULT NULL COMMENT '學生ID',`s_name` varchar(50) DEFAULT NULL COMMENT '學生名',`c_id` int DEFAULT NULL COMMENT '班級ID'
);INSERT INTO `class` (`c_id`, `c_name`)
VALUES (1, '一班'),(2, '二班'),(3, '三班');INSERT INTO `student` (`s_id`, `s_name`, `c_id`)
VALUES (1, '張三', 1),(2, '李四', 2),(3, '王五', 4);
2.測試
-- 單表
select * from class c;
select * from student s;-- 笛卡爾積
select * from class c inner join student s order by c.c_id, s.s_id;-- 內連
select * from class c inner join student s on c.c_id = s.c_id order by c.c_id, s.s_id;-- 左外連(先on,再join,再where)
select * from class c left join student s on c.c_id = s.c_id order by c.c_id, s.s_id;
select * from class c left join student s on c.c_id = s.c_id and c.c_id <> 2 order by c.c_id, s.s_id;
select * from class c left join student s on c.c_id = s.c_id where c.c_id <> 2 order by c.c_id, s.s_id;
select * from class c left join student s on c.c_id = s.c_id and s.c_id <> 2 order by c.c_id, s.s_id;
select * from class c left join student s on c.c_id = s.c_id where s.c_id <> 2 order by c.c_id, s.s_id;