Mysql sql解析
Mysql sql解析
示例语句
1 | SELECT DISTINCT |
执行顺序
1 | 1 FROM <left_table> |
sql
1 | select |
流程分析
- 1.FROM: 将2个表联合查询得到他们的笛卡尔积CROSS JOIN,产生虚表VT1。
- 2.ON: 对虚表VT1进行ON筛选,只有那些符合的行才会被记录在虚表VT2中。
- 3.LEFT JOIN: 保留左表中未匹配的行就会作为外部行,添加到虚拟表VT2中,产生虚拟表VT3。
- 4.WHERE: 对虚拟表VT3进行WHERE条件过滤,只有符合的记录才会被插入到虚拟表VT4中。
- 5.GROUP BY: 根据GROUP BY子句中的列,对VT4中的记录进行分组操作,产生虚拟表VT5 。
- 6.HAVING: 对虚拟表VT5应用HAVING过滤,只有符合的记录才会被插入到虚拟表VT6中。
- 7.SELECT: 对SELECT子句中的元素进行处理,生成VT7表。
- 8.ORDER BY: 根据ORDER BY子句的条件对结果进行排序,生成VT8表。
- 9.LIMIT: LIMIT子句从上一步得到的VT8虚拟表 中选出从指定位置开始的指定行数据。
流程说明
单表查询:根据 WHERE 条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);
然后根据SELECT 的选择列选择相应的列进行返回最终结果。两表连接查询:对两表求积(笛卡尔积:行相乘、列相加)并用 ON 条件和连接连接类型进行过滤形成中间表;
然后根据WHERE条件过滤中间表的记录,并根据 SELECT 指定的列返回查询结果。多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,
直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。