oracle怎么分組字段 oracle 分組

Oracle如何對一個多值字段進(jìn)行分組統(tǒng)計

CREATE??TABLE??info?(

濟(jì)寧ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

users????varchar(100)

);

INSERT?INTO?info?VALUES('userA@userB@userC');

INSERT?INTO?info?VALUES('userB@userC@userD');

INSERT?INTO?info?VALUES('userC@userD@userE');

COLUMN?"用戶"?FORMAT?A15

SELECT

to_char(strvalue)?as?"用戶",

count(*)?AS?"用戶數(shù)"

FROM

info,

table(fn_split(?info.users,??'@'))

GROUP?BY

to_char(strvalue)

ORDER?BY

1;

用戶????????????????用戶數(shù)

---------------?----------

userA????????????????????1

userB????????????????????2

userC????????????????????3

userD????????????????????2

userE????????????????????1

上面這樣的效果, 是否滿足你的需求?

如果滿足的話, 你再往下看, 下面是 存儲過程的相關(guān)代碼

Oracle?需要首先在數(shù)據(jù)庫中,?創(chuàng)建好?類型?與?函數(shù)。

來實現(xiàn)一個??split?功能的處理。

--?定義一個對象類型.

CREATE?OR?REPLACE?TYPE?ty_row_str_split?as?object?(strValue?VARCHAR2?(4000));

/

--?定義一個?表/數(shù)組類型,?內(nèi)容是前面定義的那個對象.

CREATE?OR?REPLACE?TYPE?ty_tbl_str_split?IS?TABLE?OF?ty_row_str_split;

/

--------------------

--?字符分割函數(shù).

--?參數(shù)1:??被分割的源字符串

--?參數(shù)2:??用于拆分的字符串。

--------------------

CREATE?OR?REPLACE?FUNCTION?fn_split(

p_str???????IN?VARCHAR2,

p_delimiter?IN?VARCHAR2)

RETURN?ty_tbl_str_split?IS

j?????????INT?:=?0;

i?????????INT?:=?1;

--?被分割的源字符串?的長度.

len???????INT?:=?0;

--?分隔字符串的長度

len1??????INT?:=?0;

--?暫存的中間每一個單元的文本信息.

str???????VARCHAR2(4000);

--?預(yù)期返回結(jié)果.

str_split?ty_tbl_str_split?:=?ty_tbl_str_split();

BEGIN

--?被分割的源字符串?的長度.

len???:=?LENGTH(p_str);

--?分隔字符串的長度.

len1?:=?LENGTH(p_delimiter);

--?遍歷?被分割的源字符串.

WHILE?j??len?LOOP

--?在被分割的源字符串中,?查詢?分隔字符串.

j?:=?INSTR(p_str,?p_delimiter,?i);

IF?j?=?0?THEN

--?j=0?意味著沒有找到.

??--?可以理解為是查詢到最后一個單元了.

??--?設(shè)置?j?:=?len,?讓外部的循環(huán)處理可以結(jié)束了.

j??:=?len;

--?獲取最后一個單元的內(nèi)容.

str?:=?SUBSTR(p_str,?i);

--?結(jié)果追加一行.

str_split.EXTEND;

--?設(shè)置結(jié)果內(nèi)容.

str_split(str_split.COUNT)?:=?ty_row_str_split(strValue?=?str);

IF?i?=?len?THEN

EXIT;

END?IF;

ELSE

--?如果在被分割的源字符串中,找到了?分隔字符串.

--?首先,獲取分割的內(nèi)容.

str?:=?SUBSTR(p_str,?i,?j?-?i);

--?然后設(shè)置索引,?下一次再查找的時候,從指定的索引位置開始(不是從0開始找了)

i?:=?j?+?len1;

--?結(jié)果追加一行.

str_split.EXTEND;

--?設(shè)置結(jié)果內(nèi)容.

str_split(str_split.COUNT)?:=?ty_row_str_split(strValue?=?str);

END?IF;

END?LOOP;

RETURN?str_split;

END?fn_split;

/

