此文章為http://huangsir007.blog.51cto.com/6159353/1854818該片的后續(xù)
成都創(chuàng)新互聯(lián)自成立以來(lái),一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開(kāi)發(fā)等基于互聯(lián)網(wǎng)的全面整合營(yíng)銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開(kāi)發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開(kāi)發(fā)工程師團(tuán)隊(duì)及專業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。
關(guān)于數(shù)據(jù)庫(kù)語(yǔ)言查詢:
SQL> show parameter nls_language;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_language string AMERICAN 支持的是AMERICAN
SQL> select * from nls_session_parameters where parameter='NLS_LANGUAGE';
PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_LANGUAGE
AMERICAN
還有一種時(shí)間語(yǔ)言:
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 時(shí)間語(yǔ)言也是AMERICAN,所以這種1-1月-1982不允許的,月份必須是英文
否則會(huì)亂碼
關(guān)于時(shí)間的格式查詢:
SQL> select * from nls_session_parameters where parameter='NLS_DATE_FORMAT'; 這是默認(rèn)的時(shí)間格式
PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_DATE_FORMAT
DD-MON-RR 這是默認(rèn)的時(shí)間格式DD-MON-RR
SQL> show parameter nls_date_format; 這種方式查不出來(lái)就用上面的方式
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_date_format string
查看當(dāng)前時(shí)間格式
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
然后臨時(shí)修改當(dāng)前會(huì)話的時(shí)間格式(修改的是當(dāng)前session會(huì)話的,關(guān)掉后將失去更改,修改之后才能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
這樣時(shí)間格式的錯(cuò)誤之后遇到就好解決了
根據(jù)hiredate:入職時(shí)間; 受雇日期;做判斷來(lái)查詢
SQL> select ename,HIREDATE from emp where HIREDATE>'1982-1-1'; 以此時(shí)間入職之后的雇員
ENAME HIREDATE
---------- ----------
SCOTT 1987-04-19
ADAMS 1987-05-23
MILLER 1982-01-23
根據(jù)薪水的某個(gè)區(qū)間做查詢
SQL> select ename,sal from emp where sal>2000 and sal<5000;
ENAME SAL
---------- ----------
JONES 2975
BLAKE 2850
CLARK 2450
SCOTT 3000
FORD 3000
關(guān)鍵字like,做匹配查詢
查詢手寫字母為S的雇員
SQL> select ename from emp where ename like 'S%';
ENAME
----------
SMITH
SCOTT
選出第三個(gè)字母為大寫O的雇員(下劃線為匹配任一個(gè),%匹配任意個(gè))
SQL> select ename from emp where ename like '__O%';
ENAME
----------
SCOTT
關(guān)鍵字in
查詢雇員號(hào)在某個(gè)區(qū)間
SQL> select empno,ename from emp where empno in (7900,7934);
EMPNO ENAME
---------- ----------
7900 JAMES
7934 MILLER
以順序查詢,關(guān)鍵字order by(默認(rèn)為升序asc,降序?yàn)閐esc)
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
按照雇員年薪進(jìn)行排序
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
對(duì)同一個(gè)部門sal進(jìn)行降序,對(duì)部門號(hào)進(jìn)行升序
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
查詢最大值,最小值,平均值,關(guān)鍵字為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
查詢出高出平均工資得雇員
1、先找出平均工資是多少?
SQL> select avg(sal) from emp;
AVG(SAL)
----------
2073.21429
2、然后查詢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
分組查詢每個(gè)部門的最大sal和最小sal,關(guān)鍵字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的部門號(hào),關(guān)鍵字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
1、分組函數(shù)只能出現(xiàn)在選擇列,having、order by字句中
2、如果在select語(yǔ)句中同時(shí)包含group by,having,order by那么他們的順序是group by,having,order by
3、在選擇列中如果有列、表達(dá)式和分組函數(shù),那么這些列和表達(dá)式必須有一個(gè)出現(xiàn)在group by字句中,否則就會(huì)出錯(cuò)
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
多表結(jié)合查詢
按照相同字段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
查詢出部門號(hào)為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是薪水級(jí)別,如下:
SQL> select * from salgrade;
GRADE LOSAL HISAL
---------- ---------- ----------
1 700 1200 區(qū)間700-1200之間的薪水等級(jí)
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
查詢員工名及工資,以及工資所在的等級(jí),關(guān)鍵字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
多表查詢結(jié)合order by關(guān)鍵字
按照部門號(hào)排序查詢員工名,薪水,部門號(hào)以及所在部門
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表中,員工的各個(gè)上級(jí)員工名(一個(gè)表中的不同查詢)
SQL> select e.ename,m.ename from emp e,emp m where e.mgr=m.empno; 判斷條件是員工上級(jí)號(hào)等于員工號(hào),左邊是員工,右邊是員工對(duì)應(yīng)的上級(jí)號(hào)
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
查出某一個(gè)員工的上級(jí)
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相同部門的員工,當(dāng)查出來(lái)的結(jié)果是當(dāng)行字句時(shí),選擇等于號(hào)=
1、線找出smith員工所在的部門號(hào)
SQL> select deptno from emp where ename='SMITH';
DEPTNO
----------
20
2、然后以部門號(hào)為判斷條件進(jìn)行查詢所在部門號(hào)的員工
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
子查詢
當(dāng)查出來(lái)的結(jié)果是多行字句時(shí),選擇in進(jìn)行匹配其中某些
1、找出部門號(hào)為10的所有職位
SQL> select job from emp where deptno=10; 當(dāng)有重復(fù)的行時(shí),選擇關(guān)鍵字distinct
JOB
---------
MANAGER
PRESIDENT
CLERK
SQL> select distinct job from emp where deptno=10;
2、然后查出在所有職位的所有字段,滿足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號(hào)部門員工工資高的員工,關(guān)鍵字all
1、先查詢出部門號(hào)30得員工工資
SQL> select sal,deptno from emp where deptno=30;
SAL DEPTNO
---------- ----------
1600 30
1250 30
1250 30
2850 30
1500 30
950 30
2、然后再找出比這個(gè)部門號(hào)都高的員工
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
當(dāng)然也有第二種方式表示,如下:
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
找出任何一個(gè)員工工資比30號(hào)部門員工工資高的員工(比30號(hào)員工的最低工高就滿足條件)
運(yùn)用關(guān)鍵字any或者min(sal)
查找出和smith相同部門號(hào)相同職位的員工
1、線找出Smith所在的部門號(hào)和職位
SQL> select deptno,job from emp where ename='SMITH';
DEPTNO JOB
---------- ---------
20 CLERK
2、然后再按照要求查詢
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 查詢的判斷條件必須一一對(duì)應(yīng)job,deptno對(duì)應(yīng)后面的子查詢
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
查出每個(gè)部門號(hào)的平均工資進(jìn)行分組,查出平均工資,以部門號(hào)進(jìn)行分組排序
SQL> select deptno,avg(sal) from emp group by deptno;
DEPTNO AVG(SAL)
---------- ----------
30 1566.66667
20 2175
10 2916.66667
查找出自己部門,自己的工資比自己部門的平均工資高的員工
上面已經(jīng)查找出了平均值工資和部門號(hào)作為了一張表,然后結(jié)合兩表進(jìn)行查詢
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:兩張表查詢,條件一定得準(zhǔn)確,邏輯必須清楚
內(nèi)嵌視圖就是子查詢當(dāng)做一張表來(lái)使用,給這個(gè)子查詢這張表賦予一個(gè)別名
給表取別名不能加as,列可以加
oracle的分頁(yè)查詢
1、rownum分頁(yè) rownum為oracle分配的獨(dú)有的
SQL> select e.*,rownum rn from (select * from emp) e; rownum作為分頁(yè),添加一個(gè)字段rn作為分頁(yè)行號(hào),用其他值(xm)取代也可以,就是指分頁(yè)行號(hào)
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就是分頁(yè)的行數(shù),現(xiàn)在就可以基于條件來(lái)進(jìn)行每頁(yè)分配多少行,進(jìn)行分頁(yè)查詢
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
這樣的查詢是錯(cuò)誤的,必須用rownum來(lái)進(jìn)行判斷,如下:
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.
這樣的操作是錯(cuò)誤的,正確做法如下:
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
或者如下第二種:
將下面的查詢結(jié)果當(dāng)做又一張字表
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
函數(shù)count
一張表總共有多少行
SQL> select count(*) from emp;
COUNT(*)
----------
14
用查詢結(jié)果創(chuàng)建一張新表
SQL> create table myemp(id,ename,sal) as select empno,ename,sal from emp; 后面是查詢的結(jié)果
Table created
SQL> desc myemp;
Name Type Nullable Default Comments
----- ------------ -------- ------- --------
ID NUMBER(4) Y
ENAME VARCHAR2(10) Y
SAL NUMBER(7,2) Y 創(chuàng)建的新表和查詢出來(lái)的結(jié)果一模一樣
合并查詢:
可以使用的操作符號(hào)union,union all,intersect,minus(減)
union:取得兩個(gè)結(jié)果的并集,去掉查詢相同的交集
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
然后將兩者進(jìn)行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不會(huì)取消重復(fù)行
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
直接是兩者查詢的總和,不去掉重復(fù)行
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取差集,大的集合減去小的集合(誰(shuí)的查詢?cè)谇熬褪菧p去后面查詢的集合)
如果小的減去大的就是空集
集合操作速度快
網(wǎng)站題目:oracle之sql查詢二
URL分享:http://chinadenli.net/article36/gishpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、服務(wù)器托管、網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站建設(shè)、云服務(wù)器、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)