oracle 對象管理 06_查詢

1、簡單查詢
1.select字句:可跟字符串,函數,列名,子查詢(子查詢中不能包含ORDER BY子句),distinct等
    count(*)=count(1):包含全部行 count(column):不包含空值
    字段重複個數統計
    SELECT deptno,count(1) FROM emp GROUP BY deptno HAVING COUNT(1)>3;
2.where字句:查詢的條件,可用函數,運算符,like,like '=_%' escape '='通配等
3.order by:排序ASC,DESC
4.group by:分組查詢對字段的要求,配合聚合函數,where字句,having字句使用,分組彙總
           group by會將空值當成一組,不能使用列別名,默認會按字段升序排序
           where字句中不能使用分組函數   
    rollup:對分組統計結果進行彙總,當有多列時對第一列子統計,最後有個總統計
    cube:針對每一個統計列給出子分組統計及總統計
    grouping()配合rollup和cube使用,若是爲空返回1,不然返回0
    SELECT deptno,job,SUM(sal) from emp GROUP BY rollup(deptno,job) ORDER BY 1;
    SELECT deptno,job,SUM(sal) from emp GROUP BY CUBE(deptno,job);
    SELECT GROUPING(deptno),deptno,GROUPING(job),job,SUM(sal) from emp GROUP BY CUBE(job,deptno);
5.子查詢,子查詢中不能用order by子句
6.替代變量使用&
    select * from emp_n where empno=#    
2、多表鏈接查詢
1.from字句後兩表按字段內鏈接;
    內鏈接,只返回知足鏈接條件的數據,外連接,返回鏈接主表全部數據及從表知足條件數據。
2.外鏈接查詢tba left[right] join tbb on ...;
3.exists,not exists(有空值時返回true),in,not in(結果集中含有空值時返回false)
    select * from emp where deptno not in(10,20,null);
  單行運算符(=,>,>=,<,<=,<>)用於單行子查詢,多行運算符(in,not in,< any,<all..)用於多行子查詢 
4.表別名不支持as用法
3、分頁查詢,排序後分頁,須要先全量排序
    SELECT * FROM (SELECT E.EMPNO, ENAME, SAL, HIREDATE, DEPTNO, ROWNUM RM FROM EMP E order by empno) E
    WHERE E.RM BETWEEN 6 AND 10; --包括邊界值
4、樹形結構查詢
1.語法
    SELECT [LEVEL] ,column,expression,...
      FROM table_name
    [WHERE where_clause]
    [[START WITH start_condition] 
    [CONNECT BY PRIOR prior_condition]];     
    LEVEL:爲僞列,用於表示樹的層次
    start_condition:層次化查詢的起始條件
    prior_condition:定義父節點和子節點之間的關係,connect by prior 左邊的爲父接點,右邊爲子接點。
2.使用start with ...connect by prior 從根節點開始遍歷
    select level, empno,mgr,ename,job from emp
    start with empno = 7839
    connect by prior empno = mgr;
3.格式化層次查詢結果
    select level, lpad(' ', 2 * level - 1,' ') || ename as "Ename", job
    from emp start with ename = 'KING' connect by prior empno = mgr;
4.跟到葉子的最短路徑
    a.SYS_CONNECT_BY_PATH
    b.CONNECT_BY_ISLEAF:判斷是不是葉子,是爲1不是爲0;
    c.CONNECT_BY_ROOT ename: 當前層次的根節點
    select t.*,sys_connect_by_path(ename,'/') path, lpad(' ', 
    (level-1)*10,' ') ||'>'||sys_connect_by_path(ename,'/') format_path,
    level, CONNECT_BY_ISLEAF, CONNECT_BY_ROOT ename from  emp  t
    start with ename = 'KING'  connect by prior empno = mgr;
5、集合查詢
    UNION ALL 返回各個查詢檢索出的全部的行,不過濾掉重複記錄
    UNION     返回各個查詢檢索出的過濾掉重複記錄的全部行,即並集
    INTERSECT 返回兩個查詢檢索出的共有行,即交集
    MINUS     返回將第二個查詢檢索出的行從第一個查詢檢索出的行中減去以後剩餘的行,即差集      
    MERGE INTO修改更新數據
    MERGE INTO emp2 a
         USING emp b
            ON (a.empno=b.empno)
    WHEN MATCHED THEN
           UPDATE SET a.comm = nvl(b.comm,100)
    WHEN NOT MATCHED THEN
       INSERT VALUES (b.empno,b.ename,b.job,b.mgr,b.hiredate,b.sal,b.comm,b.deptno);
