oracle数据集合的操作

一、统计函数

统计函数包括:

COUNT():统计个数

SUM():计算求和

MIN():求最小值

AVG():求平均值

MAX():求最大值

范例:计算emp表中的总人数、平均工资、总工资、最低工资与最高工资

SELECT COUNT(*) 人数, AVG(sal) 平均工资, SUM(sal) 每月总支出,MIN(sal) 最低工资,MAX(sal) 最高工资 FROM emp;

范例:统计出公司的平均雇佣年限

SELECT AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12)

FROM emp;  ---统计函数允许与其他的函数嵌套

注意:以上的几个操作函数,在表中没有数据的时候,只有COUNT()函数会返回结果,其他都是null。

二、分组统计

如果要进行分组则应该使用GROUP BY句子完成,那么此时的SQL语法结构变为如下形式:

【4选出所需要的数据列】SELECT [DISTINCT] * | 分组列[别名],分组列 [别名]…

【1确定数据来源】FROM 表名

【2筛选数据行】[WHERE 限定条件(s)];称[别名]

【3对筛选的行分组】[GROUP BY 分组字段,分组字段…]

【5数据排序】ORDER BY 排序字段 [ASC|DESC],排序字段 [ASC|DESC], …

范例:根据部门编号分组,查询出每个部门的编号、人数、平均工资

SELECT deptno, COUNT(*), AVG(sal)

FROM emp

GROUP BY deptno;

使用分组需要注意三个条件:

1、如果查询不使用GROUP BY 子句,那么SELECT 子句中只允许出现统计函数,其他任何字段不允许出现。

2、如果查询中使用了GROUP BY 子句,那么SELECT子句中只允许出现分组字段、统计函数、其他字段都不允许出现。

3、统计函数允许嵌套,但是嵌套之后的SELECT子句里面只允许出现嵌套函数,而不允许出现任何字段,包括分组字段。

三、HAVING 子句

HAVING 子句:有HAVING时必然有GROUP BY。反之未必。

【5选出所需要的数据列】SELECT [DISTINCT] * | 分组列[别名],分组列 [别名]…

【1确定数据来源】FROM 表名称[别名]

【2筛选数据行】[WHERE 限定条件(s)];

【3对筛选的行分组】[GROUP BY 分组字段,分组字段…]

【4 针对于筛选的行分组】[HAVING 分组过滤]

【6数据排序】ORDER BY 排序字段 [ASC|DESC],排序字段 [ASC|DESC], …

范例:要求查询出每个职位的名称,职位的平均工资,但是要求显示的平均工资高于2000。

SELECT job, AVG(sal)

FROM emp

GROUP BY job

HAVING AVG(sal) > 2000;

说明:关于WHERE与HAVING的区别?

WHERE子句是在GROUP BY 分组之前进行筛选,指的是选出那些可以参与分组的数据,并且WHERE子句中不允许使用统计函数;

HAVING子句实在GROUP BY分组之后执行的,可以使用统计函数

四、子查询嵌套

子查询就是查询嵌套。都需要使用()。而且查询子句的一个任意位置上都可以随意出现子查询。但是出现子查询最多的位置:WHERE, FROM,HAVING 。如下使用推荐方案。

WHERE子句:子查询返回单行单列、单行多列、多行单列;

HAVING子句:子查询返回单行单列,而且要使用统计函数过滤;

FROM子句:子查询返回的是多行多列;

 

1、where子句:

where子句中主要返回单行单列、单行多列、多行单列等几种情况:

范例:要求查询出工资工资最低的固原信息。

SELECT *

FROM emp

WHERE sal=(SELECT MIN(sal) FROM emp);

对于where子句查询返回多行单列的情况,那么实质上就相当于告诉用户一个数据的操作范围。而对范围的判断,主要有三个运算符:IN 、ANY 、ALL

IN 操作:

范例:找出工资在MANAGER职员范围内的雇员信息

SELECT *

FROM emp

WHERE sal IN(SELECT sal FROM emp WHERE job = ‘MANAGER‘);

NOT IN操作:

范例:找出工资不在MANAGER职员范围内的雇员信息

SELECT *

FROM emp

WHERE sal IN(SELECT sal FROM emp WHERE job = ‘MANAGER‘);

注意,这里的操作,一定要保证子句里查询的结果不为null。

ANY操作:

1、=ANY: 功能上与IN完全没有任何区别

SELECT *

FROM emp

WHERE sal = ANY (SELECT sal FROM emp WHERE job = ‘MANAGER‘);

2、>ANY: 比子查询返回的最小的内容要大

SELECT *

FROM emp

WHERE sal > ANY (SELECT sal FROM emp WHERE job = ‘MANAGER‘);

3、<ANY: 比查询返回的最大值的内容要小

SELECT *

FROM emp

WHERE sal < ANY (SELECT sal FROM emp WHERE job = ‘MANAGER‘);

ALL操作:

1、>ALL: 比子查询返回最大的值要大

SELECT *

FROM emp

WHERE sal > All (SELECT sal FROM emp WHERE job = ‘MANAGER‘);

2、<ALL: 比子查询返回的最小的值还要小

SELECT *

FROM emp

WHERE sal < All (SELECT sal FROM emp WHERE job = ‘MANAGER‘);

Exists()判断是否满足条件

如果现在子查询有数据返回(不管任何数据)就表示条件满足。那么就显示出数据,否则不显示。

使用exists()只关心子查询里面返回的是否有行,至于什么行,它不关心

SELECT *

FROM EMP

