Oracle数据库——分组查询

select * from emp;

开始之前需要导入一些表,下载地址:https://yuyunyaohui.lanzous.com/ivPKcdnlecd
导入方法:https://blog.csdn.net/hyh17808770899/article/details/106744978

示例数据:员工表emp、部门表dept、工资级别表salgrade
在这里插入图片描述

一、分组函数的概念

什么是分组函数?
分组函数作用于一组数据,并对一组数据返回一个值。
在这里插入图片描述

二、分组函数的使用

SELECT     [column,] group function(column),FROM 	    table
[WHERE   condition]
[GROUP BY   column]
[ORDER BY   column]

三、常用的分组函数

1、AVG(平均值)和SUM(合计)函数

求出员工的平均工资和工资的总额

select avg(sal),sum(sal) from emp;

在这里插入图片描述
2、MIN(最小值)和MAX(最大值)函数

求出员工工资的最大值和最小值

select min(sal),max(sal) from emp;

在这里插入图片描述
3、COUNT(计数)函数

求出员工的总人数

select count(*) from emp;
select count(empno) from emp;

在这里插入图片描述
4、DISTINCT(distinct)关键字

求出部门数

select count(distinct deptno) from emp;

在这里插入图片描述
5、LISTAGG:行转列

set linesize 200;
col 部门中员工的姓名 for a60;
select deptno 部门号,listagg(ename,',') within group (order by ename) 部门中员工的姓名
from emp group by deptno;

在这里插入图片描述
6、分组函数与空值

分组函数会自动忽略空值

例1:统计员工的平均工资

select sum(sal)/count(*),sum(sal)/count(sal),avg(sal)from emp;

在这里插入图片描述
例2:统计员工的平均奖金

select sum(comm)/count(*), sum(comm)/count(comm), avg(comm)from emp;

在这里插入图片描述

7、在分组函数中使用NVL函数

注意:NVL函数使分组函数无法忽略空值

select count(*),count(comm) from emp;
select count(*),count(nvl(comm,0)) from emp;

在这里插入图片描述
使用GROUP BY 子句数据分组
在这里插入图片描述


三、分组数据

GROUP BY 子句语法

SELECT     column, group function(column),FROM 	    table
[WHERE   condition]
[GROUP BY   group _by_expression]
[ORDER BY   column];

1、可以使用GROUP BY子句将表中的数据分成若干组

(1)在select列表中所有未包含在组函数中的列都应该包含在GROUP BY子句中

例:求每个部门的平均工资,要求显示:部门号,部门平均工资

select deptno,avg(sal)
from emp
group by deptno;

在这里插入图片描述

SELECT     a,b,c,组函数(x)
FROM 	 table 
GROUP BY   a,b,c;

(2)包含在GROUP BY子句中的列不必包含在select列表中

例:求每个部门的平均工资,要求显示:部门平均工资

select avg(sal)
from emp
group by deptno;

在这里插入图片描述

SELECT    组函数(x)
FROM 	 table 
GROUP BY   a,b,c;

2、使用多个列分组

在这里插入图片描述

例:按部门、不同的职位,统计员工的工资总额

select deptno,empjob,sum(sal)
from emp
group by deptno,empjob
order by deptno;

在这里插入图片描述
3、过滤分组

having子句的使用
在这里插入图片描述

having子句的语法

SELECT         column, group_function(column),FROM 	        table
[WHERE        condition]
[GROUP BY   group_by_expression]
[HAVING  	  group_condition]
[ORDER BY   column];

having子句示例
求平均工资大于2000的部门,要求显示:部门号,平均工资

select deptno,avg(sal)
from emp
group by deptno
having avg(sal) > 2000;

在这里插入图片描述


四、使用HAVING子句过滤分组结果集

1、where与having的区别

不能再WHERE子句中使用组函数(注意)

可以在HAVING子句中使用组函数

2、where与having可以通用的情况

例:查询10号部门的平均工资
注:从SQL优化的角度上看,尽量使用where;
having先分组,后过滤;where先过滤,后分组

select deptno,avg(sal)
from emp
group by deptno
having deptno=10;

在这里插入图片描述

select deptno,avg(sal)
from emp
where deptno=10
group by deptno;

在这里插入图片描述


