SQL Server2012开始,可以使用OFFSET......FETCH:
SELECT *FROM Student ORDER BY Score --分页通常必然伴随着排序
OFFSET 6 ROWS --略过6行
FETCH NEXT 3 ROWS ONLY --取其后的3行
表表达式:
子查询只能返回‘一列’的结果集,若要返回多列,需要表表达式;表表达式又称“表子查询”,可以理解为返回值为表的子查询,具体分为派生表,CTE,内联表值与视图;
在它们子查询上有共同要求:
1,每一列要求有列名,且唯一;
2,不保证排序,所以不能使用ORDER BY;
派生表:将子查询结果当做表来使用,直接放在外部查询FROM子句后面:
SELECT *FROM(
SELECT Id,
Id*2 AS DoubleId --计算列,加别名
FROM Student) ns --这个别名必须有,即使没有WHERE
WHERE ns.DoubleId>10 --WHERE子句使用子查询表别名ns
)
语法要求:派生表必须有表别名,且子查询必须是独立的;
派生表被SELECT出来后,只能使用一次,如果要反复使用表子查询结果,需要:
公用表表达式(CTE):最大优势,一次定义,多次使用,但CTE在批处理结束后会被销毁,想更长时间保留表子查询结果,需要视图;
一次可定义多个CTE:
WITH MethoudStudent --第一个CTE
AS (SELECT*FROM Student)
BastStudent --第二个CTE,不需要WITH
AS(SELECT*FROM Exam)
...... --还可继续创建CTE
一次定义,多次使用:
WITH MethoudStudent
AS(
SELECT*,Methoud(Enroll) AS EnrollMethoud FROM Student
)
SELECT *FROM MethoudStudent oms --第一次使用
WHERE Score=(
SELECT MAX(Score) FROM MethoudStudent ims --第二次使用
WHERE oms.EnrollMethoud=ims.EnrollMethoud
)