函數(shù)創(chuàng)建完畢以后,可以開始做查詢的處理.

SQL?select?to_char(strvalue)?as?Value?from?table(fn_split('aa,bb,cc',','));

VALUE

-------------------------------------------------------------------------------

aa

bb

cc

oracle怎么根據(jù)一個數(shù)分組

首先你的starttime是什么類型的,數(shù)字?字符?還是時間?

要出來08:00-08:30這種結(jié)果簡單,只要查詢的時候加一個關(guān)聯(lián)就可以,

比如select starttime||'-'||endtime from table.當(dāng)然試過是時間的字段類型,比如date什么的,那就轉(zhuǎn)換成字符型的,反正現(xiàn)在看來主要是字符型。

再說分組,分組可以用case when手動分組。

按照你給的圖片個人覺得可以這么分

select case when starttime=0800 and endtime=10:00 then 1

when starttime=0900 and endtime=12:00 then 2

when starttime=1330 and endtime=15:30 then 3

when starttime=1530 and endtime=17:30 then 4

end 分組, starttime||'-'||endtime from table

這個語句中的具體寫法,可能會因為數(shù)據(jù)類型的原因什么的,導(dǎo)致語句不能直接用,需要轉(zhuǎn)換一下數(shù)據(jù)類型,但是大體上的意思和寫法就是這樣了。

oracle里面怎么多個字段分組排序

分組排序用group by,若需要條件則在后面加having。

多個字段的話用order by,比如:order by a,b

order by 可以讓表按a排序,遇到重復(fù)的再按b再排一次序,做到把想要的字段與其他無關(guān)字段分開比較。

關(guān)于oracle怎么做多次分組

以NO字段為主,進(jìn)行分組。

select a.no,sum(a.金額) from table a group by a.no

同一個NO,會對應(yīng)不同的姓名。

select a.no,a.姓名,sum(a.金額) from table a group by a.no,a.姓名

看不懂

目標(biāo)語句:當(dāng)收費醒目包含‘鹽’這一項,則統(tǒng)計no='10' 且 姓名=‘張三’,所有收費項目對...

select a.項目,sum(a.金額) from table a where a.收費項目= '1' and a.no = '10' and a.姓名=‘張三’ group by a.項目

oracle 字段分開

左(外)連接:LEFT OUTER JOIN…ON;

右(外)連接:RIGHT OUTER JOIN…ON;

全(外)連接:FULL OUTER JOIN…ON; -- 把兩張表中沒有的數(shù)據(jù)都顯示

SELECT * FROM emp RIGHT OUTER JOIN dept ON(emp.deptno=dept.deptno);

在Oracle之外的數(shù)據(jù)庫都使用以上的SQL:1999語法操作,所以這個語法還必須會一些(如果你一直使用的都是Oracle就可以不會了)。

再次強(qiáng)調(diào):多表查詢的性能肯定不高,而且性能一定要在大數(shù)據(jù)量的情況下才能夠發(fā)現(xiàn)。

四、統(tǒng)計函數(shù)及分組查詢

1、統(tǒng)計函數(shù)

在之前學(xué)習(xí)過一個COUNT()函數(shù),此函數(shù)的功能可以統(tǒng)計出表中的數(shù)據(jù)量,實際上這個就是一個統(tǒng)計函數(shù),而常用的統(tǒng)計函數(shù)有如下幾個:

COUNT():查詢表中的數(shù)據(jù)記錄;

AVG():求出平均值;

SUM():求和;

MAX():求出最大值;

MIN():求出最小值;

范例:測試COUNT()、AVG()、SUM()

統(tǒng)計出公司的所有雇員,每個月支付的平均工資及總工資。

SELECT MAX(sal),MIN(sal) FROM emp;

注意點:關(guān)于COUNT()函數(shù)

COUNT()函數(shù)的主要功能是進(jìn)行數(shù)據(jù)的統(tǒng)計,但是在進(jìn)行數(shù)據(jù)統(tǒng)計的時候,如果一張表中沒有統(tǒng)計記錄,COUNT()也會返回數(shù)據(jù),只是這個數(shù)據(jù)是“0”。

