2021年SQL语句--GroupBy总结_第1页
2021年SQL语句--GroupBy总结_第2页
2021年SQL语句--GroupBy总结_第3页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选word文档 下载可编辑sql语句-group by总结1sql语句-groupby总结groupby语句简介groupby语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。p.s.这里真是体会到了一个好的命名的力量,groupby从字面是直接去理解是非常好理解的。恩,以后在命名的环节一定要加把劲:)。话题扯远了。groupby的使用上面已经给出了对groupby语句的理解。基于这个理解和sqlserver201*的联机帮助,下面对groupby语句的各种典型使用进行依

2、次列举说明。1groupbyexpressions:这个恐怕是groupby语句最常见的用法了,groupby+分组字段(可以有多个)。在执行了这个操作以后,数据集将根据分组字段的值将一个数据集划分成各个不同的小组。比如有如下数据集,其中水果名称(fruitname)和出产国家(productplace)为联合主键fruitnameproductplacepriceapplechina$1applejapan$1appleusa$5orangechina$0.8bananachina$1peachusa$0如果我们想知道每个国家有多少种水果,那么我们可以通过如下sql语句来完成selectco

3、unt(*)as水果种类,productplaceas出产国fromt_test_fruitinfogroupbyproductplace这个sql语句就是使用了groupby+分组字段的方式,那么这句sql语句就可以解释成“我按照出产国家(productplace)将数据集进行分组,然后分别按照各个组来统计各自的记录数量。”很好理解对吧。这里值得注意的是结果集中有两个返回字段,一个是productplace(出产国),一个是水果种类。如果我们这里水果种类不是用count(*),而是类似如下写法的话selectfruitname,productplacefromt_test_fruitinfo

4、groupbyproductplace那么sql在执行此语句的时候会报如下的类似错误选择列表中的列t_test_fruitinfo.fruitname无效,因为该列没有包含在聚合函数或groupby子句中。这就是我们需要注意的一点,如果在返回集字段中,这些字段要么就要包含在groupby语句的后面,作为分组的依据;要么就要被包含在聚合函数中。我们可以将groupby操作想象成如下的一个过程,首先系统根据select语句得到一个结果集,如最开始的那个水果、出产国家、单价的一个详细表。然后根据分组字段,将具有相同分组字段的记录归并成了一条记录。这个时候剩下的那些不存在于groupby语句后面作为分

5、组依据的字段就有可能出现多个值,但是目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的,所以这里就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的数据格中,那么完成这个步骤的就是聚合函数。这就是为什么这些函数叫聚合函数(aggregatefunctions)了。2groupbyallexpressionsgroupbyall+分组字段,这个和前面提到的groupbyexpressions的形式多了一个关键字all。这个关键字只有在使用了where语句的,且where条件筛选掉了一些组的情况才可以看出效果。在sqlserver201*的联机帮助中,对于groupbyall

6、是这样进行描述的作者mnmnm669201*-4-1418:46回复此发言2sql语句groupby总结如果使用all关键字,那么查询结果将包括由groupby子句产生的所有组,即使某些组没有符合搜索条件的行。没有all关键字,包含groupby子句的select语句将不显示没有符合条件的行的组。其中有这么一句话“如果使用all关键字,那么查询结果将包含由groupby子句产生的所有组.没有all关键字,那么不显示不符合条件的行组。”这句话听起来好像挺耳熟的,对了,好像和leftjoin和rightjoin有点像。其实这里是类比leftjoin来进行理解的。还是基于如下这样一个数据集fruit

7、nameproductplacepriceapplechina$1applejapan$1appleusa$5orangechina$0.8bananachina$1peachusa$首先我们不使用带all关键字的groupby语句selectcount(*)as水果种类,productplaceas出产国fromt_test_fruitinfowhere(productplacejapan)groupbyproductplace那么在最后结果中由于japan不符合where语句,所以分组结果中将不会出现japan。现在我们加入all关键字selectcount(*)as水果种类,produc

8、tplaceas出产国fromt_test_fruitinfowhere(productplacejapan)groupbyallproductplace重新运行后,我们可以看到japan的分组,但是对应的“水果种类”不会进行真正的统计,聚合函数会根据返回值的类型用默认值0或者null来代替聚合函数的返回值。3groupbyexpressionswithcube|rollup首先需要说明的是groupbyall语句是不能和cube和rollup关键字一起使用的。首先先说说cube关键字,以下是sqlserver201*联机帮助中的说明指定在结果集内不仅包含由groupby提供的正常行,还包含汇

9、总行。在结果集内返回每个可能的组和子组组合的groupby汇总行。groupby汇总行在结果中显示为null,但可用来表示所有值。使用grouping函数确定结果集内的空值是否是groupby汇总值。结果集内的汇总行数取决于groupby子句内包含的列数。groupby子句中的每个操作数(列)绑定在分组null下,并且分组适用于所有其它操作数(列)。由于cube返回每个可能的组和子组组合,因此不论指定分组列时所使用的是什么顺序,行数都相同。我们通常的groupby语句是按照其后所跟的所有字段进行分组,而如果加入了cube关键字以后,那么系统将根据所有字段进行分组的基础上,还会通过对所有这些分组

