前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库中on条件与where条件的区别

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

作者头像
九转成圣
发布2024-04-10 18:34:07
570
发布2024-04-10 18:34:07
举报
文章被收录于专栏:csdncsdn

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

有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家

标签:数据库
代码语言:javascript
复制
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条件

代码语言:javascript
复制
-- 因为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)

实现细节:

生成笛卡尔积

代码语言:javascript
复制
+-------+-------+---------+------------+---------+--------+
| 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 | 运营部 |
+-------+-------+---------+------------+---------+--------+

执行on子句(e.deptno = d.deptno)

代码语言:javascript
复制
+-------+-------+---------+------------+---------+--------+
| empno | ename | edeptno | is_deleted | ddeptno | dname  |
+-------+-------+---------+------------+---------+--------+
|     1 | 张三  |       1 |          0 |       1 | 开发部 |
|     2 | 李四  |       1 |          1 |       1 | 开发部 |
+-------+-------+---------+------------+---------+--------+

执行join子句

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

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

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

代码语言:javascript
复制
+-------+-------+---------+------------+---------+--------+
| empno | ename | edeptno | is_deleted | ddeptno | dname  |
+-------+-------+---------+------------+---------+--------+
|     1 | 张三  |       1 |          0 |       1 | 开发部 |
|     2 | 李四  |       1 |          1 |       1 | 开发部 |
|     3 | 王五  |      10 |          0 | NULL   | NULL    |
+-------+-------+---------+------------+---------+--------+

执行where子句

代码语言:javascript
复制
+-------+-------+---------+------------+---------+--------+
| empno | ename | edeptno | is_deleted | ddeptno | dname  |
+-------+-------+---------+------------+---------+--------+
|     1 | 张三  |       1 |          0 |       1 | 开发部 |
|     3 | 王五  |      10 |          0 | NULL   | NULL    |
+-------+-------+---------+------------+---------+--------+

on条件

代码语言:javascript
复制
-- 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)

实现细节:

生成笛卡尔积

代码语言:javascript
复制
+-------+-------+---------+------------+---------+--------+
| 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 | 运营部 |
+-------+-------+---------+------------+---------+--------+

执行on子句(e.deptno = d.deptno and e.is_deleted = 0)

代码语言:javascript
复制
+-------+-------+---------+------------+---------+--------+
| empno | ename | edeptno | is_deleted | ddeptno | dname  |
+-------+-------+---------+------------+---------+--------+
|     1 | 张三  |       1 |          0 |       1 | 开发部 |
+-------+-------+---------+------------+---------+--------+

执行join子句

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

代码语言:javascript
复制
+-------+-------+---------+------------+--------+---------+
| empno | ename | edeptno | is_deleted | dname  | ddeptno |
+-------+-------+---------+------------+--------+---------+
|     1 | 张三  |       1 |          0 | 开发部 |       1 |
|     2 | 李四  |       1 |          1 | NULL   | NULL    |
|     3 | 王五  |      10 |          0 | NULL   | NULL    |
+-------+-------+---------+------------+--------+---------+

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

  1. 生成笛卡尔积
  2. 执行on子句过滤
  3. 执行join子句回填数据 left join 回填被on过滤掉的左表数据,右表用null填充 right join 回填被on过滤掉的右表的数据,左表用null填充 inner join 不处理

完整的sql执行顺序

代码语言:javascript
复制
from>on>join>where>group by>having>select>distinct>order by>limit
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据库中on条件与where条件的区别
    • 标签:数据库
    • where条件
    • on条件
    • sql执行顺序之from>on>join>where
    • 完整的sql执行顺序
    相关产品与服务
    数据库
    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档