oracle高级查询(实例基于scott用户四张表)
oracle高级查询(实例基于scott用户四张表)
分组查询
多表查询
子查询
综合实例
=======================================================================
scott用户的四张表(emp,dept,bonus,salgrade)
没有这四张表的可参考http://blog.csdn.net/love_legain/article/details/54311040进行创建
-------------------------------------------
desc emp
名称 空值 类型
-------- -------- ------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
---------------------------------------------
desc dept
名称 空值 类型
------ -------- ------------
DEPTNO NOT NULL NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
------------------------------------------------
desc salgrade
名称 空值 类型
----- -- ------
GRADE NUMBER
LOSAL NUMBER
HISAL NUMBER
------------------------------------------------
desc bonus
名称 空值 类型
----- -- ------------
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
SAL NUMBER
COMM NUMBER
=============================分组查询==================================
①分组函数的概念
分组函数作用于一组数据,并对一组数据返回一个值
②分组函数的使用
--select AVG(sal),sum(sal) from emp;
-- select max(sal),min(sal) from emp;
--select count(*) from emp;
--select count (distinct DEPTNO) from emp;
wm_concat:行转列
select deptno,wm_concat(ename) from emp group by deptno--11gr2和12C上已经摒弃了wm_concat函数
在分组函数中使用nvl函数:nvl函数使分组函数无法忽略空值
select count(*),count(NVL(comm,0)) from emp;
③使用group by子句数据分组
select deptno,avg(sal) from emp group by deptno;
注意:在select列表中所有未包含在组函数中的列都应该包含在group by子句中
包含在group by子句中的列不必包含在select列表中
④使用having子句过滤分组结果集
不能再where子句中使用分组函数
可以在having子句中使用分组函数
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子句
⑥group by语句得增强
select deptno,job,sum(sal) from emp group by deptno,job;
+
select deptno,sum(sal) from emp group by deptno;
+
select sum(sal) from emp;
=
select deptno,job,sum(sal) from emp group by rollup(deptno,job);
sql*plus的报表功能
================================多表查询================================
①什么是多表查询
从多个表中获取数据
②笛卡尔积
③等值连接
select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno;
④不等值连接
select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;
⑤外连接
核心:通过外链接,把链接不成立的记录,任然包含在最后的结果中
左外连接:当连接条件不成立的时候,等号左边的表依然被包含
右外连接:当连接条件不成立的时候,等号右边的表依然被包含
select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数 from emp e,dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname;--右外连接
⑥自连接
核心:通过别名,将同一张表视为多张表
select e.ename 员工姓名,b.ename 老板姓名 from emp e,emp b where e.mgr=b.empno;
自连接存在的问题:不适合操作大表
⑦解决方法:层次查询
select level,empno,ename,sal,mgr from emp connect by prior empno=mgr start with mgr is null order by 1;
==============================子查询===================================
①子查询概述
--查询比scott工资高的员工信息
select * from emp where sal>(select sal from emp where ename='scott');
②子查询的使用
可以使用子查询的位置:where,select,having,from
主查询和子查询可以不是同一张表
select * from emp where deptno=(select deptno from dept where dname='SALES');
select e.* from emp e,dept d where e.deptno=d.deptno and d.dname='SALES';
一般不在子查询中,使用排序,但在top-n分析问题中,必须对子查询排序
--rownum 行号 伪列
select rownum,empno,ename,sal from (select * from emp order by sal desc) where rownum <= 3;
行号永远按照默认的顺序生成
行号只能使用<,<=;不能使用>,>=
一般先执行子查询,再执行主查询,但相关子查询除外
select empno,ename,sal,(select avg(sal)from emp where deptno=e.deptno) avgsal from emp e where sal>(select avg(sal)from emp where deptno=e.deptno);
单行子查询和多行子查询
操作符(多行)
in 等于列表中的任何一个
any 和子查询返回的任意一个值比较
all 和子查询返回的所有值比较
操作符(单行)
= equal to
> greater than
>=greater than or equal to
<less than
<= less than or equal to
<>not equal to
select * from emp where job=(select job from emp where empno=7566) and sal >(select sal from emp where empno=7782);
select * from emp where sal=(select min(sal) from emp);
--查询最低工资大于20号部门最低工资的部门号和部门的最低工资
select deptno,min(sal) from emp group by deptno having min(sal) > (select min(sal) from emp where deptno=20);
--查询部门名称是SALES和ACCOUNTING的员工信息
select * from emp where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING');
select e.* from emp e,dept d where e.deptno=d.deptno and (d.dname='SALES' OR d.dname='ACCOUNTING');
SELECT * from emp where sal>any(select sal from emp where deptno=30);
--等价于
select * from emp where sal >(select min(sal) from emp where deptno=30);
子查询对控制问题
--查询不是老板的员工
select * from emp where empno not in (select mgr from emp where mgr is not null);
===================================综合实例=============================
实例一
分页查询显示员工信息:显示员工号,姓名,月薪
-每页显示四条记录
-显示第二页的员工
-按照月薪降序排列
select r,emp,ename,sal
from(select rownum r,empno,ename,sal
from(select rownum,empno,ename,sal from emp order by sal desc) e1 where rownum <=8) e2
where r>=5;
--oracle分页通过子查询实现
实例二
找到员工表中薪水大于本部门平均薪水的员工
select e.empno,e.name,e.sal,d.avgsal from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d where e.deptno=d.deptno and e.sal>d.avgsal;
实例三
按部门统计员工人数,按照如下格式输出(员工的入职年份已知)
total 1980 1981 1982 1987
14 1 10 1 2
select count(*) total,
sum(decode(to_char(hiredate,'YYYY'),'1980',1,0)) "1980",
sum(decode(to_char(hiredate,'YYYY'),'1981',1,0)) "1981",
sum(decode(to_char(hiredate,'YYYY'),'1982',1,0)) "1982"
from emp;
--使用子查询方式
select
(select count(*) from emp) total,
(select count(*) from emp where to_char(hiredate,'yyyy')='1980') "1980",
(select count(*) from emp where to_char(hiredate,'yyyy')='1981') "1981",
(select count(*) from emp where to_char(hiredate,'yyyy')='1982') "1982"
from dual;
oracle高级查询(实例基于scott用户四张表)的更多相关文章
- Oracle导入SQL脚本执行 scott 用户下的表删除了
执行 .sql 文件时,应在 sqlplus 或 cmd 中执行,速度比plsql 中的command window 中书许多, scott 用户下的表删除了 可以执行如下 @D:\app\Admi ...
- oracle同一个数据库实例不同的用户之间的表、序列授权操作
1.背景:用户jtuser中有jtproduct中表A,B的同义词,在用户jtuser中向表A,B插入数据,提示“权限不够” 2.将A,B表授权给jtuser用户 $ sqlplus / as sys ...
- Oracle基本的增删改查语句--本人使用scott用户中的表
--感觉有用点个赞^v^ 1 --创建表空间 create tablespace mykebai datafile 'c:\mykebai.dbf' --数据问价存放位置 size 100m --数据 ...
- Scott用户的四张表:
Scott用户的四张表: 转载:http://www.cnblogs.com/mchina/archive/2012/09/06/2649951.html 在Oracle的学习之中,重点使用的是SQL ...
- Oracle记录(三) Scott用户的表结构
在Oracle的学习之中,重点使用的是SQL语句,而所有的SQL语句都要在scott用户下完成,这个用户下一共有四张表,可以使用: SELECT * FROM tab; 查看所有的数据表的名称,如果现 ...
- Oracle笔记(三) Scott用户的表结构
在Oracle的学习之中,重点使用的是SQL语句,而所有的SQL语句都要在scott用户下完成,这个用户下一共有四张表,可以使用: SELECT * FROM tab; 查看所有的数据表的名称,如果现 ...
- 同一个数据库实例,不同用户下多表创建视图,Hibernate完毕ORM映射,Spring整合,后台实现
1.同一个数据库实例.同用户,多表创建视图 2.同一个数据库实例,不同用户下.多表创建视图 3.同一个数据库,不同数据库实例,多表创建视图 4.不同类型数据库,多表创建视图 1.同一个数据库实例.同用 ...
- Oracle中把一张表查询结果插入到另一张表中
1. 新增一个表,通过另一个表的结构和数据 create table XTHAME.tab1 as select * from DSKNOW.COMBDVERSION 2. 如果表存在: inse ...
- 记录一则FGA审计“A用户对B用户某张表的更新操作”需求
环境:Oracle 11.2.0.4 我这里测试A用户为JINGYU,要审计的表为B用户SCOTT下的EMP表.通过FGA来实现. 1.添加审计策略 2.测试审计效果 3.控制审计策略 1.添加审计策 ...
随机推荐
- 不完全翻译:Threading in C#-Getting Started
Introduction(引入,介绍) and Concepts(概念) 原文地址:http://www.albahari.com/threading/ 注:水平有限不能全文翻译,备注了个别字段和短句 ...
- Spring学习(10)--- @Qualifier注解
按类型自动装配可能多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围(或指定唯一),也可以指定单独的构造器参数或方法参数 可用于注解集合类型变量 例子: package c ...
- C# 并行任务——Parallel类
一.Parallel类 Parallel类提供了数据和任务的并行性: 二.Paraller.For() Paraller.For()方法类似于C#的for循环语句,也是多次执行一个任务.使用Paral ...
- JDBC加载数据库驱动的方式
JDBC作为数据库访问的规范接口,其中只是定义一些接口.具体的实现是由各个数据库厂商来完成. 一.重要的接口: 1.public interface Driver 每个驱动程序类必须实现的接口.Jav ...
- HttpClient+Jsoup 抓取网页信息(网易贵金属为例)
废话不多说直接讲讲今天要做的事. 利用HttpClient和Jsoup技术抓取网页信息.HttpClient是支持HTTP协议的客户端编程工具包,并且它支持HTTP协议. jsoup 是一款基于 Ja ...
- javascript中的window.open()被浏览器拦截
最近做项目的时候,点击事件的时候遇到了window .open()被浏览器拦截的情况,虽然在自己的开发环境中都能正常使用,但是放在测试环境中window.open()就是不能使用, 后来经过测试,单纯 ...
- Transparent Application Failover 透明应用切换
官方文档地址 http://docs.oracle.com/cd/E11882_01/network.112/e41945/advcfg.htm#NETAG455 About Transparent ...
- MySQL加密和解密案例
define("ENCRYPT",'2998a15c0cd853edad7');//密钥key 被存储的数据库的字段设置成blob格式(二进制) //AES_ENCRYPT 加密 ...
- 响应式、手机端、自适应 百分比实现div等宽等高的方法
在百分比布局中, 有时候会遇见一个头疼的问题,就是如果某个布局是正方形的话,我们在这种情况下考虑到适应各种媒体尺寸,又不能给它定固定的宽高. 之前遇见过纯色布局的结果我就用纯色图片代替实现的,现在有了 ...
- IOS 固定定位底部input输入框,获取焦点时弹出的输入法键盘挡住input
移动页面经常会做到这样一个效果,看下面的图片,重点就是那个固定定位的底部,里面有个input输入框,在输入字符的时候,安卓手机看着是完全没有问题! 1.页面没有点击底部input的初始状态 2.安卓手 ...