Oracle基础查询


--单行子查询 
      select * from emp where sal > (select sal from emp where empno = 7566);
    --子查询空值/多值问题
   1、如果子查询未返回任何行,则主查询也不会返回任何结果                                                             --(空值)
           select * from emp where sal > (select sal from emp where empno = 8888);
   2、如果子查询返回单行结果,则为单行子查询,可以在主查询中对其使用相应的单行记录比较运算符       --(正常)
           select * from emp where sal > (select sal from emp where empno = 7566);
   3、如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符                      --(多值)--非法 
           select * from emp where sal > (select avg(sal) from emp group by deptno);              

--多行子查询
       select * from emp where sal > any(select avg(sal) from emp group by deptno);   --any返回子查询中结果的最小值    
       select * from emp where sal > all(select avg(sal) from emp group by deptno);   --all返回子查询中结果的最大值
       select * from emp   where job in (select job from emp where ename = 'MARTIN' or ename = 'SMITH'); --in先判断子查询即里面的结果,再作为条件进行外面的判断

 

--对于 in 和 exists      

      --EXISTS的执行流程 
        --select * from t1 where exists ( select null from t2 where y = x )  
        --可以理解为:  
        --for x in ( select * from t1 )  
        --loop  
             --if ( exists ( select null from t2 where y = x.x )  
           --then  
               --OUTPUT THE RECORD  
         --end if  
         --end loop  
  
        select * from emp e  where exists (select * from emp m where ename in( 'MARTIN', 'SMITH') and e.job=m.job); --exists是先判断外面的查询,然后查询里面的结果,再通过连接条件将两个结果连接起来进行判断        
      区别:
       1、如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用 in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用 exists。   
       2、如果是 exists,--那么以外层表为驱动表,先被访问,如果是 IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了  
       3、IN 是不对NULL进行处理  

            eg:  select 1 from dual where null in (0,1,2,null)                结果为空  

 

--查询某用户下所有表
      select table_name from all_tables where owner='SCOTT'; 

      select * from all_tables where owner='SCOTT'; 

                                                                                                                                                                                                                                                                               
--查询 EMP 表中所有字段(列)
       select * from all_tab_columns where table_name='EMP';
--列出表的索引列 
       select * from sys.all_ind_columns where table_name='EMP'; 
       select  *  from  sys.all_ind_columns  where upper(table_name)='CAREUSERHAM';
--列出表中约束
        select * from all_constraints where table_name='EMP'
--在 oracle中描述数据字典视图
       select table_name ,comments from dictionary where table_name like '%TABLE%';

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(oracle基础)