zoukankan      html  css  js  c++  java
  • DB 常用SQL积累

    1. 在表中找出指定字段重复记录个数
      答案:SELECT [Field1],[Field2],[Field3],[...],COUNT(*) FROM [TableName] WHERE [Condition] GROUP BY [Field1],[Field2],[Field3],[...] HAVING COUNT(*)>1
    2. 表中
    每个Y的最新X(ID为主健且自增)

      答案:SELECT ID, Y, X FROM TableName T WHERE (NOT EXISTS (SELECT 1 FROM TableName T2 WHERE (T2.Y = T.Y) AND (T2.X > T.X OR T2.X = T.X AND T2.ID > T.ID)))
    3. 表:table1(FId,Fclass,Fscore),用最高效最简单的SQL列出各班成绩最高的列表,显示班级,成绩两个字段。
      答案:select fclass,max(fscore) from table1 group by fclass
    4. 有一个表table1有两个字段FID,Fno,字都非空,写一个SQL语句列出该表中一个FID对应多个不同的Fno的纪录。

    • 示例
      类如: 
      101a1001 
      101a1001 
      102a1002 
      102a1003 
      103a1004 
      104a1005 
      104a1006 
      105a1007 
      105a1007 
      105a1007 
      结果: 
      102a1002 
      102a1003 
      104a1005 
      104a1006
    • 答案:select t2.* from table1 t1, table1 t2 where t1.fid = t2.fid and t1.fno <> t2.fno;

    5. 有员工表empinfo 
      ( 
        Fempno varchar2(10) not null pk, 
        Fempname varchar2(20) not null, 
        Fage number not null, 
        Fsalary number not null 
      ); 
      假如数据量很大约1000万条;写一个你认为最高效的SQL,用一个SQL计算以下四种人: 
      fsalary>9999 and fage > 35 
      fsalary>9999 and fage < 35 
      fsalary <9999 and fage > 35 
      fsalary <9999 and fage < 35 
      每种员工的数量;
      
    答案
      select sum(case when fsalary > 9999 and fage > 35 then 1 else 0end) as "fsalary>9999_fage>35",
      sum(case when fsalary > 9999 and fage < 35 then 1 else 0 end) as "fsalary>9999_fage<35",
      
    sum(case when fsalary < 9999 and fage > 35 then 1 else 0 end) as "fsalary<9999_fage>35",
      
    sum(case when fsalary < 9999 and fage < 35 then 1 else 0 end) as "fsalary<9999_fage<35"
      
    from empinfo;

    6. 表A字段如下 
      month person income 
      月份 人员 收入 
      要求用一个SQL语句(注意是一个)得出所有人(不区分人员)每个月及上月和下月的总收入 
      要求列表输出为 
      月份 当月收入 上月收入 下月收入 
      MONTHS PERSON INCOME
      200807 mantisXF 5000
      200806 mantisXF2 3500
      200806 mantisXF3 3000
      200805 mantisXF1 2000
      200805 mantisXF6 2200
      200804 mantisXF7 1800
      200803 8mantisXF 4000
      200802 9mantisXF 4200
      200802 10mantisXF 3300
      200801 11mantisXF 4600
      200809 11mantisXF 6800
      答案:
      Select (Select Month From A Where Month = To_Char(Sysdate, 'mm')) 月份,
      (Select Sum(Income) From A Where Month = To_Char(Sysdate, 'mm')) 当月收入,
      (Select Sum(Income) From A Where To_Number(Month) = To_Number(Extract(Month From Sysdate)) - 1) 上月收入,
      (Select Sum(Income) From A Where To_Number(Month) = To_Number(Extract(Month From Sysdate)) + 1) 下月收入
      200801 4600 0 7500
      200802 7500 4600 4000
      200803 4000 7500 1800
      200804 1800 4000 4200
      200805 4200 1800 6500
      200806 6500 4200 5000
      200807 5000 6500 0
      200809 6800 0 0

    7. 表B 
      C1 c2 
      2005-01-01 1 
      2005-01-01 3 
      2005-01-02 5
      要求的处数据 
      2005-01-01 4 
      2005-01-02 5 
      合计 9 
      试用一个Sql语句完成。
      答案:
      SELECT tt.c1 as '日期',SUM(tt.c2) AS '合计' 
      FROM B tt
      GROUP BY  tt.c1 
      union 
      SELECT '合计'  as '日期',SUM(tt.c2) AS '合计'
      FROM B tt

    8. 数据库1,2,3 范式的概念与理解。
      关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式1NF(第一范式),2NF(第二范式),3NF(第三范式).

    • 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
      姓名   班级   分数
      如果分数存在数学分数,英语分数和语文分数,那么不满足第一范式,因为分数列还能再分。
    • 第二范式(2NF):在1NF基础上,另外包含两部分,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
      OrderID   ProductID   UnitPrice   Discount   Quantity   ProductName
      主键由OrderID和ProductID组合而成,Discount(折扣)和Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice和ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。
    • 第三范式(3NF):在2NF基础上,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
      OrderID   OrderDate   CustomerID   CustomerName   CustomerAddr   CustomerCity
      OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。

    9. 简述oracle行触发器的变化表限制表的概念和使用限制,行触发器里面对这两个表有什么限制。

    • 变化表mutating table:被DML语句正在修改的表
      需要作为DELETE CASCADE参考完整性限制的结果进行更新的表也是变化的 
      限制:对于Session本身,不能读取正在变化的表
    • 限制表constraining table:需要对参考完整性限制执行读操作的表
      限制:如果限制列正在被改变,那么读取或修改会触发错误,但是修改其它列是允许的。 

    10. ORACLE临时表有几种?临时表和普通表的主要区别有哪些,使用临时表的主要原因是什么?

    • 会话特有的临时表 
      SESSION级的临时表数据在整个SESSION都存在,直到结束此次SESSION
    • 事务特有的临时表
      TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除TRANACTION临时表数据。
    • 临时表保存在内存中。普通表则是长期储存数据,可以随时读取写入的。
    • 临时表的主要作用是提高查询效率

    11. 怎么实现:使一个会话里面执行的多个过程函数或触发器里面都可以访问的全局变量的效果,并且要实现会话间隔离?
      Oracle数据库程序包中的变量,在本程序包中可以直接引用,但是在程序包之外,则不可以直接引用。对程序包变量的存取,可以为每个变量配套相应的存储过程<用于存储数据>和函数<用于读取数据>来实现。 

    12. aa,bb表都有20个字段,且记录数量都很大,aa,bb表的X字段(非空)上有索引,请用SQL列出aa表里面存在的X在bb表不存在的X的值,请写出认为最快的语句,并解译原因。
      select aa.x from aa where not exists (select 'x' from bb where aa.x = bb.x) ;
      同时使用了aa和bb中的X索引

    13. 简述SGA主要组成结构和用途?
      SGA是Oracle为一个实例分配的一组共享内存缓冲区,它包含该实例的数据和控制信息。SGA在实例启动时被自动分配,当实例关闭时被收回。数据库的所有数据操作都要通过SGA来进行。
      SGA中内存根据存放信息的不同,可以分为如下几个区域:

    • Buffer Cache:存放数据库中数据库块的拷贝。它是由一组缓冲块所组成,这些缓冲块为所有与该实例相链接的用户进程所共享。缓冲块的数目由初始化参数DB_BLOCK_BUFFERS确定,缓冲块的大小由初始化参数DB_BLOCK_SIZE确定。大的数据块可提高查询速度。它由DBWR操作。  
    • 日志缓冲区Redo Log Buffer:存放数据操作的更改信息。它们以日志项(redo entry)的形式存放在日志缓冲区中。当需要进行数据库恢复时,日志项用于重构或回滚对数据库所做的变更。日志缓冲区的大小由初始化参数LOG_BUFFER确定。大的日志缓冲区可减少日志文件I/O的次数。后台进程LGWR将日志缓冲区中的信息写入磁盘的日志文件中,可启动ARCH后台进程进行日志信息归档。 
    • 共享池Shared Pool:包含用来处理的SQL语句信息。它包含共享SQL区和数据字典存储区。共享SQL区包含执行特定的SQL语句所用的信息。数据字典区用于存放数据字典,它为所有用户进程所共享。 

     

    14. 什么是分区表?简述范围分区和列表分区的区别,分区表的主要优势有哪些?
      使用分区方式建立的表叫分区表
      范围分区:每个分区都由一个分区键值范围指定(对于一个以日期列作为分区键的表,“2005 年 1 月”分区包含分区键值为从“2005 年 1 月 1 日” 
    到“2005 年 1 月 31 日”的行)。
      列表分区:每个分区都由一个分区键值列表指定(对于一个地区列作为分区键的表,“北美”分区可能包含值“加拿大”“美国”和“墨西哥”)。
      分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务。通过分区,数据库设计人员和管理员能够解决前沿应用程序带来的一些难题。分区是构建千兆字节数据系统或超高可用性系统的关键工具。

    15. 背景:某数据运行在archivelog,且用rman作过全备份和数据库的冷备份,且所有的归档日志都有,现控制文件全部损坏,其他文件全部完好,请问该怎么恢复该数据库,说一两种方法。

     

    • 使用冷备份,直接将冷备份的文件全部COPY到原先的目录下,在从新启动数据库就可以
    • 使用归档日志
      启动数据库NOMOUNT
      创建控制文件,控制文件指定数据文件和重做日志文件的位置
      使用RECOVER DATABASE using backup controlfile until cancel 命令回复数据库,这时可以使用归档日志
      ALETER DATABASE OPEN RESETLOGS;
      重新备份数据库和控制文件

    16. 用rman写一个备份语句:备份表空间TSB,level 为2的增量备份。

    17. 有个表a(x number(20),y number(20))用最快速高效的SQL向该表插入从1开始的连续的1000万记录。
      alter table a nologging;
      insert /*+append*/ a select /*+parallel(t,8)*/ rownum from dual t  connect by level <= 10000000;commit;
    18. 查询优化

    • 对数据库查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引 
    • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
      select id from t where num is null
    • 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
    • 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
    • in 和 not in 也要慎用,否则会导致全表扫描
    • 如果在 where 子句中使用参数,也会导致全表扫描
    • 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描
    • 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描

    19. 数据库事务的四大特性
      原子性
      一致性
      分离性
      持久性

     

     

     

     

     


    待阅读:
    http://www.cnblogs.com/tylerdonet/archive/2011/10/10/2205859.html 
    SQL中ROLLUP 用法:http://blog.csdn.net/dyufei/article/details/4801283
    引自:
    http://www.cnblogs.com/qiangqiang/archive/2010/10/15/1852252.html

     

  • 相关阅读:
    让Extjs EditorGridPanel 编辑时支持方向键
    开发WebApp之PC客户端
    windows下mysql忘记root密码的解决方法
    TortoiseSVN使用svn+ssh协议连接服务器时重复提示输入密码
    jQuery Mobile页面跳转后未加载外部JS原因分析及解决
    在CentOS中安装与配置SVN的方法
    设置VMWARE通过桥接方式使用主机无线网卡上网
    关于sp_executesql与exec执行动态sql的区别--转载RascallySnake
    TreeView 点击触发父节点、子节点的连锁反应选中与取消
    Winform客户端发布与升级:ClickOnce
  • 原文地址:https://www.cnblogs.com/raysbo/p/1207475.html
Copyright © 2011-2022 走看看