Oracle_group by分组查询_深入
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Oracle_group by分组查询_深入,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5586字,纯文字阅读大概需要8分钟。
内容图文
![Oracle_group by分组查询_深入](/upload/InfoBanner/zyjiaocheng/477/4b76acf3e55842aaa19b95ffda04f3ac.jpg)
在SQL Server中使用的分组查询是ORDER BY子句,使用ORDER BY子句要同聚合函数配合使用才能完成分组查询,在SELECT查询的字段中如果字段没有使用聚合函数就必须出现在ORDER BY子句中(即SELECT后边的字段名要么出现在聚合函数中,要么在ORDER BY子句中使用)
在分组查询中还可以配合使用HAVING子句,定义查询条件。
使用group by进行分组查询
在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:
〉被分组的列
〉为每个分组返回一个值得表达式,例如用一个列名作为参数的聚合函数
group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面(重要)
group by实例
实例一
数据表:
姓名 科目 分数
张三 语文 80
张三 数学 98
张三 英语 65
李四 语文 70
李四 数学 80
李四 英语 90
期望查询结果:
姓名 语文 数学 英语
张三 80 98 65
李四 70 80 90
代码
SQL 代码 复制![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220096.jpg)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220123.jpg)
create table testScore
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220151.jpg)
(
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220180.jpg)
tid int primary key identity(1,1),
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220221.jpg)
tname varchar(30) null,
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220248.jpg)
ttype varchar(10) null,
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220276.jpg)
tscor int null
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220313.jpg)
)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220358.jpg)
go
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220387.jpg)
---插入数据insert into testScore values (‘张三‘,‘语文‘,80)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220444.jpg)
insert into testScore values (‘张三‘,‘数学‘,98)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220473.jpg)
insert into testScore values (‘张三‘,‘英语‘,65)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220501.jpg)
insert into testScore values (‘李四‘,‘语文‘,70)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220529.jpg)
insert into testScore values (‘李四‘,‘数学‘,80)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220567.jpg)
insert into testScore values (‘李四‘,‘英语‘,90)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220593.jpg)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220622.jpg)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220650.jpg)
select tname as ‘姓名‘ ,
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220679.jpg)
max(case ttype when ‘语文‘ then tscor else 0 end) ‘语文‘,
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220707.jpg)
max(case ttype when ‘数学‘ then tscor else 0 end) ‘数学‘,
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220733.jpg)
max(case ttype when ‘英语‘ then tscor else 0 end) ‘英语‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220761.jpg)
from testScore
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220789.jpg)
group by tname
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220816.jpg)
实例二
有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为Primary Key)
国家(country) | 人口(population) |
中国 | 600 |
美国 | 100 |
加拿大 | 100 |
英国 | 200 |
法国 | 300 |
日本 | 250 |
德国 | 200 |
墨西哥 | 50 |
印度 | 250 |
根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
洲 | 人口 |
亚洲 | 1100 |
北美洲 | 250 |
其他 | 700 |
代码
SQL 代码 复制![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220852.jpg)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220882.jpg)
SELECT SUM(population),
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220909.jpg)
CASE country
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220936.jpg)
WHEN ‘中国‘ THEN ‘亚洲‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220965.jpg)
WHEN ‘印度‘ THEN ‘亚洲‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070220993.jpg)
WHEN ‘日本‘ THEN ‘亚洲‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221020.jpg)
WHEN ‘美国‘ THEN ‘北美洲‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221060.jpg)
WHEN ‘加拿大‘ THEN ‘北美洲‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221089.jpg)
WHEN ‘墨西哥‘ THEN ‘北美洲‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221115.jpg)
ELSE ‘其他‘ END
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221154.jpg)
FROM Table_A
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221183.jpg)
GROUP BY CASE country
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221211.jpg)
WHEN ‘中国‘ THEN ‘亚洲‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221238.jpg)
WHEN ‘印度‘ THEN ‘亚洲‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221267.jpg)
WHEN ‘日本‘ THEN ‘亚洲‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221304.jpg)
WHEN ‘美国‘ THEN ‘北美洲‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221339.jpg)
WHEN ‘加拿大‘ THEN ‘北美洲‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221366.jpg)
WHEN ‘墨西哥‘ THEN ‘北美洲‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221406.jpg)
ELSE ‘其他‘ END;
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221437.jpg)
同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下;
SQL 代码 复制![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221465.jpg)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221492.jpg)
SELECT
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221520.jpg)
CASE WHEN salary <= 500 THEN ‘1‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221555.jpg)
WHEN salary > 500 AND salary <= 600 THEN ‘2‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221581.jpg)
WHEN salary > 600 AND salary <= 800 THEN ‘3‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221609.jpg)
WHEN salary > 800 AND salary <= 1000 THEN ‘4‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221641.jpg)
ELSE NULL END salary_class,
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221669.jpg)
COUNT(*)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221695.jpg)
FROM Table_A
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221722.jpg)
GROUP BY
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221750.jpg)
CASE WHEN salary <= 500 THEN ‘1‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221777.jpg)
WHEN salary > 500 AND salary <= 600 THEN ‘2‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221805.jpg)
WHEN salary > 600 AND salary <= 800 THEN ‘3‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221833.jpg)
WHEN salary > 800 AND salary <= 1000 THEN ‘4‘
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221862.jpg)
ELSE NULL END;
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221892.jpg)
对于groupby后面一般都是跟一个列名,但在该例子中通过case语句使分组变得跟强大了。
实例三
有如下数据
国家(country) | 性别(sex) | 人口(population) |
中国 | 1 | 340 |
中国 | 2 | 260 |
美国 | 1 | 45 |
美国 | 2 | 55 |
加拿大 | 1 | 51 |
加拿大 | 2 | 49 |
英国 | 1 | 40 |
英国 | 2 | 60 |
按照国家和性别进行分组,得出结果如下
国家 | 男 | 女 |
中国 | 340 | 260 |
美国 | 45 | 55 |
加拿大 | 51 | 49 |
英国 | 40 | 60 |
代码
SQL 代码 复制![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221922.jpg)
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221949.jpg)
SELECT country,
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070221979.jpg)
SUM( CASE WHEN sex = ‘1‘ THEN
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070222018.jpg)
population ELSE 0 END), --男性人口SUM( CASE WHEN sex = ‘2‘ THEN
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070222096.jpg)
population ELSE 0 END) --女性人口FROM Table_A
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070222150.jpg)
GROUP BY country;
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070222176.jpg)
GROUP BY子句中的NULL值处理
当GROUP BY子句中用于分组的列中出现NULL值时,将如何分组呢?SQL中,NULL不等于NULL(在WHERE子句中有过介绍)。然而,在GROUP BY子句中,却将所有的NULL值分在同一组,即认为它们是“相等”的。
HAVING子句
GROUP BY子句分组,只是简单地依据所选列的数据进行分组,将该列具有相同值的行划为一组。而实际应用中,往往还需要删除那些不能满足条件的行组,为了实现这个功能,SQL提供了HAVING子句。语法如下。
SELECT column, SUM(column)
FROM table
GROUP BY column
HAVING SUM(column) condition value
说明:HAVING通常与GROUP BY子句同时使用。当然,语法中的SUM()函数也可以是其他任何聚合函数。DBMS将HAVING子句中的搜索条件应用于GROUP BY子句产生的行组,如果行组不满足搜索条件,就将其从结果表中删除。
HAVING子句的应用
从TEACHER表中查询至少有两位教师的系及教师人数。
实现代码:
SQL 代码 复制![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070222204.jpg)
SELECT DNAME, COUNT(*) AS num_teacher
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070222364.jpg)
FROM TEACHER
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070222420.jpg)
GROUP BY DNAME
![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070222476.jpg)
HAVING COUNT(*)>=2![Oracle_group by分组查询_深入 - 文章图片](/upload/getfiles/0001/2021/4/24/20210424070222548.jpg)
HAVING子句与WHERE子句的区别
HAVING子句和WHERE子句的相似之处在于,它也定义搜索条件。但与WHERE子句不同,HAVING子句与组有关,而不是与单个的行有关。
1、如果指定了GROUP BY子句,那么HAVING子句定义的搜索条件将作用于这个GROUP BY子句创建的那些组。
2、如果指定WHERE子句,而没有指定GROUP BY子句,那么HAVING子句定义的搜索条件将作用于WHERE子句的输出,并把这个输出看作是一个组。
3、如果既没有指定GROUP BY子句也没有指定WHERE子句,那么HAVING子句定义的搜索条件将作用于FROM子句的输出,并把这个输出看作是一个组。
4、在SELECT语句中,WHERE和HAVING子句的执行顺序不同。在本书的5.1.2节介绍的SELECT语句的执行步骤可知,WHERE子句只能接收来自FROM子句的输入,而HAVING子句则可以接收来自GROUP BY子句、WHERE子句和FROM子句的输入。
Oracle_group by分组查询_深入
标签:sql normal group .com 分组查询 规则 技术分享 http copy
本文系统来源:http://www.cnblogs.com/haozhengfei/p/e6a9a2f95b0b85887857e00176e800a8.html
内容总结
以上是互联网集市为您收集整理的Oracle_group by分组查询_深入全部内容,希望文章能够帮你解决Oracle_group by分组查询_深入所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。