6、行列轉換查詢
    CREATE TABLE xuesheng (name varchar2(10), kecheng varchar2(10) , chengji number(4,1));
    insert into xuesheng values ('student1','語文',90);
    insert into xuesheng values ('student1','數學',80);
    insert into xuesheng values ('student1','英語',60);
    insert into xuesheng values ('student2','語文',77);
    insert into xuesheng values ('student2','數學',94);
    insert into xuesheng values ('student2','英語',87);
    insert into xuesheng values ('student3','語文',97);
    insert into xuesheng values ('student3','數學',84);
    insert into xuesheng values ('student3','英語',57);
    commit;
1.按列分類合併,將記錄轉字段使用 max +decode + group by
    select name,max(decode(kecheng,'語文',chengji)) 語文,
    max(decode(kecheng,'數學',chengji)) 數學,
    max(decode(kecheng,'英語',chengji)) 英語
    from xuesheng group by name;
2.字段轉記錄,union all,補充一列,原行值換名稱
    select * from xuesheng_new;
    select name,'語文' kecheng,語文 chengji from xuesheng_new
    union all
    select name,'數學' kecheng,數學 chengji from xuesheng_new
    union all
    select name,'英語' kecheng,英語 chengji from xuesheng_new;
7、合併及拆分
    create table temp01 (c1 number,c2 varchar2(4));
    insert into temp01 values (1,'我');
    insert into temp01 values (1,'是');
    insert into temp01 values (1,'大王');
    insert into temp01 values (2,'你');
    insert into temp01 values (2,'是豬');
    insert into temp01 values (3,'呵呵');
    commit;
1.合併工具函數
    CREATE OR REPLACE FUNCTION get_c2_new(tmp_c1 NUMBER)
    RETURN VARCHAR2
    IS
    Col_c2 VARCHAR2(4000);
    BEGIN
    FOR cur IN (SELECT c2 FROM temp01 WHERE c1=tmp_c1) LOOP
    Col_c2 := Col_c2||','||cur.c2;
    END LOOP;
    Col_c2 := ltrim(Col_c2,',');
    RETURN Col_c2;
    END;
    select distinct c1,get_c2_new(c1) cc2 from temp01;
2.使用固定函數
    SELECT c1, LTRIM(MAX(SYS_CONNECT_BY_PATH(c2, ',')), ',') c2  
    FROM (SELECT c2, c1, ROW_NUMBER() OVER(PARTITION BY c1 ORDER BY c2 DESC) RN  
              FROM temp01)  
    START WITH RN = 1 
    CONNECT BY RN - 1 = PRIOR RN  
           AND c1 = PRIOR c1 
    GROUP BY c1;
    select c1,ltrim(max(sys_connect_by_path(c2,',')),',') c2 from 
    (select c1,c2,row_number() over (partition by c1 order by c2 ) rn from temp01)
    start with rn=1
    connect by prior rn=rn-1
          and  prior c1= c1
    group by c1;    
3.按指定符號拆分
    select distinct c1,
                    replace(regexp_substr(c2, '[^,]+', 1, level),
                            ',',
                            ' ') c2
      from (select c1, c2 from temp02) tab1
    connect by level <=
               length(c2) - length(replace(c2, ',', '')) + 1
     order by c1;
    select distinct c1,  regexp_substr(c2, '[^,]+', 1, level) c2
      from temp02
    connect by level <=
               length(c2) - length(replace(c2, ',', '')) + 1
     order by c1;
補充:
--一、求出平均薪水最高的部門的部門編號。
select avgsal,deptno from 
(select avg(sal) avgsal,deptno from emp group by deptno order by avgsal desc) where rownum <2;
--二、求每一個部門的平均薪水的等級
select a.deptno,a.avgsal,b.grade from (select deptno,avg(sal) avgsal from emp group by deptno) a,salgrade b where a.avgsal between b.losal and hisal;
--3.相同工做,相同領導的人員信息
SELECT * FROM emp WHERE (job,mgr) IN (SELECT job,mgr FROM emp GROUP BY job,mgr HAVING COUNT(1) >1);
--4.查詢工資高於同一部門平均工資的員工的部門號,姓名,工資
select deptno,ename,sal from emp outer
where sal > (select avg(sal) from emp inner where inner.deptno = outer.deptno);
--5.刪除emp2表中sal重複的值,留一條
DELETE FROM emp2 WHERE ROWID NOT IN(SELECT MAX(ROWID) FROM emp2 GROUP BY sal);
delete from emp_new a where a.rowid < (select max(rowid) from emp_new b where a.id=b.id  group by id);
--六、找出誰的工資在本部門中最高的?     
SELECT * FROM emp WHERE sal IN (SELECT MAX(sal) FROM emp GROUP BY deptno);
select a.* from emp a where a.sal>=(select max(sal) from emp b where a.deptno=b.deptno);
--七、求出每一個人的領導的名字
SELECT b.ename || ' 的領導是 ' ||a.ename  FROM emp a,emp b WHERE a.empno=b.mgr;
--八、求出平均薪水最高的部門的部門編號。
SELECT T.DEPTNO FROM (SELECT AVG(SAL) SA, DEPTNO FROM EMP GROUP BY DEPTNO ORDER BY SA DESC) T WHERE ROWNUM < 2; 
select  AVG(SAL) SA, DEPTNO FROM EMP GROUP BY DEPTNO having avg(sal)>=(select max(avg(sal)) from emp group by deptno)sql

