T-Sql 学习(9) - 强大的Select

来源:互联网 发布:工商银行能办淘宝卡吗 编辑:程序博客网 时间:2024/06/05 01:17

 

1,普通选择
三种指定列别名的方法(ID为列名):
SELECT ID ii FROM Table_1
SELECT ID AS ii FROM Table_1
SELECT ii = ID FROM Table_1

2,计算字段
select PI()

3,select top n [PERCENT],可以选择top n或者n%
top和group by联合使用,会产生不可以预期的结果

4,派生表(逻辑表)
即:从from子句中使用select得到虚拟的表;
注意:虚拟表必须有别名
SELECT ID, name
FROM ( SELECT * FROM Table_1 ) A

派生表的功能非常类似于view(视图,下一节介绍)

5,连接,join
在inner连接时候,从句的顺序不会影响结果集合;但是outer连接可能会影响,尤其是在where子句中存

在不匹配连接的时候

6,谓词
谓词就是返回TRUE或者NOT TRUE的表达式
一些常见的谓词函数:
1)BETWEEN a AND b,即:[a,b]左右封闭区间;
2)LIKE 字符串的模糊比较:%任意多个字符,_一个字符,[ab]二选一,[^a]非;
3)EXIST 子查询是否有结果返回;
4)IN,某个值与列表中的每一个值进行比较,查看是否在其中;IN()可以使用枚举的值,也可以使用

select的结果集合;
5)ANY和ALL,专门用于子查询
IN和=ANY一样,NOT IN和<>ALL一样

7,子查询
嵌套查询。

相关子查询的效率要比自连接好。比如:select from ta where exists (select from ta where...),与之比较的是select from ta t1, ta t2 where ... 前者会进行优化:一旦发现满足条件的数据立即停止,而后者却会把所有的数据都进行匹配。尤其是当满足条件的数据非常多的时候,前者的性能优势会体现的非常明显。

8,聚集函数
前面曾经提到过。
COUNT(*)会把NULL计算在内,COUNT(col)则忽略NULL;其他的聚集函数都自动忽略NULL;
所有的这些聚集函数都有个参数,可以是:
ALL 或者 DISTINCT,以便决定是否忽略重复的值;
它常与GROUP BY以及HAVING联合使用;

9,GROUP BY和HAVING
1)Group By对表进行分组,Having来限制要返回的组;这就像where之于select一样;

2)**** **** ****
Select DISTINCT aa from ta;
Select aa from ta group by aa;
**** **** ****
二者的功能是完全一样的;

3)CUBE 和 ROLLUP
RollUp在结果集合中产生多个总计行(对group by关联的第一个字段的每一个值进行统计,最后全部数据进行一个统计),该行中某个列的GROUPING()检查结果为TRUE,可以根据这个来进行后续处理。如果结果集合中没有NULL结果的话,还可以使用ISNULL()来确定是不是该行属于总计行;从这个角度说,ISNULL()在这里扮演了GROUPING()同样的功能。


Cube会产生一个多维的结果,不止是一行,而是对每个group by的字段都进行统计,相当于全方位的总计,最后,当然还有一个总的总计。

4)having的限制作用是在查询产生之后才进行的,所以他的功能比where还要小;所以要尽量使用where

10,union
1)返回的列的名字,以第一个UNION之前的表的名字为准;
2)UNION ALL不处理重复行,而UNION处理重复行;如果表格比较大的话,这个过程会非常耗时;

11,order by
如果没有必须的要求,不要进行排序,因为比较耗时;

12,compute与rollup

在生成结果的总计时候,MS建议使用rollup来替代compute。

 

[后记]

关于where, group by, order by的顺序,今天搞明白了:首先使用where来过滤原始数据;然后进行分组、聚合等计算;最后的即将返回的结果集,进行order by。实际上,根据“查询的执行计划”就可以得到结果;和自己的分析是一致的。

根据这个顺序,也很容易理解,为什么列的别名只能在order by中使用,而where、group by、having都不行。 

原创粉丝点击