两个方面:语法顺序和执行顺序 理解SQL语句执行原理
语法顺序
(1)SELECT[DISTINCT]
(2)FROM
(3)WHERE
(4)HAVING
(5)UNION
(6)ORDER BY
执行顺序
(1)FROM
(2)WHERE
(3)GROUP BY
(4)HAVING
(5)SELECT
(6)DISTINCT
(7)UNION
(8)ORDER BY
注意:
(1)FROM是sql语句执行的开始,作用是先将所有的数据从硬盘上(理解数据时保存在硬盘上的
文件中)读取到缓冲区中
然后再进行对缓冲区中的数据进行其他相关操作。
(2)SELECT执行的顺序比较靠后,应该说是在FROM和GROUP BY之后执行的;因此不能在
WHERE中设定别名的字段作为判断条件的原因。
举个简单查询的例子:
第一种写法:
SELECT ID AS A_ID FROM A
WHERE ID>10
第二种写法:
SELECT ID AS A_ID FROM A
WHERE A_ID>10
第一种写法使用A表中的原始ID字段名作为查询条件是正确的;而第二种写法使用A表中ID字段
的别名A_ID作为查询条件是不正确的,语句无法执行。
(3)UNION总是排在ORDER BY之前
分页方式实现总结
例子:每页显示第N(N>=2,默认N=1)页的Limit条数据,
(1) 采用top 方式实现
SELECT TOP Limit*from A
WHERE ID NOT IN(
SELECT TOP Limit*(N-1) ID from A
)
select top 10 *from PUB_USER
where USER_ID not in(
select top 20 USER_ID from PUB_USER
)
(2) 采用Max方式实现
SELECT TOP Limit *FROM A
WHERE ID>(
SELECT MAX(ID)AS TempID FROM
(
SELECT TOP Limit ID FROM A ORDER BY ID
)TempTable
)
SELECT TOP 10 *FROM PUB_USER
WHERE USER_ID>
(
SELECT MAX(USER_ID)AS ID FROM(
SELECT TOP 10 USER_ID FROM PUB_USER ORDER BY USER_ID
)TempTable
)
(3)采用Row_Number方式实现
N表示第几页,Limit表示每页显示多少条数据
SELECT *FROM(
SELECT ROW_NUMBER() OVER(ORDER BY ID)AS RowNumber
FROM A
)TempTable WHERE RowNumber BETWEEN Limit(N-1)+1 AND Limit*N
SELECT *FROM(
SELECT ROW_NUMBER() OVER(ORDER BY USER_ID)AS RowNumber
FROM PUB_USER
)TempTable WHERE RowNumber BETWEEN 21 AND 30
总结:以上几种实现分页查询的方式,以及性能表现能够看到,Row_Number()Over(Order by)
实现性能更佳,而且能够适应多表连接以及子查询。