五、在分组查询中使用order by子句

例:求每个部门的平均工资,要求显示:部门号,部门的平均工资,并且按照工资升序排列

可以按照:(列、别名、表达式、序号)进行排序

select deptno,avg(sal)
from emp
group by deptno
order by avg(sal);
select deptno,avg(sal) 平均工资
from emp
group by deptno
order by 平均工资;
select deptno,avg(sal) 平均工资
from emp
group by deptno
order by 2;

在这里插入图片描述

1、分组函数的嵌套

例:求部门平均工资的最大值
1、通过AVG函数求出每个部门的平均工资
2、嵌套MAX函数求出部门平均工资的最大值

select max(avg(sal))
from emp
group by deptno;

在这里插入图片描述

2、group by 语句的增强

(1)按部门、不同的职位,统计工资总额

select deptno,empjob,sum(sal)
from emp
group by deptno,empjob
order by deptno;

在这里插入图片描述
(2)按部门,统计工资总额

select deptno,avg(sal)
from emp
group by deptno
order by deptno;

在这里插入图片描述
(3)统计工资总额

select sum(sal) from emp;

在这里插入图片描述
语法:

	group by rollup(a, b)
等价于:
	group by a,b
	+
	group by a
	+
	group by null
select deptno,empjob,sum(sal)
from emp
group by rollup(deptno,empjob);

在这里插入图片描述

break on deptno skip 2;
select deptno,empjob,sum(sal)
from emp
group by rollup(deptno,empjob);

在这里插入图片描述

set pagesize 30;
select deptno,empjob,sum(sal)
from emp
group by rollup(deptno,empjob);

在这里插入图片描述


六、SQL*Plus的报表功能

报表包括:标题、页码、别名等。

ttitle col 15 ‘我的报表’ col 35 sql.pno col 15 表示空15列 sql.pno表示报表的页码

col deptno heading 部门号 col job heading 职位 col sum(sal) heading 工资总额
break on deptno skip 1

get E:\study\大三下\数据库应用开发\导出.sql
ttitle col 15 '我的报表' col 35 sql.pno
col deptno heading 部门号
col empjob heading 职位
col sum(sal) heading 工资总额
break on deptno skip 1;
@E:\study\大三下\数据库应用开发\导出.sql;
select deptno, empjob, sum (sal) ;
from emp
group by rollup (deptno, empjob) ;
set pagesize 10;
select deptno,empjob,sum(sal)
from emp
group by rollup(deptno,empjob);

