多个inner join执行顺序(mysql的关键词执行顺序)
本文目录
- mysql的关键词执行顺序
- sql中用join连接3个表有顺序吗
- 查询的顺序,是先left join还是先inner join
- **L语句中表的先后顺序由什么决定
- inner join 顺序问题
- sql中left join on 和where的执行顺序
- **L语句到底是怎么执行的
- inner join多表关联的时候,表联接的先后顺序对效率有影响吗
mysql的关键词执行顺序
①From:对from左边的表和右边的表计算笛卡尔积,产生虚拟表c1()
②On:对c1中的数据进行on过滤,只有符合过滤条件的数据记录才会记录在虚拟表c2中
③Join:若指定了连接条件(left、right),主表中的未匹配的行就会作为外部行添加到c2中,生成虚拟表c3
④Where:对虚拟表c3中的数据进行条件过滤,符合过滤条件的记录插入到虚拟表c4中
⑤Group by:根据group by子句中的列,对c4中的记录进行分组操作,生成c5
⑥Having:对虚拟表c5中的记录进行having过滤,符合筛选条件的记录插入虚拟表c6中
⑦Select:执行select操作,选择指定的列,插入到虚拟表c7中
⑧Distinct:对c7中的数据去重,生成虚拟表c8
⑨Order by:对虚拟表c8中的数据按照指定的排序规则进行排序,生成虚拟表c9
⑩Limit:取出指定的记录,产生虚拟表c10,将结果返回
上面是我看他们博客都这样写的!但是我觉得不适合我理解。可能是我太菜,我就以我写的sql理解下执行过程。
1、首先是找到from字段和join字段后面的所有表,形成笛卡尔积。student、English、class形成笛卡尔积。
2、然后是哪种(inner、join、right)join并且根据on字段对笛卡尔积做改变(这个改变因on改变行的条数,因为join类型去重某些行和置空某些列)。
3、是根据where字段去再次筛选上步得到的笛卡尔积。
4、然后group by去分组。
5、之后select 列结构(列结构就此不变)
6、因为distinct只能对单个列字段去重,所以肯定的在select后再去执行(行结构就此不变)。
7、order by是排序,能排序就说明整个表的行的条数不会发生改变了。
8、limit字段是最后从上面结果选一部分出去。
执行顺序只是相对的,在mysql优化器语法分析器分析优化的时候会给我们优化,在保证语义不变的情况下,进行语义等价转换。所以上面的顺序只是一般情况下可以这样分析。
sql中用join连接3个表有顺序吗
sql中用join连接3个表没有顺序参考以下原因
如果只是join(即内连接,等同于inner join),则这里表的顺序是没有要求的,但如果是left join或right join则是有顺序要求的
查询的顺序,是先left join还是先inner join
inner join(等值连接) 只返回两个表中联结字段相等的行
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
INNER JOIN 语法:
INNER JOIN 连接两个数据表的用法:
SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号
INNER JOIN 连接三个数据表的用法:
SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号
INNER JOIN 连接四个数据表的用法:
SELECT * FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号
INNER JOIN 连接五个数据表的用法:
SELECT * FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表5 ON Member.字段号=表5.字段号
**L语句中表的先后顺序由什么决定
如果写join 系统默认 的是 inner join 内连接,就是完全匹配的意思,这个就没有先后顺序,哪个写前面都一样, 如果是 left join 左连接 ,就是已前面一个表即 左边的表为 基础,左边的数据会全部保留,如果右边没有匹配的则 对应字段 补null right join 则相反
inner join 顺序问题
在**L里面两个语句应该是一样的效果呀,VFP里面要怪一点,与当前工作区有关:
下面的语句能输出数据:
select stock_sl
select stock_name.股票简称,stock_sl.现价,stock_sl.买入价,stock_sl.持有数量;
from stock!stock_name inner join stock!stock_sl ;
on stock_name.股票代码=stock_sl.股票代码
sql中left join on 和where的执行顺序
(8)SELECT (9)DISTINCT (11)《Top Num》 《select list》
(1)FROM
(3)《join_type》 JOIN 《right_table》
(2)ON 《join_condition》
(4)WHERE 《where_condition》
(5)GROUP BY 《group_by_list》
(6)WITH 《CUBE | RollUP》
(7)H**ING 《having_condition》
(10)ORDER BY 《order_by_list》
逻辑查询处理阶段简介
FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1
ON:对VT1应用ON筛选器。只有那些使《join_condition》为真的行才**入VT2。
OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
WHERE:对VT3应用WHERE筛选器。只有使《where_condition》为true的行才**入VT4.
GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.
CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.
H**ING:对VT6应用H**ING筛选器。只有使《having_condition》为true的组才会**入VT7.
SELECT:处理SELECT列表,产生VT8.
DISTINCT:将重复的行从VT8中移除,产生VT9.
ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).
TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。
**L语句到底是怎么执行的
下面先给出上面的**L语句的执行顺序,然后进行讲解:
(8) select
(9) distinct
(11) top 1
(6) Table1.id,COUNT(Table1.name) as nameCount
(1) from Table1
(3) inner join Table2
(2) on Table1.id=Table2.id
(4) where Table1.id《4
(5) group by Table1.id
(7) having Table1.id《3
(10) order by Table1.id desc
红色序号给出了执行的顺序:
(1)from:对Table1和Table2执行笛卡尔积,也就是两个表的行的各种组合,共5*5=25行,生成虚拟表VT1
(2)on:选择VT1中的那些Table1.id=Table2.id的所有行,生成虚拟表VT2。
(3)inner join:这里是内部连接,直接就是VT2,如果是outer join,如left join、right join、full join,那么还需要按照外部连接的规则,把VT1中没有匹配的行添加到VT2,生成VT3.
(4)where:选出VT3中Table1.id《4的表格,给虚拟表VT4.
(5)group by:按照Table1.id进行分组。
(6)COUNT:执行聚合函数,选出对应Table1.id的行数,生成的结果给虚拟表VT5
(7)having:选择VT5中Table1.id《3的所有结果,给虚拟表VT6
(8)select:选择VT6中相应的列,给虚拟表VT7
(9)distinct:将VT7中重复的行去除,生成VT8
(10)order by:将VT8的结果按照Table1.id进行排序,这里没有生成一个新的表VT9,而是生成游标VC9。
(11)top:从游标VC9的开始处选择指定的行数,这里是1行,生成虚拟表VT10.
经过上面的过程,最终的**L语句将VT10返回给用户使用。
所以以后再写**L语句的时候,可以按照上面的顺序写**L语句了,读**L语句也可以按照上面的顺序去读,做到心里明白。
inner join多表关联的时候,表联接的先后顺序对效率有影响吗
你好,据我了解是没有影响的。影响效率的是你是否选对了合适的列做关联,相应的列上是不是有适合的索引。
更多文章:
channel attention(深度学习attention map的中文意思是什么)
2026年4月12日 15:00
怎样把字符串转化成数组(vue.js怎么把字符串转化为数组)
2026年4月12日 14:00
文本编辑器quick(kate文本编辑器有verilog高亮定义么)
2026年4月12日 13:40
多个inner join执行顺序(mysql的关键词执行顺序)
2026年4月12日 13:20
dmesg命令(linux中的dmesg命令输出的内容是从哪个文件里面获取的)
2026年4月12日 13:00






