0.结论两个表在,join时,首先做一个笛卡尔积,on后面的条件是对这个笛卡尔积做一个过滤形成一张临时表,如果没有where就直接返回结果,如果有where就对上一步的临时表再进行过滤。先on,再jo
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;
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有什么区别
相关文章:
-
-
你是不是在安装sql server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也同样折磨我。在上c#课程时候,要求使用sql server来进行数据库实验。在本…
-
SQL实现字段替换的示例详解
在sql中,替换字段值可以使用不同的函数,具体取决于所使用的数据库管理系统(dbms)。在大多数常见的dbms中,比如mysql、postgresql、sql ...
[阅读全文]
-
-
-
今天我的数据同步脚本报错了检查postgresql服务发现无法启动于是便有了这篇记录,算是日志吧,把我的排查过程、解决思路记录一下1、检查端口检查服务端口是否被占用,在命令提示符中…
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论