Oracle高级查询
来源:互联网 发布:微店淘宝一键搬家 编辑:程序博客网 时间:2024/06/18 17:33
分组Group by 与Having
--统计每个部门的员工个数
select * from emp;select deptno, count(1),job from emp group by deptno,job;
--统计每个部门的员工人数至少是5个以上的部门
select deptno,count(1) from emp group by deptno having count(1)>5;
--根据不同的部门排名
--分析函数
--(1)ROW_NUMBER 返回连续的排位,不论值是否相等
--【语法】ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)
--【功能】表示根据COL1分组,在分组内部根据 COL2排序,而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的)
select deptno,ename,sal,row_number() OVER (partition by deptno order by sal desc) aa from emp;
--(2)RANK 具有相等值的行排位相同,序数随后跳跃
--【语法】RANK ( ) OVER ( [query_partition_clause] order_by_clause )
select deptno,ename,sal,rank() OVER (partition by deptno order by sal desc) aa from emp;
--(3)DENSE_RANK 具有相等值的行排位相同,序号是连续的
--【语法】dense_RANK ( ) OVER ( [query_partition_clause] order_by_clause )
--根据每个部门工资降序排序的名次
select deptno,ename,sal,dense_rank() OVER (partition by deptno order by sal desc) aa from emp;
select deptno,ename,sal,dense_rank() OVER (order by sal desc) aa from emp;
-- 子查询
--查询与“SCOTT”在同一个部门的雇员信息
--(1)查询“SCOTT”用户的部门编号
select deptno from emp where ename='SCOTT'
--(2)查询20的部门的雇员信息
select * from emp where deptno=20;
-- = (只能一个值) /in(单个/多个) 发生错误?
select * from emp where deptno in (select deptno from emp where ename='SCOTT');
select * from emp;
--查询与“SCOTT”不在同一个部门的雇员信息 not in
select * from emp where deptno not in(select deptno from emp where ename='SCOTT');
--查询工资在1500-3000的员工信息部门是10与40
select * from emp where sal>=1500 and sal<=3000
--部门是10与40
select * from ( select * from emp where sal>=1500 and sal<=3000) e1
where e1.deptno in (10,40);
--EMP表中,查询雇员薪水大于3000的部门名称
--薪水大于3000的部门编号
select * from emp where sal>3000;
--薪水大于3000的部门名称
select dname from dept where deptno in(select deptno from emp where sal>3000)
select dname from dept where deptno not in(select deptno from emp where sal>3000)
--exists 存在 where /
select dname from dept d where not exists (select * from emp where sal>3000 and emp.deptno=d.deptno)
select dname from dept d where exists (select * from emp where sal>3000)
连接查询
--内连接
--(1) select * from 表1 inner join 表2 on ...
select * from emp; --18
select * from dept; --4
--查询雇佣所在的部门名称
select empno,ename,job,sal,dept.dname from emp inner join dept on emp.deptno =dept.deptno
--(2) select * from 表1,表2 where.....
select empno,ename,job,sal,dept.dname from emp, dept where emp.deptno =dept.deptno
--表名能否交换位置??会影响查询结果 (没有影响,可以交换!)
select empno,ename,job,sal,dept.dname from dept inner join emp on emp.deptno =dept.deptno
--不等值=18*4-18
select empno,ename,job,sal,dept.dname from dept inner join emp on emp.deptno !=dept.deptno
select * from emp;
select * from dept;
insert into dept values(50,'IT','HZ');
--左外连接
--以左表为基准 ,如果没有匹配的,显示为null
--select * from 表1 left join 表2 on ...
select empno,ename,job,sal,dept.dname from emp left join dept on emp.deptno =dept.deptno --18
--两张能否位置 (不能)
select empno,ename,job,sal,dept.dname from dept left join emp on emp.deptno =dept.deptno --4?5 19
--右外连接
--以右表为基准 ,如果没有匹配的,显示为null
--select * from 表1 left join 表2 on ...
select empno,ename,job,sal,dept.dname from emp right join dept on emp.deptno =dept.deptno --19
--两张能否位置 (不能)
select empno,ename,job,sal,dept.dname from dept right join emp on emp.deptno =dept.deptno --18
联合查询:
select * from emp; --18
select * from emp2; --3
--删除多余的列
alter table emp2 drop column dept;
-- union (过滤重复的数据)
select * from emp
union
select * from emp2
-- union all (不过滤)
select * from emp
union all
select * from emp2
-- intersect (交集)
select * from emp
intersect
select * from emp2
-- minus (补集) 18-2=16
select * from emp
minus
select * from emp2
0 0
- Oracle高级技巧,高级查询
- Oracle高级查询
- Oracle高级查询
- oracle 高级SQL查询
- Oracle高级查询
- Oracle的高级查询
- oracle的高级查询
- Oracle高级查询
- Oracle 高级查询
- Oracle高级查询
- Oracle高级查询加深
- ORACLE 高级查询
- oracle高级查询总
- Oracle 查询高级用法
- ORACLE 高级子查询
- oracle 高级查询
- oracle之高级查询
- Oracle 高级查询
- 0.个人框架开源起始
- strcpy函数实现的几种方式
- xml与java实体相互转化
- Apache 配置多个虚拟主机
- 选择排序+for的增强版输出
- Oracle高级查询
- 【华为 OJ模拟】将3x3二维数组的右上半元素全部置为0
- 使用Netty搭建APP推送服务器
- hdu 1505 City Game
- ubuntu 安装 librdkafka
- java 反射操作 实例分析(自己写哦)
- SOJ 4437 Carries(二分)
- ListView分页加载数据
- map用法详解