在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实验一 SQL*PLUS练习 【实验目的】 (1) 了解Oracle的工作环境和基本使用方法。 (2) 练习标准SQL的数据操作,查询命令及其查询优化。 (3) 学会使用高级SQL命令,排序、分组、自连接查询等。 (4) 学会使用SQL*PLUS命令显示报表,存储到文件等。 【实验内容】 一、 准备使用SQL*PLUS 1. 进入SQL*PLUS 2. 退出SQL*PLUS 3. 显示表结构命令DESCRIBE SQL>DESCRIBE emp 使用DESCRIBE(缩写DESC)可以列出指定表的基本结构,包括各字段字段名以及类型、长度、是否非空等信息。 4. 使用SQL*PLUS显示数据库EMP表的内容 输入下面的查询语句: SQL>SELECT * FROM emp; 按下回车键执行查询 5. 执行命令文件 START或@命令将指定文件调入SQL缓冲区,并执行文件内容。 SQL>@ 文件名(文件后缀缺省为.SQL)或 SQL>START 文件名 文件每条SQL语句顺序装入缓冲区并执行。 二、 数据库命令——有关表、视图等的操作 1. 创建表employee 例1 定义一个人事信息管理系统存放职工基本信息的一张表。可输入如下命令: SQL>CREATE TABLE employee (empno number(6) PRIMARY KEY, /* 职工编号 name varchar2(10) NOT NULL, /* 姓名 deptno number(2) DEFAULT 10, /* 部门号 salary number(7,2) CHECK(salarycreate table emp2 as select * from emp where 1=2; 在命令的where子句给出1=2,表示条件不可能成立,因而只能复制表结构,而不能复制任何数据到新表去。另外,还可以复制一个表的部分列定义或部分列定义及其数据。 三、 Oracle数据库数据查询 1、单表查询 2、多表查询 四、 SQL*PLUS常用命令 表1 常用报表格式化名命令 命令 定义 Btitle 为报表的每一页设置底端标题 Column 设置列的标题和格式 Compute 让SQL*PLUS计算各种值 Remark 将某些字标记为注释 Set linesize 设置报表的行宽字符数 Set newpage 设置报表各页之间的行数 Spool 使SQL*PLUS将输出写入文件 Start 使SQL*PLUS执行一个sql文件 Ttitle 设置报表每页的头标题 Break 让SQL*PLUS进行分组操作 例3 建立一个批命令文件对查询到的数据以报表的形式输出并将其保存到指定的文件。 处理方法:利用SQL*PLUS语言工具(也可以使用其他文本编辑器)建立批命令的.SQL文件。在“SQL>”提示符下,使用EDIT命令在”E:\”建立SCGB.SQL文件。 SCGB.SQL文件的命令组如下: SQL>EDIT E:\ SCGB.SQL SET echo off SET pagesize 30 SET linesize 75 TTITLE’2008年4月10号’CE’公司职员基本情况登记表’R’Page:’ FORMAT 99- >SQL.PNO SKIP 1 CE’===========================’ BTITLE COL 60 ’制标单位’ TAB 3 ‘人事部’ COLUMN empno heading ‘职工|编号’ COLUMN ename format a10 heading ‘姓 名’ COLUMN job heading ‘工 种’ COLUMN sal format $99,990 heading 工 资’ COLUMN comm Like sal heading ‘奖 金’ COLUMN deptno format 9999 heading ‘部门|编号’ COLUMN hiredate heading ‘参工作时间’ SPOOL e:\sjbb /*在E盘建立格式报表输出文件,默认属性为LST BREAK on deptno skip 1 COMPUTE sum of sal comm on deptno SELECT empno,ename,job,hiredate,sal,comm,deptno from emp ORDER BY deptno,sal; SPOOL off /*终止SPOOL功能,关闭其文件。注意,此命令不可省,否则将建立空文件。 五、 实验内容 1、以cs+学号为用户名创建用户,并授予用户创建数据对象的权限。 2、复制emp表,复制表名为emp_学号,然后将emp表工资低于$2000 的职工插入到复制的表。 3、对复制的emp表插入一行只包含有职工号,职工名,工资与部门号四个数据 项值的记录。 4、在复制的emp表将雇员ALLEN提升为经理,工资增至$2500, 奖(佣 )金增40%。 5、删除复制的emp表工资低于500的记录行。 6、列出10号部门既不是经理,也不是秘书的职工的所有信息。 7、查找出部门所在地是CHICAGO的部门的职工姓名、工资和工种。 8、统计各部门各工种的人数、工资总和及奖金总和。 9、查找出工资比其所在部门平均工资高的职工姓名、工种与工资情况。 实验3 Oracle数据库开发环境下PL/SQL编程 【实验目的】 (1)掌握 PL/SQL 的基本使用方法。 (2)在SQL*PLUS环境下运行PL/SQL的简单程序。 (3)应用 PL/SQL 解决实际问题 【实验内容与步骤】 PL/SQL的可执行部分是由一系列语句组成的(包括对数据库进行操作的SQL语句,PL/SQL语言的各种流程控制语句等)。在块数据库查询,增、删、改等对数据的操作是由SQL命令完成的。在PL/SQL,可以使用SQL的数据查询命令,数据操纵命令和事务控制命令。可使用全部SQL函数。PL/SQLSQL语句,可使用SQL的比较操作等运算符。但不能使用数据定义语句。 在PL/SQL使用SELECT语句时注意几点: (1)SELECT语句必须含有INTO子句。 (2)INTO子句后的变量个数和位置及数据类型必须和SELECT命令后的字段名表相同。 (3)INTO子句后可以是简单类型变量或组合类型变量。 (4)SELECT语句的WHERE条件可以包含PL/SQL定义的变量及表达式,但变量名不要同数据库表列名相同。 (5)在未使用显式游标的情况下,使用SELECT语句必须保证只有一条记录返回,否则会产生异常情况。 [例3-1] 问题:编写一个过程,求和运算。 SET SERVEROUTPUT ON; DECLARE a number:=1; BEGIN a:=a+5; DBMS_OUTPUT.PUT_LINE('和为:'||TO_CHAR(a)); END; / 【例3-2】:使用%TYPE声明变量,输出制定表的相关信息。 DECLARE my_name student.sname%TYPE; BEGIN SELECT sname INTO my_name FROM student WHERE no=’01203001’; DBMS_OUTPUT.PUT_LINE(my_name); END; / 【例3-3】问题:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该员工工资增10%。 declare v_sal emp.sal%type; begin select sal into v_sal from emp where ename=spName; if v_sal :NEW.sal THEN DBMS_OUTPUT.PUT_LINE('工资减少'); ELSIF :OLD.sal < :NEW.sal THEN DBMS_OUTPUT.PUT_LINE('工资增'); ELSE DBMS_OUTPUT.PUT_LINE('工资未作任何变动'); END IF; DBMS_OUTPUT.PUT_LINE('更新前工资 :' || :OLD.sal); DBMS_OUTPUT.PUT_LINE('更新后工资 :' || :NEW.sal); END; / --执行UPDATE查看效果 UPDATE emp SET sal = 3000 WHERE empno = '7788'; 6、需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。 Create table foo(a number); Create trigger biud_foo Before insert or update or delete On foo Begin If user not in (‘DONNY’) then Raise_application_error(-20001, ‘You don’t have access to modify this table.’); End if; End; / 即使SYS,SYSTEM用户也不能修改foo表。 2、 利用PL/SQL编写程序实现下列触发器 1)、编写一个数据库触发器,当任何时候某个部门从dept表删除时,该触发器将从emp表删除该部门的所有雇员。(要求:emp表、dept表均为复制后的表) 2)、创建一个触发器,当客户下完订单后,自动统计该订单的所有图书的价格总额。 3)、创建一个触发器,禁止客户在非工作时间(早上8:00前,晚上17:00后)下订单。 五、实验心得
编辑推荐 《Oracle SQL高级编程》:资深Oracle专家力作,OakTable团队推荐,全面、独到、翔实,题材丰富,Oracle开发人员和DBA必备。 媒体推荐 本书作者全部是OakTable的成员,且具有15-29年丰富的Oracle开发经验。在研究一些被其他专门讨论Oracle SQL语言的参考书直接忽略的问题时,这种对Oracle数据库的长期钻研无疑是一个巨大的优势。   ——亚马逊读者评论 目录 第1章 SQL核心 1 1.1 SQL语言 1 1.2 数据库的接口 2 1.3 SQL*Plus 回顾 3 1.3.1 连接到数据库 3 1.3.2 配置SQL*Plus环境 4 1.3.3 执行命令 6 1.4 5 个核心的SQL语句 8 1.5 SELECT语句 8 1.5.1 FROM子句 9 1.5.2 WHERE子句 11 1.5.3 GROUP BY子句 11 1.5.4 HAVING子句 12 1.5.5 SELECT列表 12 1.5.6 ORDERBY子句 13 1.6 INSERT语句 14 1.6.1 单表插入 14 1.6.2 多表插入 15 1.7 UPDATE语句 17 1.8 DELETE语句 20 1.9 MERGE语句 22 1.10 小结 24 第2章 SQL执行 25 2.1 Oracle架构基础 25 2.2 SGA-共享池 27 2.3 库高速缓存 28 2.4 完全相同的语句 29 2.5 SGA-缓冲区缓存 32 2.6 查询转换 35 2.7 视图合并 36 2.8 子查询解嵌套 39 2.9 谓语前推 42 2.10 使用物化视图进行查询重写 44 2.11 确定执行计划 46 2.12 执行计划并取得数据行 50 2.13 SQL执行——总览 52 2.14 小结 53 第3章 访问和联结方法 55 第4章 SQL是关于集合的 95 第5章 关于问题 116 第6章 SQL执行计划 137 第7章 高级分组 170 第8章 分析函数 197 第9章 Model子句 225 第10章 子查询因子化 254 第11章 半联结和反联结 292 第12章 索引 334 第13章 SELECT以外的内容 360 第14章 事务处理 386 第15章 测试与质量保证 415 第16章 计划稳定性与控制 443
Oracle 10g 开发与管理 本文是由笔者2012年学习oracle数据库时编写的学习札记,其的题目 多数为老师留下的思考题目。 我相信本文会对初学者使用oracle有一个初步的使用印象。右图为我所参 考的书籍。 第一讲 Oacle关系数据库 9 一. Oracle的安装 9 二. 用浏览器进入em 企业管理器 11 三.启动DBCA的方法 11 四.服务设置 11 五. Oracle的卸载 11 六. Oracle数据库的应用系统结构 11 七. 补充资料——oracle安装时出现的问题 12 第二讲 Oacle数据库体系结构 14 一. 物理存储结构——(数据库载体) 14 1.数据文件(.DBF) 14 2.日志文件 (.Log) 14 1) 日志文件 15 2) 数据库工作模式 15 3.控制文件(.ctl) 15 4.参数文件 (.ora) 16 二. 逻辑存储结构 17 1.数据块 (Data Blocks) 17 2.盘区(Extent) 18 3.段 (Segment) 18 4.表空间(Table Spaces) P34 18 三. 内存结构 19 1.数据缓冲区: 内存的40% 19 2.日志缓冲区: 19 3.数据字典缓冲区: 19 4.共享池 内存的10% 19 5.大池 5-10M 20 6.JAVA池 不小于20M 20 7.Streams池 20 8.软件代码区: 20 9.程序全局区(PGA) 20 四. 实例的进程结构(实例=SGA + 后台进程) 20 1.DBWR (数据库写入进程) 21 2.LGWR(日志写入进程) 22 3.ARCH(归档进程)-可选进程 22 4.CKPT(检查点进程)-可选进程 22 5.SMON (系统监控进程) 22 6.PMON (进程监控进程) 22 7.RECO (恢复进程) 22 8. Dnnn (调度进程)-可选进程(略) 22 五. 数据字典 22 第三讲 用户、模式和表 24 一. 用户和模式 24 1.模式 24 2.模式对象 24 3.用户 24 (1)创建用户 24 (2)授权 24 (3)删除用户及该模式下对象 26 二. 表 26 1. 数据类型 26 (1)字符型 26 (2)数值型 26 (3)日期时间型 26 (4)LOB (大型对象) 26 (5)RowID (伪列类型) 27 2. 创建表 27 (1)Create Table 表名 27 (2)在原来已有表上建一个新表(结构和数据) 27 (3)使用OEM建表 27 3.默认值和NULL值 27 三. 修改表 28 四. 删除表 28 五. 数据完整性 28 1.Primary Key 约束 28 2.NOT NULL约束 29 3.Unique 约束 29 4.Foreign Key 约束 29 5.Check约束 (最复杂)列级 | 表级 29 第四讲 SQL基本查询 31 一. SQL语句概述 31 1. SQL简介 31 2. SQL分类 31 3. PL/SQL (Procedure Language) 31 二. SQL*Plus 31 1.启动 SQL*Plus 单行编辑 31 2.启动iSQL*Plus 多行编辑 31 3.退出 32  直接关闭 32  输入:Exit 或 quit 32 三. 本书所使用的示例模式 32 1.Vendition:销售管理系统(11个表)(略) 32 2. School:学生成绩管理系统(6个表) 32 四. SQL SELECT语句 34 1.Select语句的格式 34 2.Select … From … ——选择列(投影) 35 3.Where子句——选择行(选择)数据过滤 35 4.Order By子句 35 5.统计函数——列名应指定别名 35 6. Group By分组 36 7.Having子句 36 8.练习:表的查询 36 五. 在SQL *Plus使用函数 37 1.字符串函数 37 2.数字函数 37 3.日期时间函数 38 4.转换函数 38 第五讲 修改SQL数据与SQL*Plus命令 40 一.添数据 40 1.Insert Into 表名 [ 字段列表 ] Values (值) 40 2.向表插入空值 40 3.从其它表拷贝数据 40 二. 更新数据 41 三. 删除数据 42 1.Delete 语句 42 2.Truncate 语句 42 四. SQL*Plus命令 42 1.设置环境变量命令 42 (1)Pause 43 (2)pagesize 和 newpage 43 (3)linesize 43

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨云21

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值