两种过滤where和having有什么区别

合集下载

having和where的区别

having和where的区别

having和where的区别本质的区别就是where筛选的是数据库表⾥⾯本来就有的字段,⽽having筛选的字段是从前筛选的字段筛选的。

where和having都可以使⽤的场景:select goods_price,goods_name from sw_goods where goods_price>100select goods_price,goods_name from sw_goods having goods_price>100原因:goods_price作为条件也出现在了查询字段中。

只可以使⽤where,不可以使⽤having的情况:select goods_name,goods_number from sw_goods where goods_price>100select goods_name,goods_number from sw_goods having goods_price>100(X)原因:goods_price作为筛选条件没有出现在查询字段中,所以就会报错。

having的原理是先select 然后从select出来的进⾏筛选。

⽽where是先筛选在select。

只可以使⽤having,不可以使⽤where的情况:select goods_category_id,avg(good_price) as ag from sw_goods group by goods_category having ag>1000select goods_category_id,avg(goods_price) as ag from sw_goods where ag>1000 group by goods_category(X)报错,这个表⾥没有这个ag这个字段。

where⼦句中⼀般不使⽤聚合函数那种情况。

数据库原理与应用课后题及答案

数据库原理与应用课后题及答案

的逻辑表示。
外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。用户可
以通过外模式描述语言来描述、定义对应于用户的数据记录(外模式),也可以利用数据操纵语言(DML)对这些数据记
录进行。外模式反映了数据库的用户观。
内模式又称存储模式,对应于物理级,它是数据库中全体数据的
内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式翱物理结构,对应着
答:是数据资源管理机构的一组人员,全名负责数据库系统的运行管理和控制。 职责:参与数据库系统设计,参
与觉得数据库的存储结构和存取策略,参与定义数据的安全性要求和完整性约束条件,监控数据库的使用和运行,
数据库的改进和重组。
19. 试论述模式、外模式、内模式的区别和联系。
答:模式又称概念模式或逻辑模式,对应于概念级。它是由数据库设计者综合所有用户的数据,按照统一的观点构
数据库原理与应用
答:指不受系统控制、出于系统之外的事物、机构、人员等客观实体的统称; 包含:外部实体名称,别名,编号,简要描述,输入的数据流,输出的数据流,数量。 11. 什么是数据流?数据流词条一般包含哪些内容? 答:指系统中有着起点和终点的数据结构。 包含:数据流名称,别名,编号,说明,数据流来源,数据流去向,组成,平均流量,高峰期流量,相关元素。 12. 什么是数据存储?数据存储词条一般包含哪些内容? 答:是数据及其结构停留或保存的地方,是数据流的来源和去向之一。 含义:数据存储名称,别名,编号,说明,输入的数据流,输出的数据流,组成,数据量,存取频度,存取方式, 相关元素。 13. 什么是处理逻辑?处理逻辑词条一般包含哪些内容? 答:用于描述处理是如何工作的,有哪些输入和输出。 包含:处理名称,编号,说明,输入的数据流,输出的数据流,处理逻辑,平均执行频率,高峰期执行频率,相关 元素。 14. 什么是信息分类?信息分类要遵循哪些原则? 答:指将具有某种共同属性或特征的信息归并一起,把不具有上述共性的信息区别开来的过程。 原则:科学性原则,系统性原则,可扩展性原则,兼容性原则,综合实用性原则。 15. 什么是线分类法? 答:按选定的若干属性(或特征)将分类对象逐次地分为若干层级,每个层级又分为若干类目。 16. 什么是面分类法? 答:将分类对象按选定的若干个属性或特征,分成彼此之间互不相关的若干方面(简称面),每个面又可以分为许 多彼此独立的若干类目。 17. 简述信息编码的功能。 答:鉴别:编码是鉴别信息分类对象的唯一标识 分类:编码可以作为区分对象类别的标识 排序:编码有一定的顺序,股可方便的进行排序 专用含义:当采用一些专用符号代表特定事物或概念时,编码提供一定的专用含义 18. 简述信息编码的原则。 答:唯一性,正确性,可扩展性,规范性,稳定性。 19. 什么是顺序编码?区间编码?字母编码? 答:顺序编码:将要编码的对象按一定的规则分配给连续的顺序号码 区间编码:对编码对象分区间进行编码 字母编码:是用具有特定意义的字母代表某一类项目 20. 什么是数据定义分析? 答:指确定系统安装和正常运行起降数据库、基本表、视图、索引等对象的创建、修改与删除等需求。 21. 为什么要进行数据定义分析? 答:避免数据库运行期间定义、修改与删除有关对象容易造成冲突。 22. 数据操纵分析的主要任务是什么? 答:数据插入、修改、删除、查询、统计和排序。 23. 数据完整性分析的主要任务是什么? 答:找出保证数据库中数据满足一致性、正确性和有效性的需求,其目的是防止错误的数据进入数据库。 24. 并发处理分析的主要内容是哪些? 答: ·分析数据定义时产生的并发处理需求 ·分析数据操纵时产生的并发处理需求

