版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012219371/article/details/85058925
一个完整的SQL查询如下:
SELECT DISTINCT column, AGG_FUNC(column_or_expression), …
FROM mytable
JOIN another_table
ON mytable.column = another_table.column
WHERE constraint_expression
GROUP BY column
HAVING constraint_expression
ORDER BY column ASC/DESC
LIMIT count OFFSET COUNT;
查询执行顺序:
1、FROM and JOINs
从from
和join
关键字得到要查询的表,比如这里是mytable
和another_table
,对这两个表进行笛卡儿积运算,生成临时表T1
2、ON
对临时表T1
进行ON
条件过滤生成临时表T2
3、OUTER,添加外连接行
这一步只有在连接为outer join
时才会发生,这里的工作主要是在临时表T2
的基础上添加保留表中被过滤条件过滤掉的数据,非保留表中的数据被赋予NULL
值,最后生成临时表T3
4、WHERE
对临时表T3
进行WHERE
条件过滤,生成临时表T4
5、GROUP BY
对临时表T4
进行分组操作,生成临时表T5
6、HAVING
对临时表T5
进行HAVING
条件过滤,生成临时表T6
7、SELECT
对临时表T6
进行SELECT
操作,生成临时表T7
注意: 这里有一个需要注意的点是别名的使用,如下SQL语句
select customer_id cid,email e,address a
from customer c
where c.cid='xxx'
由上可知该句SQL的执行顺序为from-->where-->select
,由于from
在where
前面执行,所以可以在where
中使用表的别名
,由于select
在where
的后面执行,所以不能在where
中使用列的别名
。该句SQL的正确写法为:
select customer_id cid,email e,address a
from customer c
where c.customer_id='xxx'
8、DISTINCT
对临时表T7
进行DISTINCT
操作,生成临时表T8
9、ORDER BY
对临时表T8
进行ORDER BY
操作,生成临时表T9
10、LIMIT / OFFSET
对临时表T9
进行LIMIT
或OFFSET
操作得到指定位置的数据,并返回结果集