1.SELECTDISTINCT
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
关键词 DISTINCT 用于返回唯一不同的值。
语法:
SELECT DISTINCT 列名称 FROM 表名称
2.Groupby CUBE 和 ROLLUP 之间的区别
CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
3.TOP 子句
1)TOP 子句用于规定要返回的记录的数目。
从上面的"Persons" 表中选取头两条记录
语法:
SELECTTOP 2 * FROM Persons
2)TOP PERCENT
返回总行数的百分比
上面的"Persons" 表中选取 50% 的记录
语法:
SELECT TOP 50PERCENT * FROM Persons
4. with ties
查询出最后一条数据额外的返回值
对于with ties一般是和Top ,order by相结合使用的,会查询出最后一条数据额外的返回值(解释:如果按照order by 参数排序TOP n(PERCENT)返回了前面n(pencent)个记录,但是n+1…n+k条记录和排序后的第n条记录的参数值(order by 后面的参数)相同,则n+1、…、n+k也返回。n+1、…、n+k就是额外的返回值)。
语法:
selecttop 3 with ties * from peopleinfo order by [name] desc
5. HAVING
指定组或聚合的搜索条件。HAVING只能与 SELECT 语句一起使用。HAVING 通常在 GROUP BY 子句中使用。如果不使用 GROUP BY 子句,则 HAVING 的行为与 WHERE 子句一样。
语法
SELECTcolumn_name, aggregate_function(column_name)
FROM table_name
WHEREcolumn_name operator value
GROUP BYcolumn_name
HAVINGaggregate_function(column_name) operator value
6. COMPUTE和 COMPUTE BY
生成合计作为附加的汇总列出现在结果集的最后。当与 BY 一起使用时,COMPUTE 子句在结果集内生成控制中断和小计。可在同一查询内指定 COMPUTE BY 和 COMPUTE。
语法
[ COMPUTE
]
7. UNION
将两个或更多查询的结果合并为单个结果集,该结果集包含联合查询中的所有查询的全部行。UNION 运算不同于使用联接合并两个表中的列的运算。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
UNION 语法
SELECTcolumn_name(s) FROM table_name1
UNION
SELECTcolumn_name(s) FROM table_name2
UNION和UNION ALL区别
1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
3、从效率上说,UNIONALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。
总结:UNION去重且排序,UNIONALL不去重不排序
8. EXISTS
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
语法
EXISTS subquery
实例:
SELECT ID,NAMEFROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID=B.AID)
9.Intersect
返回两个输入集的交集,可以选择保留重复项。
语法
1) 注:标准
Intersect(Set_Expression1 , Set_Expression2 [ , ALL ] )
2) 注:非标准
Set_Expression1
Intersect [ ALL ]
Set_Expression2
备注
Intersect 函数返回两个集的交集。 默认情况下,此函数会先删除两个集合中的重复项,然后再对这两个集合求交集。
可以使用可选的 ALL 标志来保留重复项。 如果指定了 ALL,Intersect 函数除了照常对非重复的元素求交集以外,还会对第一个集与第二个集中的重复项求交集。
示例
例如,Intersect({[1994],[1995], [1996]}, {[1995], [1996], [1997]}) 返回集 {[1995], [1996]}。
10.Except
计算两个集并删除第一个集中与第二个集中的元组重复的元组,也可以保留重复项。
语法
1)标准
Except(Set_Expression1,Set_Expression2 [, ALL ] )
2)非标准
Set_Expression1
Except [ALL ]
Set_Expression2
备注
如果指定了 ALL,该函数将保留在第一个集中找到的重复项,但仍会删除在第二个集中找到的重复项。成员的返回顺序与它们在第一个集中出现的顺序相同。
11.WAITFOR
在达到指定时间或时间间隔之前,或者指定语句至少修改或返回一行之前,阻止执行批处理、存储过程或事务。
语法
WAITFOR
{
| TIME 'time_to_execute'
}
实例:
WAITFOR TIME '22:20';------到指定时间
WAITFOR DELAY '02:00';-----时间间隔
12.GOTO
将执行流更改到标签处。跳过GOTO 后面的 Transact-SQL 语句,并从标签位置继续处理。GOTO 语句和标签可在过程、批处理或语句块中的任何位置使用。GOTO 语句可嵌套使用。
语法
Define the label:
label :
Alter the execution:
13.TRY...CATCH
对Transact-SQL 实现与 Microsoft Visual C# 和 Microsoft Visual C++ 语言中的异常处理类似的错误处理。Transact-SQL 语句组可以包含在 TRY 块中。如果 TRY 块内部发生错误,则会将控制传递给 CATCH 块中包含的另一个语句组。
语法
BEGIN TRY
END TRY
BEGIN CATCH
END CATCH
[ ; ]
ERROR_NUMBER() 返回错误号。
ERROR_SEVERITY() 返回严重性。
ERROR_STATE() 返回错误状态号。
ERROR_PROCEDURE() 返回出现错误的存储过程或触发器的名称。
ERROR_LINE() 返回导致错误的例程中的行号。
ERROR_MESSAGE() 返回错误消息的完整文本。该文本可包括任何可替换参数所提供的值,如长度、对象名或时间。
14.标量值函数
创建用户定义函数。这是一个已保存 Transact-SQL 或公共语言运行时 (CLR) 例程,该例程可返回一个值。用户定义函数不能用于执行修改数据库状态的操作。与系统函数一样,用户定义函数可从查询中调用。标量函数和存储过程一样,可使用 EXECUTE 语句执行。
语法
Scalar Functions
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ][ type_schema_name. ]parameter_data_type
)
RETURNS return_data_type
[ ; ]
实例:
USE AdventureWorks;
GO
IF OBJECT_ID (N'dbo.ufnGetInventoryStock', N'FN') IS NOT NULL
DROP FUNCTION ufnGetInventoryStock;
GO
CREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int)
RETURNS int
AS
-- Returns the stock level for the product.
BEGIN
DECLARE @ret int;
SELECT @ret = SUM(p.Quantity)
FROM Production.ProductInventory p
WHERE p.ProductID = @ProductID
AND p.LocationID = '6';
IF (@ret IS NULL)
SET @ret = 0;
RETURN @ret;
END;
GO
15.表值函数
用户定义表值函数返回table 数据类型。对于内联表值函数,没有函数主体;表是单个 SELECT 语句的结果集。
实例:
USE AdventureWorks;
GO
IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL
DROP FUNCTIONSales.ufn_SalesByStore;
GO
CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)
RETURNS TABLE
AS
RETURN
(
SELECT P.ProductID,P.Name, SUM(SD.LineTotal) AS 'YTD Total'
FROM Production.Product ASP
JOINSales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
JOINSales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
WHERE SH.CustomerID =@storeid
GROUP BY P.ProductID,P.Name
);
GO