【Access】SQL语句中WHERE子句和HAVING子句的异同

【Access】SQL语句中WHERE子句和HAVING子句的异同

【Access】SQL语句中WHERE子句和HAVING子句的异同初学SQL语句的时候,很多朋友总是无法理解HAVING 子句和WHERE子句之间区别,今天我们就来细细谈一谈这个问题。

首先列出它们之间的相同和区别,然后我们举例说明。

一、相同点:二者的相同点是在功能上来说的,HAVING子句和WHERE子句都可以用来设定限制条件以使查询结果满足一定的条件限制。

二、区别如下:1、WHERE是先分组再筛选记录,WHERE在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前;而 HAVING 子句在聚合后对组记录进行筛选。

2、在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

而HAVING子句中可以。

HAVING 子句是聚组函数唯一出现的地方。

3、在查询过程中聚合语句(SUM,MIN,MAX,AVG,COUNT)要比HAVING子句优先执行。

而WHERE子句在查询过程中执行优先级高于聚合语句。

4、HAVING 子句中的每一个元素必须出现在SELECT列表中。

例如,下图是一份销售业绩表:现在假如我们想要查询销售额大于4000的记录,我们可以建立如下的SQL查询:SELECT 销售编号, 姓名, 销售额FROM 销售表WHERE 销售额>4000运行的到如下的结果:那么现在假如我们想要查询销售额总额大于4000的员工以及它们的销售总额,怎么办呢?这时候我们可以建立如下的SQL查询:SELECT 姓名, Sum([销售额]) AS 该员工的销售总额FROM 销售表GROUP BY 姓名HAVING Sum([销售额]) >4000运行的到如下的结果:看到这里,请仔细想一想以上两个查询是不是明显感觉不一样啊?第二个查询就是以姓名来分组,求出每个员工的销售总额,然后再以这个销售总额为条件进行判断,而第一个查询并没有涉及到分组聚合,直接使用WHERE筛选记录。

sql中的where、groupby和having用法解析

sql中的where、groupby和having用法解析

sql中的where、groupby和having⽤法解析--sql中的 where 、group by 和 having ⽤法解析--如果要⽤到group by ⼀般⽤到的就是“每这个字” 例如说明现在有⼀个这样的表:每个部门有多少⼈就要⽤到分组的技术select DepartmentID as '部门名称',COUNT(*) as '个数' from BasicDepartment group by DepartmentID--这个就是使⽤了group by +字段进⾏了分组,其中我们就可以理解为我们按照了部门的名称ID--DepartmentID将数据集进⾏了分组;然后再进⾏各个组的统计数据分别有多少;--如果不⽤count(*) ⽽⽤类似下⾯的语法select DepartmentID,DepartmentName from BasicDepartment group by DepartmentID--将会出现错误--选择列表中的列 'BasicDepartment.DepartmentName' ⽆效,因为该列没有包含在聚合函数或 GROUP BY ⼦句中。

这就是我们需要注意的⼀点,如果在返回集字段中,这些字段要么就要包含在Group By语句的后⾯,作为分组的依据;要么就要被包含在聚合函数中,作为分组的依据;--出现的错误详解:咱们看看group by 的执⾏的过程,先执⾏select 的操作返回⼀个程序集,--然后去执⾏分组的操作,这时候他将根据group by 后⾯的字段--进⾏分组,并且将相同的字段并称⼀列数据,如果group by 后⾯没有这个字段的话就要分成好多的数据。

--但是分组就只能将相同的数据分成两列数据,⽽⼀列中⼜只能放⼊⼀个字段,所以那些没有进⾏分组的--数据系统不知道将数据放⼊哪⾥,所以就出现此错误--⽬前⼀种分组情况只有⼀条记录,⼀个数据格是⽆法放⼊多个数值的,--所以这⾥就需要通过⼀定的处理将这些多值的列转化成单值,然后将其放在对应的--数据格中,那么完成这个步骤的就是聚合函数。

