
Group By
子句\r\n Group By子句可以将表的行划分为不同的组。分别总结每个组,这样就可以控制想要看见的详细信息的级别。\r\n \r\n 语法:\r\n \r\n [ Group By [ ALL ] Group_By_expression[ ,...n ]\r\n \r\n [ WITH { CUBE | ROLLUP } ] ]\r\n \r\n 参数说明:\r\n \r\n ALL:包含所有组和结果集,甚至包含那些任何行都不满足WHERE子句指定的搜索条件的组和结果集。如果指定了ALL,将对组中不满足搜索条件的汇总列返回空值。不能用CUBE或ROLLUP运算符指定ALL。如果访问远程表的查询中有WHERE子句,则不支持Group By ALL *** 作。\r\n \r\n Group_By_expression:对其执行分组的表达式。Group_By_expression也称为分组列。Group_By_expression可以是列或引用列的非聚合表达式。在选择列表内定义的列的别名不能用于指定分组列。对于不包含CUBE或ROLLUP的Group By子句,Group_By_ expression的项数受查询所涉及的Group By列的大小、聚合列和聚合值的限制。该限制从8060字节的限制开始,对保存中间查询结果所需的中间级工作表有8060字节的限制。如果指定了CUBE或ROLLUP,则最多只能有10个分组表达式。\r\n \r\n CUBE:指定在结果集内不仅包含由Group By提供的正常行,还包含汇总行。在结果集内返回每个可能的组和子组组合的Group By汇总行。Group By汇总行在结果中显示为NULL,但可用来表示所有值。使用GroupING函数确定结果集内的空值是否是Group By汇总值。结果集内的汇总行数取决于Group By子句内包含的列数。Group By子句中的每个 *** 作数(列)绑定在分组NULL下,并且分组适用于所有其他 *** 作数(列)。由于CUBE返回每个可能的组和子组组合,因此,不论指定分组列所使用的是什么顺序,行数都相同。\r\n \r\n ROLLUP:指定在结果集内不仅包含由Group By提供的正常行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。\r\n \r\n 使用Group By子句的注意事项。\r\n \r\n (1)在SELECT子句的
字段列表中,除了聚集函数外,其他所出现的字段一定要在Group By子句中有定义才行。例如“Group By A,B”,那么“SELECT SUM(A),C”就有问题,因为C不在Group By中,但是SUM(A)是可以的。\r\n \r\n (2)SELECT子句的字段列表中不一定要有聚集函数,但至少要用到Group By子句列表中的一个项目。例如“Group By A,B,C”,则“SELECT A”是可以的。\r\n \r\n (3)在SQL Server中text、ntext和image数据类型的字段不能作为Group By子句的分组依据。\r\n \r\n (4)Group By子句不能使用字段别名。\r\n 1.按单列进行分组\r\n \r\n Group By子句可以基于指定某一列的值将数据集合划分为多个分组,同一组内所有记录在分组属性上具有相同值。\r\n \r\n 示例:\r\n \r\n 把“student”表按照“性别”这个单列进行分组。在查询分析器中输入的SQL
语句如下:\r\n \r\n use student\r\n \r\n select 性别\r\n \r\n from student\r\n \r\n Group By 性别\r\n \r\n 但仍然要强调SELECT子句必须与Group By后的子句或者是分组函数列相一致。\r\n \r\n 例如,由于下列查询中“姓名”列既不包含在Group By子句中,也不包含在分组函数中,所以是错误的。错误的SQL语句如下:\r\n \r\n use student select 姓名,性别 from student Group By 性别\r\n \r\n 例如,在“grade”表中,按“学期”分组查询。SQL语句如下:\r\n \r\n use studnet select 学期 from grade Group By 学期\r\n \r\n 2.按多列进行分组\r\n \r\n Group By子句可以基于指定多列的值将数据集合划分为多个分组。\r\n \r\n 示例:\r\n \r\n 在“student”表中,按照“性别”和“年龄”列进行分组。在查询分析中输入的SQL语句如下:\r\n \r\n use student\r\n \r\n select 性别,年龄\r\n \r\n from student\r\n \r\n Group By 性别,年龄\r\n \r\n 在“student”表中,首先按照“性别”分组,然后再按照“年龄”分组。\r\n \r\n 再举一个例子,例如,在“grade”表中,按照“学号”和“课程代号”列进行分组。SQL语句如下:\r\n \r\n use student\r\n \r\n select 学号,课程代号 from grade Group By 学号,课程代号\r\n \r\n 按多列进行分组时有NULL组的是如何处理的。当表按多列进行分组时有NULL组,这时NULL被作为一个特定值处理,就像其他任何值一样。也就是说,如果在某个分组列中存在两个NULL,则按它们有相同的值那样处理,并将它们放在相同的组中。\r\n \r\n 示例:\r\n \r\n 在“grade”表中,按“学期”和“课程代号”列进行分组。在查询分析器中输入的SQL语句如下:\r\n \r\n use student\r\n \r\n select 学期,课程代号\r\n \r\n from grade\r\n \r\n Group By 学期,课程代号\r\n \r\n 3.与聚集函数一起使用\r\n \r\n Group By子句是经常与聚集函数一起使用。如果SELECT子句中包含聚集函数,则计算每组的汇总值,当用户指定Group By时,选择列表中任一非聚集表达式内的所有列都应包含在Group By列表中,或者Group By表达式必须与选择列表表达式完全匹配。\r\n \r\n 示例:\r\n \r\n 在“student”表中,分别求男女生的平均年龄。在查询分析器中输入的SQL语句如下:\r\n \r\n use student\r\n \r\n select 性别,avg(年龄) as 平均年龄\r\n \r\n from student\r\n \r\n Group By 性别\r\n \r\n 例如,在“student”表中,分别求有多少个男生和女生。SQL语句如下:\r\n \r\n use student\r\n \r\n select 性别,count(性别) as 人数 from student Group By 性别\r\n \r\n 说明:关于聚合函数的详细讲解可参阅9.2.1节。\r\n \r\n 4.与HAVING子句一起使用\r\n \r\n HAVING子句对Group By子句选择出来的结果进行再次筛选,最后输出符合HAVING子句中条件的记录。HAVING子句的语法与WHERE子句的语法相类似,惟一不同的是HAVING子句中可以包含聚合函数。\r\n \r\n 语法:\r\n \r\n [HAVING ]\r\n \r\n 参数说明:\r\n \r\n :指定组或聚合应满足的搜索条件。当HAVING与Group By ALL一起使用时,HAVING 子句替代ALL。\r\n \r\n 示例:\r\n \r\n 在“student”表中,按“性别”分组求平均年龄,并且查询其平均年龄大于21的学生信息。在查询分析器中输入的SQL语句如下:\r\n \r\n use student\r\n \r\n select avg(年龄), 性别\r\n \r\n from student\r\n \r\n Group By 性别\r\n \r\n having avg(年龄)>21\r\n \r\n 在“grade”表中,按“学期”分组求平均成绩,并且查询“平均成绩”大于93的课程信息。在查询分析器中输入的SQL语句如下:\r\n +1 已赞过
接下来,我们将使用员工相关的四张样本数据表,来学习SQL,建议你在学习过程中多动手练习,理解才会更深刻。表和字段含义,如下图:
如何利用SQL语句来 *** 作以上数据呢?我们必须将样本数据导入MySQL客户端(如:Navicat)中。可以在客户端 *** 作数据,或者在终端窗口。工作中经常在客户端 *** 作,所以本文所有SQL语句将在Navicat中学习。
首先将sql脚本保存到桌面(获取方式:关注"Python之每日一课"公众号,后来回复"sql基础数据",即可。),导入SQL脚本的具体 *** 作流程如下:
现在数据准备完成。这里是导入sql脚本;导出同理,选择”转储SQL“文件。当然了,Navicat也支持将当前表或查询结果导出Excel、CSV等文件类型。
下面可以写SQL语句了(每个sql脚本可以保存,下次直接使用),如下:
类似于Python中 :print(要打印的东西)
①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
② 要查询的东西 可以是常量值、表达式、字段、也可以是函数
补充:可以给字段起别名,好处是提高可读性,更方便理解;多表连接时,区分字段。用AS 或 空格来实现。如下:
2、 条件查询
条件查询:根据条件过滤原始表的数据,查询到想要的数据
1)语法
2)分类
①条件表达式
②逻辑表达式
③模糊查询
⭐ 注意:where 一定要放到 from 后面。NULL 不是假,也不是真,而是"空";任何运算符,判断符碰到NULL,都得NULL;NULL的判断只能用is null,is not null;NULL 影响查询速度,一般避免使值为NULL。exists查询可以与in型子查询互换,它们之间区别以后语句优化时会详细讲解。
3、 排序查询
1)语法
2)举栗
⭐ 注意:order by 一定要放到 语句最后(limit前面)
4、分组查询
1)语法
2)特点
①可以按单个字段分组
②和分组函数一同查询的字段最好是分组后的字段
③分组筛选(where 和 having区别)
④可以按多个字段分组,字段之间用逗号隔开
⑤可以支持排序
⑥having后可以支持别名
3)举栗
⭐ 注意:关键字顺序是where —>group by—>having—>order by—>limit( having不能单独使用,需结合group by ,表示对分组后的结果进行筛选;而 group by 必须结合分组聚合函数一起使用 ,比如:count()、max()等)
5、 常见函数
1)单行函数
2)分组函数
3)分组函数特点
①以上五个分组函数都忽略null值,除了count(*)
②sum和avg一般处理数值型,max、min、count可以处理任何数据类型
③都可以搭配distinct使用,用于统计去重后的结果
④count的参数可以支持:字段、*、常量值,一般放1
6、连接查询(多表查询)
单个表不能满足需求时,需要结合多张表,去除有关联的数据。这时就需要用连接查询,连接查询有三种,通常join使用的最多。
①等值连接的结果 = 多个表的交集
②多个表不分主次,没有顺序要求
③一般为表起别名,提高阅读性和性能
①语法
②好处
语句上,连接条件和筛选条件实现了分离,简洁。
⭐ 注意:左右连接可互换 A left join B 等价于B right join A;内连接是左</pre>
右连接的交集;mysql没有外连接。
自连接相当于等值连接,但是等值连接涉及多个表,而自连接仅仅是它自己。如下:在员工信息表里,查询员工名和直接上级的名。
7、子查询
一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询。在外面的查询语句,称为主查询或外查询。
①子查询都放在小括号内
②子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
③子查询优先于主查询执行,主查询使用了子查询的执行结果
④子查询根据查询结果的行数不同分为以下两类:
2)举栗
8、分页查询 (可选)
实际web开发中,当显示的数据,一页显示不完时,需要分页提交sql请求。
2)特点
①起始条目索引默认从0开始
②limit子句放在查询语句的最后
③公式:select * from 表 limit (page-1)*sizePerPage,
3)举栗
9、union联合查询
union用于把涉及多个表的SELECT语句的结果组合到一个结果集合中。适用于查询条件较多,多个表之间没有连接关系的场景。</pre>
2)特点
①多条查询语句的查询的列数必须是一致的
②多条查询语句的查询的列的类型几乎相同
③union 代表去重,union all 代表不去重
3)举栗
UNION 和 UNION ALL 运行结果的区别如下:
⭐ 注意:在多个 SELECT 语句中,第一个 SELECT 语句中被使用的字段名称将被用于结果的字段名称。当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION
好,今天学习到这里。工作中用的最多就是查询。如果能消化本文涉及到的所有内容,大概能解决80%的工作需求。本文更多的是原理介绍,例子不多,只有先知道是什么,才能知道怎么学。那么,接下来最重要的是要多练习实践。因为实际的业务场景要复杂很多,给大家推荐两个刷题的网站,力扣和牛客网,里面有大量的sql面试题。能进一步提高我们sql的水平。这篇文章主要是SQL的常用查询。明天继续学习SQL的DML增删改。一起加油!
评论列表(0条)