`
kavy
  • 浏览: 890643 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQL语句:group by having

 
阅读更多

having子句与where有相似之处但也有区别,都是设定条件的语句。0 I0 G. z9 H: S5 [
在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优先级别优先于聚合语句。

having条件表达示为聚合语句。肯定的说having子句查询过程执行优先级别低于聚合语句。" W) q( k% I" }: \$ |6 X
再换句说话说把上面的having换成where则会出错。统计分组数据时用到聚合语句。

 对分组数据再次判断时要用having。如果不用这些关系就不存在使用having。直接使用where就行了。, g* K* s1 o7 o& w8 [
having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。

聚合函数,这是必需先讲的一种特殊的函数:0 P9 u& h7 z2 n) I5 Z) i, V2 I
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
SELECT SUM(population) FROM tablename
+ e' k/ w9 S# {! a0 W. O" ^
这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有 国家的总人口数。 通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。
 当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值.
也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值.7 B4 n# W9 D; o) V
HAVING子句可以让我们筛选成分组后的各组数据.; Y( }; X, \5 m1 O
HAVING子句在聚合后对组记录进行筛选
而WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前
 看下面这几个例子吧:

 ?& [
一、显示每个地区的总人口数和总面积.* g) w5 u5 F7 @1 `9 U
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
6 ], L+ y- ?" A% v& m
二、 显示每个地区的总人口数和总面积.仅显示那些面积超过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子句可以让我们筛选成组后的各组数据.

三、我在多举一些例子

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
  2  group by sno
  3  having avg(grade) > (select avg(grade) from sc where sno=3);

分享到:
评论