过滤常用操作方法有哪些

过滤常用操作方法有哪些

过滤常用操作方法有哪些常用的过滤操作方法有很多,下面我将介绍一些常见的过滤操作方法,以及它们的使用方法。

1. 等值过滤等值过滤是最简单和常见的过滤方式,它主要用于从数据集中选择满足某个条件的记录。

在SQL中,可以使用WHERE子句加上等号进行等值过滤。

例如,我们可以使用以下语句过滤出年龄为25岁的员工:SELECT * FROM employees WHERE age = 25;2. 范围过滤范围过滤是指根据某个范围条件,从数据集中选择满足条件的记录。

在SQL中,可以使用BETWEEN关键字进行范围过滤。

例如,我们可以使用以下语句过滤出年龄在25岁到30岁之间的员工:SELECT * FROM employees WHERE age BETWEEN 25 and 30;3. 模式匹配过滤模式匹配过滤是指根据某个模式条件,从数据集中选择满足条件的记录。

在SQL 中,可以使用LIKE关键字进行模式匹配过滤。

例如,我们可以使用以下语句过滤出姓名以"D"开头的员工:SELECT * FROM employees WHERE name LIKE 'D%';4. 空值过滤空值过滤是指根据某个属性是否为空值,从数据集中选择满足条件的记录。

在SQL中,可以使用IS NULL或IS NOT NULL关键字进行空值过滤。

例如,我们可以使用以下语句过滤出没有邮箱地址的员工:SELECT * FROM employees WHERE email IS NULL;5. 唯一性过滤唯一性过滤是指根据某个属性的唯一性,从数据集中选择满足条件的记录。

在SQL中,可以使用DISTINCT关键字进行唯一性过滤。

例如,我们可以使用以下语句过滤出不重复的部门名称:SELECT DISTINCT department FROM employees;6. 多条件过滤多条件过滤是指根据多个条件的组合,从数据集中选择满足条件的记录。

sql_having的用法说明(3篇)

sql_having的用法说明(3篇)

第1篇一、HAVING子句的语法结构HAVING子句的基本语法结构如下:```SELECT column_name(s)FROM table_nameWHERE conditionGROUP BY column_name(s)HAVING condition;```其中,`column_name(s)`表示要选择的列名,`table_name`表示要查询的表名,`condition`表示查询条件,`column_name(s)`表示按哪些列进行分组,`HAVING condition`表示分组后的筛选条件。

二、HAVING子句的用法1. 筛选分组后的结果HAVING子句可以用来筛选分组后的结果。

例如,假设我们有一个名为`sales`的表,其中包含`employee_id`和`sales_amount`两列,我们可以使用HAVING子句来筛选出销售总额超过10000的员工:```SELECT employee_id, SUM(sales_amount) AS total_salesFROM salesGROUP BY employee_idHAVING SUM(sales_amount) > 10000;```2. 使用聚合函数HAVING子句可以与聚合函数(如SUM、AVG、MAX、MIN、COUNT等)一起使用。

例如,假设我们想找出平均销售金额超过5000的员工:```SELECT employee_id, AVG(sales_amount) AS average_salesFROM salesGROUP BY employee_idHAVING AVG(sales_amount) > 5000;```3. 筛选特定的分组有时,我们可能只想筛选特定的分组。

例如,假设我们只想找出销售总额超过10000的员工,且这些员工所在的部门ID为1:```SELECT employee_id, SUM(sales_amount) AS total_salesFROM salesWHERE department_id = 1GROUP BY employee_idHAVING SUM(sales_amount) > 10000;```4. 使用子查询HAVING子句还可以与子查询一起使用。

where子句和having子句区别

where子句和having子句区别

where⼦句和having⼦句区别where⼦句和having⼦句的区别:1.where 不能放在group by后⾯2.having 是跟group by连在⼀起⽤的,放在group by 后⾯,此时的作⽤相当于where3.where 后⾯的条件中不能有聚集函数,⽐如SUM(),AVG()等,⽽HAVING可以。

⼀、where⼦句where⼦句:where⼦句仅仅⽤于从from⼦句中返回的值,from⼦句返回的每⼀⾏数据都会⽤where⼦句中的条件进⾏判断筛选,where⼦句中允许使⽤⽐较运算符和逻辑运算符⼆、having⼦句having⼦句:having⼦句通常是与order by⼦句⼀起使⽤的,因为having的作⽤是对使⽤group by 进⾏分组统计后的结果进⾏进⼀步的筛选。

