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的区别

相关推荐
憧憬成为web高手17 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
yio_yin1 天前
Spring事务管理(数据一致性)
数据库·sql·spring
Csvn1 天前
📊 SQL 入门 Day 9:CTE(公用表表达式)— 让 SQL 像写代码一样优雅
后端·sql
虹科网络安全1 天前
艾体宝新闻|从 SQL 注入到服务器接管:CVE-2026-57517 暴露 Web 管理面板的供应链与安全编码风险
服务器·前端·sql
Databend1 天前
用 QUALIFY 写出更清晰的窗口函数 SQL
数据库·sql·数据分析
难寻安逸1 天前
DVWA-使用sqlmap 进行sql注入过程
数据库·sql·网络安全
Csvn2 天前
📊 SQL 入门 Day 8:集合操作 — 用 SQL 做数学里的"并交差"
后端·sql
Irene19912 天前
大数据开发的常见实践:把 SQL 直接写在 Shell 脚本里 ER图 数据血缘
sql·数据血缘·er
川石课堂软件测试2 天前
安全测试|常见SQL注入攻击方式、实例及预防
服务器·数据库·sql·功能测试·测试工具·安全·单元测试
qq_366086222 天前
sql 查询中关于 null 值判断的问题
数据库·sql