日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

oracle—高级查询

發(fā)布時(shí)間:2023/12/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle—高级查询 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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
  • 數(shù)值型
    number類型
  • 日期型
    date timestamp
  • 大對(duì)象型
    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;

    集合查詢

  • 交叉連接(笛卡爾積)
  • 等值、非等值連接
  • 內(nèi)連接
  • 外連接(左外、右外、全連接)
  • 自連接
  • 自然連接(隱含鏈接條件,自動(dòng)匹配鏈接自動(dòng))
  • 集合運(yùn)算
    union(求合集重復(fù)記錄只顯示一次)
    union all(求合集顯示所有記錄信息)
    intersect(求交集,顯示公共的數(shù)據(jù)部分)
    minus(集合相減,哪個(gè)表在前面以哪個(gè)表的數(shù)據(jù)為主)
  • CREATE TABLE A(ID INT,NAME VARCHAR2(10)); CREATE TABLE B(ID INT,NAME VARCHAR2(10)); INSERT INTO A VALUES(1,'張三'); INSERT INTO A VALUES(2,'李四'); INSERT INTO B VALUES(3,'王五'); INSERT INTO B VALUES(2,'李四');--intersect SELECT * FROM A INTERSECT SELECT * FROM B;

    --minus(A為主表) SELECT * FROM A MINUS SELECT * FROM B;

    --minus(B為主表) SELECT * FROM B MINUS SELECT * FROM A;

    子查詢

  • 非關(guān)聯(lián)子查詢:主查詢和子查詢是相對(duì)獨(dú)立的,唯一的,子查詢查詢結(jié)果和主查詢進(jìn)行比較
    SELECT A.ENAME,A.SAL FROM EMP A WHERE A.DEPTNO=(SELECT B.DEPTNO FROM DEPTB WHERE B.LOC= 'NEW YORK');
  • 關(guān)聯(lián)子查詢:主查詢和子查詢是產(chǎn)生關(guān)聯(lián)關(guān)系的主查詢的一個(gè)列字段代入到子查詢中進(jìn)行比較
    SELECT A.DEPTNO,(SELECT B.LOC FROM DEPT B WHERE B.DEPTNO=A.DEPTNO) FROM EMP A;
  • IN和EXISTS,IN是做全表掃描,EXISTS是做是否存在,非全表掃描
  • 查詢屬于領(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)系需要)
    形如:

    SELECT *FROM EMP START WITH EMPNO=7369 CONNECT BY PRIOR MGR=EMPNO;(父節(jié)點(diǎn)=子節(jié)點(diǎ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)生跳躍排名
    SELECT EARNMONTH 月份,AREA 地區(qū),SNAME 打工者,PERSONINCOME 收入,RANK() OVER(PARTITION BY EARNMONTH, AREA ORDER BY PERSONINCOME DESC) 排名FROM EARNINGS;

    • dense_rank:排名會(huì)有并列,不產(chǎn)生跳躍排名
    SELECT EARNMONTH 月份,AREA 地區(qū),SNAME 打工者,PERSONINCOME 收入,DENSE_RANK() OVER(PARTITION BY EARNMONTH, AREA ORDER BY PERSONINCOME DESC) 排名FROM EARNINGS;

    • row_number:排名沒有并列,不產(chǎn)生跳躍排名
    SELECT EARNMONTH 月份,AREA 地區(qū),SNAME 打工者,PERSONINCOME 收入,ROW_NUMBER() OVER(PARTITION BY EARNMONTH, AREA ORDER BY PERSONINCOME DESC) 排名FROM EARNINGS;

    總結(jié)

    以上是生活随笔為你收集整理的oracle—高级查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。