相关推荐

    常用SQL*Plus语句:

    4. GROUP BY语句:用于对查询结果进行分组。 5. HAVING语句:用于对分组结果进行筛选。 例如: SELECT 字段名1, 字段名2, …… FROM 表名 WHERE 条件 GROUP BY 字段名 HAVING 条件; 四、SQL*Plus命令: 1. ...

    SQL语句基础教程

    * 数据聚合:使用GROUP BY和HAVING语句对数据进行聚合 SQL语法详解 ------------- ### SELECT指令 SELECT指令是SQL语言的基础,用于从数据库中的表格内选出资料。SELECT指令的语法结构如下: SELECT "栏位名" ...

    分布式数据库sql语句2022优秀文档.ppt

    * GROUP BY 语句:用于分组数据 * HAVING 语句:用于指定分组条件 * ORDER BY 语句:用于排序数据 * LIMIT 语句:用于限制查询结果的数量 三、 创建数据库结构 SQL 语句可以用来创建数据库结构,包括数据库表、...

    SQL语句详细解释

    在 SQL 语句中,还有许多其他的语句和函数,例如 GROUP BY、HAVING、JOIN 等。这些语句和函数可以帮助我们更好地操作和分析数据。 SQL 语句是一种功能强大且灵活的语言,用于管理和操作关系数据库管理系统。通过...

    SQL语句练习--数据库

    ### SQL语句练习知识点解析 #### 一、创建数据库与数据表 1. **创建数据库:** - **SQL语句:** `CREATE DATABASE student;` - **知识点解析:** 这条命令用于创建一个新的数据库`student`。在创建数据库时,...

    数据库系统原理实验报告-SQL查询语句.doc

    SQL 语句:SELECT 课程号, AVG(作业1 成绩 + 作业2 成绩 + 作业3 成绩) AS 平均成绩 FROM 学生作业表 GROUP BY 课程号 HAVING AVG(作业1 成绩 + 作业2 成绩 + 作业3 成绩) > 80; 查询结果截图: 四、实验总结 通过...

    SQL GROUP BY 语句详解

    GROUP BY 语句还有其他高级用法,比如配合 HAVING 子句进行分组后的条件筛选,或者与子查询和联接操作结合使用,以实现更复杂的分析需求。总的来说,理解并熟练运用 GROUP BY 语句对于在 SQL 查询中进行数据分析至关...

    sql语句大全总结

    此外,SQL 语句还可以使用 JOIN 语句、SUBQUERY 语句、GROUP BY 语句、HAVING 语句等等,以满足不同的数据查询和分析需求。 SQL 语句大全总结提供了完整的 SQL 教程,涵盖了基础语句语法、函数教程、高级编程教程...

    JsonSQL:用SQL语句解析JSON文件

    **JsonSQL: SQL语句解析JSON文件** 在大数据处理和Web应用中,JSON(JavaScript Object Notation)格式已经成为数据交换的常见格式。然而,对于习惯使用SQL查询关系型数据库的人来说,处理JSON数据可能会觉得不太...

    使用Oracle查询并删除重复记录的SQL语句

    使用Oracle查询并删除重复记录的SQL语句 在实际应用中,删除重复记录是非常常见的操作,特别是在数据导入、数据整合和数据清洁等场景中。Oracle数据库提供了多种方式来查询和删除重复记录,本文将详细介绍这些方法...

    数据库作业2(SQL)1

    SQL 语句:SELECT C.C#, C.CNAME FROM C WHERE C.C# IN (SELECT SC.C# FROM SC GROUP BY SC.C# HAVING COUNT(DISTINCT SC.S#) = (SELECT COUNT(*) FROM S)); 三、设一个影片出租公司的数据库 (略)

    SQL基本语句 SQL基本语句

    除此之外,SQL还支持更复杂的操作,如JOINs(连接多个表)、GROUP BY(用于聚合数据)、ORDER BY(排序结果)和HAVING(在聚合后设置条件)。同时,SQL的事务处理能力确保了数据的一致性,即使在事务的一部分失败时...

    sql 查询重复数据

    使用以下 SQL 语句可以查找所有重复记录: ```sql SELECT * FROM t_info a WHERE ((SELECT COUNT(*) FROM t_info WHERE Title = a.Title) > 1) ORDER BY Title DESC; ``` 查找重复记录 想要查找重复记录,...

    sql语句

    SELECT语句可以根据需要包含多个列名,也可以使用WHERE子句进行条件过滤,GROUP BY用于分组,HAVING用于过滤分组后的结果,ORDER BY用于排序。 3. UPDATE语句: UPDATE用于修改已存在的数据。比如,要将所有在...

    最易入门SQL语句教程

    #### SQL语句教程(11) GROUP BY **用途**:`GROUP BY` 子句用于将数据分组。 **基本语法**: ```sql SELECT column1, aggregate_function(column2), ... FROM table_name GROUP BY column1; ``` **示例**: 如果...

    SQL语句SQL语句.zip

    在这个名为“SQL语句SQL语句.zip”的压缩包中,包含了一个名为“SQL语句.sql”的文件,很可能是包含了一系列SQL查询和其他数据库操作的脚本。 SQL主要分为以下几个部分: 1. 数据查询(DQL):这是SQL最基础的功能...

    简单讲解sql语句中的group by的使用方法

    SQL中的`GROUP BY`语句是数据库查询中的一个重要部分,它用于将数据按照一个或多个列的值进行分组,以便对每个组执行聚合函数,如`SUM`、`COUNT`、`AVG`和`MAX`等。下面我们将详细讨论`GROUP BY`的使用方法及其相关...

    高级SQL注入:混淆和绕过.pdf

    6. 基于GROUP BY和HAVING语句的过滤规避:使用`GROUP BY`和`HAVING`语句来过滤SQL语句,例如使用`GROUP BY user_id HAVING user_id=1`来检测SQL语句中是否包含恶意的关键词。 7. group_concat()函数的使用:使用`...

    泛微系统SQL语句大全

    利用SQL的`WHERE`子句进行条件筛选,`GROUP BY`进行分组统计,`HAVING`过滤分组结果,配合`CASE`表达式实现复杂的逻辑判断,满足多样化的业务需求。 5. **SQL Server特性**: - SQL Server提供了许多高级特性,如...

    vc++SQL语句嵌套

    3. **分组和聚合**:在`GROUP BY`或`HAVING`子句中使用子查询来计算分组依据或过滤条件。 4. **数据校验**:在插入或更新数据时,子查询可以用来验证新值的有效性。 在VC++中,我们通常使用ODBC(Open Database ...

Global site tag (gtag.js) - Google Analytics