SQL,在join中,on和where的区别
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;