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

0.结论

  • 两个表在,join时,首先做一个笛卡尔积,on后面的条件是对这个笛卡尔积做一个过滤形成一张临时表,如果没有where就直接返回结果,如果有where就对上一步的临时表再进行过滤。

  • 先on,再join,再where

  • 在使用left join时,on和where条件的区别如下:

    • 1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

    • 2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉

1.数据准备

sql 复制代码
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.测试

sql 复制代码
-- 单表
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.四

9.参考

在join中,on和where的区别

相关推荐
tryCbest5 天前
数据库SQL学习
数据库·sql
cowboy2585 天前
mysql5.7及以下版本查询所有后代值(包括本身)
数据库·sql
努力的lpp5 天前
SQL 报错注入
数据库·sql·web安全·网络安全·sql注入
麦聪聊数据5 天前
统一 Web SQL 平台如何收编企业内部的“野生数据看板”?
数据库·sql·低代码·微服务·架构
山峰哥5 天前
吃透 SQL 优化:告别慢查询,解锁数据库高性能
服务器·数据库·sql·oracle·性能优化·编辑器
轩情吖5 天前
MySQL初识
android·数据库·sql·mysql·adb·存储引擎
james的分享5 天前
大数据领域核心 SQL 优化框架Apache Calcite介绍
大数据·sql·apache·calcite
阿寻寻5 天前
【数据库】sql的update语句怎么使用?
数据库·sql
小猿备忘录5 天前
【性能优化】人大金仓SQL优化实战:一条UPDATE语句从119分钟到2.68秒的蜕变
网络·sql·性能优化