oracle—高级查询
Sql基礎(chǔ)
數(shù)據(jù)庫(kù)語(yǔ)言
數(shù)據(jù)操縱語(yǔ)言:DML (data manipulation language)
select insert update delete merge
數(shù)據(jù)定義語(yǔ)言:DDL(data definition language)
create alter drop truncate
事務(wù)控制語(yǔ)言:TCL (transaction control language)
commit rollback savepoint
數(shù)據(jù)控制語(yǔ)言:DCL (Data Control Language)
grant revoke
數(shù)據(jù)類型
Sql的數(shù)據(jù)類型:
char固定字符,最長(zhǎng)2000個(gè)
varchar2可變長(zhǎng),最長(zhǎng)4000最小值是1
number類型
date timestamp
clob(存儲(chǔ)單字節(jié)數(shù)據(jù),文本數(shù)據(jù))
blob(存儲(chǔ)二進(jìn)制數(shù)據(jù))
常用數(shù)據(jù)類型轉(zhuǎn)換
SELECT TO_DATE('2015-08-19','YYYY-MM-DD')AS A_DAY FROM DUAL; SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD')AS TODAY FROM DUAL; SELECT TO_TIMESTAMP('2015-08-19 17:40:32.11','YYYY-MM-DDHH24:MI:SS.FF') AS A_DAY FROM DUAL; SELECT TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF')AS TODAY FROM DUAL; SELECT TO_NUMBER(REPLACE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'),'-')) FROM DUAL;集合查詢
union(求合集重復(fù)記錄只顯示一次)
union all(求合集顯示所有記錄信息)
intersect(求交集,顯示公共的數(shù)據(jù)部分)
minus(集合相減,哪個(gè)表在前面以哪個(gè)表的數(shù)據(jù)為主)
子查詢
SELECT A.ENAME,A.SAL FROM EMP A WHERE A.DEPTNO=(SELECT B.DEPTNO FROM DEPTB WHERE B.LOC= 'NEW YORK');
SELECT A.DEPTNO,(SELECT B.LOC FROM DEPT B WHERE B.DEPTNO=A.DEPTNO) FROM EMP A;
查詢屬于領(lǐng)導(dǎo)(大小領(lǐng)導(dǎo)都算)的員工:
SELECT * FROM employees a WHERE EXISTS (SELECT 1 FROM employees b WHERE a.employee_id=b.manager_id);查詢哪個(gè)部門不存在員工的部門信息:
SELECT * FROM departments t WHERE NOT EXISTS(SELECT 1 FROM employees b WHERE b.department_id=t.department_id);sql高級(jí)
表復(fù)制語(yǔ)句
CT: create table <new table> as select * from <exists table>
要求目標(biāo)表不存在,因?yàn)樵诓迦霑r(shí)會(huì)自動(dòng)創(chuàng)建表,并將查詢表中指定字段數(shù)據(jù)復(fù)制到新建的表中
lS: insert into table2 (f1,f2,.….) select v1,v2,... from table1
要求目標(biāo)表table2必須存在,由于目標(biāo)表table2已經(jīng)存在,所以我們除了插入源表table1的字段外,還可以插入常量
merge用法
merge into 表A using 與表A產(chǎn)生關(guān)聯(lián)字段值 on 和表A關(guān)聯(lián)的條件when matched then...when not matched then...遞歸查詢
START WITH CONNECT BY。是oracle提供的遞歸查詢(分層查詢)函數(shù),我們?cè)谶M(jìn)行遞歸遍歷樹形結(jié)構(gòu)的時(shí)候可以使用。
??start with(從某個(gè)節(jié)點(diǎn)id開始)
??connect by prior (子節(jié)點(diǎn)id和父節(jié)點(diǎn)pid直接的關(guān)系需要)
形如:
可以添加WHERE條件限制。
可以指定多個(gè)起始節(jié)點(diǎn)查詢。
可以進(jìn)行排序。
sql分析函數(shù)
數(shù)據(jù)準(zhǔn)備
over (partition by…order by)函數(shù)
-- 分月份和地區(qū)統(tǒng)計(jì)最高值,最低值,平均值,總額,并按月份排序 SELECT DISTINCT EARNMONTH 月份,AREA 地區(qū),MAX(PERSONINCOME) OVER(PARTITION BY EARNMONTH, AREA) 最高值,MIN(PERSONINCOME) OVER(PARTITION BY EARNMONTH, AREA) 最低值,AVG(PERSONINCOME) OVER(PARTITION BY EARNMONTH, AREA) 平均值,SUM(PERSONINCOME) OVER(PARTITION BY EARNMONTH, AREA) 總額FROM EARNINGS;rollup函數(shù)
--按照月份,地區(qū)統(tǒng)計(jì)收入,分開統(tǒng)計(jì),不同字段在前會(huì)有不同的結(jié)果 SELECT EARNMONTH, AREA, SUM(PERSONINCOME)FROM EARNINGSGROUP BY ROLLUP(EARNMONTH, AREA);cube函數(shù)
--按照月份,地區(qū)統(tǒng)計(jì)收入,全部統(tǒng)計(jì) SELECT EARNMONTH, AREA, SUM(PERSONINCOME)FROM EARNINGSGROUP BY CUBE(EARNMONTH, AREA)ORDER BY EARNMONTH, AREA;grouping函數(shù)
在以上例子中,是用rollup和cuba函數(shù)都會(huì)對(duì)結(jié)果集產(chǎn)生null,這時(shí)候可用grouping函數(shù)來(lái)確認(rèn)該記錄是由哪個(gè)字段得出來(lái)的
示例1:
--grouping函數(shù)用法,帶一個(gè)參數(shù),參數(shù)為字段名,如果是該字段就返回0,如果不是該字段結(jié)果返回1 SELECT EARNMONTH,grouping(EARNMONTH)FROM EARNINGSGROUP BY ROLLUP(EARNMONTH);示例2:
SELECT EARNMONTH,(CASEWHEN ((GROUPING(AREA) = 1) AND (GROUPING(EARNMONTH) = 0)) THEN'月份小計(jì)'WHEN ((GROUPING(AREA) = 1) AND (GROUPING(EARNMONTH) = 1)) THEN'總計(jì)'ELSEAREAEND) AREA,SUM(PERSONINCOME)FROM EARNINGSGROUP BY ROLLUP(EARNMONTH, AREA);rank / dense_rank / row_number
- rank:排名會(huì)有并列,產(chǎn)生跳躍排名
- dense_rank:排名會(huì)有并列,不產(chǎn)生跳躍排名
- row_number:排名沒有并列,不產(chǎn)生跳躍排名
總結(jié)
以上是生活随笔為你收集整理的oracle—高级查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言——结构体数组——学生成绩表
- 下一篇: 使用java进行本地文件全盘搜索