数据库中on条件与where条件的区别

news/2024/7/23 19:47:19 标签: 数据库, sql, mysql

数据库中on条件与where条件的区别

标签:数据库

sql">mysql> SELECT  e.empno,ename,e.deptno,e.is_deleted FROM `emp_test` e ;
+-------+-------+--------+------------+
| empno | ename | deptno | is_deleted |
+-------+-------+--------+------------+
|     1 | 张三  |      1 |          0 |
|     2 | 李四  |      1 |          1 |
|     3 | 王五  |     10 |          0 |
+-------+-------+--------+------------+
3 rows in set (0.07 sec)

mysql> select * from dept;
+--------+--------+------+
| deptno | dname  | loc  |
+--------+--------+------+
|      1 | 开发部 | 北京 |
|      2 | 测试部 | 上海 |
|      3 | 市场部 | 广州 |
|      4 | 运营部 | 杭州 |
+--------+--------+------+
4 rows in set (0.06 sec)

where条件

sql">-- 因为e.is_deleted = 0再过滤条件中,所以不会出现再结果集中
mysql> SELECT e.empno,ename,e.deptno as edeptno,e.is_deleted,dname,d.deptno as ddeptno FROM `emp_test` e left join dept d on e.deptno = d.deptno where e.is_deleted = 0;
+-------+-------+---------+------------+--------+---------+
| empno | ename | edeptno | is_deleted | dname  | ddeptno |
+-------+-------+---------+------------+--------+---------+
|     1 | 张三  |       1 |          0 | 开发部 |       1 |
|     3 | 王五  |      10 |          0 | NULL   | NULL    |
+-------+-------+---------+------------+--------+---------+
2 rows in set (0.07 sec)

实现细节:

  1. 生成笛卡尔积

    sql">+-------+-------+---------+------------+---------+--------+
    | empno | ename | edeptno | is_deleted | ddeptno | dname  |
    +-------+-------+---------+------------+---------+--------+
    |     1 | 张三  |       1 |          0 |       1 | 开发部 |
    |     1 | 张三  |       1 |          0 |       2 | 测试部 |
    |     1 | 张三  |       1 |          0 |       3 | 市场部 |
    |     1 | 张三  |       1 |          0 |       4 | 运营部 |
    |     2 | 李四  |       1 |          1 |       1 | 开发部 |
    |     2 | 李四  |       1 |          1 |       2 | 测试部 |
    |     2 | 李四  |       1 |          1 |       3 | 市场部 |
    |     2 | 李四  |       1 |          1 |       4 | 运营部 |
    |     3 | 王五  |      10 |          0 |       1 | 开发部 |
    |     3 | 王五  |      10 |          0 |       2 | 测试部 |
    |     3 | 王五  |      10 |          0 |       3 | 市场部 |
    |     3 | 王五  |      10 |          0 |       4 | 运营部 |
    +-------+-------+---------+------------+---------+--------+
    
  2. 执行on子句(e.deptno = d.deptno)

    sql">+-------+-------+---------+------------+---------+--------+
    | empno | ename | edeptno | is_deleted | ddeptno | dname  |
    +-------+-------+---------+------------+---------+--------+
    |     1 | 张三  |       1 |          0 |       1 | 开发部 |
    |     2 | 李四  |       1 |          1 |       1 | 开发部 |
    +-------+-------+---------+------------+---------+--------+
    
  3. 执行join子句

    left join 会把左表中有on过滤后的临时表中没有的添加进来,右表用null填充

    right会把右表中有on过滤后的临时表中没有的添加进来,左表用null填充

    故将王五添加进来,并且右表填充null

    sql">+-------+-------+---------+------------+---------+--------+
    | empno | ename | edeptno | is_deleted | ddeptno | dname  |
    +-------+-------+---------+------------+---------+--------+
    |     1 | 张三  |       1 |          0 |       1 | 开发部 |
    |     2 | 李四  |       1 |          1 |       1 | 开发部 |
    |     3 | 王五  |      10 |          0 | NULL   | NULL    |
    +-------+-------+---------+------------+---------+--------+
    
  4. 执行where子句

    sql">+-------+-------+---------+------------+---------+--------+
    | empno | ename | edeptno | is_deleted | ddeptno | dname  |
    +-------+-------+---------+------------+---------+--------+
    |     1 | 张三  |       1 |          0 |       1 | 开发部 |
    |     3 | 王五  |      10 |          0 | NULL   | NULL    |
    +-------+-------+---------+------------+---------+--------+
    

on条件

-- empno=2因为不满足e.is_deleted = 0故不会连表,dept对应部分为null(只有完全满足连表条件才会连表)
mysql> SELECT e.empno,ename,e.deptno as edeptno,e.is_deleted,dname,d.deptno as ddeptno FROM `emp_test`e left join dept d on e.deptno = d.deptno and e.is_deleted = 0 ;
+-------+-------+---------+------------+--------+---------+
| empno | ename | edeptno | is_deleted | dname  | ddeptno |
+-------+-------+---------+------------+--------+---------+
|     1 | 张三  |       1 |          0 | 开发部 |       1 |
|     2 | 李四  |       1 |          1 | NULL   | NULL    |
|     3 | 王五  |      10 |          0 | NULL   | NULL    |
+-------+-------+---------+------------+--------+---------+
3 rows in set (0.10 sec)

