此文章爲http://huangsir007.blog.51cto.com/6159353/1854818該片的後續 數據庫
關於數據庫語言查詢:session
SQL> show parameter nls_language;oracle
NAME TYPE VALUEide
------------------------------------ ----------- ------------------------------函數
nls_language string AMERICAN 支持的是AMERICANrest
SQL> select * from nls_session_parameters where parameter='NLS_LANGUAGE';orm
PARAMETERblog
--------------------------------------------------------------------------------排序
VALUEget
--------------------------------------------------------------------------------
NLS_LANGUAGE
AMERICAN
還有一種時間語言:
SQL> show parameter nls_date_language;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_date_language string
SQL> select * from nls_session_parameters where parameter='NLS_DATE_LANGUAGE';
PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_DATE_LANGUAGE
AMERICAN 時間語言也是AMERICAN,因此這種1-1月-1982不容許的,月份必須是英文
不然會亂碼
關於時間的格式查詢:
SQL> select * from nls_session_parameters where parameter='NLS_DATE_FORMAT'; 這是默認的時間格式
PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_DATE_FORMAT
DD-MON-RR 這是默認的時間格式DD-MON-RR
SQL> show parameter nls_date_format; 這種方式查不出來就用上面的方式
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_date_format string
查看當前時間格式
SQL> select * from student;
XH XM SEX BIRTHDAY CLASSID
---------- ------------------------------ --- --------- ----------
1 ?????? F 09-JUL-16 1
2 xiaobai F 06-SEP-16 2
3 xiaohua F 2
而後臨時修改當前會話的時間格式(修改的是當前session會話的,關掉後將失去更改,修改以後才能yyyy-mm-dd格式)
SQL> alter session set nls_date_format='yyyy-mm-dd';
Session altered.
修改後再次查詢,以下
SQL> select * from student;
XH XM SEX BIRTHDAY CLASSID
---------- ------------------------------ --- ---------- ----------
1 ?????? F 2016-07-09 1
2 xiaobai F 2016-09-06 2
3 xiaohua F 2
這樣時間格式的錯誤以後遇到就好解決了
根據hiredate:入職時間; 受僱日期;作判斷來查詢
SQL> select ename,HIREDATE from emp where HIREDATE>'1982-1-1'; 以此時間入職以後的僱員
ENAME HIREDATE
---------- ----------
SCOTT 1987-04-19
ADAMS 1987-05-23
MILLER 1982-01-23
根據薪水的某個區間作查詢
SQL> select ename,sal from emp where sal>2000 and sal<5000;
ENAME SAL
---------- ----------
JONES 2975
BLAKE 2850
CLARK 2450
SCOTT 3000
FORD 3000
關鍵字like,作匹配查詢
查詢手寫字母爲S的僱員
SQL> select ename from emp where ename like 'S%';
ENAME
----------
SMITH
SCOTT
選出第三個字母爲大寫O的僱員(下劃線爲匹配任一個,%匹配任意個)
SQL> select ename from emp where ename like '__O%';
ENAME
----------
SCOTT
關鍵字in
查詢僱員號在某個區間
SQL> select empno,ename from emp where empno in (7900,7934);
EMPNO ENAME
---------- ----------
7900 JAMES
7934 MILLER
以順序查詢,關鍵字order by(默認爲升序asc,降序爲desc)
SQL> select ename,sal from emp order by sal;
ENAME SAL
---------- ----------
SMITH 800
JAMES 950
ADAMS 1100
WARD 1250
MARTIN 1250
MILLER 1300
TURNER 1500
ALLEN 1600
CLARK 2450
BLAKE 2850
JONES 2975
SCOTT 3000
FORD 3000
KING 5000
按照僱員年薪進行排序
SQL> select ename,sal*12 nianxin from emp order by nianxin(asc|desc); 別名的做用
ENAME NIANXIN
---------- ----------
SMITH 9600
JAMES 11400
ADAMS 13200
WARD 15000
MARTIN 15000
MILLER 15600
TURNER 18000
ALLEN 19200
CLARK 29400
BLAKE 34200
JONES 35700
SCOTT 36000
FORD 36000
KING 60000
對同一個部門sal進行降序,對部門號進行升序
SQL> select ename,sal,deptno from emp order by sal desc,deptno;
ENAME SAL DEPTNO
---------- ---------- ----------
KING 5000 10
FORD 3000 20
SCOTT 3000 20
JONES 2975 20
BLAKE 2850 30
CLARK 2450 10
ALLEN 1600 30
TURNER 1500 30
MILLER 1300 10
WARD 1250 30
MARTIN 1250 30
ADAMS 1100 20
JAMES 950 30
SMITH 800 20
查詢最大值,最小值,平均值,關鍵字爲max,min,avg
SQL> select max(sal),min(sal),avg(sal) from emp;
MAX(SAL) MIN(SAL) AVG(SAL)
---------- ---------- ----------
5000 800 2073.21429
查找出sal最大值的員工,先查詢出sal的最大值,而後使sal=sal的最大值作判斷查詢
SQL> select ename,sal from emp where sal=(select max(sal) from emp);
ENAME SAL
---------- ----------
KING 5000
查詢出高出平均工資得僱員
一、先找出平均工資是多少?
SQL> select avg(sal) from emp;
AVG(SAL)
----------
2073.21429
二、而後查詢sal與平均工資做比較
SQL> select ename,sal from emp where sal>(select avg(sal) from emp);
ENAME SAL
---------- ----------
JONES 2975
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
FORD 3000
分組查詢每一個部門的最大sal和最小sal,關鍵字group by
SQL> select max(sal),min(sal),deptno from emp group by deptno;
MAX(SAL) MIN(SAL) DEPTNO
---------- ---------- ----------
2850 950 30
3000 800 20
5000 1300 10
找出最大sal大於3000的部門號,關鍵字having 某字段 作判斷
SQL> select max(sal),min(sal),deptno from emp group by deptno having max(sal)>3000;
MAX(SAL) MIN(SAL) DEPTNO
---------- ---------- ----------
5000 1300 10
一、分組函數只能出如今選擇列,having、order by字句中
二、若是在select語句中同時包含group by,having,order by那麼他們的順序是group by,having,order by
三、在選擇列中若是有列、表達式和分組函數,那麼這些列和表達式必須有一個出如今group by字句中,不然就會出錯
SQL> select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)>2000 order by avg(sal);
DEPTNO AVG(SAL) MAX(SAL)
------ ---------- ----------
20 2175 3000
10 2916.66666 5000
多表結合查詢
按照相同字段deptno查詢 如不按照這也條件就是14*4=56條記錄
SQL> select e.ename,d.dname,d.deptno from emp e,dept d where e.deptno=d.deptno;
ENAME DNAME DEPTNO
---------- -------------- ----------
CLARK ACCOUNTING 10
KING ACCOUNTING 10
MILLER ACCOUNTING 10
JONES RESEARCH 20
FORD RESEARCH 20
ADAMS RESEARCH 20
SMITH RESEARCH 20
SCOTT RESEARCH 20
WARD SALES 30
TURNER SALES 30
ALLEN SALES 30
JAMES SALES 30
BLAKE SALES 30
MARTIN SALES 30
查詢出部門號爲10的員工名和薪水,以及所在部門(dname)
SQL> select e.ename,e.ename,d.dname,d.deptno from emp e,dept d where e.deptno=d.deptno=10;
select e.ename,e.ename,d.dname,d.deptno from emp e,dept d where e.deptno=d.deptno=10
*
ERROR at line 1:
ORA-00933: SQL command not properly ended
這樣的組合e.deptno=d.deptno=10是不被容許的,正確以下:
SQL> select e.ename,e.sal,d.dname,d.deptno from emp e,dept d where e.deptno=d.deptno and d.deptno=10;
ENAME SAL DNAME DEPTNO
---------- ---------- -------------- ----------
CLARK 2450 ACCOUNTING 10
KING 5000 ACCOUNTING 10
MILLER 1300 ACCOUNTING 10
表salgrade是薪水級別,以下:
SQL> select * from salgrade;
GRADE LOSAL HISAL
---------- ---------- ----------
1 700 1200 區間700-1200之間的薪水等級
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
查詢員工名及工資,以及工資所在的等級,關鍵字between and
SQL> select e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;
ENAME SAL GRADE
---------- ---------- ----------
SMITH 800 1
JAMES 950 1
ADAMS 1100 1
WARD 1250 2
MARTIN 1250 2
MILLER 1300 2
TURNER 1500 3
ALLEN 1600 3
CLARK 2450 4
BLAKE 2850 4
JONES 2975 4
SCOTT 3000 4
FORD 3000 4
KING 5000 5
多表查詢結合order by關鍵字
按照部門號排序查詢員工名,薪水,部門號以及所在部門
SQL> select e.ename,e.sal,d.dname,d.deptno from emp e,dept d where e.deptno=d.deptno order by d.deptno;
ENAME SAL DNAME DEPTNO
---------- ---------- -------------- ----------
CLARK 2450 ACCOUNTING 10
KING 5000 ACCOUNTING 10
MILLER 1300 ACCOUNTING 10
JONES 2975 RESEARCH 20
FORD 3000 RESEARCH 20
ADAMS 1100 RESEARCH 20
SMITH 800 RESEARCH 20
SCOTT 3000 RESEARCH 20
WARD 1250 SALES 30
TURNER 1500 SALES 30
ALLEN 1600 SALES 30
JAMES 950 SALES 30
BLAKE 2850 SALES 30
MARTIN 1250 SALES 30
找出emp表中,員工的各個上級員工名(一個表中的不一樣查詢)
SQL> select e.ename,m.ename from emp e,emp m where e.mgr=m.empno; 判斷條件是員工上級號等於員工號,左邊是員工,右邊是員工對應的上級號
ENAME ENAME
---------- ----------
FORD JONES
SCOTT JONES
TURNER BLAKE
ALLEN BLAKE
WARD BLAKE
JAMES BLAKE
MARTIN BLAKE
MILLER CLARK
ADAMS SCOTT
BLAKE KING
JONES KING
CLARK KING
SMITH FORD
查出某一個員工的上級
SQL> select e.ename,m.ename from emp e,emp m where e.mgr=m.empno and e.ename='WARD';
ENAME ENAME
---------- ----------
WARD BLAKE
子查詢
查出和Smith相同部門的員工,當查出來的結果是當行字句時,選擇等於號=
一、線找出smith員工所在的部門號
SQL> select deptno from emp where ename='SMITH';
DEPTNO
----------
20
二、而後以部門號爲判斷條件進行查詢所在部門號的員工
SQL> select ename,deptno from emp where deptno=(select deptno from emp where ename='SMITH');
ENAME DEPTNO
---------- ----------
SMITH 20
JONES 20
SCOTT 20
ADAMS 20
FORD 20
子查詢
當查出來的結果是多行字句時,選擇in進行匹配其中某些
一、找出部門號爲10的全部職位
SQL> select job from emp where deptno=10; 當有重複的行時,選擇關鍵字distinct
JOB
---------
MANAGER
PRESIDENT
CLERK
SQL> select distinct job from emp where deptno=10;
二、而後查出在全部職位的全部字段,知足job
SQL> select * from emp where job in (select distinct job from emp where deptno=10);
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- ---------- ---------- ----------
DEPTNO
----------
7782 CLARK MANAGER 7839 1981-06-09 2450
10
7698 BLAKE MANAGER 7839 1981-05-01 2850
30
7566 JONES MANAGER 7839 1981-04-02 2975
20
EMPNO ENAME JOB MGR HIREDATE SAL COMM
找出全部員工工資比30號部門員工工資高的員工,關鍵字all
一、先查詢出部門號30得員工工資
SQL> select sal,deptno from emp where deptno=30;
SAL DEPTNO
---------- ----------
1600 30
1250 30
1250 30
2850 30
1500 30
950 30
二、而後再找出比這個部門號都高的員工
SQL> select ename,sal,deptno from emp where sal>all (select sal from emp where deptno=30);
ENAME SAL DEPTNO
---------- ---------- ----------
JONES 2975 20
SCOTT 3000 20
FORD 3000 20
KING 5000 10
固然也有第二種方式表示,以下:
SQL> select ename,sal,deptno from emp where sal>(select max(sal) from emp where deptno=30);
ENAME SAL DEPTNO
---------- ---------- ----------
JONES 2975 20
SCOTT 3000 20
KING 5000 10
FORD 3000 20
找出任何一個員工工資比30號部門員工工資高的員工(比30號員工的最低工高就知足條件)
運用關鍵字any或者min(sal)
查找出和smith相同部門號相同職位的員工
一、線找出Smith所在的部門號和職位
SQL> select deptno,job from emp where ename='SMITH';
DEPTNO JOB
---------- ---------
20 CLERK
二、而後再按照要求查詢
SQL> select * from emp where (job,deptno)=(select deptno,job from emp where ename='SMITH');
select * from emp where (job,deptno)=(select deptno,job from emp where ename='SMITH')
*
ERROR at line 1:
ORA-01722: invalid number 查詢的判斷條件必須一一對應job,deptno對應後面的子查詢
SQL> select * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- ---------- ---------- ----------
DEPTNO
----------
7369 SMITH CLERK 7902 1980-12-17 800
20
7876 ADAMS CLERK 7788 1987-05-23 1100
20
查出每一個部門號的平均工資進行分組,查出平均工資,以部門號進行分組排序
SQL> select deptno,avg(sal) from emp group by deptno;
DEPTNO AVG(SAL)
---------- ----------
30 1566.66667
20 2175
10 2916.66667
查找出本身部門,本身的工資比本身部門的平均工資高的員工
上面已經查找出了平均值工資和部門號做爲了一張表,而後結合兩表進行查詢
SQL> select e.ename,e.sal,e.deptno,b.avg from emp e,(select deptno,avg(sal) avg from emp group by deptno) b where e.deptno=b.deptno and e.sal>b.avg;
ENAME SAL DEPTNO AVG
---------- ---------- ---------- ----------
ALLEN 1600 30 1566.66667
JONES 2975 20 2175
BLAKE 2850 30 1566.66667
SCOTT 3000 20 2175
KING 5000 10 2916.66667
FORD 3000 20 2175
where e.deptno=b.deptno and e.sal>b.avg:兩張表查詢,條件必定得準確,邏輯必須清楚
內嵌視圖就是子查詢當作一張表來使用,給這個子查詢這張表賦予一個別名
給表取別名不能加as,列能夠加
oracle的分頁查詢
一、rownum分頁 rownum爲oracle分配的獨有的
SQL> select e.*,rownum rn from (select * from emp) e; rownum做爲分頁,添加一個字段rn做爲分頁行號,用其餘值(xm)取代也能夠,就是指分頁行號
select e.*,rownum xm from (select * from emp) e; 同樣的效果只是由rn變成了xm
SQL> select e.*,rownum rn from (select * from emp) e;
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- ---------- ---------- ----------
DEPTNO RN
---------- ----------
7369 SMITH CLERK 7902 1980-12-17 800
20 1
SQL> select e.*,rownum xm from (select ename,sal from emp) e;
ENAME SAL XM
---------- ---------- ----------
SMITH 800 1
ALLEN 1600 2
WARD 1250 3
JONES 2975 4
rn和xm就是分頁的行數,如今就能夠基於條件來進行每頁分配多少行,進行分頁查詢
SQL> select e.*,rownum xm from (select ename,sal from emp) e where xm<4;
select e.*,rownum xm from (select ename,sal from emp) e where xm<4
*
ERROR at line 1:
ORA-00904: "XM": invalid identifier
這樣的查詢是錯誤的,必須用rownum來進行判斷,以下:
SQL> select e.*,rownum xm from (select ename,sal from emp) e where rownum<4;
ENAME SAL XM
---------- ---------- ----------
SMITH 800 1
ALLEN 1600 2
WARD 1250 3
SQL> SQL> select e.*,rownum xm from (select ename,sal from emp) e where rownum<4 and rownum >2;
SP2-0734: unknown command beginning "WARD ..." - rest of line ignored.
這樣的操做是錯誤的,正確作法以下:
SQL> select * from (select e.*,rownum xm from (select ename,sal from emp) e where rownum<4) where xm>2;
ENAME SAL XM
---------- ---------- ----------
WARD 1250 3
或者以下第二種:
將下面的查詢結果當作又一張字表
SQL> select e.*,rownum xm from (select ename,sal from emp) e;
ENAME SAL XM
---------- ---------- ----------
SMITH 800 1
ALLEN 1600 2
WARD 1250 3
JONES 2975 4
MARTIN 1250 5
SQL> select * from (select e.*,rownum xm from (select ename,sal from emp) e) where xm>2 and xm<4;
ENAME SAL XM
---------- ---------- ----------
WARD 1250 3
函數count
一張表總共有多少行
SQL> select count(*) from emp;
COUNT(*)
----------
14
用查詢結果建立一張新表
SQL> create table myemp(id,ename,sal) as select empno,ename,sal from emp; 後面是查詢的結果
Table created
SQL> desc myemp;
Name Type Nullable Default Comments
----- ------------ -------- ------- --------
ID NUMBER(4) Y
ENAME VARCHAR2(10) Y
SAL NUMBER(7,2) Y 建立的新表和查詢出來的結果如出一轍
合併查詢:
可使用的操做符號union,union all,intersect,minus(減)
union:取得兩個結果的並集,去掉查詢相同的交集
SQL> select ename,sal,job from emp where sal>2500;
ENAME SAL JOB
---------- --------- ---------
JONES 2975.00 MANAGER
BLAKE 2850.00 MANAGER
SCOTT 3000.00 ANALYST
KING 5000.00 PRESIDENT
FORD 3000.00 ANALYST
SQL> select ename,sal,job from emp where job='MANAGER';
ENAME SAL JOB
---------- --------- ---------
JONES 2975.00 MANAGER
BLAKE 2850.00 MANAGER
CLARK 2450.00 MANAGER
而後將二者進行union,取並集,去掉交集部分
SQL> select ename,sal,job from emp where sal>2500 union
2 select ename,sal,job from emp where job='MANAGER';
ENAME SAL JOB
---------- --------- ---------
BLAKE 2850.00 MANAGER
CLARK 2450.00 MANAGER
FORD 3000.00 ANALYST
JONES 2975.00 MANAGER
KING 5000.00 PRESIDENT
SCOTT 3000.00 ANALYST
相同的部分取一次
union all不會取消重複行
SQL> select ename,sal,job from emp where sal>2500 union all select ename,sal,job from emp where job='MANAGER';
ENAME SAL JOB
---------- --------- ---------
JONES 2975.00 MANAGER
BLAKE 2850.00 MANAGER
SCOTT 3000.00 ANALYST
KING 5000.00 PRESIDENT
FORD 3000.00 ANALYST
JONES 2975.00 MANAGER
BLAKE 2850.00 MANAGER
CLARK 2450.00 MANAGER
直接是二者查詢的總和,不去掉重複行
intersect取交集
SQL> select ename,sal,job from emp where sal>2500 intersect select ename,sal,job from emp where job='MANAGER';
ENAME SAL JOB
---------- --------- ---------
BLAKE 2850.00 MANAGER
JONES 2975.00 MANAGER
minus取差集,大的集合減去小的集合(誰的查詢在前就是減去後面查詢的集合)
若是小的減去大的就是空集
集合操做速度快