多语言展示
当前在线:1044今日阅读:26今日分享:39

SQL Server查询数据之分组查询

数据分组是指将数据表中的数据按照某种值分为很多组。例如,将STUINFO表中的数据用性别进行分组,会得到两组:所有男生为一组,所有女生为一组。数据分组使用GROUP BY子句,当然,如果想要将满足条件的分组查询出来,还需要HAVING子句的配合。
工具/原料

SQL Server

方法/步骤
1

1.1、将表内容按列分组GROUP BY子句:用来对数据分组。分组是根据指定字段的不同值划分的。示例:将STUINFO表中的数据,按所属专业字段分组。

2

1.2、技巧:前面讲过去除相同值,需要使用DISTINCT关键字。但是,使用DISTINCT会严重降低查询效率,为此,使用GROUP BY子句代替DISTINCT是一种非常好的解决方案。这里需要说明的一点是,如果将上面的SELECT子句字段列表中的“所属院系”改为星号(*),则会产生一系列的错误。SELECT  *FROM  STUINFOGROUP BY STUMAJOR

3

1.3、通过错误提示得到如下启示,如果查询语句有GROUP BY子句,则:● SELECT子句中通常不单独使用星号通配符。如果非要单独使用星号通配符,则应当在GROUP BY子句中列出表的所有字段名,字段名之间用逗号分隔。不过这样会使GROUP BY子句失去它的作用。因为,此时并不是按单个字段分组,而是使用GROUP BY后列出的所有字段的组合分组。● 如果SELECT子句后是字段名列表,而这些字段名又不在聚合函数中,则应当在GROUP BY子句中列出所有这些字段名。此时,需要注意的还有,分组是按GROUP BY后的所有字段的组合分组,而并非是按单个字段分组。例如,“GROUP BY depart,sname”表示只有某几个记录中的所属院系和姓名都相同时才把这些记录分为一组。

4

2、聚合函数与分组配合使用示例1:统计STUINFO表中男生的总人数和女生的总人数。示例2:统计STUINFO表中每个专业的女生人数。

5

3.1、 查询数据的直方图直方图是表示不同实体之间数据相对分布的条状图。在一个查询语句中使用GROUP BY子句,不仅可以查询数据,而且可以格式化数据生成图表。示例:从STUINFO表中,查询一个表示每个专业学生人数的直方图。

6

3.2、REPLICATE函数是SQL Server的字符函数。作用是以指定的次数重复字符表达式。本例中,它以人数5倍为次数,重复了等号(=)。这里使用人数的5倍是为了让图表更明显一些,如果人数非常多,图表很大,可以用某个常量除人数,例如COUNT(*)/5等。

7

4、 排序分组结果如果想排序分组结果,则应当使用ORDER BY子句。ORDER BY子句要放在GROUP BY子句的后面。实际上,ORDER BY子句永远要放在其他子句的后面。示例:在STUINFO表中统计每个专业的学生人数,并按学生人数降序排序。

8

5.1、 反转查询结果示例:从STUINFO表中查询每个专业的男生人数和女生人数。

9

5.2、从上面的查询结果虽然将统计数据查询了出来,但还不够完美。这里由于表中的数据表较少,还看不出太明显的效果,如果要查询出每一个专业中男生是多少人、女生是多少人,在学习SQL语句时要学会灵活运用,CASE表达式和GROUP BY子句联合使用会得到很多有用的数据表示,其中就包括反转查询结果的数据表示,具体语句如图。 这样就巧妙地利用了COUNT函数忽略NULL值的规则,将数据反转了过来。

10

6.1、使用HAVING子句设置分组查询条件查看想要的分组的统计信息,而并不是所有分组的统计信息。HAVING子句用于设置分组查询条件,即过滤不需要的分组。该子句通常和GROUP BY子句一起使用。单独使用HAVING子句没有太大的意义。示例:在STUINFO表中统计计算机专业和会计专业的学生人数,并按学生人数降序排序。

11

6.2、本例也可以用WHERE子句代替HAVING子句:

12

6.3、小结注意:HAVING子句与WHERE子句之后都写条件表达式,而且都会根据条件表达式的结果筛选数据。但它们是有区别的,主要区别如下。● HAVING子句用于筛选组,而WHERE子句用于筛选记录。● HAVING子句中可以使用聚合函数,而WHERE子句中不能使用聚合函数。● HAVING子句中不能出现既不被GROUP BY子句包含,又不被聚合函数包含的字段。而WHERE子句中可以出现任意字段。通常,HAVING子句总是和GROUP BY子句配合使用的,而WHERE子句可以不用任何子句的配合。

推荐信息