WHERE EXISTS( SELECT * FROM emp WHERE empno=7839);

2、having 子句使用子查询

使用HAVING的前提是得使用了GROUP BY,而使用了GROUP BY就一定要分组。

范例:要求统计出所有高于公司平均工资的部门编号、平均工资、部门人数。

SELECT deptno, COUNT(*),AVG(sal)

FROM emp

GROUP BY deptno

HAVING AVG(sal) > (SELECT AVG(sal) FROM emp);

3、from子句使用子查询

范例:将这个语句查询出来的表最为一张临时表:SELECT deptno, COUNT(empno) count, AVG(sal) avg  FROM emp  GROUP BY deptno---根据部门进行分组查询出部门人数、平均工资等信息。

然后将temp这张表与dept这张表进行多表查询。

SELECT d.deptno, d.dname, d.loc, temp.count, temp.avg

FROM dept d, ( SELECT deptno, COUNT(empno) count, AVG(sal) avg

FROM emp  GROUP BY deptno ) temp

WHERE d.deptno = temp.deptno(+);

 

 

原文地址:https://www.cnblogs.com/Etude/p/9275430.html

时间: 2024-11-10 14:05:04

oracle数据集合的操作的相关文章

Oracle 数据导入导出操作 (转)

Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的丢失). Oracle有个好处,虽然你的电脑不是服务器,但是你装了oracle客户端,并建立了连接 (通过Net Configuration Assistant添加正确的服务命名,其实你可以想成是客户端与服务器端 修了条路,然后数据就可以被拉过来了) 这样你可以把数据导出到本地,虽然可能服务器离你很远

oracle中的数据集合操作

一.数据更新操作 DML语法中主要包括两个内容:查询与更新,更新主要包括:增加数据.修改数据.删除数据.其中这些操作是离不开查询的.         1.增加数据 语法:INSERT INTO 表名称 [(字段名称1, 字段名称2,-)] VALUES(数据1,数据2-..): 注意:     1.对于字符串需要使用""括起来     2.对于时间可以使用to_date()进行转换     3.数字就直接写 范例:向myemp表中插入一条数据 INSERT INTO myemp(emp

oracle 如何用触发器实现更新刚插入的数据集合

oracle 如何用触发器实现更新刚插入的数据集合 1.建立测试表 create table TEST_TB ( ID   NUMBER, WLID NUMBER, PM   VARCHAR2(100), DJZT VARCHAR2(10), SL   NUMBER, PH   VARCHAR2(100) ); 2.建立带ref cursor定义的包和包体及函数: CREATE OR REPLACE package pkg_test as /* 定义ref cursor类型 不加return类型

VS2015操作Oracle数据需要做那些设置?

1>在oracle网上下载:ODP.NET 2> 要根据自己的oracle 数据32bit/64bit,选择下载. 3> 根据提示配置tnsnames.ora文件. # alias = # (DESCRIPTION = # (ADDRESS = (PROTOCOL = TCP)(HOST =localhost)(PORT = 1521)) # (CONNECT_DATA = # (SERVER = DEDICATED) # (SERVICE_NAME = orcl) # ) # ) al

Oracle 数据操作提示“记录被另一个用户锁住”

oracle数据中删除数据时提示“记录被另一个用户锁住” 解决方法: 1.查看数据库锁,诊断锁的来源及类型: select object_id,session_id,locked_mode from v$locked_object; 或者用以下命令: select b.owner,b.object_name,l.session_id,l.locked_mode from v$locked_object l, dba_objects b where b.object_id=l.object_id

oracle之sql简单操作

基于上篇文章的环境下进行操作http://huangsir007.blog.51cto.com/6159353/1854392 oracle用户sys.system区别: sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限 system用户是管理操作员,权限也很大,具有sysoper角色,没有create database的权限 一般来说,对数据库维护,使用system用户登录就可以 sqlplus: Usage 2: sqlplus [ [<opt

python集合相关操作

集合相关操作 集合是一个无序的,不重复的数据组合,它有着两个主要作用:去重以及关系测试. 去重指的是当把一个列表变成了集合,其中重复的内容就自动的被去掉了 关系测试指的是,测试两组数据之间的交集.差集.并集等关系. 去重测试代码如下: # 创建一个列表 -- 里面存在一些重复值 test_list = [1,2,3,4,2,2,3,4,3,2,3,4] # 利用集合将列表中重复的内容去掉 test_list = set(test_list) # 打印测试并且查看test_list 被赋予新值后的

Goldengate抽取ORACLE 数据 到 Hbase

1.        软件版本说明: Goldengate 12c  12.2.0.1 forOracle (源端 ) Goldengate 12c  12.2.0.1  for Bigdata ( 目标端) Oracle 11g 11.2.0.4.0 (注oracle 数据库必须是11.2.0.4之后的版本,之前的oracle 数据库版本不支持ogg 12c ) HBase 1.1.2 Java 1.8.0_91 2.        机器IP 说明 源端IP地址(192.168.45.176)安

Oracle数据泵expdp/impdp

Oracle11g以后的新特性使得默认条件下在分配表空间时忽略空表,以减少表空间的资源占用,这样使得在使用Oracle的exp导出用户数据时就会忽略空表,这样就会造成数据的不完整,当然在使用exp导出数据时也不是没有办法,这个以前有提到过,在此就不做过多的赘述了http://jim123.blog.51cto.com/4763600/1934205.使用这种方法是可以解决在使用exp导出用户数据时不会忽略空表,但是还有更为高效的办法就是使用expdp/impdp --Oracle数据泵,来对Or