SQL join中on和where的区别解析
目录
- 0.结论
- 1.数据准备
- 2.测试
- 2.1.普通
- 2.1.1.class单表
- 2.1.2.student单表
- 2.1.3.笛卡尔积
- 2.1.4. 内连接
- 2.2.5.普通外连
- 2.2.重点来啦-外连接
- 2.2.1.一
- 2.2.2.二
- 2.2.3.三
- 2.2.4.四
- 3.参考资料
0.结论
- 两个表在,joandroidin时,首先做一个笛卡尔积,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'android, `s_name` varchar(50) DEFAULT NULL COMMENT '学生名', `c_id` int DEFAULTandroid 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 classhttp://www.devze.com 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;
2.1.普通
2.1.1.class单表
2.1.2.student单表
2.1.3.笛卡尔积
2.1.4. 内连接
2.2.5.普通外连
2.2.重点来啦-外连接
2.2.1.一
2.2.2.二
2.2.3.三
2.2.4.四
3.参考资料
SQL语句中LEFT JOIN的ON和WHERE有什么区别
精彩评论