SELECT COUNT(ename) FROM BONUS;

如果使用的是其他函數(shù),則有可能返回null,但是COUNT()永遠(yuǎn)都會返回一個具體的數(shù)字,這一點以后在開發(fā)之中都會使用到。

2、分組查詢

在講解分組操作之前首先必須先明確一點,什么情況下可能分組,例如:

公司的所有雇員,要求男性一組,女性一組,之后可以統(tǒng)計男性和女性的數(shù)量;

按照年齡分組,18歲以上的分一組,18歲以下的分一組;

按照地區(qū)分組:北京人一組,上海人一組,四川一組;

這些信息如果都保存了數(shù)據(jù)庫之中,肯定在數(shù)據(jù)的某一列上會存在重復(fù)的內(nèi)容,例如:按照性別分組的時候,性別肯定有重復(fù)(男和女),按照年齡分組(有一個范圍的重復(fù)),按照地區(qū)分組有一個地區(qū)的信息重復(fù)。

所以分組之中有一個不成文的規(guī)定:當(dāng)數(shù)據(jù)重復(fù)的時候分組才有意義,因為一個人也可以一組(沒什么意義)。

SELECT [DISTINCT] *|分組字段1 [別名] [,分組字段2 [別名] ,…] | 統(tǒng)計函數(shù)

FROM 表名稱 [別名], [表名稱 [別名] ,…]

[WHERE 條件(s)]

[GROUP BY 分組字段1 [,分組字段2 ,…]]

[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]];

范例:按照部門編號分組,求出每個部門的人數(shù),平均工資

SELECT deptno, COUNT(empno), AVG(sal)

FROM emp

GROUP BY deptno;

范例:按照職位分組,求出每個職位的最高和最低工資

SELECT job, MAX(sal), MIN(sal)

FROM emp

GROUP BY job;

但是現(xiàn)在一旦分組之后,實際上對于語法上就會出現(xiàn)了新的限制,對于分組有以下要求:

分組函數(shù)可以在沒有分組的時候單獨用使用,可是卻不能出現(xiàn)其他的查詢字段;

分組函數(shù)單獨使用:

SELECT COUNT(empno) FROM emp;

錯誤的使用,出現(xiàn)了其他字段:

SELECT empno,COUNT(empno) FROM emp;

如果現(xiàn)在要進(jìn)行分組的話,則SELECT子句之后,只能出現(xiàn)分組的字段和統(tǒng)計函數(shù),其他的字段不能出現(xiàn):

正確做法:

SELECT job,COUNT(empno),AVG(sal)

FROM emp

GROUP BY job;

錯誤的做法:

SELECT deptno,job,COUNT(empno),AVG(sal)

FROM emp

GROUP BY job;

分組函數(shù)允許嵌套,但是嵌套之后的分組函數(shù)的查詢之中不能再出現(xiàn)任何的其他字段。

范例:按照職位分組,統(tǒng)計平均工資最高的工資

1、先統(tǒng)計出各個職位的平均工資

SELECT job,AVG(sal)

FROM emp

GROUP BY job;

2、平均工資最高的工資

SELECT MAX(AVG(sal))

FROM emp

GROUP BY job;

范例:查詢出每個部門的名稱、部門的人數(shù)、平均工資

1、確定所需要的數(shù)據(jù)表:

dept表:每個部門的名稱;

emp表:統(tǒng)計出部門的人數(shù)、平均工資;

2、確定已知的關(guān)聯(lián)字段:emp.deptno=dept.deptno;

范例:將dept表和emp表的數(shù)據(jù)關(guān)聯(lián)

SELECT d.dname,e.empno,e.sal

FROM dept d, emp e

WHERE d.deptno=e.deptno;

DNAME EMPNO SAL

-------------- ---------- ----------

ACCOUNTING 7782 2450

ACCOUNTING 7839 5000

ACCOUNTING 7934 1300

RESEARCH 7369 800

