Oracle 高级子查询

关联更新:
drop table e purge;
create table e as select * from emp;
alter table e add (location varchar2(13));
将正确的城市的信息添加到location列!
update e set location=
(select loc from dept where deptno=e.deptno);

关联删除:
从e表中删除销售部门的员工!
delete e where deptno=
(select deptno from dept where deptno='SALES');

内外交互式子查询:
select ename,sal
from emp e
where sal>(select avg(sal) from emp where deptno=e.deptno);


with子句:
哪个部门总工资大于所有部门的平均工资!
SELECT *
FROM  
  (SELECT  d.dname, SUM(e.sal) AS dept_total
   FROM    emp e, dept d
   WHERE   e.deptno = d.deptno
   GROUP BY d.dname)
where dept_total>
                            (SELECT SUM(dept_total)/COUNT(*) AS dept_avg
                            FROM (SELECT  d.dname, SUM(e.sal) AS dept_total
                                       FROM    emp e, dept d
                                       WHERE   e.deptno = d.deptno
                                       GROUP BY d.dname));

WITH
dept_costs  AS (
   SELECT  d.dname, SUM(e.sal) AS dept_total
   FROM    emp e, dept d
   WHERE   e.deptno = d.deptno
   GROUP BY d.dname),
avg_cost    AS (
   SELECT SUM(dept_total)/COUNT(*) AS dept_avg
   FROM   dept_costs)
SELECT *
FROM   dept_costs
WHERE  dept_total >
        (SELECT dept_avg
         FROM avg_cost)
ORDER BY dname;

with子句中的视图叫做询问块,询问块的复杂查询在
with子句中只运行一次,运行成功后会将询问块的结果集
保存到temp表空间,以后再次调用询问块时会在后台转换
为对结果集的直接访问


使连续重复的值只显示一次:

row_number() OVER ( PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,
在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号
(组内连续的唯一的).
 
with test as (
select 1 cd,'a' name from dual union all
select 1 cd,'b' name from dual union all
select 1 cd,'c' name from dual union all
select 1 cd,'d' name from dual union all
select 1 cd,'e' name from dual union all
select 2 cd,'q' name from dual union all
select 2 cd,'w' name from dual union all
select 2 cd,'e' name from dual)
select
(case when
(row_number() over(partition by cd order by name))=1
then cd else null end) as cd,name from test;

引申:

条件表达式:
SELECT ename, job, sal,
       CASE job WHEN 'CLERK'  THEN  1.10*sal
                WHEN 'SALESMAN' THEN  1.15*sal
                WHEN 'ANALYST'   THEN  1.20*sal
       ELSE sal END     "REVISED_SALARY"
FROM   emp;

select ename, job, sal,
       decode (job,
                   'CLERK',1.10*sal,
                   'SALESMAN',1.15*sal,
                   'ANALYST',1.20*sal,
               sal) "REVISED_SALARY"
from emp;

SELECT ename, job, sal,
       CASE WHEN job='CLERK'  THEN  1.10*sal
            WHEN job='SALESMAN' THEN  1.15*sal
            WHEN job='ANALYST'   THEN  1.20*sal
            WHEN ename='BLAKE'  THEN SAL*1.1
       ELSE      sal END     "REVISED_SALARY"
FROM   emp;

猜你喜欢

转载自blog.csdn.net/m0_37298602/article/details/77471316