10、字段所有可能存在的组合形成的分组条件进行分组计算。由于上面举的例子过于简单,这里就再适合了,现在我们的数据集将换一个场景,一个表中包含人员的基本信息员工所在的部门编号(c_emplinfo_deptid)、员工性别(c_emplinfo_sex)、员工姓名(c_emplinfo_name)等。那么我现在想知道每个部门各个性别的人数,那么我们可以通过如下语句得到selectc_emplinfo_deptid,c_emplinfo_sex,count(*)asc_emplinfo_totalstaffnumfromt_personnel_emplinfogroupbyc_emplinfo_dept

11、id,c_emplinfo_sex但是如果我现在希望知道所有部门有多少人(这里相当于就不进行分组了,因为这里已经对员工的部门和性别没有做任何限制了,但是这的确也是一种分组条件的组合方式);每种性别有多人(这里实际上是仅仅根据性别(c_emplinfo_sex)进行分组);扩展阅读数据库简单sql语句总结sql关系型数据库系统简单sql语句总结数据库简单sql语句总结全篇以学生成绩的管理为例描述。在查询结果中显示列名a.用as关键字selectnameas姓名fromstudentsorderbyageb.直接表示selectname姓名fromstudentsorderbyage精确查找:a.

12、用in限定范围select*fromstudentswherenativein(湖南,四川)b.between.andselect*fromstudentswhereagebetween20and30c.“=”select*fromstudentswherename=李山d.like:select*fromstudentswherenamelike李%(注意查询条件中有“%”,则说明是部分匹配,而且还有先后信息在里面,即查找以“李”开头的匹配项。所以若查询有“李”的所有对象,应该命令%李%;若是第二个字为李,则应为_李%或_李或_李_。)e.匹配检查符select*fromcourseswhe

13、recnolikeac%(表示或的关系,与in(.)类似,而且可以表示范围,如select*fromcourseswherecnolikea-c%)对于时间类型变量的处理a.smalldatetime直接按照字符串处理的方式进行处理,例如select*fromstudentswherebirth=1980-1-1andbirthsql关系型数据库系统简单sql语句总结groupbygender(查看男女学生各有多少)注意从哪种角度分组就从哪列groupby对于多重分组,只需将分组规则罗列。比如查询各届各专业的男女同学人数,那么分组规则有届别(grade)、专业(mno)和性别(gender),

14、所以有groupbygrade,mno,genderselectgrade,mno,gender,count(*)fromstudentsgroupbygrade,mno,gender通常group还和having联用,比如查询1门课以上不及格的学生,则按学号(sno)分类有selectsno,count(*)fromgradeswheremark1union联合合并查询结果,如select*fromstudentswherenamelike张%unionallselect*fromstudentswherenamelike李%多表查询a.内连接selectg.sno,,c.cou

15、rsenamefromgradesgjoinstudentssong.sno=s.snojoincoursescono=o(注意可以引用别名)b.外连接2sql关系型数据库系统简单sql语句总结b左连接o,max(coursename),count(sno)fromcoursesleftjoingradesono=o左连接特点显示全部左边表中的所有项目,即使其中有些项中的数据未填写完全。左外连接返回那些存在于左表而右表中却没有的行,再加上内连接的行。b右连接与左连接类似b全

16、连接selectsno,name,majorfromstudentsfulljoinmajorsonstudents.mno=majors.mno两边表中的内容全部显示c.自身连接selectccno,ccoursename,cpno,ccoursenamefromcoursesc1,coursesc2wherecpno=ccno采用别名解决问题。d.交叉连接selectlastname+firstnamefromlastnamecrossjoinfirstanme相当于做笛卡儿积嵌套查询a.用关键字in,如查询李山的同乡select*fromstudentswherenativein(sel

17、ectnativefromstudentswherename=李山)b.使用关键字exist,比如,下面两句是等价的select*fromstudentswheresnoin(selectsnofromgradeswherecno=b2)sql关系型数据库系统简单sql语句总结select*fromstudentswhereexists(select*fromgradeswheregrades.sno=students.snoandcno=b2)关于排序ordera.对于排序order,有两种方法asc升序和desc降序b.对于排序order,可以按照查询条件中的某项排列,而且这项可用数字表示

18、,如selectsno,count(*),avg(mark)fromgradesgroupbysnohavingavg(mark)85orderby310.其他a.对于有空格的识别名称,应该用括住。b.对于某列中没有数据的特定查询可以用null判断,如selectsno,coursenofromgradeswheremarkisnullc.注意区分在嵌套查询中使用的any与all的区别,any相当于逻辑运算“|”而all则相当于逻辑运算“&”d.注意在做否定意义的查询是小心进入陷阱如,没有选修b2课程的学生selectstudents.*fromstudents,gradeswherestudents.sno=grades.snoandob2上面的查询方式是错误的,正确方式见下方select*fromstudentswherenotexists(select*fromgradeswheregrades.sno=students.snoandcno=b2)sql关系型数据库系统简单sql语句总结1关

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论