RESEARCH 7876 1100

RESEARCH 7902 3000

RESEARCH 7788 3000

RESEARCH 7566 2975

SALES 7499 1600

SALES 7698 2850

SALES 7654 1250

SALES 7900 950

SALES 7844 1500

SALES 7521 1250

已選擇14行。

此時的查詢結(jié)果中,可以發(fā)現(xiàn)在dname字段上顯示出了重復(fù)的數(shù)據(jù),按照之前對分組的理解,只要數(shù)據(jù)重復(fù)了,那么就有可

能進(jìn)行分組的查詢操作,但是此時與之前的分組不太一樣,之前的分組是針對于一張實體表進(jìn)行的分組(emp、dept都屬于實體表),但是對于以上的數(shù)據(jù)是

通過查詢結(jié)果顯示的,所以是一張臨時的虛擬表,但是不管是否是實體表還是虛擬表,只要是有重復(fù),那么就直接進(jìn)行分組。

SELECT d.dname,COUNT(e.empno),AVG(e.sal)

FROM dept d, emp e

WHERE d.deptno=e.deptno

GROUP BY d.dname;

但是這個分組并不合適,因為部門一共有四個部門(因為現(xiàn)在已經(jīng)引入了dept表,dept表存在了四個部門的信息),所以應(yīng)該通過左右連接改變查詢的結(jié)果。

SELECT d.dname,COUNT(e.empno),NVL(AVG(e.sal),0)

FROM dept d, emp e

WHERE d.deptno=e.deptno(+)

GROUP BY d.dname;

之前的所有操作都是針對于單個字段分組的,而實際上分組操作之中也可以實現(xiàn)多字段分組。

范例:要求顯示每個部門的編號、名稱、位置、部門的人數(shù)、平均工資

1、確定所需要的數(shù)據(jù)表:

dept表:每個部門的名稱;

emp表:統(tǒng)計出部門的人數(shù)、平均工資;

2、確定已知的關(guān)聯(lián)字段:emp.deptno=dept.deptno;

范例:將emp表和dept表關(guān)聯(lián)查詢

SELECT d.deptno,d.dname,d.loc,e.empno,e.sal

FROM dept d,emp e

WHERE d.deptno=e.deptno(+);

DEPTNO DNAME LOC EMPNO SAL

---------- -------------- ------------- ---------- ----------

10 ACCOUNTING NEW YORK 7782 2450

10 ACCOUNTING NEW YORK 7839 5000

10 ACCOUNTING NEW YORK 7934 1300

20 RESEARCH DALLAS 7369 800

20 RESEARCH DALLAS 7876 1100

20 RESEARCH DALLAS 7902 3000

20 RESEARCH DALLAS 7788 3000

20 RESEARCH DALLAS 7566 2975

30 SALES CHICAGO 7499 1600

30 SALES CHICAGO 7698 2850

30 SALES CHICAGO 7654 1250

30 SALES CHICAGO 7900 950

30 SALES CHICAGO 7844 1500

30 SALES CHICAGO 7521 1250

40 OPERATIONS BOSTON

已選擇15行。

此時存在了重復(fù)數(shù)據(jù),而且這個重復(fù)的數(shù)據(jù)平均在了三列上(deptno,dname,loc),所以在分組上的GROUP BY子句中就可以寫上三個字段:

SELECT d.deptno,d.dname,d.loc,COUNT(e.empno),NVL(AVG(e.sal),0)

FROM dept d,emp e

WHERE d.deptno=e.deptno(+)

GROUP BY d.deptno,d.dname,d.loc;

以上就是多字段分組,但是不管是單字段還是多字段,一定要有一個前提,存在了重復(fù)數(shù)據(jù)。

范例:要求統(tǒng)計出每個部門的詳細(xì)信息,并且要求這些部門的平均工資高于2000;

在以上程序的基礎(chǔ)上完成開發(fā),在之前唯一所學(xué)習(xí)的限定查詢的語法只有WHERE子句,所以下面先使用WHERE完成要求。

SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) mycount,NVL(AVG(e.sal),0) myavg

FROM dept d,emp e

WHERE d.deptno=e.deptno(+) AND AVG(e.sal)2000

GROUP BY d.deptno,d.dname,d.loc;

現(xiàn)在出現(xiàn)了如下的錯誤提示:

WHERE d.deptno=e.deptno(+) AND AVG(e.sal)2000

*

第 3 行出現(xiàn)錯誤:

ORA-00934: 此處不允許使用分組函數(shù)

本錯誤提示的核心意思就是在WHERE子句之中不能使用統(tǒng)計函數(shù),之所以在WHERE子句之中不能使用,實際上跟WHERE子句的主要功能有關(guān),WHERE的主要功能是從全部的數(shù)據(jù)之中取出部分?jǐn)?shù)據(jù)。

此時如果要對分組后的數(shù)據(jù)再次進(jìn)行過濾,則使用HAVING子句完成,那么此時的SQL語法格式如下:

SELECT [DISTINCT] *|分組字段1 [別名] [,分組字段2 [別名] ,…] | 統(tǒng)計函數(shù)

FROM 表名稱 [別名], [表名稱 [別名] ,…]

[WHERE 條件(s)]

[GROUP BY 分組字段1 [,分組字段2 ,…]]

[HAVING 分組后的過濾條件(可以使用統(tǒng)計函數(shù))]

[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]];

下面使用HAVING進(jìn)行過濾。

SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) mycount,NVL(AVG(e.sal),0) myavg

FROM dept d,emp e

WHERE d.deptno=e.deptno(+)

GROUP BY d.deptno,d.dname,d.loc

HAVING AVG(sal)2000;

注意點:WHERE和HAVING的區(qū)別

WHERE:是在執(zhí)行GROUP BY操作之前進(jìn)行的過濾,表示從全部數(shù)據(jù)之中篩選出部分的數(shù)據(jù),在WHERE之中不能使用統(tǒng)計函數(shù);

HAVING:是在GROUP BY分組之后的再次過濾,可以在HAVING子句中使用統(tǒng)計函數(shù);

思考題:顯示非銷售人員工作名稱以及從事同一工作雇員的月工資的總和,并且要滿足從事同一工作的雇員的月工資合計大于$5000,輸出結(jié)果按月工資的合計升序排列:

第一步:查詢出所有的非銷售人員的信息

SELECT * FROM emp WHERE job'SALESMAN';

第二步:按照職位進(jìn)行分組,并且使用SUM函數(shù)統(tǒng)計

SELECT job,SUM(sal)

FROM emp

WHERE job'SALESMAN'

GROUP BY job;

第三步:月工資的合計是通過統(tǒng)計函數(shù)查詢的,所以現(xiàn)在這個對分組后的過濾要使用HAVING子句完成

SELECT job,SUM(sal)

FROM emp

WHERE job'SALESMAN'

GROUP BY job

HAVING SUM(sal)5000;

第四步:按照升序排列

SELECT job,SUM(sal) sum

FROM emp

WHERE job'SALESMAN'

GROUP BY job

HAVING SUM(sal)5000

ORDER BY sum ASC;

以上的題目就融合分組操作的大部分語法的使用,而且以后遇到問題,要慢慢分析。

五、子查詢

子查詢 = 簡單查詢 + 限定查詢 + 多表查詢 + 統(tǒng)計查詢的綜合體;

在之前強(qiáng)調(diào)過多表查詢不建議大家使用,因為性能很差,但是多表查詢最有利的替代者就是子查詢,所以子查詢在實際的開發(fā)之中使用的相當(dāng)?shù)亩啵?/p>

所謂的子查詢指的就是在一個查詢之中嵌套了其他的若干查詢,嵌套子查詢之后的查詢SQL語句如下:

