> 技术文档 > SQL,在join中,on和where的区别_sql join where

SQL,在join中,on和where的区别_sql join 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  2order 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  2order 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  2order 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  2order by c.c_id, s.s_id;

2.1.普通

2.1.1.class单表

SQL,在join中,on和where的区别_sql join where

2.1.2.student单表

SQL,在join中,on和where的区别_sql join where

2.1.3.笛卡尔积

SQL,在join中,on和where的区别_sql join where

2.1.4. 内连接

SQL,在join中,on和where的区别_sql join where

2.2.5.普通外连

SQL,在join中,on和where的区别_sql join where

2.2.重点来啦-外连接

2.2.1.一

SQL,在join中,on和where的区别_sql join where

2.2.2.二

SQL,在join中,on和where的区别_sql join where

2.2.3.三

SQL,在join中,on和where的区别_sql join where

2.2.4.四

SQL,在join中,on和where的区别_sql join where

9.参考

在join中,on和where的区别