系統信息獲取函數
1.SYS_CONTEXT:可得到系統和數據的信息第一個參數爲'USERENV',是固定的:
select sys_context('USERENV','AUTHENTICATION_TYPE') from dual;--用戶的認證類型
select sys_context('USERENV','AUTHENTICATION_DATA') from dual;--未知
select sys_context('USERENV','BG_JOB_ID') from dual;--當前指定id的會話是否爲oracle後臺程序創建,不是則返回null
select sys_context('USERENV','CLIENT_INFO') from dual;--經過dbms_application_info包能夠存儲高達64字節的用戶會話信息
select sys_context('USERENV','CURRENT_SCHEMA') from dual;--默認的schema將被當作當前的schema。當在當前會話中使用ALTER SESSION SET CURRENT_SCHEMA語句的時候,它的查詢返回值將被改變
select sys_context('USERENV','CURRENT_SCHEMAID') from dual;--當前schema的id
select sys_context('USERENV','CURRENT_USER') from dual;--當前的登錄用戶
select REPLACE(SUBSTR(sys_context('USERENV','HOST'),1,30),'\',':) from dual;--當前會話主機操做系統名
select sys_context('USERENV','CURRENT_USERID') from dual;--當前登錄的用戶的id
select sys_context('USERENV','DB_DOMAIN') from dual;--爲數據庫的域指定初始化參數
select sys_context('USERENV','DB_NAME') from dual;--數據庫實例名
select sys_context('USERENV','ENTRYID') from dual;--可用的審計標示符。不能再分佈式sql語句中使用此選項。使用USERENV關鍵字必須置AUDIT_TRAIL的初始化參數爲真。
select sys_context('USERENV','EXTERNAL_NAME') from dual;--數據庫用戶的擴展名
select sys_context('USERENV','FG_JOB_ID') from dual;--返回做業id當此會話是客戶端進程建立。不然,返回null
select sys_context('USERENV','INSTANCE') from dual;--當前數據庫實例的標示id數據庫

select sys_context('USERENV','ISDBA') from dual;--當前用戶是不是以dba身份登陸
select sys_context('USERENV','LANG') from dual;--iso對‘LANGUAGE’的簡稱,查詢的參數比「LANGUAGE」短
select sys_context('USERENV','LANGUAGE') from dual;--結果爲當前數據庫使用的存儲語言,跟上面查詢意義同樣
select sys_context('USERENV','NETWORK_PROTOCOL') from dual;--用於通訊的網絡協議
select sys_context('USERENV','NLS_CALENDAR') from dual;--當前會話使用的,格林尼治時間
select sys_context('USERENV','NLS_CURRENCY') from dual;--本地化的貨幣符,如人民幣爲¥,美圓符爲$
select sys_context('USERENV','NLS_DATE_FORMAT') from dual;--當前使用的日期格式,通常中國爲dd-mon-rr
select sys_context('USERENV','NLS_DATE_LANGUAGE') from dual;--表示日期的語言,如中文簡體SIMPLIFIED CHINESEexpress

select sys_context('USERENV','NLS_TERRITORY') from dual;--數據庫服務器所在區域,如中國CHINA
select sys_context('USERENV','OS_USER') from dual;--操做系統的用戶名
select sys_context('USERENV','PROXY_USER') from dual;--是否使用代理用戶。否返回null
select sys_context('USERENV','PROXY_USERID') from dual;--代理用戶id
select sys_context('USERENV','SESSION_USER') from dual;--當前認證的數據庫用戶名
select sys_context('USERENV','SESSION_USERID') from dual;--當前認證的數據庫用戶名id
select sys_context('USERENV','SESSIONID') from dual;--當前會話id
select sys_context('USERENV','TERMINAL') from dual;--操做系統用戶組
select sys_context('USERENV','IP_ADDRESS') from dual;--當前會話主機ip
select sys_context('USERENV','HOST') from dual;--當前會話主機操做系統名
--查詢回滾進度
SELECT  r.name 回滾段名,
        s.sid,
        s.serial#,
        s.username 用戶名,
        s.status,
  s.SQL_ADDRESS,
  t.cr_get,
        t.phy_io,
        t.used_ublk,
        t.noundo,
        substr(s.program, 1, 78) 操做程序
FROM   sys.v_$session s,sys.v_$transaction t,sys.v_$rollname r
WHERE  t.addr = s.taddr and t.xidusn = r.usn
--  AND r.NAME IN ('ZHYZ_RBS')
ORDER  BY t.cr_get,t.phy_io
 服務器

相關文章
相關標籤/搜索