SELECT [DISTINCT] *|分組字段1 [別名] [,分組字段2 [別名] ,…] | 統(tǒng)計函數(shù) ,(

SELECT [DISTINCT] *|分組字段1 [別名] [,分組字段2 [別名] ,…] | 統(tǒng)計函數(shù)

FROM 表名稱 [別名], [表名稱 [別名] ,…]

[WHERE 條件(s)]

[GROUP BY 分組字段1 [,分組字段2 ,…]]

[HAVING 分組后的過濾條件(可以使用統(tǒng)計函數(shù))]

[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]])

FROM 表名稱 [別名], [表名稱 [別名] ,…] ,(

SELECT [DISTINCT] *|分組字段1 [別名] [,分組字段2 [別名] ,…] | 統(tǒng)計函數(shù)

FROM 表名稱 [別名], [表名稱 [別名] ,…]

[WHERE 條件(s)]

[GROUP BY 分組字段1 [,分組字段2 ,…]]

[HAVING 分組后的過濾條件(可以使用統(tǒng)計函數(shù))]

[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]])

[WHERE 條件(s) (

SELECT [DISTINCT] *|分組字段1 [別名] [,分組字段2 [別名] ,…] | 統(tǒng)計函數(shù)

FROM 表名稱 [別名], [表名稱 [別名] ,…]

[WHERE 條件(s)]

[GROUP BY 分組字段1 [,分組字段2 ,…]]

[HAVING 分組后的過濾條件(可以使用統(tǒng)計函數(shù))]

[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]])]

[GROUP BY 分組字段1 [,分組字段2 ,…]]

[HAVING 分組后的過濾條件(可以使用統(tǒng)計函數(shù))]

[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]];

理論上子查詢可以出現(xiàn)在查詢語句的任意位置上,但是從個人而言,子查詢出現(xiàn)在WHERE和FROM子句之中較多;

以下的使用特點為個人總結(jié),不是官方聲明的:

WHERE:子查詢一般只返回單行列、多行單列、單行多列的數(shù)據(jù);

FROM:子查詢返回的一般是多行的數(shù)據(jù),當(dāng)作一張臨時表出現(xiàn)。

范例:要求查詢出工資比SMITH還要高的全部雇員信息

要想完成本程序,首先必須要知道SMITH的工資是多少:

SELECT sal FROM emp WHERE ename='SMITH';

由于此時返回的是單列的數(shù)據(jù),所以這個子句查詢可以在WHERE中出現(xiàn)。

SELECT * FROM emp

WHERE sal(

SELECT sal

FROM emp

WHERE ename='SMITH');

范例:要求查詢出高于公司平均工資的全部雇員信息

公司的平均工資應(yīng)該使用AVG()函數(shù)求出。

SELECT AVG(sal) FROM emp;

此時數(shù)據(jù)的返回結(jié)果是單行單列的數(shù)據(jù),在WHERE之中出現(xiàn)。

SELECT * FROM emp

WHERE sal(

SELECT AVG(sal)

FROM emp);

以上所返回的是單行單列,但是在子查詢之中,也可以返回單行多列的數(shù)據(jù),只是這種子查詢很少出現(xiàn)。

范例:子查詢返回單行多列數(shù)據(jù)

SELECT * FROM emp

WHERE (job,sal)=(

SELECT job,sal

FROM emp

WHERE ename='ALLEN');

如果現(xiàn)在的子查詢返回的是多行單列數(shù)據(jù)的話,這個時候就需要使用三種判斷符判斷了:IN、ANY、ALL;

1、 IN操作符:用于指定一個子查詢的判斷范圍

這個操作符的使用實際上與之前講解的IN是一樣的,唯一不同的是,里面的范圍由子查詢指定了。

SELECT * FROM emp

WHERE sal in (

SELECT sal

FROM emp

WHERE job='MANAGER');

但是在使用IN的時候還要注意NOT IN的問題,如果使用NOT IN操作,在子查詢之中,如果有一個內(nèi)容是null,則不會查詢出任何的結(jié)果。

2、 ANY操作符:與每一個內(nèi)容想匹配,有三種匹配形式

=ANY:功能與IN操作符是完全一樣的;

SELECT * FROM emp

WHERE sal=ANY (

SELECT sal

FROM emp

WHERE job='MANAGER');

