oracle之sql查詢二

此文章爲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取差集,大的集合減去小的集合(誰的查詢在前就是減去後面查詢的集合)

若是小的減去大的就是空集

集合操做速度快

相關文章
相關標籤/搜索