`
hejiajunsh
  • 浏览: 402596 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

sql语句中GROUP BY 和 HAVING的使用 count()

阅读更多

在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。 

SELECT SUM(population) FROM bbc 

这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有 
国家的总人口数。 

having是分组(group by)后的筛选条件,分组后的数据组内再筛选
where则是在分组前筛选


通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。 
当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值. 
也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值. 

HAVING子句可以让我们筛选成组后的各组数据. 
WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前. 
而 HAVING子句在聚合后对组记录进行筛选。 

让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句,还采用第三节介绍的bbc表。 

SQL实例: 

一、显示每个地区的总人口数和总面积. 
SELECT region, SUM(population), SUM(area)
FROM bbc# `& e4 k' X* n1 v% ?+ |
GROUP BY region
 先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。# B* i' z  `, }* S, E5 i 


二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。 
SELECT region, SUM(population), SUM(area)7 ]; Z& I! t% i
FROM bbc8 F4 w2 v( P- f
GROUP BY region
HAVING SUM(area)>1000000# y" P  z. O7 D9 `# X
在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。
相反,HAVING子句可以让我们筛选成组后的各组数据

 

三、查询CUSTOMER 和ORDER表中用户的订单数

select c.name, count(order_number) as count from orders o,customer c where c.id=o.customer_id group by customer_id;

+--------+-------+
| name   | count |
+--------+-------+
| d      |     9 |
| cc     |     6 |
| 菩提子 |     1 |
| cccccc |     2 |
+--------+-------+

增加HAVING过滤

select c.name, count(order_number) as count from orders o,customer c where c.id=o.customer_id group by customer_id having count(order_number)>5;

+------+-------+
| name | count |
+------+-------+
| d    |     9 |
| cc   |     6 |
+------+-------+

 

 

四、我在多举一些例子

SQL> select * from sc;

       SNO PNO        GRADE
---------- ----- ----------
         1 YW             95
         1 SX              98
         1 YY             90
         2 YW            89
         2 SX             91
         2 YY             92
         3 YW            85
         3 SX             88
         3 YY             96
         4 YW            95
         4 SX             89

       SNO PNO        GRADE
---------- ----- ----------
         4    YY            88

这个表所描述的是4个学生对应每科学习成绩的记录,其中SNO(学生号)、PNO(课程名)、GRADE(成绩)。

1、显示90分以上学生的课程名和成绩

//这是一个简单的查询,并没有使用分组查询

SQL> select sno,pno,grade from sc where grade>=90;

       SNO PNO        GRADE
---------- ----- ----------
         1 YW            95
         1 SX             98
         1 YY             90
         2 SX             91
         2 YY             92
         3 YY             96
         4 YW            95

已选择7行。

2、显示每个学生的成绩在90分以上的各有多少门

//进行分组显示,并且按照where条件之后计数

SQL> select sno,count(*) from sc where grade>=90 group by sno;

       SNO   COUNT(*)
---------- ----------
         1          3
         2          2
         4          1
         3          1

3、这里我们并没有使用having语句,接下来如果我们要评选三好学生,条件是至少有两门课程在90分以上才能有资格,列出有资格的学生号及90分以上的课程数。

//进行分组显示,并且按照where条件之后计数,在根据having子句筛选分组

SQL> select sno,count(*) from sc where grade>=90 group by sno having count(*)>=2;

       SNO   COUNT(*)
---------- ----------
         1          3
         2          2

这个结果是我们想要的,它列出了具有评选三好学生资格的学生号,跟上一个例子比较之后,发现这是在分组后进行的子查询。

4、学校评选先进学生,要求平均成绩大于90分的学生都有资格,并且语文课必须在95分以上,请列出有资格的学生

//实际上,这个查询先把语文大于95分的学生号提取出来,之后求平均值,分组显示后根据having语句选出平均成绩大于90的

SQL> select sno,avg(grade) from sc where SNO IN (SELECT SNO FROM SC WHERE GRADE>=95 AND PNO='YW') group by sno having avg(grade)>=90;

       SNO AVG(GRADE)
---------- ----------
         1    94.3333333
         4    90.6666667

5、查询比平均成绩至少比学号是3的平均成绩高的学生学号以及平均分数

//having子句中可进行比较和子查询

SQL> select sno,avg(grade) from sc
          group by sno
          having avg(grade) > (select avg(grade) from sc where sno=3);

 

分享到:
评论

相关推荐

    浅谈sql语句中GROUP BY 和 HAVING的使用方法

    在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。 SELECT SUM(population) FROM ...

    深入浅析SQL中的group by 和 having 用法

    一、sql中的group by 用法解析:  Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。  作用:通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理...

    LINQ to SQL手册

    LINQ to SQL语句(6)之Group By/Having LINQ to SQL语句(7)之Exists/In/Any/All/Contains LINQ to SQL语句(8)之Concat/Union/Intersect/Except LINQ to SQL语句(9)之Top/Bottom和Paging和SqlMethods LINQ to SQL语句...

    MySQL根据某一个或者多个字段查找重复数据的sql语句

    sql 查出一张表中重复的所有记录数据 1.表中有id和name 两个字段,查询出name重复的所有数据 ... select count(username) as '重复次数',username from xi group by username having count(*)>1 order by userna

    复习笔记SQL34句

    SQL语句(11) Group By 4 SQL语句(12) HAVING 4 SQL语句(13) ALIAS 4 SQL语句(14) 连接 4 SQL语句(15) 外部连接 5 SQL语句(16) Subquery 6 SQL语句(17) UNION 6 SQL语句(18) UNION ALL 6 SQL语句(19) INTERSECT 7 SQL...

    最易入门SQL语句教程

    SQL语句教程(11) Group By ....................................6 SQL语句教程(12) HAVING.......................................7 SQL语句教程(13) ALIAS........................................7 SQL语句...

    SQL语句教程.doc

    GROUP BY 12 HAVING 13 ALIAS 13 表格链接 15 外部链接 16 CONCATENATE 17 SUBSTRING 18 TRIM 19 表格处理 21 CREATE TABLE 21 CONSTRAINT 22 NOT NULL 22 UNIQUE 22 CHECK 23 主键 23 外来键 24 CREATE VIEW 26 ...

    SQL语句教程.pdf

    GROUP BY HAVING ALIAS 表格链接 外部链接 CONCATENATE SUBSTRING TRIM 表格处理 CREATE TABLE CONSTRAINT NOT NULL UNIQUE CHECK 主键 外来键 CREATE VIEW CREATE INDEX ALTER TABLE DROP TABLE TRUNCATE TABLE ...

    SQL语句教程【经典】

    SQL语句教程【经典】 SQL指令 SELECT DISTINCT WHERE AND OR IN BETWEEN LIKE ORDER BY 函数 COUNT GROUP BY HAVING ALIAS 表格链接 外部链接 CONCATENATE SUBSTRING TRIM CREATE TABLE ...

    精通sql结构化查询语句

    6.2.4 使用别名 6.3 排序与分组 6.3.1 升序排序与降序排序 6.3.2 多列字段排序 6.3.3 使用GROUPBY子句对查询结果进行分组 6.3.4 HAVING子句的应用 6.4 条件查询 6.4.1 WHERE单条件语句查询 6.4.2 运算符查询 6.4.3 ...

    SQL语句查询数据库中重复记录的个数

    代码如下:select a,b,c,count(*) from (select c.a,c.b,c.c from test c) having count(*) >= 2 group by a,b,c 或者 代码如下:select zdbh,tdzl,zdmj,count(*) from ecaadmin.zdsx group by zdbh,tdzl,zdmj having ...

    数据库SQL语句教程大全

    SQL语句教程(11) Group By .......................................................................................................... 6 SQL语句教程(12) HAVING ..............................................

    sql语句重复操作

    选择重复,消除重复和选择出序列 所有名字重复人的记录是: select * from emp where name in (select name from emp group by name having count(*)>1)

    50个常用SQL语句,很好

    where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where ...

    SQL语句大全 珍藏版2019-02-28

    显示第一个语句中不在第二个语句中的项 [SQL 语句 1] MINUS [SQL 语句 2] (21) Concatenate................................... ............... ...............................12 结果相加(串联) MySQL/Oracle...

    数据库按照指定多个字段去重复查询sql语句

    按照指定字段查询出出现重复的数据 SELECT m.* FROM dbo.Sheet1$ m,( SELECT ZCMC,ZCFL,XH ...GROUP BY ZCMC,ZCFL,XH HAVING COUNT(1)>1 ) AS m1 WHERE m.ZCMC=m1.ZCMC AND m.ZCFL=m1.ZCFL and m.XH=m1.XH

    SQL查询大全

    having语句只能跟在:group by语句后面; 答案: select 学号,min(成绩)as 最低分,max(成绩)as 最高分 from sc groupby 学号 having min(成绩)>70 and max(成绩) ; 5.查询至少有5名学生选修并以3开头的课程的平均成绩。...

    Oracle查看有多个执行计划的SQL语句

    在SQL优化过程,有时候需要查看哪些SQL具有多个执行计划(Multiple Executions Plans for the same SQL statement),因为同一个SQL有多个执行计划一般意味着代码有问题或某些其它原因,例如,SQL语句使用绑定变量,...

    城院数据库系统原理实验9.doc

    a.productname,count(quantity) from [OrderDetails] b,products a where a.productid=b.productid group by b.productid,a.productname 在员工表中找一个员工,删除这个员工相关的所有数据(多个SQL语句) select * ...

    实例详解Group by和Having子句

    元旦节,干点啥呢,小编给大家分享Group by和Having子句的小例子,具体详情如下所示: 表结构: 要求: 查询有多个员工的工资不低于2000的部门编号(就是说如果一个部门的员工大于2000的人数有两个或两个以上就...

Global site tag (gtag.js) - Google Analytics