ANY:比子查詢中返回記錄最小的還要大的數(shù)據(jù);

SELECT * FROM emp

WHERE salANY (

SELECT sal

FROM emp

WHERE job='MANAGER');

ANY:比子查詢中返回記錄的最大的還要小;

SELECT * FROM emp

WHERE salANY (

SELECT sal

FROM emp

WHERE job='MANAGER');

3、 ALL操作符:與每一個內(nèi)容相匹配,有兩種匹配形式:

ALL:比子查詢中返回的最大的記錄還要大

SELECT * FROM emp

WHERE salALL (

SELECT sal

FROM emp

WHERE job='MANAGER');

ALL:比子查詢中返回的最小的記錄還要小

SELECT * FROM emp

WHERE salALL (

SELECT sal

FROM emp

WHERE job='MANAGER');

以上的所有子查詢都是在WHERE子句中出現(xiàn)的,那么下面再來觀察在FROM子句中出現(xiàn)的查詢,這個子查詢一般返回的是多行多列的數(shù)據(jù),當(dāng)作一張臨時表的方式來處理。

范例:查詢出每個部門的編號、名稱、位置、部門人數(shù)、平均工資

回顧:最早的時候使用的是多字段分組統(tǒng)計完成的:

SELECT d.deptno,d.dname,d.loc,COUNT(e.empno),AVG(e.sal)

FROM emp e,dept d

WHERE e.deptno(+)=d.deptno

GROUP BY d.deptno,d.dname,d.loc;

這個時候?qū)嶋H上是產(chǎn)生了笛卡爾積,一共產(chǎn)生了56條記錄;

新的解決方案:通過子查詢完成,所有的統(tǒng)計查詢只能在GROUP BY中出現(xiàn),所以在子查詢之中負(fù)責(zé)統(tǒng)計數(shù)據(jù),而在外部的查詢之中,負(fù)責(zé)將統(tǒng)計數(shù)據(jù)和dept表數(shù)據(jù)相統(tǒng)一。

SELECT d.deptno,d.dname,d.loc,temp.count,temp.avg

FROM dept d,(

SELECT deptno dno,COUNT(empno) count,AVG(sal) avg

FROM emp

GROUP BY deptno) temp

WHERE d.deptno=temp.dno(+);

現(xiàn)在的程序中所操作的數(shù)據(jù)量:

子查詢中統(tǒng)計的記錄是14條記錄,最終統(tǒng)計的顯示結(jié)果是3條記錄;

dept表之中一共有4條記錄;

如果現(xiàn)在產(chǎn)生笛卡爾積的話只有12條記錄,再加上雇員的14條記錄,一共才26條記錄;

通過如上的分析,可以發(fā)現(xiàn),使用子查詢的確要比使用多表查詢更加節(jié)省性能,所以在開發(fā)之中子查詢出現(xiàn)是最多的,而且在給

出一個不成文的規(guī)定:大部分情況下,如果最終的查詢結(jié)果之中需要出現(xiàn)SELECT子句,但是又不能直接使用統(tǒng)計函數(shù)的時候,就在子查詢中統(tǒng)計信息,即:有

復(fù)雜統(tǒng)計的地方大部分都需要子查詢。

oracle中怎么把按'+'拆分字段進(jìn)行分組

oracle 數(shù)據(jù)庫拆分字段的實現(xiàn)方法:

用正則表達(dá)式拆分某一個字段,比如有a,b,c,d,e

sql寫法如下:

select regexp_substr('a,b,c,d,e,','[^,]+',1,rownum)

from dual connect by rownum=length(regexp_replace('a,b,c,', '[^,]', null))

結(jié)果:

執(zhí)行結(jié)果如下:

1 a

2 b

3 c

4 d

5 e

網(wǎng)站題目:oracle怎么分組字段 oracle 分組
標(biāo)題路徑:http://muchs.cn/article38/hgeepp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、虛擬主機(jī)、網(wǎng)站導(dǎo)航Google、網(wǎng)站內(nèi)鏈、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)