oracle的表的數據管理3 -- 複雜查詢

數據分組 – max,min,avg,sum,count

Eg: 數據分組查詢,熟練應用max,min,avg,sum,count

1.

(min

max)

SQL> select min(sal),max(sal) fromemp;

  MIN(SAL)  MAX(SAL)

      800      5000      查詢出最大工資和最少工資

2.

(min

max)

SQL>  select ename,sal fromemp where sal=(select max(sal) from emp);

ENAME           SAL

KING        5000.00        查詢出員工中工資最高的人(子查詢)

3.

(avg

sum)

SQL> select avg(sal),sum(sal) fromemp;

  AVG(SAL)  SUM(SAL)

2073.21428     29025      查詢員工的平均工資和總工資

4.

(count)

SQL> select count(ename) from emp;

COUNT(ENAME)

         14               查詢員工總人數

5.

(avg

子查詢)

SQL> select * from emp where sal>(selectavg(sal) from emp);

EMPNO ENAME     JOB        MGR HIREDATE         SAL     COMM DEPTNO

7566 JONES     MANAGER   7839 1981/4/2     2975.00              20

 7698 BLAKE     MANAGER   7839 1981/5/1     2850.00              30                        查詢出工資高於平均工資的人的信息

Groupby 和having子句

1.      Groupby 用於對查詢的結果分組統計

2.      Having 子句用於限制分組的顯示結果

Eg:groupby和having語句的熟練應用。注意group by後可以跟多個條件

1.(

Group

by)

SQL> selectDEPTNO,avg(sal),sum(sal) from emp group by DEPTNO order byDEPTNO;

DEPTNO  AVG(SAL)  SUM(SAL)

10     2916.66666  8750

20      2175     10875  查詢每個部門的平均工資和最高工資

2.

(group

   by)

SQL> selectDEPTNO,avg(sal),job from emp group by DEPTNO,job order by DEPTNO;

DEPTNO  AVG(SAL) JOB

10      1300 CLERK

10      2450 MANAGER

10      5000 PRESIDENT查詢每個部門的每種崗位的平均工資和最低工資

3.

(group

By,  having)

SQL> selectdeptno,avg(sal) from emp group by deptno having avg(sal)<(select avg(sal) fromemp);

DEPTNO  AVG(SAL)

30 1566.66666   查詢出部門平均工資低於平均工資的部門及其平均工資

3.      分組函數只能出現在選擇列表、having、order by子語句中

4.      如果在select語句中同時包含group by、having和order by,那麼他們的順序是group by→having→order by

5.      在選擇列中如果有列、表達式和分組函數,那麼至少有一個要出現在group by字句中,否則則會出錯。 ---(oracle11g測試分組條件可以不出現在查詢字段中)

 Oracle的多表查詢

---基於2個或兩個以上的表的查詢

Eg:表的聯力查詢

1.

(a1.no=

a2.no)

顯示僱員名,僱員工資和所在部門的名稱

SQL> select ename,sal,DNAME from emp,dept whereemp.DEPTNO = dept.DEPTNO;

ENAME           SAL DNAME

CLARK       2450.00 ACCOUNTING

SCOTT       3000.00 RESEARCH

WARD        1250.00 SALES

2.

(and

)

顯示部門號爲10的部門名和員工和工資

SQL> select ename,sal,DNAME from emp,dept whereemp.DEPTNO = dept.DEPTNO and emp.deptno=10;

ENAME           SAL DNAME

CLARK       2450.00 ACCOUNTING

3.

(between

and)

顯示僱員的性命,工資及其工資的級別 – (添加表salgrade)

SQL> select ename,sal,grade from emp,salgradewhere emp.sal between salgrade.losal andsalgrade.hisal;

ENAME           SAL     GRADE

SMITH        800.00         1

MILLER      1300.00         2

ALLEN       1600.00         3

JONES       2975.00         4

KING        5000.00         5

