你这问题也问得太笼统了吧?
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:做网站、网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的忠县网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
多表查询:select a.* from tb_a a,tb_b b
where a.aid=b.bid
and ...;
子查询:select * from (select * from tb);
select a.* from tb_a a
where a.aid in(select b.bid from tb_b);
sql允许多次嵌套,子查询即嵌套其他查询中得查询
可把子查询返回结果理解成一张表,外层查询会把子查询返回的结果当成一张表
子查询要用括号括起来
将子查询放在比较运算符的右边,增强可读性
子查询的分类:
单行子查询:子查询返回一行记录,可使用单行比较运算符
多行子查询:子查询返回多行记录
--有哪些雇员薪水在平均薪水之上
--1、先求平均薪水
select avg(nvl(e.sal,0)) from emp e;
--2.把所有人的薪水和平均薪水作比较,使用的单行比较运算符
select * from emp e where e.sal (select avg(nvl(e.sal,0)) from emp e);
-- 查询雇员表哪些人是经理人
-- 1.先查询所有经理人 distinct去重(多行子查询)
select distinct e.mgr from emp e;
--2.在雇员表中过滤是经理的
select * from emp where empno in (select distinct e.mgr from emp e);
-- 每个部门的平均薪水等级
--1.求出每个部门的平均薪水等级
select e.deptno,avg(nvl(e.sal,0)) from emp e group by e.deptno;
--2.根据部门平均薪水断出薪水等级
select g.deptno,sg.grade from salgrade sg join (select e.deptno,avg(nvl(e.sal,0)) avgsal from emp e group by e.deptno) g on g.avgsal between sg.losal and sg.hisal;
--1.求平均薪水最高的部门的部门编号
-- 求部门平均薪水
select e.deptno,avg(nvl(e.sal,0)) from emp e group by e.deptno;
-- 求最高的薪水
select max(t.vsal) from (select e.deptno,avg(nvl(e.sal,0)) vsal from emp e group by e.deptno) t;
-- 求部门编号(重复的sql可以抽取为视图)
select t.deptno,t.vsal from (select e.deptno,avg(nvl(e.sal,0)) vsal from emp e group by e.deptno) t where t.vsal = (select max(t.vsal) from (select e.deptno,avg(nvl(e.sal,0)) vsal from emp e group by e.deptno) t);
)
--2.求部门的平均薪水的等级
--3.求部门平均的薪水等级 (薪水等级的平均)
--求每个人的薪水等级
select e.deptno, sg.grade
from emp e
join salgrade sg
on e.sal between sg.losal and sg.hisal;
--求部门的平均薪水等级
select t.deptno, avg(t.grade)
from (select e.deptno, sg.grade
from emp e
join salgrade sg
on e.sal between sg.losal and sg.hisal) t
group by t.deptno;
--4.求薪水最高的前5名员工
-- 所有员工薪水降序
select * from emp e order by e.sal desc;
-- oracle中没有limit子句,rownum只存在于查询出来的虚拟表中
select * from (select * from emp e order by e.sal desc) t where rownum =5;
--5.求薪水最高的第6到10名
-- 默认对于基表 rownum,跟插入顺序有关
select rownum rn,t.* from emp t;
-- 对于子查询rownum跟内层查询的顺序有关
--rn顺序是根据内层查询记录进行分配的
select rownum rn,t.* from (select * from emp e order by e.sal desc) t;
-- 根据rn顺序来过滤第6到10条
select * from (select rownum rn,t.* from (select * from emp e order by e.sal desc) t) t1 where t1.rn 5 and t1.rn =10;
SELECT B.DEPTNO,COUNT(B.ENAME) FROM EMP B,(Select DEPTNO,AVG(SAL) SAL_A FROM EMP GROUP BY DEPTNO) A WHERE B.SAL A.SAL_A AND A.DEPTNO = B.DEPTNO
试一下,看看是否好用。
一、
伪列就像Oracle中的一个表列,但实际上它并未存储在表中。伪列可以从表中查询,但是不能插入、更新或删除它们的值。常用的伪列:rowid和rownum。
Rowid:数据库中的每一行都有一个行地址,Rowid伪列返回该行地址。可以使用Rowid值来定位表中的一行。通常情况下,Rowid值可以唯一地标识数据库中的一行。
Rowid伪列有以下重要用途:
1)能以最快的方式访问表中的一行;
2)能显示表的行是如何存储的。
3)可以作为表中行的唯一标识。
如:SQL
select
rowid,ename
from
emp;
Rownum:对于一个查询返回的每一行,Rownum伪列返回一个数值代表的次序。返回的第一行的Rownum值为1,第二行的Rownum值为2,依此类推。通过使用Rownum伪列,用户可以限制查询返回的行数。
如:SQLselect
*
from
emp
where
rownum11;
从EMP表中提取10条记录
二、
oracle中不支持select
top
n
from
tablename
查询,但是通过
order
by
和
rownum
组合可以实现此功能。例如:SELECT 列名1...列名n FROM
(SELECT 列名1...列名n FROM
表名
ORDER
BY
列名1...列名n)
WHERE
ROWNUM
=
N(抽出记录数)
ORDER
BY
ROWNUM
ASC