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);
分享到:
相关推荐
4. GROUP BY语句:用于对查询结果进行分组。 5. HAVING语句:用于对分组结果进行筛选。 例如: SELECT 字段名1, 字段名2, …… FROM 表名 WHERE 条件 GROUP BY 字段名 HAVING 条件; 四、SQL*Plus命令: 1. ...
* 数据聚合:使用GROUP BY和HAVING语句对数据进行聚合 SQL语法详解 ------------- ### SELECT指令 SELECT指令是SQL语言的基础,用于从数据库中的表格内选出资料。SELECT指令的语法结构如下: SELECT "栏位名" ...
* GROUP BY 语句:用于分组数据 * HAVING 语句:用于指定分组条件 * ORDER BY 语句:用于排序数据 * LIMIT 语句:用于限制查询结果的数量 三、 创建数据库结构 SQL 语句可以用来创建数据库结构,包括数据库表、...
在 SQL 语句中,还有许多其他的语句和函数,例如 GROUP BY、HAVING、JOIN 等。这些语句和函数可以帮助我们更好地操作和分析数据。 SQL 语句是一种功能强大且灵活的语言,用于管理和操作关系数据库管理系统。通过...
### SQL语句练习知识点解析 #### 一、创建数据库与数据表 1. **创建数据库:** - **SQL语句:** `CREATE DATABASE student;` - **知识点解析:** 这条命令用于创建一个新的数据库`student`。在创建数据库时,...
SQL 语句:SELECT 课程号, AVG(作业1 成绩 + 作业2 成绩 + 作业3 成绩) AS 平均成绩 FROM 学生作业表 GROUP BY 课程号 HAVING AVG(作业1 成绩 + 作业2 成绩 + 作业3 成绩) > 80; 查询结果截图: 四、实验总结 通过...
GROUP BY 语句还有其他高级用法,比如配合 HAVING 子句进行分组后的条件筛选,或者与子查询和联接操作结合使用,以实现更复杂的分析需求。总的来说,理解并熟练运用 GROUP BY 语句对于在 SQL 查询中进行数据分析至关...
此外,SQL 语句还可以使用 JOIN 语句、SUBQUERY 语句、GROUP BY 语句、HAVING 语句等等,以满足不同的数据查询和分析需求。 SQL 语句大全总结提供了完整的 SQL 教程,涵盖了基础语句语法、函数教程、高级编程教程...
**JsonSQL: SQL语句解析JSON文件** 在大数据处理和Web应用中,JSON(JavaScript Object Notation)格式已经成为数据交换的常见格式。然而,对于习惯使用SQL查询关系型数据库的人来说,处理JSON数据可能会觉得不太...
使用Oracle查询并删除重复记录的SQL语句 在实际应用中,删除重复记录是非常常见的操作,特别是在数据导入、数据整合和数据清洁等场景中。Oracle数据库提供了多种方式来查询和删除重复记录,本文将详细介绍这些方法...
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还支持更复杂的操作,如JOINs(连接多个表)、GROUP BY(用于聚合数据)、ORDER BY(排序结果)和HAVING(在聚合后设置条件)。同时,SQL的事务处理能力确保了数据的一致性,即使在事务的一部分失败时...
使用以下 SQL 语句可以查找所有重复记录: ```sql SELECT * FROM t_info a WHERE ((SELECT COUNT(*) FROM t_info WHERE Title = a.Title) > 1) ORDER BY Title DESC; ``` 查找重复记录 想要查找重复记录,...
SELECT语句可以根据需要包含多个列名,也可以使用WHERE子句进行条件过滤,GROUP BY用于分组,HAVING用于过滤分组后的结果,ORDER BY用于排序。 3. UPDATE语句: UPDATE用于修改已存在的数据。比如,要将所有在...
#### SQL语句教程(11) GROUP BY **用途**:`GROUP BY` 子句用于将数据分组。 **基本语法**: ```sql SELECT column1, aggregate_function(column2), ... FROM table_name GROUP BY column1; ``` **示例**: 如果...
在这个名为“SQL语句SQL语句.zip”的压缩包中,包含了一个名为“SQL语句.sql”的文件,很可能是包含了一系列SQL查询和其他数据库操作的脚本。 SQL主要分为以下几个部分: 1. 数据查询(DQL):这是SQL最基础的功能...
SQL中的`GROUP BY`语句是数据库查询中的一个重要部分,它用于将数据按照一个或多个列的值进行分组,以便对每个组执行聚合函数,如`SUM`、`COUNT`、`AVG`和`MAX`等。下面我们将详细讨论`GROUP BY`的使用方法及其相关...
6. 基于GROUP BY和HAVING语句的过滤规避:使用`GROUP BY`和`HAVING`语句来过滤SQL语句,例如使用`GROUP BY user_id HAVING user_id=1`来检测SQL语句中是否包含恶意的关键词。 7. group_concat()函数的使用:使用`...
利用SQL的`WHERE`子句进行条件筛选,`GROUP BY`进行分组统计,`HAVING`过滤分组结果,配合`CASE`表达式实现复杂的逻辑判断,满足多样化的业务需求。 5. **SQL Server特性**: - SQL Server提供了许多高级特性,如...
3. **分组和聚合**:在`GROUP BY`或`HAVING`子句中使用子查询来计算分组依据或过滤条件。 4. **数据校验**:在插入或更新数据时,子查询可以用来验证新值的有效性。 在VC++中,我们通常使用ODBC(Open Database ...