数据库面试详解

  1. 下列属于关系型数据库的是()(选择两项)
    A. Oracle
    B. MySql
    C. IMS
    D. MongoDB
    答案:AB
    分析: IMS 是 IP Mulitimedia Subsystem 的缩写,是 IP 多媒体系统
    MongoDB 分布式文档存储数据库
  2. 请列出 Java 常见的开源数据连接池,并对参数做出简单的说明
    答:在 Java 中开源的常用的数据库连接池有以下几种 : (1)DBCP
    DBCP 是一个依赖 Jakarta commons-pool 对象池机制的数据库连接池.DBCP 可以直接
    的在应用程序中使用,Tomcat 的数据源使用的就是 DBCP。
    (2)c3p0
    c3p0 是一个开放源代码的 JDBC 连接池,它在 lib 目录中与 Hibernate 一起发布,包括了
    实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对
    象。
    (3)Druid
    阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包
    含一个 ProxyDriver,一系列内置的 JDBC 组件库,一个 SQL Parser。支持所有 JDBC
    兼容的数据库,包括 Oracle、MySql、Derby、Postgresql、SQL Server、H2 等等。
  3. 储蓄所有多个储户,储户在多个储户所存取款,储蓄所与储户之间是()
    A. 一对一的联系
    B. 多对一的联系
    C. 一对多的联系
    D. 多对多的联系
    答案:D
  4. 视图是一个“虚表”,视图的构造基于()
    A. 基本表或视图
    B. 视图
    C. 数据字典
    D. 基本表
    答案:A
  5. 设有关系 R(A,B,C,D)及其上的函数相关性集合 F={B→A,BC→D},那么
    关系 R 最高是()
    A. 第一范式的
    B. 第二范式的
    C. 第三范式的
    D. BCNF 范式的
    答案: A
    分析:
    根据数据库三大范式的依赖性要求,从 B,BC 函数确定 A 和 D 这一点上,
    明显看出 B,BC 都有可能是主码. 若B是主码的话,仔细看会发现,F中竟然没有谁去函数确定C,这显然是说不
    通的,(因为 C 至少会被 B 这个主码函数确定);
    若 BC 是主码,那么 F 中存在非主属性对候选码的部分依赖,不满足第二范式
    的要求,故为第一范式.
  6. 什么是 DAO 模式?
    答:DAO(DataAccess Object)顾名思义是一个为数据库或其他持久化机制提供了抽
    象接口的对象,在不暴露数据库实现细节的前提下提供了各种数据操作。为了建立一个
    健壮的 Java EE 应用,应该将所有对数据源的访问操作进行抽象化后封装在一个公共 API
    中。用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的
    所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,
    并且编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储。DAO
    模式实际上包含了两个模式,一是 Data Accessor(数据访问器),二是 Data Object
    (数据对象),前者要解决如何访问数据的问题,而后者要解决的是如何用对象封装数据。
  7. 数据库 MySQL,Oracle,SqlServer 分页时用的语句
    Mysql:使用 limit 关键字
    Select * from 表名 where 条件 limit 开始位置,结束位置。通过动态的改
    变开始和结束位置的值来实现分页。
    Oracle:通过 rownum 来实现
    select * from ( select rownum rn,t.* from addressbook where rownum<=
    20 ) where rownum > 10
    Sqlserver:
    select top 20 * from addressbook where id not in (select top 10 id from
    addressbook)
  8. Oracle 完成分页功能的三层子查询语句及其含义?
    如:
    select * from (select t.,rownum r from (select * from A) t where rownum < 10)
    where r >5
    select * from A:要查询的数据
    select t.
    ,rownum r from (select * from A) t where rownum < 10:取前 10 行
    select * from (select t.*,rownum r from (select * from A) t where rownum < 10)
    尚学堂 Java 面试题大全及参考答案
    where r >5:取 5-10 行
  9. 问 SQL 怎么优化执行效率更高
    答:
  10. SQL 优化的原则是:将一次操作需要读取的 BLOCK 数减到最低,即在最短的时间达到
    最大的数据吞吐量。
    调整不良 SQL 通常可以从以下几点切入:
  1. 检查不良的 SQL,考虑其写法是否还有可优化内容
  2. 检查子查询 考虑 SQL 子查询是否可以用简单连接的方式进行重新书写
  3. 检查优化索引的使用
  4. 考虑数据库的优化器
  1. 避免出现 SELECT * FROM table 语句,要明确查出的字段。
  2. 在一个 SQL 语句中,如果一个 where 条件过滤的数据库记录越多,定位越准确,则
    该 where 条件越应该前移。
  3. 查询时尽可能使用索引覆盖。即对 SELECT 的字段建立复合索引,这样查询时只进行
    索引扫描,不读取数据块。
  4. 在判断有无符合条件的记录时建议不要用 SELECT COUNT (*)和 select top 1 语
    句。
  5. 使用内层限定原则,在拼写 SQL 语句时,将查询条件分解、分类,并尽量在 SQL 语
    句的最里层进行限定,以减少数据的处理量。
  6. 应绝对避免在 order by 子句中使用表达式。
  7. 如果需要从关联表读数据,关联的表一般不要超过 7 个。
  8. 小心使用 IN 和 OR,需要注意 In 集合中的数据量。建议集合中的数据不超过 200
    个。
  9. <> 用 < 、 > 代替,>用>=代替,<用<=代替,这样可以有效的利用索引。
  10. 在查询时尽量减少对多余数据的读取包括多余的列与多余的行。
  11. 对于复合索引要注意,例如在建立复合索引时列的顺序是 F1,F2,F3,则在 where
    或 order by 子句中这些字段出现的顺序要与建立索引时的字段顺序一致,且必须包含第
    一列。只能是 F1 或 F1,F2 或 F1,F2,F3。否则不会用到该索引。
  12. 谈谈数据库去空格的情况
    一、表中字符串带空格的原因
    1、空格就是空格。
    2、控制符 显示为 空格。
    二、解决方法
    第一种情况,去空格的处理的比较简单,Replace(column,' ','') 就可以解决。
    第二种情况,解决方法就比较麻烦点:需要先查出相应的 ASCII 码,再用
    Replace(column,char(ascii 码),'')解决,以下举个栗子:
    CREATE TABLE #temp
    (NAME NVARCHAR(50))
    INSERT INTO #temp SELECT '明天就是国庆了'+CHAR(10) --换行符
    SELECT * FROM #temp --末尾显示为空格
    SELECT REPLACE(NAME,' ','') FROM #temp --去不掉这个空格
    SELECT REPLACE(NAME,CHAR(10),'') FROM #temp --去掉空格
    SELECT REPLACE(NAME,CHAR(ASCII(RIGHT(NAME,1))),'') FROM #temp --在
    不知道是最后一位是什么字符导致空格的情况下,先转 ASCII 码,在替换
    DROP TABLE #temp
    ----下面是查询结果:
    --'明天就是国庆了 '
    --'明天就是国庆了 '
    --'明天就是国庆了'
    --'明天就是国庆了'
  13. 根据你以往的经验简单叙述一下 MYSQL 的优化
    答:
    1.数据库的设计
    尽量把数据库设计的更小的占磁盘空间.
    1).尽可能使用更小的整数类型.(mediumint 就比 int 更合适).
    2).尽可能的定义字段为 not null,除非这个字段需要 null.
    3).如果没有用到变长字段的话比如 varchar,那就采用固定大小的纪录格式比如 char.
    4).表的主索引应该尽可能的短.这样的话每条纪录都有名字标志且更高效.
    5).只创建确实需要的索引。索引有利于检索记录,但是不利于快速保存记录。如果总是
    要在表的组合字段上做搜索,那么就在这些字段上创建索引。索引的第一部分必须是最
    常使用的字段.如果总是需要用到很多字段,首先就应该多复制这些字段,使索引更好的
    压缩。
    6).所有数据都得在保存到数据库前进行处理。
    7).所有字段都得有默认值。
    8).在某些情况下,把一个频繁扫描的表分成两个速度会快好多。在对动态格式表扫描以取
    得相关记录时,它可能使用更小的静态格式表的情况下更是如此。
    2.系统的用途
    1).尽量使用长连接.
    2).explain 复杂的 SQL 语句。
    3).如果两个关联表要做比较话,做比较的字段必须类型和长度都一致.
    4).LIMIT 语句尽量要跟 order by 或者 distinct.这样可以避免做一次 full table
    scan.
    5).如果想要清空表的所有记录,建议用 truncate table tablename 而不是 delete
    from tablename.
    6).能使用 STORE PROCEDURE 或者 USER FUNCTION 的时候.
    7).在一条insert 语句中采用多重纪录插入格式.而且使用load data infile来导入大
    量数据,这比单纯的 indert 快好多.
    8).经常 OPTIMIZE TABLE 来整理碎片.
    9).还有就是 date 类型的数据如果频繁要做比较的话尽量保存在 unsigned int
    类型比较快。
    3.系统的瓶颈
    1).磁盘搜索.
    并行搜索,把数据分开存放到多个磁盘中,这样能加快搜索时间.
    2).磁盘读写(IO)
    可以从多个媒介中并行的读取数据。
    3).CPU 周期
    数据存放在主内存中.这样就得增加 CPU 的个数来处理这些数据。
    4).内存带宽
    当 CPU 要将更多的数据存放到 CPU 的缓存中来的话,内存的带宽就成了瓶颈.
  14. 以 Oracle11R 为例简述数据库集群部署
    命令行工具
    –crsctl 管理集群相关的操作:
    -启动和关闭 Oracle 集群
    -启用和禁用 Oracle 集群后台进程
    -注册集群资源
    -srvctl 管理 Oracle 资源相关操作
    -启动和关闭数据库实例和服务
    在 Oracle Grid 安装的 home 路径下的命令行工具 crsctl 和 srvctl 用来管理 Oracle
    集群。使用 crsctl 可以监控和管理任何集群节点的集群组件和资源。srvctl 工具提供了
    类似的功能,来监控和管理 Oracle 相关的资源,例如数据库实例和数据库服务。crsctl
    命令只能是集群管理者来运行,srvctl 命令可以是其他用户,例如数据库管理员来使用。
  15. 说一下数据库的存储过程?
    一、存储过程与函数的区别:
    1.一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
    2.对于存储过程来说可以返回参数(output),而函数只能返回值或者表对象。
    3.存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分
    来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于 FROM 关键字的
    后面。
    二、存储过程的优点:
    1.执行速度更快 – 在数据库中保存的存储过程语句都是编译过的
    2.允许模块化程序设计 – 类似方法的复用
    3.提高系统安全性 – 防止 SQL 注入
    4.减少网络流通量 – 只要传输存储过程的名称
    系统存储过程一般以 sp 开头,用户自定义的存储过程一般以 usp 开头
  16. 数据库创建索引的缺点?
    缺点:
    第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
    第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物
    理空间,如果要建立聚簇索引,那么需要的空间就会更大。
    第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降
    低了数据的维护速度。
  17. 有两张表;请用 SQL 查询,所有的客户订单日期最新的前五条订单记录。
    (分别注明 MySQL. Oracle 写法)
    客户信息表(c CUSTOM)有以下字段:
    id、name、mobile
    客户订单表(C_ORDER)有以下字段:
    id、custom_id、commodity、count、order _date
    Mysql:
    Select * from c_order order by order_date desc limit 0,5;
    Oracle:
    Select o.*,rownum n
    from c_order order by order_date desc where n<6;
  18. 关于 HQL 与 SQL,以下哪些说法正确?()
  19. 下面是学生表(student)的结构说明
    字段名称 字段解释 字段类型 字段长度 约束
    s_id 学号 字符 10 PK
    s_name 学生姓名 字符 50 Not null
    s_age 学生年龄 数值 3 Not null
    s-sex 学生性别 字符(男:1 女:0) 1 Not null
    下面是教师表(Teacher )的结构说明
    字段名称 字段解释 字段类型 字段长度 约束
    t_id 教师编号 字符 10 PK
    A. HQL与SQL没什么差别
    B. HQL 面向对象,而 SQL 操纵关系数据库
    C. 在 HQL 与 SQL 中,都包含 select,insert,update,delete 语句
    D. HQL 仅用于査询数据,不支持 insert,update 和 delete 语句
    答案: BC
    t_name 教师名字 字符 50 Not null
    下面是课程表(Course)的结构说明
    字段名称 字段解释 字段类型 字段长度 约束
    c_id 课程编号 字符 10 Pk
    c_name 课程名字 字符 50 Not null
    t_id 教师编号 字符 10 Not null
    下面是成绩表(SC)的结构说明
    字段名称 字段解释 字段类型 字段长度 约束
    s_id 学号 字符 10 Pk
    c_id 课程编号 字符 10 Pk
    score 成绩 数值 3 Not null
    1、查询“001”课程比“002”课程成绩高的所有学生的学号;
    select a.s_id from (select s_id,score from SC where C_ID='001') a,(select
    s_id,score
    from SC where C_ID='002') b
    where a.score>b.score and a.s_id=b.s_id;
    2、查询平均成绩大于 60 分的同学的学号和平均成绩;
    select S_ID,avg(score)
    from sc
    group by S_ID having avg(score) >60;
    3、查询所有同学的学号、姓名、选课数、总成绩;
    select Student.S_ID,Student.Sname,count(SC.C_ID),sum(score)
    from Student left Outer join SC on Student.S_ID=SC.S_ID
    group by Student.S_ID,Sname
    4、查询姓“李”的老师的个数;
    select count(distinct(Tname))
    from Teacher
    where Tname like '李%';
    5、查询没学过“叶平”老师课的同学的学号、姓名;
    select Student.S_ID,Student.Sname
    from Student
    where S_ID not in (select distinct( SC.S_ID) from SC,Course,Teacher where
    SC.C_ID=Course.C_ID and Teacher.T#=Course.T# and Teacher.Tname='叶平');
    6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
    select Student.S_ID,Student.Sname from Student,SC where
    Student.S_ID=SC.S_ID and SC.C_ID='001'and exists( Select * from SC as SC_2
    where SC_2.S_ID=SC.S_ID and SC_2.C_ID='002');
    7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
    select S_ID,Sname
    from Student
    where S_ID in (select S_ID from SC ,Course ,Teacher where SC.C_ID=Course.C_ID
    and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S_ID having
    count(SC.C_ID)=(select count(C_ID) from Course,Teacher where
    Teacher.T#=Course.T# and Tname='叶平'));
    8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
    Select S_ID,Sname from (select Student.S_ID,Student.Sname,score ,(select score
    from SC SC_2 where SC_2.S_ID=Student.S_ID and SC_2.C_ID='002') score2
    from Student,SC where Student.S_ID=SC.S_ID and C_ID='001') S_2 where score2
    <score;
    9、查询所有课程成绩小于 60 分的同学的学号、姓名;
    select S_ID,Sname
    from Student
    where S_ID not in (select S.S_ID from Student AS S,SC where S.S_ID=SC.S_ID and
    score>60);
    10、查询没有学全所有课的同学的学号、姓名;
    select Student.S_ID,Student.Sname
    from Student,SC
    where Student.S_ID=SC.S_ID group by Student.S_ID,Student.Sname having
    count(C_ID) <(select count(C_ID) from Course);
    11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
    select distinct S_ID,Sname from Student,SC where Student.S_ID=SC.S_ID and
    SC.C_ID in (select C_ID from SC where S_ID='1001');
    12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名;
    select distinct SC.S_ID,Sname
    from Student,SC
    where Student.S_ID=SC.S_ID and C_ID in (select C_ID from SC where
    S_ID='001');
  20. 为管理岗位业务培训信息,有如下 3 个表:
    S(S#,SN,SD,SA),其中 S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄。
    C (C#,CN ),其中 C#,CN 分别代表课程编号、课程名称
    SC(S#,C#,G),其中 S#,C#,G 分别代表学号、所选修的课程编号、学习成绩
    请使用 2 种标准 SQL 语句査洵选修课程名称为“税收基础”的学员学号和姓名,并说明
    其优缺点 。
    SQL92 标准:
    SELECT SN,SD FROM S
    WHERE [S#] IN(
    SELECT [S#] FROM C,SC
    WHERE C.[C#]=SC.[C#]
    AND CN=N'税收基础')
    SQL99 标准:
    select s.s#,s.sn from s
    join sc on s.s#=sc.s#
    join c on sc.c#=c.c#
    where c.cn='税收基础'
    优点:
    SQL99 将连接条件和过滤条件分开,显得代码清晰。
    SQL92 书写简单易于理解。
    缺点:
    SQL92 连接条件和过滤条件都写在一起,不利于查看。
    SQL99 书写相对麻烦不易于理解。
  21. 用 Java 怎么实现有每天有 1 亿条记录的 DB 储存?MySQL 上亿记录数
    据量的数据库如何设计?
    1.这么大数据量首先建议 使用大数据的 DB,可以用 spring batch 来做类似这样的处理。
    定量向 DB 存储数据。如果需要定时,可以考虑 quartz。
    Mysql 数据库设计:
    1.读写分离;
    2.纵向横向拆分库、表。
    MySQL 的基本功能中包括 replication(复制)功能。所谓 replication,就是确定 master
    以及与之同步的 slave 服务器,再加上 slave 将 master 中写入的内容 polling 过来更新
    自身内容的功能。这样 slave 就是 master 的 replica(复制品)。这样就可以准备多台内
    容相同的服务器。
    通过 master 和 salve 的 replication,准备好多台服务器之后,让应用程序服务器通
    过负载均衡器去处理查询 slave。这样就能将查询分散到多台服务器上。
    应用程序实现上应该只把 select 等读取之类的查询发送给负载均衡器,而更新应当
    直接发送给 master。要是在 slave 上执行更新操作,slave 和 master 的内容就无法同
    步。MySQL 会检测到 master 和 slave 之间内容差异,并停止 replication,这回导致系
    统故障。Slave 可以采用 LVS(linux 系统自带的负载均衡器)实现查询的负载均衡。
    使用 MySQL 的 replication 是利用的冗余化,实现冗余化需要实现的最小服务器数量是
    4 台,三台 slave 和一台 master,slave 为什么是需要三台呢,比如一台 slave 死机了,
    现在需要修复再次上线,那么意味着你必须停止一台 slave 来复制 MySQL 的数据,如
    果只有两台 slave,一台坏了,你就必须停止服务,如果有三台,坏了一台,你复制数据
    时停止一台,还有一台可以运维。
    对于数据的处理是能放入到内存中就尽量放入到内存中如果不能放入到内存中,可以利
    用 MySQL 的 Partitioning。
    Partitioning 就是表分割也就是讲 A 表和 B 表放在不同的服务器上。简单来说,
    Partitioning 就是充分利用局部性进行分割,提高缓存利用效率,从而实现 Partitioning
    的效果。其中最重要的一点就是以 Partitioning 为前提设计的系统将表分割开,用
    RDBMS 的方式的话,对于一对多的关系经常使用 JOIN 查询将两张表连接起来。但是如
    果将表分割开了之后,也就是两张表不在同一个数据库,不在同一个服务器上怎样使用
    JOIN 操作,这里需要注意的是如果是用 where in 操作不是省了一些麻烦了嘛。
  22. Mysql 的引擎有哪些?支持事物么?DB 储存引擎有哪些?
    MySQL 有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:
    MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、
    FEDERATED、ARCHIVE、CSV、BLACKHOLE。
    MySQL 支持数个存储引擎作为对不同表的类型的处理器。MySQL 存储引擎包括处理事
    务安全表的引擎和处理非事务安全表的引擎。
    · MyISAM 管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM 在所
    有 MySQL 配置里被支持,它是默认的存储引擎,除非你配置 MySQL 默认使用另外一
    个引擎。
    · MEMORY 存储引擎提供“内存中”表。MERGE 存储引擎允许集合将被处理同样的
    MyISAM 表作为一个单独的表。就像 MyISAM 一样,MEMORY 和 MERGE 存储引擎处
    理非事务表,这两个引擎也都被默认包含在 MySQL 中。
    注释:MEMORY 存储引擎正式地被确定为 HEAP 引擎。
    · InnoDB 和 BDB 存储引擎提供事务安全表。BDB 被包含在为支持它的操作系统发布的
    MySQL-Max 二进制分发版里。InnoDB 也默认被包括在所 有 MySQL 5.1 二进制分发
    版里,你可以按照喜好通过配置 MySQL 来允许或禁止任一引擎。
    · EXAMPLE 存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但
    没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在 MySQL 源代码中的
    一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。
    · NDB Cluster 是被 MySQL Cluster 用来实现分割到多台计算机上的表的存储引擎。它
    在 MySQL-Max 5.1 二进制分发版里提供。这个存储引擎当前只被 Linux, Solaris, 和
    Mac OS X 支持。在未来的 MySQL 分发版中,我们想要添加其它平台对这个引擎的支
    持,包括 Windows。 · ARCHIVE 存储引擎被用来无索引地,非常小地覆盖存储的大量数据。
    · CSV 存储引擎把数据以逗号分隔的格式存储在文本文件中。
    · BLACKHOLE 存储引擎接受但不存储数据,并且检索总是返回一个空集。
    · FEDERATED 存储引擎把数据存在远程数据库中。在 MySQL 5.1 中,它只和 MySQL
    一起工作,使用 MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动
    器或客户端连接方法连接到另外的数据源。
  23. 以下是学生考试结果表
    fname kecheng fenshu
    张三 语文 81
    张三 数学 65
    李四 语文 76
    李四 数学 90
    王五 语文 61
    王五 数学 100
    王五 英语 90
    1.请用一条 sql 语句从 t_result 表中查询出每门课都大于 75 分的学生姓名;
    select b.fname from
    (select fname,count(kecheng) c from t_result group by fname)a,
    (Select fname,kecheng,count(fname) c from t_result where fenshu >75 group by
    fname)b
    where a.fname = b.fname and a.c = b.c
    2.请用一条 sql 写出总分排名前三的学生姓名,总分,平均分
    select fname,sum(fenshu),avg(fenshu) from t_result GROUP By fname order by
    SUM(fenshu) desc;
  24. 库中已经存在雇用表表名:
    org_employee;表中字段:雇员编号(emp_id),雇员姓名(em_name),雇员年龄
    (emp_age),雇员部门(depart_name);请写出执行以下操作的 sql 语句:
    1)向表中增加一条数据:雇员编号(1001),雇员姓名(张三),雇员年龄(24),雇员
    部门(研发部);
    INSERT INTO org_employee
    VALUES(‘1001’,’张三’,’24’,’研发部’);
    2)查询雇员年龄在 55(包含)至 60(不包含)岁之间的雇员数据
    SELECT * FROM org_employee
    WHERE emp_age>=55 and emp_age <60;
    3)分部门查询各个部门的雇员数量
    SELECT COUNT(*),depart_name group by depart_name;
    4)删除姓名为张三的雇员数据
    Delete from org_employee where em_name =’张三’; 5)在表中增加一个日期类型的字段雇员出生日期,字段为 emp_brithday
    Alter table org_employee add(emp_brithday date);
    6)将表 org_employee 删除
    drop org_employee;
  25. 如下表 1 中的数据,表名为:t_test,记录某场比赛的结果。
    请用 sql 语句实现表 2 的查询结果
    ID matchdate result
    1 2015-02-04 胜 2 2015-02-04 负 3 2015-02-04 胜 4 2015-04-07 负 5 2015-04-07 胜
    6 2015-04-07 负 表 1
    比赛日期 胜 负
    2015-02-04 2 1
    2015-04-07 1 2 表 2
    SQL 语句:
    create table t_second(
    matchdate date,
    win varchar(3),
    lose varchar(3)
    );
    insert into t_second (matchdate,win) select matchdate,count(result) from t_test
    where result ='胜' GROUP BY matchdate;
    update t_second,(select matchdate,count(result) as lose from t_test where result
    ='负' GROUP BY matchdate)s set t_second.lose = s.lose where
    t_second.matchdate = s.matchdate;
  26. 请将如下数据库语句进行优化,使其执行效率更高(提示:…不需要更
    改)
    SELECT…
    FROM EMP
    WHERE DEPT_NO NOT IN (SELECT DEPT_NO
    FROM DEPT
    WHERE DEPT_CAT=’A’);
    优化后:
    SELECT…
    FROM EMP
    WHERE DEPT_NO NOT EXISTS(SELECT DEPT_NO
    FROM DEPT
    WHERE DEPT_CAT=’A’);
    优化的理由:not in 和 not exists
    如果查询语句使用了 not in 那么内外表都进行全表扫描,没有用到索引;
    而 not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用 not exists 都比 not
    in 要快。
  27. 请简述如何将 Oracle 中的数据库转至 DB2 中,需要保证表结构和数据
    不变
    使用 ETL 工具,如 infomatic,datastage,kettle 等,可以完成异构数据库的迁移
    以 kettle 为例
    表输入选择 oracle 库
    表输出选择 DB 库
    循环执行可以进行全库迁移
  28. 学生成绩表
    姓名:name 课程:subject 分数:score 学号:stuid
    张三 数学 89 1
    张三 语文 80 1
    张三 英语 70 1
    李四 数学 90 2
    李四 语文 70 2
    李四 英语 80 2
    1.计算每个人的总成绩并排名(要求显示字段:姓名,总成绩)
    select name,sum(score) s from t_stu GROUP BY name;
    2.列出各门课程成绩最好的学生(要求显示字段:学号,姓名,科目,成绩)
    select t1.stuid,t1.name,t1.subject,t1.score from t_stu t1,(
    select subject,MAX(score) as maxscore from t_stu group by subject)t2
    where t1.subject = t2.subject and t1.score = t2.maxscore;
    3.列出各个课程的平均成绩(要求显示字段;课程,平均成绩)
    select subject,AVG(score)平均成绩 from t_stu
    group by subject;
  29. Oracl 数据库中有两张表 Stu(学生表)和 Grade(分数表),如下图所
    示:
    Stu 表
    sid(学生 ID) sname(姓名) sage(年龄)
    1 张三 23
    2 李四 25
    3 王五 24
    Grade 表
    gid(分数主键) cid(课程 ID) sid(学生主键) grade(分数)
    1 2 3 86
    2 2 2 79
    3 1 2 80
    4 1 1 81
    5 1 3 70
    6 2 1 78
    请写 sql 统计出有两门以上的课的分数在 80 分以上的学生的姓名和年龄?
    Select sname,sage from Stu where Stu.sid in (
    Select sid from Grade where grade >80
    )
  30. 下面是学生表(Student)的结构说明:
    字段名称 字段解释 字段类型 字段长度 约束
    s_id 学号 字符 10 PK
    s_name 学生姓名 字符 50 Not null
    s_age 学生年龄 数值 3 Not null
    s_sex 学生性别 字符(男:1 女:0) 1 Not null
    下面是教师表(Teacher)
    字段名称 字段解释 字段类型 字段长度 约束
    t_id 教师编号 字符 10 PK
    t_name 教师名字 字符 50 Not null
    下面是课程表(Course)的结构说明:
    字段名称 字段解释 字段类型 字段长度 约束
    c_id 课程编号 字符 10 PK
    c_name 课程名字 字符 50 Not null
    t_id 教师编号 字符 10 Not null
    下面是成绩表(SC)的结构说明:
    字段名称 字段解释 字段类型 字段长度 约束
    s_id 字符 字符 10 PK
    c_id 课程编号 字符 10 PK
    score 成绩 数值 3 Not null
    查询同名同姓学生名单,并统计同名人数
    select 姓名,count(学号) as num
    from 学生表
    group by 姓名
    having count(学号)>1 --保证查找到的都是存在 2 个以上(包括 2)的同名同姓的姓名
    及人数。
    查询平均成绩大于 60 分的学生的学号和平均成绩;
    Select s_id,avg(score) from sc groupby s_id having avg(score)>60
    查询姓“李”的老师的个数;
    Select count(*),teacher.t_name from teacher where teacher.t_name like '李%'
  31. 取出 sql 表中低 31 到 40 的记录(以自动增长 ID 为主键)
    Sql server 方案:
    select top 10 * from t where id not in
    (select top 30 id from t order by id ) orde by id
    Mysql 方案:select * from t order by id limit 30,10
    Oracle 方案:
    select rownum num,tid from (select rownum num,tid from t_test)
    where num>=30 and num<=41;
  32. 下列两个表,需要用一条 sql 语句把 b 表中的 ID 和 NAME 字段的数值
    复制到 A 表中
    A 表
    ID NAME
    B 表
    ID NAME OTHER
    1 Aaa Ddd
    2 Bbb Eee
    insert into a select id,name from b;
  33. 什么是基本表,什么是视图,两者的区别和联系是什么?
    它是从一个或几个基本表中导出的 表,是从现有基本表中抽取若干子集组成用户的“专
    用表”。
    基本表:基本表的定义指建立基本关系模式,
    而变更则是指对数据库中已存在的基本表进行删除与修改。
    区别:
    1、视图是已经编译好的 sql 语句。而表不是
    2、视图没有实际的物理记录。而表有。
    3、表是内容,视图是窗口
    4、表只用物理空间而视图不占用物理空间,
    视图只是逻辑概念的存在,表可以及时对它进行修改,
    但视图只能有创建的语句来修改
    5、表是内模式,试图是外模式
    6、视图是查看数据表的一种方法,
    可以查询数据表中某些字段构成的数据,
    只是一些 SQL 语句的集合。从安全的角度说,
    视图可以不给用户接触数据表,从而不知道表结构。
    7、表属于全局模式中的表,是实表;视图属于局部模式的表,
    是虚表。
    8、视图的建立和删除只影响视图本身,不影响对应的基本表。
    联系:视图(view)是在基本表之上建立的表,它的结构(
    即所定义的列)和内容(即所有数据行)都来自基本表,
    它依据基本表存在而存在。一个视图可以对应一个基本表,
    也可以对应多个基本表。
    视图是基本表的抽象和在逻辑意义上建立的新关系
  34. 什么是事务?什么是锁?
    事务与锁是不同的。事务具有 ACID(
    原子性、一致性、隔离性和持久性),锁是用于解决隔离性的一种机制。事务的隔离级别
    通过锁的机制来实现。另外锁有不同的粒度,同时事务也是有不同的隔离级别的(一般
    有四种:读未提交 Read uncommitted,
    读已提交 Read committed,
    可重复读 Repeatable read,
    可串行化 Serializable)。
    在具体的程序设计中,开启事务其实是要数据库支持才行的,如果数据库本身不支持事
    务,那么仍然无法确保你在程序中使用的事务是有效的。
    锁可以分为乐观锁和悲观锁:
    悲观锁:认为在修改数据库数据的这段时间里存在着也想修改此数据的事务;
    乐观锁:认为在短暂的时间里不会有事务来修改此数据库的数据;
    我们一般意义上讲的锁其实是指悲观锁,在数据处理过程中,将数据置于锁定状态(由
    数据库实现)
    如果开启了事务,在事务没提交之前,别人是无法修改该数据的;如果 rollback,你在
    本次事务中的修改将撤消(不是别人修改的会没有,因为别人此时无法修改)。当然,前
    提是你使用的数据库支持事务。还有一个要注意的是,部分数据库支持自定义 SQL 锁覆
    盖事务隔离级别默认的锁机制,如果使用了自定义的锁,那就另当别论。
    重点:一般事务使用的是悲观锁(具有排他性)
  35. Student 学生表(学号,姓名、性别、年龄、组织部门),Course 课程
    表(编号,课程名称),Sc 选课表(学号,课程编号,成绩)
    写一个 SQL 语句,查询选修了计算机原理的学生学号和姓名
    select 学号,姓名 from Student where 学号 in
    (select 学号 from Sc where 课程编号 in
    (Select 课程编号 from Course where 课程名称 = ‘计算机原理’))
    写一个 SQL 语句,查询“周星驰”同学选修了的课程名字
    select 课程名称 from Course where 编号 in (
    select Sc.课程编号 from Student,Sc where Student.姓名=’周星驰’ and
    Student.学号 = Sc.学号)
    写一个 SQL 语句,查询选修了 5 门课程的学生学号和姓名
    Select 学号,姓名 from Student where 学号 in (
    Select 学号,count(课程编号) from Sc group by 学号 having count(课程编号)>=5)
  36. sql 查询
    Student(S#,Sname,Sage,Ssex)学生表
    S#:学号
    Sname:学生姓名
    Sage:学生年龄
    Ssex: 学生性别
    Course(C#,Cname,T#)课程表
    C#,课程编号;
    Cname:课程名字;
    T#:教师编号;
    SC(S#,C#,score)成绩表
    S#:学号;
    C#,课程编号;
    Score:成绩;
    Teacher(T#,Tname)教师表
    T#:教师编号;
    Tname:教师名字
    查询“001”课程比“002”课程成绩高的所有学生学号
    select SC1.S#
    from SC SC1 JOIN SC SC2 ON SC1.S#=SC2.S#
    WHERE SC1.C#='001' AND SC2.C#='002' AND SC1.score>SC2.score
    查询平均成绩大于 60 分的同学的学号和平均成绩
    select S#,AVG(score) 平均成绩
    from SC
    group by S#
    having AVG(score)>60
    查询所有同学的学号、姓名、选课数、总成绩
    select Student.S#,Sname,COUNT() 选课数,SUM(score) 总成绩
    from Student JOIN SC on Student.S#=SC.S#
    group by Student.S#,Sname
    查询姓“李”的老师的个数
    Select count(
    ) from Teacher where Tname like ‘李%’;

查询没学过“叶平”老师课的同学的学号、姓名
SELECT stu2.s#,stu2.stuname FROM Student stu2 WHERE stu2.s# NOT IN
(SELECT DISTINCT stu.s# FROM student stu, course c,teacher tea,score score
WHERE stu.s#= score.s# AND course.c#= score.c#
AND tea.t#= course.t#AND tea.tname= '叶平' )

原文地址:https://www.cnblogs.com/linanana/p/12546317.html