數據分組 – 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
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)