Oracle高级查询

整理一下SQL的较高级的查询,包括:集合操作符、DECODE()函数、CASE()表达式、层次化查询以及ROLLUP和CUBE子句。其中,集合操作符用于将两个或多个查询返回的行组合起来;CASE表达式可以在SQL语句中实现IF-THEN-ELSE逻辑;ROLLUP和CUBE子句可以得到各组行的小计和总计。

1、使用集合操作符

集合操作符可以将两个或多个结果组合起来,常用的集合操作符包括:UNION、UNION ALL、INTERSECT和MINUS。(这些操作符具有相同的优先级,当同时使用多个操作符时,会按照从左到右的方式引用这些操作符)。

  1. 使用UNION ALL操作符:UNION ALL操作符用于获取两个结果集的并集,包含重复行。例如:
    select ename,sal,job from emp where sal > 1000
    union all 
    select ename,sal,job from emp where ename = 'TOM';

     

  2. 使用UNION操作符:UNION操作符也用于获取两个结果集的并集,与UNION ALL操作符不同的是,当使用该操作符时,会自动去掉结果集中的重复行,并且会以第一列的结果进行排序。例如:
    select ename,sal,job from emp where sal > 1000
    union 
    select ename,sal,job from emp where eanme = 'TOM';

     

  3. 使用INTERSECT操作符:INTERSECT操作符用于获取两个结果集的交集。(当使用该操作符时,只会显示同时存在于两个结果集中的数据,并且会以第一列的结果进行排序)。例如:
    select ename,sal,job from emp where sal > 1000
    intersect
    select ename,sal,job from emp where job = 'MANAGER';

     

  4. 使用MINUS操作符:MINUS操作符用于获取两个结果集的差集。(当使用该操作符时,只会显示在第一个结果集中存在,在第二个结果集中不存在的数据,并且会以第一列的结果进行排序)。
    select ename,sal,job from emp where sal > 1000
    minus
    select ename,sal,job from emp where job = 'MANAGER';

     

  5. 组合使用集合操作符:可以使用多个集合操作符将两个以上的查询组合起来,一个操作符的返回值再提供给下一个操作符使用。例如:
    (select ename,sal,job from emp where sal > 1000
    union
    select ename,sal,job from emp where job = 'MANAGER')
    intersect
    (select ename,sal,job from emp where sal >1000
    minus
    select ename,sal,job from emp where job = 'MANAGER');

     

2、使用TRANSLATE()函数

TRANSLATE(x,from_string,to_string)函数返回将from_string中的每个字符替换为to_string中的相应字符以后的x。(TRANSLATE()函数是字符级别的替换,而不是字符串的替换,意思是用to_string中的字符逐一替换from_string中的字符)。

select translate('123456','345','asd') from dual;

3、使用DECODE()函数

DECODE(value,if1,then1,if2,then2,if3,then3,...,default_value)表示如果value等于if1时,返回结果为then1,如果value等于if2时,返回结果为then2,依次类推,如果不等于任何一个if值,则返回default_value。

简单的使用案例:

select decode(1,1,2,3) from dual;

4、使用CASE表达式

CASE表达式可以在SQL中实现IF-THEN-ELSE类型的逻辑,有两种类型的CASE表达式:简单CASE表达式和搜索CASE表达式。

4.1、使用简单CASE表达式

语法如下:

CASE search_expression
    WHEN expression1 THEN result1
    WHEN expression2 THEN result2
    ...
    WHEN expressionN THEN resultN
    ELSE default_result
END;
  • search_expression:表示待求值的表达式;
  • expression1、expression2、...、expressionN:表示要与search_expression进行比较的表达式;
  • result1、result2、...、resultN:表示返回值;如果expression1的值等于search_expression,则返回result1,以此类推;
  • default_result:表示无法找到匹配的表达式时默认返回值。

例如:

select ename,deptno,
case deptno
when 10 then 'ACCO'
when 20 then 'BCCO'
when 30 then 'CCCO'
else 'NOT EXISTS'
end
fro emp;

4.2、使用搜索CASE表达式

语法如下:

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    WHEN conditionN THEN resultN
    ELSE default_result
END;
  • condition1、condition2、...、conditionN:表示待求值的表达式;
  • result1、result2、...、resultN:表示返回值;如果condition1为真,则返回result1,以此类推;
  • default_result:表示当没有为真的条件时返回的默认结果。

例如:

select 
count(case when sal < 1000 then 1 else null end) low,
count(case when sal between 1000 and 2000 then 1 else null end) med,
count(case when sal > 2000 then 1 else null end) high
from enp;

5、层次化查询

6、使用扩展的GROUP BY子句

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Oracle)