实现细节:

  1. 生成笛卡尔积

    sql">+-------+-------+---------+------------+---------+--------+
    | empno | ename | edeptno | is_deleted | ddeptno | dname  |
    +-------+-------+---------+------------+---------+--------+
    |     1 | 张三  |       1 |          0 |       1 | 开发部 |
    |     1 | 张三  |       1 |          0 |       2 | 测试部 |
    |     1 | 张三  |       1 |          0 |       3 | 市场部 |
    |     1 | 张三  |       1 |          0 |       4 | 运营部 |
    |     2 | 李四  |       1 |          1 |       1 | 开发部 |
    |     2 | 李四  |       1 |          1 |       2 | 测试部 |
    |     2 | 李四  |       1 |          1 |       3 | 市场部 |
    |     2 | 李四  |       1 |          1 |       4 | 运营部 |
    |     3 | 王五  |      10 |          0 |       1 | 开发部 |
    |     3 | 王五  |      10 |          0 |       2 | 测试部 |
    |     3 | 王五  |      10 |          0 |       3 | 市场部 |
    |     3 | 王五  |      10 |          0 |       4 | 运营部 |
    +-------+-------+---------+------------+---------+--------+
    
  2. 执行on子句(e.deptno = d.deptno and e.is_deleted = 0)

    sql">+-------+-------+---------+------------+---------+--------+
    | empno | ename | edeptno | is_deleted | ddeptno | dname  |
    +-------+-------+---------+------------+---------+--------+
    |     1 | 张三  |       1 |          0 |       1 | 开发部 |
    +-------+-------+---------+------------+---------+--------+
    
  3. 执行join子句

    将被on条件过滤掉的李四和王五加回来,右表填充null

    +-------+-------+---------+------------+--------+---------+
    | empno | ename | edeptno | is_deleted | dname  | ddeptno |
    +-------+-------+---------+------------+--------+---------+
    |     1 | 张三  |       1 |          0 | 开发部 |       1 |
    |     2 | 李四  |       1 |          1 | NULL   | NULL    |
    |     3 | 王五  |      10 |          0 | NULL   | NULL    |
    +-------+-------+---------+------------+--------+---------+
    

sqlfromonjoinwhere_167">sql执行顺序之from>on>join>where

  1. 生成笛卡尔积

  2. 执行on子句过滤

  3. 执行join子句回填数据

    left join 回填被on过滤掉的左表数据,右表用null填充

    right join 回填被on过滤掉的右表的数据,左表用null填充

    inner join 不处理

sql_181">完整的sql执行顺序

from>on>join>where>group by>having>select>distinct>order by>limit

http://www.niftyadmin.cn/n/5411766.html

相关文章

曲线曲面 - 连续性, 坐标变换矩阵

连续性 有两种:参数连续性(Parametric Continuity)、几何连续性(Geometric Continuity)参数连续性: 零阶参数连续性,记为,指相邻两段曲线在结合点处具有相同的坐标 一阶参数连续性&…

【React】react的生命周期

react的生命周期 一、新生命周期1、挂载阶段1.1 constructor(1)在React组件挂载之前被调用(2) 初始化函数内部 state或者在this上挂载方法 1.2 getDerivedStateFromProps(1)为静态方法,不能访问…

Docker Register 搭建私有镜像仓库

1 安装 docker (1)更新软件源 sudo apt update (2)安装 docker 组件 sudo apt install docker.io (3)启动 docker 服务 sudo systemctl start docker (4)设置 docker 服务开机自启动 sudo systemctl enable docker (5)验证 docker 功能 sudo docker contai…

物联网安全|TrustAsia助力PSWG应对全球物联网产品安全合规挑战

万物互联时代,随着物联网连接数快速增长,物联网设备的潜在网络安全隐患也日益增长,可能导致设备故障、数据被盗、篡改、隐私泄露等问题的发生,甚至成为网络攻击的跳板,对互联网基础设施构成严重威胁。 我们看到&#…

Vue深度教程

一、Vue简介 1.简介 2.快速上手 二、基础 1.创建一个Vue应用 2.模板语法 3.响应式基础 4.计算属性 5.Class与 Style绑定 6.条件渲染 7.列表渲染 8.事件处理 9.表单输入绑定 10.生命周期钩子 11.侦听器 12.模板引用 13.组件基础 三、深入组件 1.组件注册 2.Props 3.组件事件 …

AJAX的学习笔记

前言 AJAX:全程Asynchronous JavaScript And XML 就是异步JS和XML 又称 阿贾克斯 通过AJAX可以在浏览器中向服务器发送异步请求,最大优点:无刷新获取数据 XML(现在已经被JSON取代了) XML 可扩展标记语言 用来传输和存储数据 …

云计算高级课程作业

1、openEuler 二进制方式安装MySQL 8.0.x。 2、备份数据库 3.备份数据库school到/backup目录 4.备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库 5.直接将MySQL数据库压缩备份 实验操作: 1、openEuler 二进制方…

安全先行,合规的内外网文件摆渡要重点关注什么?

内外网隔离在政府、军工部门、科研单位等已成为很常见的网络安全建设措施,内外网隔离是一种网络安全措施,用于保护内部网络免受外部网络的攻击和威胁。 内外网隔离的目的在于限制内外网之间的通信和数据交换,但网络隔离后,仍有数据…