T-SQL 语句的理解
1、T-SQL中各子句在逻辑上按照以下顺序进行处理
1、 FROM 2、 WHERE 3、 GROUP BY 4 、HAVING 5、 SELECT 6、ORDER BY
查询实例:
1 SELECT EMPID, YEAR(ORDERDATE) AS ORDERYEAR, COUNT(*) AS NUMBERORDERS 2 FROM SALES.ORDERS 3 WHERE CUSTID=71 4 GROUP BY EMPID,YEAR(ORDERDATE) 5 HAVING COUNT(*)>1 6 ORDER BY EMPID,ORDERYEAR
2、WHERE 阶段只返回让逻辑表达式为TRUE的那些行,不过。要时刻记住 T-SQL 使用的是 三值谓词逻辑 ,所以逻辑表达式的结果可以为 TRUE, FALSE, UNKNOWN。在三值逻辑中,“返回TRUE" 与 ”不返回FALSE“ 并不完全一样。如果要WHERE 阶段返回逻辑表达式计算结果为 TRUE 的行,就不会反悔逻辑表达式计算结果为FALSE 或UNKNOWN 的那些行。
3、GROUP BY 将WHERE 中查询到的行 按”组“进行组合。如果涉及到分组,那么GROUP BY 阶段之后的所有阶段(包括HAVING SELECT 以及GROUP BY )的操作对象将是组。
4、聚合函数(COUNT,SUM,AVG,MIN,MAX)所有的聚合函数都会忽略 NULL值 只有一个例外 COUNT(*)。
5、DISTINCT 排除重复 唯一关键字
6、OVER 子句,为行定义一个窗口,以便进行特定运算。可以把行的窗口简单地认为是运算符要操作的一个行的集合。
7、T-SQL 中支持的谓词: IN BETWEEN LIKE
IN 用于检查一个值(或标量表达式)是否与一组元素中的至少一个相等
8、查询 NULL 用
REGION IS NULL 而不能用 REGION = NULL
9、同时操作概念:即在同一逻辑查询处理阶段中出现的所有表达式都是同时进行计算。
10、[^<字符列或范围>]通配符 例如 ‘[^A-E]’表示 不属于 A-E
表示不属于指定字符列或范围内的任意单个字符。
11、表运算符: JOIN APPLY PIVOT UNPIVOT
JOIN 对两个表进行操作:联接有三种基本类型 交叉联接 内联接 外联接
交叉联接 -> 笛卡儿积
内联接-> 笛卡儿积,过滤
外联接->笛卡儿积,过滤,添加外部行
内联接:先进行笛卡儿积运算,INNER JOIN 为默认连接方式,可直接用JOIN 关键字在 ON 条件后进行过滤。
12、外联接: LEFT(OUTER) JOIN (左保留),RIGHT(OUTER) JOIN(右保留),FULL(OUTER) JOIN(都保留)
外联接会应用内联接所应用的两个逻辑处理步骤(笛卡尔积和ON过滤)此外还多加一个外联接特有的第三部。添加外部行。
ON 子句中的过滤条件不是最终的,换句话说,ON 子句中的条件并不能最终决定保留表中部分行是否会在结果中出现,而只是判断是否能够匹配另一边表中的某些行。
13、辅助表的建立:
SET NOCOUNT ON; USE 数据库名; IF OBJECT_ID('NUMS','U') IS NOT NULL DROP TABLE NUMS; CREATE TABLE NUMS(N INT NOT NULL PRIMARY KEY); DECLARE @I AS INT=1; BEGIN TRAN WHILE @I<=10000 BEGIN INSERT INTO NUMS VALUES(@I); SET @I=@I+1; END COMMIT TRAN SET NOCOUNT OFF;
14、先对两个表执行外联接,再和第三个表执行内联接。如果在内联接ON 子句中的条件是对来自外联接非保留表的列和第三个表的列进行比较,那么所有的外不行就会被过滤掉。
15、如果标量表达式的值与子查询返回值中的任何一个值相等,IN 谓词的计算结果就为 TRUE
16、EXISTS 谓词返回 TRUE的结果:它的输入时一个子查询,如果子查询能够返回任何行,该谓词则返回TRUE 否则返回 FALSE
EXISTS 使用的是二值逻辑。
17、开窗函数 OVER()
调用格式 函数名(列) OVER(选项)
COUNT(*) OVER() 对于查询结果的每一行都返回所有符合条件的行的条数。若OVER 关键字后括号为空,则开窗函数会对结果集中所有行进行聚合运算。
//例 SELECT FNAME,FCITY,FAGE,FSALARY, COUNT(*) OVER(PARTITION BY FCITY)//表示对结果集按 FCITY 进行分区 FROM T_PERSON
18、DISTINCT 必须放在开头,作用于单列的话,去除重复,作用多列的话,必须多列都不同才会被去除。