三、下⾯通过where⼦句和having⼦句的对⽐,更进⼀步的理解他们在查询过程中聚合函数(SUM,MIN,MAX,AVG,COUNT)要⽐having⼦句优先执⾏,简单的理解为只有有了统计结果后我才能执⾏筛选。

where⼦句在查询过程中执⾏优先级别优先于聚合函数(SUM,MIN,MAX,AVG,COUNT),因为他是⼀句⼀句筛选的,HAVING⼦句可以让我们筛选成组后的对各组数据筛选。

⽽WHERE⼦句在聚合前筛选记录,如:现在我们想要部门号不等于10的部门并且⼯资总和⼤于8000的部门编号?分析:通过where⼦句筛选除部门编号不为10的部门,然后对部门⼯资进⾏统计,然后使⽤having⼦句对统计结果进⾏筛选。

select deptno,sum(sa1) from empwhere deptno!='10' group by deptnohaving sum(sa1)>8000;四、异同点他们的相同之处就是定义搜索条件,不同之处是where⼦句为单个筛选⽽having⼦句和组有关,⽽不是与单个的⾏有关最后:理解having⼦句和where⼦句最好的⽅法就是基础select 语句中的那些句⼦的处理次序:where⼦句只能接受from⼦句输出的数据,⽽having⼦句则可以接受来⾃group by ,where或者from⼦句的输⼊。

where的用法四种句型

where的用法四种句型

where的用法四种句型1、条件筛选句:SELECT 字段名 FROM 表名 WHERE 条件;WHERE 关键字可以用于筛选出符合条件的记录,上述这种句式往往出现在在查找实体的场景中,比如我想查找阿里巴巴的员工,那么SQL可以写成:SELECT 姓名,部门 FROM 员工表 WHERE 公司名称="阿里巴巴"。

这 from 表名子句后面的where部分,就是用 WHERE 关键字来筛选符合条件的记录。

2、多条件筛选句:SELECT 字段名 FROM 表名 WHERE 条件1 AND 条件2…AND 条件n ;有时候,我们需要根据多个条件筛选符合条件的记录,此时就要用到AND关键词,将多个条件合并在一起查询。

比如我要查询员工表中阿里巴巴公司10岁以下的员工,可以使用以下SQL:SELECT 姓名,部门 FROM 员工表 WHERE 公司名称="阿里巴巴" AND 年龄<10 。

3、范围筛选句:SELECT 字段名 FROM 表名 WHERE 字段名 BETWEEN 最小值 AND 最大值;如果我们想查找某一项属性值处于一定范围内的记录,此时LEFT JOIN 关键词将会派上用场,我们可以使用 SELECT 字段名 FROM 表名 WHERE 字段名BETWEEN 最小值 AND 最大值的句式进行查找,比如我想查询价格在10-20元之间的商品,SQL语句可以写成:SELECT 名称,价格 FROM 商品表 WHERE 价格BETWEEN 10 AND 20 。

4、多态筛选句:SELECT 字段名 FROM 表名 WHERE 字段名 IN(值1,值2...值n);IN关键字能够帮助我们一次性地查找出符合某一列的多个取值的记录,比如我想查询商品表中价格为10元、20元、30元的商品,那么可以使用以下SQL:SELECT 名称,价格 FROM 商品表 WHERE 价格 IN(10,20,30) 。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

两种过滤where和having有什么区别?
已知:select stu_id, sub_id, score, rq from t_score;
STU_ID SUB_ID SCORE RQ
S0001 SUB001 90.00 2008-1-1
S0002 SUB001 80.00 2008-1-1
S0001 SUB002 88.00 2008-2-1
S0002 SUB002 20.00 2008-2-1
S0003 SUB002 0.00 2008-2-1
S0003 SUB001 85.00 2008-1-1
S0099 SUB001 99.00 2008-1-1
S0002 SUB002 60.00 2008-2-1
问题:要求查询最低分在80分以上的记录。

请推算出下面两句的结果,并说出where过滤与having过滤有什么不同之处?
一:select sc.stu_id,min(sc.score)
from t_score sc
where sc.score>=80
group by sc.stu_id
二:select sc.stu_id,min(sc.score)
from t_score sc
group by sc.stu_id
having min(sc.score)>=80
……经过上课详细的推理和分析……
一:结果有4条,而且每条的分数都高手80分(不符合逻辑)
二:结果只有2条(符合逻辑)
结论如下:
where :统计前过滤,过滤的是原始数据(这样参加统计的记录减少了)。

