T-SQL中where子句与having子句的对比分析
2023-08-13
来源:爱go旅游网
90 福 建 电脑 2012年第2期 T-SQL中 where子句与having子句的对比分析 查晓颖 (镇江高等职业技术学校信息系江苏镇江212003) 【摘 要】:SQL标准中的SELECT语句是数据库应用最广泛和最重要的语句之一。本文先对SE— LECT语句的功能及使用方法作出了详细分析。再以实例形式讨论了SQL-SELECT语句中WHERE子句 与HAVING子句的异同,进而对读者合理使用提供了一些参考意见。 【关键词】:SQL;SELECT语句;WHERE子句;HAVING子句 0、引言 2.1 where子句与having子句的相同点 having和where作用是相近的.都可以用于对数据 准语言。在SQL语句使用中.应用的核心是SELECT— 行的限定查询。只不过where子句用于普通字段的限 SQL查询.它能够按照用户给定的条件从SQL Server 定,而having子句是用于对聚合后结果的限定。 数据库中取出数据.并将这些数据通过一个或多个结 例1: select CID,Grade 果集返回给用户 在实际应用中用户往往要提出较复 from SC 杂的选择要求.而在SELECT—SOL语句中能够完成选 where Grade<60 择任务的子句有:WHERE、HAVING.合理利用它们可 例2: SQL即结构化查询语言.它是关系型数据库的标 以对表f单表或多表1中数据进行有效的筛选,若使用不 当,就会造成数据的遗漏或错误【】]。 1、SELECT—SQL语法介绍 select C1D,sum(Grade) from SC group by CID 在SQL中增加having子句的主要原因就是.where select语句中各子句的执行顺序应为:from子句一 子句无法与聚合函数一起使用.也就是说.聚合函数是 e子句的逻辑表达式中的【 where子句一select子句一group by子句一having子 不能放在wher聚合函数.主要功能是对表在指定列名表达式的 句一order by子句。 根据where子句中的查询条件.从from子句指定 值进行纵向统计和计算,一般作用在多条记录上。比如 )、sum(歹U名)、avg(歹0名)、max(歹0名)、min(歹0 的表中找出满足条件的数据行.列出select子句中指 count(ect关键字的后面.当作查询 定的字段名表,并以group by子句指定的列名为分组 名).一般将它们放在sel条件进行分组.对分组后的结果依照order by子句指 的字段内容出现 例3:在SC表中查找各门课程总分<300分的学生 定的排序选项.将查询结果显示出来I2J。 仔细分析,可以发现:where子句的后面可以接条 信息 select SID,sum(Grade)from SC 件表达式,having子句的后面也可以接条件表达式,那 在这里.查询条件里含有聚合函数sum,我们不能 用where来筛选低于300分的学生记录.因为表中不 Student(SID,Sname,Sex,Birthday,Specialty,SCnum) 存在这样一条记录 Course(CID,Cname,Credit) 以下代码执行后就会提示出错:“关键字"where SC(SID,CID,Grade) 下面对教务管理数据库中的3张基本表进行操 附近有语法错误” select SID,sum(Grade)from SC 作.从而进一步分析where子句与having子句的使用。 roup by SID g2、where子句与having子句的实例分析 where sum(Grade)<300 1.1 select查询语句的基本格式 select表达式列表 from基本表l视图名列表 『where查询条件1 『group by分组列名表1 『having逻辑表达式1 『order by排序列名表1 1.2 select查询语句的语法分析 having sum(Grade)<200 上述两个例子都能够按照一定的条件对数据进行 筛选,例1是将成绩(Grade)小于60的数据筛选出来。 例2是将总成绩(sum fGrade1)的数据筛选出来。 2.2 where子句与having子句的使用区别 2-2.1当筛选条件里包含聚合函数的时.必须使用 having子句 么两者在功能与使用上有什么共同点与区别呢? 1.3数据库关系模型 假定在教务管理中有3个关系模型.分别为: group by SID having sum(Grade)<300 2012年第2期 福 建 电脑 91 2.2.2 having子句的执行次序低于where子句 语句中,还可以刚在insert…into、update…set、delete语 where子句在分组或聚合计算之前选取输入行(因 句中。 此,它控制哪些行进入分组或聚合计算);而having子 例8:统计出每个学生选修课程的门数 update Student 句在分组或聚合之后选取数据行f4J。 set SCnum=( 例4:统计student表中男生的人数 select count( from Student where Sex= 男 select count( ) rom SC fWhere Student.SID=SC.SID 例5:统计出各专业男生的人数 select Specialty,count( )from Student where Sex= 男 一) group by Specialty 以上两个例子中.都是先将Sex=‘男’的记录筛选 出来,再分别进行聚合计算或分组统计的。 例6:查找出平均分低于60分的课程的课程号 select CID,avg(Grade)from SC group by CID 而having子句作用于组,从中选择满足条件的组。 般与group by关键字结合使用。 例9: select sum(Grade) rom SC fhaving sum(Grade)<200 having avg(Grade)<60 上例的执行没有语法错误,也能正常运行.但结果 为空集,没有实际意义。因为没有使用group by子句. Grade)实际上是对SC表中所有的数据进行求和 上例中,先按cid(课程号)进行分组,再对聚合函 sum(ng子句进行筛 数avg进行成绩计算.最后按照计算后的成绩进行 运算,结果集只有一行记录,没有用havi选的必要。 having条件筛选。 对上述代码作如下修改才有实际意义.实现各门 当同时含有where子句、group by子句、having子 课程总分的筛选查询 句及聚合函数时,语句的执行顺序如下[51: select CID,sum(Grade) (1)执行where子句查找符合条件的数据行; rom sc f(2)使用group by子句对where子句的输出数据进 group by CID 行分组: having sum(Grade)<200 (3)对group by子句构成的组运行聚集函数计算每 3、结论 组的值: having子句与where子句都可以用于对数据行的 (4)最后执行having子句从分组结果中筛选数据 限定查询,但当筛选条件里有聚合函数时。只能够使用 行。 having子句;having子句一般与group by子句结合.实 例7:查找出课程总分<200的女生的学号、姓名及 现分组后的数据筛选。 一总分 select SC.SID,Sname,sum(Grade)as总分 参考文献: 【1】胡西林,张科.SELECT语句中的选择子句功能分析与应用U】. 太原城市职业技术学院学报,2008,84(7):134-135. [2】周惠.数据库应用技术【M】.北京:人民邮电出版社,2009. [31 英姿.浅谈SELECT语句的使用IJ].中国高新技术企业,2009, from Student right outer join SC on Student.SID=SC.SID where Sex= 女 roup gby SC.SID,Student.Shame having sum(Grade)<200 在上例中。先执行where子句筛选from子句中指 115(4):117—118. 定的操作所产生的行,再执行greup bv子句对where 【4]王振海.数据库中SQL语句学习技巧探索田.计算机教育, 子句的输出进行分组.最后having子句用来从分组的 2008,(24):131—132. 结果中筛选数据行 [5】戴秀红.SQL SERVER.数据库中SQL语句的优化U].信息与电 2.2.3 where子句与having子句各自的作用对象不 脑(理论版),2009, ):42—44. 同 ・ [6]蒋文沛.SQL Server 2005实用教程[M].北京:人民邮电出版 where子句作用于基本表或视图.从中选择满足条 社.2009.件的元组[61。因此,where子句不仅可以用在select查询 ・+一+一+一+一+-+-+-+ (上接第120页) 【3】丁潇;陈亚洲战场复杂电磁环境的仿真与构建方法研究[期 现【硕-:k ̄]2008 ,干I1论文】装备环境工程2011,8(1) 【5】刘维华信号与信息处理【硕士论文】200511 【4】戴静波计算机生成群兵力系统中的想定建模技术研究与实