笔记237 SqlServer 中 Group by、having、order by、Distinct 使用注意事项 2013-4-14

笔记237 SqlServer 中 Group by、having、order by、Distinct 使用注意事项 2013-4-14

 1 --SqlServer 中 Group by、having、order by、Distinct 使用注意事项 2013-4-14
 2 
 3 
 4 SELECT COUNT(*) AS COUNT,REQUEST,METHOD FROM REQUESTMETH GROUP BY
 5 REQUEST,METHOD HAVING (REQUEST ='FC.OCEAN.JOB.SERVER.CBIZOZBKHEADER' OR REQUEST='FC.Ocean.Job.Server.CBizOzDocHeader')
 6 AND COUNT(*) >3
 7 ORDER BY REQUEST
 8 
 9 
10 --注意事项:--------------------------------------------------------------------
11 --
12 --HAVING后的条件不能用别名COUNT>3 必须使用COUNT(*) >3,否则报:列名 'COUNT' 无效。
13 --
14 --having 子句中的每一个元素并不一定要出现在select列表中  having只是group by之后再筛选
15 --但是Group by 子句中的每一个元素都要出现在select列表中
16 
17 
18 --如果把该语句写成:
19 
20 SELECT COUNT(*) AS COUNT,REQUEST,METHOD FROM REQUESTMETH GROUP BY
21 REQUEST ORDER BY REQUEST
22 
23 --那么将报:
24 --
25 --选择列表中的列 'REQUESTMETH.method' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
26 
27 
28 --注意:
29 --1、使用GROUP BY 子句时,SELECT 列表中的非汇总列必须为GROUP BY 列表中的项。
30 --(即select 中的字段必须为GROUP BY 列表中的项,如果select 中有字段的话)
31 --例如
32 SELECT COUNT(*) AS COUNT FROM [dbo].[CT_Append] GROUP BY [I_A_CardType] ORDER BY [I_A_CardType]
33 --2、分组时,所有的NULL值分为一组。
34 --3、GROUP BY 列表中一般不允许出现复杂的表达试、显示标题以及SELECT列表中的位置标号。
35 --
36 --
37 SELECT REQUEST,METHOD, COUNT(*) AS COUNT FROM REQUESTMETH GROUP BY
38 REQUEST,2 ORDER BY REQUEST 
39 
40 --错误信息为:每个 GROUP BY 表达式都必须包含至少一个列引用。
41 
42 
43 --GROUP BY 中使用 ORDER BY注意事项:---------------------------------------------
44 
45 SELECT COUNT(*) AS COUNT FROM REQUESTMETH GROUP BY REQUEST,METHOD ORDER BY REQUEST,METHOD
46 
47 --这样是允许的, ORDER BY后面的字段包含在GROUP BY 子句中
48 
49 SELECT COUNT(*) AS COUNTS FROM REQUESTMETH GROUP BY REQUEST ORDER BY COUNT(*) DESC
50 
51 --这样是允许的,ORDER BY后面的字段包含在聚合函数中,结果集同下面语句一样
52 
53 SELECT COUNT(*) AS COUNTS FROM REQUESTMETH GROUP BY REQUEST ORDER BY COUNTS DESC
54 
55 --这样是允许的,区别于HAVING,HAVING后不允许跟聚合函数的别名作为过滤条件
56 
57 
58 SELECT COUNT(*) AS COUNTS FROM REQUESTMETH GROUP BY REQUEST ORDER BY METHOD
59 
60 --这样是错误的:ORDER BY 子句中的列 "REQUESTMETH.method" 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
61 --既没有在select 中也没有在group by中
62 
63 --SELECT DISTINCT 中使用 ORDER BY注意事项:-----------------------------------
64 
65 SELECT DISTINCT BOOKID FROM BOOK ORDER BY BOOKNAME
66 
67 --以上语句将报:
68 
69 --如果指定了SELECT DISTINCT,那么ORDER BY 子句中的项就必须出现在选择列表中。
70 
71 --因为以上语句类似
72 
73 SELECT BOOKID FROM BOOK GROUP BY BOOKID ORDER BY BOOKNAME
74 
75 --其实错误信息也为:
76 
77 --ORDER BY子句中的列"BOOK.BookName" 无效,因为该列没有包含在聚合函数或GROUP BY 子句中。
78 
79 
80 --应该改为:
81 
82 SELECT DISTINCT BOOKID,BOOKNAME FROM BOOK ORDER BY BOOKNAME
83 SELECT DISTINCT BOOKID,BOOKNAME FROM BOOK
84 SELECT BOOKID,BOOKNAME FROM BOOK GROUP BY BOOKID,BOOKNAME
85 
86 --以上两句查询结果是一致的,DISTINCT的语句其实完全可以等效的转换为GROUP BY语句

 

posted @ 2013-08-04 19:49 桦仔 阅读(...) 评论(...)  编辑 收藏