having:统计后过滤,过滤的是统计结果(参加统计的记录并没有变化)。

where和having的区别2009-02-19 10:09
分类:数据库
字号:大中小
理解聚集和SQL 的WHERE 和HAVING 子句之间的相互作用是非常重要
的。

在WHERE 和HAVING 之间的基本差别是:WHERE 在分组和聚集计算之前选择输入行(因此,它控制哪一行进入聚集计算),而HAVING 在分组和聚集计算之后选择分组行。

因此WHERE 子句可能不包含聚集函数;因为试图使用一个聚集来判断那些行需要输入到聚集函数中没有什么意义。

另一方面,HAVING 子句总是包含聚集函数。

(严格的说,你可以写一个不使用聚集的HAVING 子句,不过是在浪费时间;相同的条件可以在WHERE 阶段更有效地使用。


HAVING
指定组或聚合的搜索条件。

HAVING 只能与SELECT 语句一起使用。

通常在GROUP BY 子句中使用它。

如果不使用GROUP BY 子句,HAVING 的行为与WHERE 子句一样。

使用HAVING 子句选择行
HAVING 子句对GROUP BY 子句设置条件的方式与WHERE 子句和SELECT 语句交互的方式类似。

WHERE 子句搜索条件在进行分组操作之前应用;而HAVING 搜索条件在进行分组操作之后应用。

HAVING 语法与WHERE 语法类似,但HAVING 可以包含聚合函数。

HAVING 子句可以引用选择列表
中出现的任意项。

我知道两者的作用是什么,但有些地方两者都可以用,比如
select studentid, avg(score) from studentScore group by studentid having left(studentid, 1)='0'
select studentid, avg(score) from studentScore where left(studentid, 1)='0' group by studentid
这种情况下哪个会快一点
解析:
select studentid, avg(score) from studentScore group by studentid having left(studentid, 1)='0'
1、分组汇总
2、过滤非法项
left(studentid, 1)='0'是个效率不很高的过滤条件,如果分组会使数据量极大减少(比如每个人有几十门课),而且要过滤掉的只是很小一部分学生,这种写法会有比较高的效率
select studentid, avg(score) from studentScore where left(studentid, 1)='0' group by studentid
1、过滤非法项
2、分组汇总
虽然left(studentid, 1)='0'是个效率不很高的过滤条件,但是如果你要从几百万学生中找到几十个学生3-5门功课的平均分,还是应该很明智的选择它,否则,呵呵,慢慢等分组吧……
总结:不是哪一种写法效率更高,是哪一种写法更符合你的实际情况,分别测试一下就知道了
完了,完了,还是副坛主,还是这里的老师,居然还问这么基础的问题??
Where 是用来指定记录级筛选条件;Having是用来指定分组筛选条件。

别告诉我,你还不理解什么是记录筛选,什么是分组筛选。

否则我就受不了了,那么简单。

SQL中WHERE 和HAVING的区别(2008-04-18 13:10:54)
标签:杂谈分类:oracle SQL语句中的Having子句与where子句之区别
在说区别之前,得先介绍GROUP BY这个子句,而在说GROUP子句前,又得先说说“聚合函数”——SQL语言中一种特殊的函数。

例如SUM, COUNT, MAX, A VG等。

这些函数和其它函数的根本区别就是它们一般作用在多条记录上。

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

而通过使用GROUP BY 子句,可以让SUM 和COUNT 这些函数对属于一组的数据起作用。

当你指定GROUP BY region 时,只有属于同一个region(地区)的一组数据才将返回一行值,也就是说,表中所有除region(地区)外的字段,只能通过SUM, COUNT等聚合函数运算后返回一个值。

下面再说说“HA VING”和“WHERE”:
HA VING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HA VING子句前;而HA VING子句在聚合后对组记录进行筛选。

让我们还是通过具体的实例来理解GROUP BY 和HA VING 子句:
SQL实例:
一、显示每个地区的总人口数和总面积:
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
先以region把返回记录分成多个组,这就是GROUP BY的字面含义。

分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。

二、显示每个地区的总人口数和总面积.仅显示那些人口数量超过1000000的地区。

SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HA VING SUM(population)>1000000
[注]在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。

相反,HA VING子句可以让我们筛选成组后的各组数据.
ps:如果想根据sum后的字段进行排序可以在后面加上:order by sum(population) desc/asc。

相关文档
最新文档