T-SQL查询学习笔记——TOP子句

在select查询或表表达式中,top结合order by子句用于限制按order by顺序优先返回的结果
在2000中,只能使用常量制定该限制,而2005中支持在top中使用任意的独立表达式,而不仅仅是常量

例子:
SELECT TOP(3) OrderID, CustomerID, OrderDate
FROM dbo.Orders
ORDER BY OrderDate DESC, OrderID DESC;


SELECT TOP(1) PERCENT OrderID, CustomerID, OrderDate
FROM dbo.Orders
ORDER BY OrderDate DESC, OrderID DESC;
GO

因为Sql Server 2005支持把任意独立表达式作为TOP的输入,所以表达式必须被包含在圆括号内。为了向后兼容,仍然支持在select top查询中使用常量时可以不带圆括号

[color=blue]Top和确定性[/color]
Top查询并不一定要有Order by字句,然而这样的查询具有不确定性。也就是说,对相同的数据运行两次同样的查询,可能会产生不同的结果。

使用不带order by子句的select top查询的理由:
1、用select top查询快速预览表的结构或列名称
2、用select top(0)创建一个与另一个表或查询具有相同结构的空表

[color=blue]Top和输入表达式[/color]

DECLARE @n AS INT;
SET @n = 2;

SELECT TOP(@n) OrderID, OrderDate, CustomerID, EmployeeID
FROM dbo.Orders
ORDER BY OrderDate DESC, OrderID DESC;

[color=blue]Top和修改[/color]

Sql Server不支持在数据修改语句中使用order by子句,即使使用了top选项也是如此,所以它不能依赖于排序。Sql Server只影响正好先访问到的指定行数

新增:
Insert top(100) into target_table select col1,col2,col3 from source_table

删除:
DELETE TOP(100) FROM dbo.LargeOrders

修改:
UPDATE TOP(5000) dbo.LargeOrders
SET CustomerID = N'ABCDE'
WHERE CustomerID = N'OLDWO';

变相排序
新增:
insert into target_table
select top(10) col1,col2,col3 from source_table order by col1;
删除:
with cte_del as
(
select top(10) * from some_table order by col1
)
delete from cte_del
修改:
with cte_upd as
(
select top(10) * from some_table order by col1
)
update cte_del set col2=col2+1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值