Skip to content

Commit f9ed7f0

Browse files
author
Yanbin Zhu
committed
feat(*): sql执行顺序优化
1 parent 79d2a2f commit f9ed7f0

File tree

1 file changed

+58
-24
lines changed

1 file changed

+58
-24
lines changed

data/blog/backend/sql/exec_order.mdx

Lines changed: 58 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,81 @@
11
---
22
title: sql 语句执行顺序
3-
date: '2024-08-02'
3+
date: '2024-08-017'
44
tags: ['backend', 'sql']
5-
draft: false
65
summary: sql 语句执行顺序
76
---
87

9-
简要版:
10-
from:需要从哪个数据表检索数据。
11-
where:过滤表中数据的条件。
12-
group by:如何将上⾯过滤出的数据分组 。
13-
having:对上⾯已经分组的数据进⾏过滤的条件。
14-
select:查看结果集中的哪个列,或列的计算结果。
15-
order by :按照什么样的顺序来查看返回的数据。
8+
# 简要版:
9+
10+
1.from:需要从哪个数据表检索数据。
11+
12+
2.where:过滤表中数据的条件。
13+
14+
3.group by:如何将上⾯过滤出的数据分组 。
15+
16+
4.having:对上⾯已经分组的数据进⾏过滤的条件。
17+
18+
5.select:查看结果集中的哪个列,或列的计算结果。
19+
20+
6.order by :按照什么样的顺序来查看返回的数据。
1621

1722
先执行on,后执行where;on是建立关联关系在生成临时表时候执行,where是在临时表生成后对数据进行筛选的。
1823

19-
详细版:
20-
1.from
21-
2.on
22-
3.join
23-
4.where
24-
5.group by(开始使用select中的别名,后面的语句中都可以使用)
25-
6.avg,sum....
26-
7.having
27-
8.select
28-
9.distinct
29-
10.order by
30-
11.limit
24+
# 详细版:
25+
1.from (两表做笛卡尔积,生成临时表temp1)
26+
27+
2.on (根据条件对temp1进行筛选生成临时表temp2)
28+
29+
3.join (根据JOIN的类型不同来对虚表tmp2做行的增减,
30+
如果是LEFT (OUTER) JOIN就把上一步舍弃的左表的记录补回来,对应右表的数据用NULL填充;
31+
如果是RIGHT(OUTER) JOIN的话就把右表删除的记录补回来,
32+
同理FULL (OUTER) JOIN分别做类似的增加记录操作,
33+
但是(INNER) JOIN不会,
34+
所以这一步的操作主要针对的是OUTER JOIN。
35+
形成虚表temp3)
36+
37+
- 若 from 子句中的表数目多余两个表,那么就将temp3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终得到一个新的虚拟表 temp3。
38+
39+
4.where (应用where筛选器,对上一步生产的虚拟表引用where筛选器,生成虚拟表temp4)
40+
41+
5.group by(group by 子句将中的唯一的值组合成为一组,得到虚拟表temp5.开始使用select中的别名,后面的语句中都可以使用)
42+
43+
6.avg,sum.... (应用avg或者sum选项,为temp5生成超组,生成temp6.)
44+
45+
7.having (应用having筛选器,生成temp7。having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器)
3146

47+
8.select (将temp7中的在select中出现的列筛选出来,生成temp8)
3248

49+
9.distinct (做指定列的去重操作,生成temp9)
50+
51+
10.order by (指定的列进行排序,生成temp10)
52+
53+
11.limit (对已经做完各种操作后的结果集做限制输出)
54+
55+
56+
57+
# 写法注意点
3358
sql 语句大小写规范:
59+
3460
1.关键字,函数名全都大写;
61+
3562
2.数据库名,表名,字段名称全部小写
63+
3664
3.sql语句必须分号结尾
3765

66+
# 使用注意点
67+
1.inner join 和 outer join 的区别
68+
69+
2.INNER JOIN 只返回匹配的行,而 OUTER JOIN 返回所有行,包括匹配的行和不匹配的行。
70+
3871

39-
inner join 和 outer join 的区别
40-
INNER JOIN 只返回匹配的行,而 OUTER JOIN 返回所有行,包括匹配的行和不匹配的行。
4172

4273

4374

44-
quote:
75+
Quote:
76+
4577
https://blog.csdn.net/u014044812/article/details/51004754
78+
4679
https://juejin.cn/post/6850418117764628487?from=search-suggest
80+
4781
https://www.wandersky.org/program/sql-must-know/2022/10/05/2690/

0 commit comments

Comments
 (0)