Mysql的执行顺序

97 阅读2分钟

Mysql的执行顺序详解

1、from 子句识别查询表的数据;

2、join on/union 用于连接多表数据;

3、where 子句基于指定的条件对记录进行筛选;

4、group by 子句将数据划分成多个组别,如按性别男、女分组(此时开始使用select中的别名,后面的语句都可以使用别名了);

5、有聚合函数时,要使用聚集函数进行数据计算(例如avg、sum等);

6、Having子句分组后的数据进行筛选;

7、执行select语句进行字段筛选

8、筛选重复数据(distinct);

9、对数据进行排序(order by);

10、执行limit进行结果限定。

SELECT DISTINCT column_name(s),avg(column_age)

FROM table1

JOIN table2

ON table1.column_name = table2.column_name

WHERE condition

GROUP BY column_name(s)

HAVING condition

ORDER BY column_name(s)

LIMIT number;

注意

  • SQL语句是从from开始执行,而不是从select。MySQL在执行SQL查询语句时,首先是将数据从硬盘加载数据缓冲区中,以便对这些数据进行操作;
  • Select是在from和group by 之后执行,这就导致了无法在where中使用select中设置的字段别名作为查询条件。
  • 聚合函数的计算在where子句之后,所以在where子句中就不能使用聚合函数;
  • Union是排在Order by 之前的,虽然数据库允许SQL语句对UNION段中的子查询或者派生表进行排序,但这并不能说明在union操作过后仍保持排序后的顺序。

就如以下SQL:

CREATE TABLE TEST(
id int,
name VARCHAR(10),
age int,
status int
)
INSERT into test values(1,'axl',10,1);
INSERT into test values(2,'axl',11,0);
INSERT into test values(3,'axl',12,1);

(select * from test WHERE name = 'axl' order by id DESC)
UNION
(SELECT * from test order by id desc);

执行结果为

image.png

可以看到不管是那一条sql的排序都没有成功生效。