注:where內容可where (emp.sal>salgrade.losal andemp.sal

4.

(order

by)

顯示僱員名,工資以及部門名,並按部門排序

SQL> select ename,sal,dname from emp,dept whereemp.deptno=dept.deptno order by dept.dname;

ENAME           SAL DNAME

MILLER       1300.00ACCOUNTING

KING        5000.00 ACCOUNTING

FORD        3000.00 RESEARCH

自連接查詢

  • 自連接是指在同一張表的連接查詢

Eg:顯示員工的上級領導的姓名--- 同表聯立當成2個表來考慮就可以了

SQL> selecta1.empno,a1.ename,a1.mgr,a2.empno,a2.ename from emp a1,emp a2 wherea1.mgr=a2.empno;

EMPNO ENAME       MGR EMPNO ENAME

7902 FORD       7566  7566JONES

7788 SCOTT      7566  7566JONES

  • 子查詢

---- 子查詢是指嵌入在其他sql語句中的select語句

單行子查詢

---- 只返回單行數據的子查詢

Eg:查詢與SMITH同一部門的所有員工

SQL> select ename,DEPTNO from emp whereDEPTNO=(select DEPTNO from emp whereename='SMITH');

ENAME     DEPTNO

SMITH         20

SCOTT         20

多行子查詢

---- 返回多行數據的子查詢

Eg:查詢和部門10的工作相同的僱員的姓名、工作和部門號

SQL> select ename,job,deptno from empwhere job in (select distinct job from empwhere deptno=10);

ENAME     JOB      DEPTNO

CLARK     MANAGER      10

BLAKE     MANAGER      30

JONES     MANAGER      20

---- 使用all操作符

Eg:查詢出工資比部門20的所有員工的工資高的員工

SQL> select ename,sal,deptno from emp wheresal> all (select sal from empwhere deptno=30);

ENAME           SAL DEPTNO

JONES       2975.00    20

SCOTT       3000.00    20

--- 使用any操作符

Eg:顯示工資比20部門任意一個員工工資的員工

SQL> select ename,sal,deptno from emp wheresal> any (select sal from empwhere deptno=30);

ENAME           SAL DEPTNO

KING        5000.00    10

FORD        3000.00    20

多列子查詢

--- where後的條件是一一對應的,實際是兩個條件的and連接

Eg:查詢出與'SMITH'部門和崗位一樣的員工信息

SQL> selectename,job,deptno from emp where (deptno,job)=(select deptno,job from emp whereename='SMITH');

ENAME     JOB      DEPTNO

ADAMS     CLERK        20

--- 在from子句中使用子查詢  ----  重要內容

 From中的子查詢被認定爲一個內嵌試圖,並且應該取別名

Eg:顯示高於自己部門平均工資的員工信息

SQL> selectename,sal,mysal,a1.deptno from emp a1,(select deptno,avg(sal) mysal from emp group bydeptno) a2 wherea1.deptno=a2.deptno anda1.sal>a2.mysal;

ENAME           SAL     MYSAL DEPTNO

ALLEN       1600.00 1566.66666    30

JONES       2975.00      2175    20

分頁查詢          -----         非常重要

  • Rownum分頁

a.      (select * from emp) 建立內嵌試圖

b.      顯示rownum。(這裏的rownum是oracle自帶分配的)

Eg

SQL> select ename,job,sal,rownum rn from(select * from emp) a1;

ENAME     JOB            SAL        RN

SMITH     CLERK       800.00         1

ALLEN     SALESMAN   1600.00         2

WARD      SALESMAN   1250.00         3

c.      篩選出rn爲6-10的數據 --(非常重要)

d.      Oracle採用二分法篩選,所以需要先篩選出1-10.,在篩選出6-10

e.      如需改變查詢列時,只需改變最裏層的select的就可以了

f.       如需排序,也只需修改最裏層的select視圖就可以了

Eg: 在第一次的篩選中要用rownum第二次要用別名rn

SQL> select * from (select a1.*,rownum rn from (selectename,job,sal from emp) a1 where rownum<=10) wherern>=6;

ENAME     JOB            SAL        RN

BLAKE     MANAGER    2850.00         6

CLARK     MANAGER    2450.00         7

SCOTT     ANALYST    3000.00         8

  • 根據rowid分頁
  • 按分析函數分頁

利用查詢結果來創建新表

Eg:創建一個部門平均工資表從emp表中生成

SQL> create table avgsal (deptno,avgsal) as select deptno,avg(sal) fromemp group by deptno;

Table created

SQL> select * from avgsal;

DEPTNO    AVGSAL

30      1566.66666

20      2175

10      2916.66666

合併查詢   ----    比較麻煩,但效率較高

Ag:在實際應用中,爲了合併多個select語句的結果,可以使用集合操作符號:union all,union,intersect,minus

a.      Union

Union用於取得兩個結果集的合集

Eg:查詢sal大於2500並且部門爲20的員工,實際效果等同於and

SQL> select ename,deptno,sal from emp wheresal>2500

  2  union select ename,deptno,sal from emp where deptno=20;

ENAME     DEPTNO      SAL

ADAMS         20  1100.00

BLAKE         30  2850.00

FORD          20  3000.00

JONES         20  2975.00

KING          10  5000.00

b.      Unionall

注: union all與union用法相同,但他的效果是缺兩個集合的全集(不會合並相同的)

c.      Intersect

Intersect是用於取兩個集合的交集

Eg: 對於分頁查詢同樣可以採用這種方法

SQL> select * from (select ename,job,sal,rownumrn from emp) where rownum<=10

  2  intersect select * from (selectename,job,sal,rownum rn from emp) where rn>=6;

ENAME     JOB            SAL        RN

BLAKE     MANAGER    2850.00         6

CLARK     MANAGER    2450.00         7

KING      PRESIDENT  5000.00         9

SCOTT     ANALYST    3000.00         8

TURNER    SALESMAN   1500.00        10

d.      Minus

Minus是取兩個集合的差集(即取A集合減去與B集合重複的部分)


union all, union,intersect,minus

Ag:A:(1,2,3)B:(3,4,5){
        1.   A minus B = (1,2)
        2.   A  union B= (1,2,3,4,5)
        3.   A  uniomall  B = (1,2,3,3,4,5)
        4.   A intersect  B = (3)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章