zoukankan      html  css  js  c++  java
  • SQL 复杂查询

     一、子查询
    
    1.相关子查询
    
      相关子查询是指需要引用主查询列表的子查询语句,相关子查询是通过EXISTS谓词来实现的。下面以显示工作在"new york"的所有雇员为例,说明相关子查询的使用方法,示例如下:
    
          SQL> select ename,job,sal,deptno from emp where exists
    
      (select 1 from dept where dept.deptno=emp.deptno and dept.loc='new york');
    
      如上所示,当使用exists谓词时,如果子查询存在返回结果,则条件为true;如果子查询没用返回结果,则条件为false。
    
     
    
    2.在from子句中使用子查询时,该子查询会被作为视图对待,因此也被称为内嵌视图。注意,当在from
    
    子句中使用子查询时,必须要给子查询指定别名。下面以显示高于部门平均工资的雇员为例,说明在from子句中使用子查询的方法。示例如下:
    
          SQL> select ename,job,sal from emp,
    
      (select deptno,avg(sal) avgsal from emp
    
               group by deptno) dept
    
               where emp.deptno=dept.deptno and emp.sal>dept.avgsal;
    
     
    
    二、复杂查询
    
    1.具有父子关系的层次查询
    
     start with:用于指定层次查询的根行。
    
     connect By:用于指定父行和子行之间的关系(connect by condition),在condition中必须使用prior引用父行。
    
          SQL> select LPAD(' ',3*(level-1))||ename ename,
    
               LPAD(' ',3*(level-1)||job job from emp
    
      where job<>'CLERK' start with mgr is null 
    
      connect by mgr=prior empno;
    
     
    
    2.使用case表达式
    
          SQL> select ename,sal,CASE WHEN sal>3000 THEN 3
    
      WHEN sal>2000 THEN 2 ELSE 1 END grade
    
      from emp where deptno=10;
    
     
    
    3.倒叙查询
    
      查看历史数据(倒叙查询只能查询5分钟之前变化的数据,而不能查询5分钟之内变化的数据)
    
          SQL> select ename,sal from emp AS OF timestamp to_timestamp
    
         ('2003-05-18 19:59:00','YYYY-MM-DD HH24:MI:SS')
    
      where ename='CLERK';
    
     
    
    4.WITH创建临时表
    
          SQL> WITH tempname AS ( SELECT ...)
    
     
    
    三、字符函数
    
    1.initcap(char):该函数用于将字符串中的每个单词的首字符大写,其他字符小写,单词之间用空格和非字母字符分隔。示例如下:
    
          SQL> initcap('my world')   输出:My World
    
     
    
    四、数字函数
    
     
    
    五、日期函数
    
     
    
    六、转换函数
    
     
    
    七、使用记录(单行多列数据的处理用记录方式比较好)
    
     
    
        定义记录的两种方式
    
        declare 
    
      type testRecode id record(
    
         rname number(6,2),
    
         rpassword emp.empPassword%type)
    
         exampleRecord testRecode;
    
     begin
    
       ....
    
       exampleRecord.rname:='hhh';
    
       end    
    
         
    
       
    
    declare
    
       testRecord emp%rowtype;
    
       begin
    
         .....
    
         emp.name:='jjj';
    
         end
    
    八、单列多行(索引、嵌套、VARRAY)
    
     
    
    九、多行多列(记录表)
    
     
    
    把行数据变成列数据的SQL查询
    GROUP BY 子句
    指定用来放置输出行的组,并且如果 SELECT 子句 中包含聚合函数,则计算每组的汇总值。指定 GROUP BY 时,选择列表中任一非聚合表达式内的所有列都应包含在 GROUP BY 列表中,或者 GROUP BY 表达式必须与选择列表表达式完全匹配。
    
    即select选择的列要么在聚合函数中,要么在Group by 中进行分组。
    
    如果你想按下面的方式显示数据
    
     
    
    而你的数据库中实际的存储方式是如下的。即是以行的形式存储的数据,现在要变成上面的列来存储
    
     
    
    SQL可以如下:
    
    select s.ClassProCode,s.YearMonth,
    max(case s.SurveyCode when 'SC001' then s.Score else 0 end) as '报名报道',
    max(case s.SurveyCode when 'SC002' then s.Score else 0 end) as '后勤接待',
    max(case s.SurveyCode when 'SC003' then s.Score else 0 end) as '副班主任'
    from SerSurvey s
    group by s.ClassProCode,s.YearMonth
    
    --备注:按照SurveyCode这个条件来转换数据,如果条件成立,则转换Score这一行的数据成列显示,否则为0
    
    或者
    
    select A.*,
    (select top 1 Score from SerSurvey
    
    where ClassProCode = A.ClassProCode and YearMonth = A.YearMonth and SurveyCode = 'SC001') as '报名报道',
    (select top 1 Score from SerSurvey
    
    where ClassProCode = A.ClassProCode and YearMonth = A.YearMonth and SurveyCode = 'SC002') as '后勤接待',
    (select top 1 Score from SerSurvey
    
    where ClassProCode = A.ClassProCode and YearMonth = A.YearMonth and SurveyCode = 'SC003') as '副班主任'
    from 
    (
    select s.ClassProCode,s.YearMonth
    from  SerSurvey s
    group by s.ClassProCode,s.YearMonth
    ) A
    
     
    
     
    
    可以分页的:
    
    begin WITH list AS ( SELECT ROW_NUMBER() OVER (ORDER BY s.YearMonth DESC)AS Row,
    s.ClassProCode,s.YearMonth,
    max(case s.SurveyCode when 'SC001' then s.Score else 0 end) as 'ApplyReport',
    max(case s.SurveyCode when 'SC002' then s.Score else 0 end) as 'LogisticsReception',
    max(case s.SurveyCode when 'SC003' then s.Score else 0 end) as 'ViceHeadTeacher',
    max(case s.SurveyCode when 'SC001' then s.flag else 0 end) as 'ApplyReportFlag',
    max(case s.SurveyCode when 'SC002' then s.flag else 0 end) as 'LogisticsReceptionFlag',
    max(case s.SurveyCode when 'SC003' then s.flag else 0 end) as 'ViceHeadTeacherFlag' 
    from SerSurvey s
    where 1=1 --And s.ClassProCode like '%ss%' And s.YearMonth='2010-05'
    group by s.ClassProCode,s.YearMonth)
    SELECT * FROM list WHERE Row between 1 and 10
    end
  • 相关阅读:
    Base64字符串在传递过程中加号被转成空格
    IIS无法启动,应用程序池自动关闭,应用程序池XXXX将被自动禁用 解决方案之一
    我要写程序我要写程序
    react native项目改名(仅针对android)
    webpack之html-webpack-plugin的使用
    webpack之React开发环境配置
    webpack之webpack-dev-server的使用
    html2canvas截图空白问题
    webpack源码分析——参数初始化
    webpack源码分析——配置调试环境
  • 原文地址:https://www.cnblogs.com/zhanghongqiang/p/4113095.html
Copyright © 2011-2022 走看看