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
 服务器

相关文章
相关标签/搜索