SQL Server面试题

2024-05-16

1. SQL Server面试题

 填空题(1空1分共20分) 如果设计的表不符合第二范式 可能会导致_______ ________ _______ SQL是由_______语言 ________语言 _______语言组成 SQL Server在两个安全级上验证用户 分别是______________ _____________________ 自定义函数由___________函数 _______________函数 ___________________函数组成 备份策略的三种类型是__________备份 _______________备份 ___________________备份组成 启动一个显式事务的语句为__________ 提交事务的语句为__________ 回滚事务的语句为__________ 表的每一行在表中是惟一的实体属于__________完整性 使列的输入有效属于__________完整性 两个表的主关键字和外关键字的数据应该对应一致属于__________完整性 简答题(共20分) 在帮助中[ n ] 意思是什么?(4分) 请简述一下第二范式(4分) 现有 销售表 它们结构如下 (4分) id int (标识号) codno char( ) (商品编码) codname varchar( ) (商品名称) spec varchar( ) (商品规格) price numeric( ) (价格) sellnum int (销售数量) deptno char( ) (售出分店编码) selldate datetime (销售时间) 要求 写出查询销售时间段在 日到 之间 分店编码是 的所有记录 4 写一个存储过程 要求传入一个表名 返回该表的记录数(假设传入的表在数据库中都存在)(4分) 5 请简述UPDATE 触发器如何工作原理 (4分)
  简答题 (共40分) (5分)使用一条SQL语句找到重复的值及重复的次数 有一数据表ZD_ks 其中有字段BM MC 请查询出在ZD_ks中BM有重复的值及重复的次数 没有的不要列出 如下表 BM  DUPCOUNT       
   描述( 分) 表 student 学生信息表 ID int 学生编号 Name varchar 学生姓名 Sex bit 性别(男 女 ) Class int 班级编号
  表 schedule 课程信息表 ID int 课程编号 Name varchar 课程名称
  表 Grade 成绩信息表 ID int 自动编号 UID int 学生编号 SID int 课程编号 Num int 考试成绩
   
  (a)求各班的总人数(1分) (b)求 班女生和男生的平均成绩(2分) (c)各班&# ;数据结构&# ;(课程名称)不及格的人数(2分)
  lishixinzhi/Article/program/SQLServer/201405/30727 
   

SQL Server面试题

2. 数据库常见笔试面试题

 数据库常见笔试面试题
                      数据库常见笔试面试题有哪些?数据库常见笔试面试会考什么?下面是数据库常见面试题总结,为大家提供参考。
    
     1、SQL的表连接方式有哪些? 
    SQL中连接按结果集分为:内连接,外连接,交叉连接
    内连接:inner join on,两表都满足的组合。内连接分为等值连接,不等连接,自然连接。
    等值连接:两表中相同的列都会出现在结果集中。
    自然连接:两表中具体相同列表的列会合并为同一列出现在结果集中。
    外连接:分为左(外)连接,右(外)连接,全连接
    左(外)连接:A left (outer) join B,以A表为基础,A表的全部数据,B表有的组合,没有的为null。
    右(外)连接:A right(outer) join B,以B表为基础,B表的全部数据,A表有的组合,没有的位null。
    全连接:A full (outer) join 两表相同的组合在一起,A表有,B表没有的数据(显示为null),同样B表有,A表没有的显示为null。
    交叉连接:cross join,就是笛卡尔乘积。
     2、三范式 
    1NF:表中的字段都是单一属性,不再可分。
    2NF:在1NF的基础上,表中所有的非主属性都必须完全依赖于任意一组候选键,不能仅依赖于候选键中的某个属性。
    3NF:在2NF的基础上,表中所有的属性都不依赖其他非主属性。
    简单的说就是:1NF表示每个属性不可分割,2NF表示非主属性不存在对主键的部分依赖,3NF表示不存在非主属性对主键的依赖传递。
     3、表的操作 
    表的创建:create table 表名 (列名1 类型 约束,列2 类型 约束…)
    表的删除: 表名
    表的更改(结构的更改,不是记录的更新):alter table 表名 add|drop 列名|约束名
    插入记录: into 表名…values…
    更新记录:表名 set 列名=值 where 条件
    删除记录: from 表名 where 条件
     4、数据的完整性 
    数据完整性指的是存储在数据库中的数据的一致性和准确性。
    完整性分类:
    (1)实体完整性:主键值必须唯一且非空。(主键约束)
    (2) 引用完整性(也叫参照完整性):外键要么为空,要么引用主表中存在的记录。(外键约束)。
    (3)用户自定义完整性:针对某一具体关系数据库中的约束条件。
     5、SQL的查询优化 
    (1)从表连接的角度优化:尽量使用内连接,因为内连接是两表都满足的行的组合,而外连接是以其中一个表的全部为基准。
    (2)尽量使用存储过程代替临时写SQL语句:因为存储过程是预先编译好的SQL语句的集合,这样可以减少编译时间。
    (3)从索引的角度优化:对那些常用的查询字段简历索引,这样查询时值进行索引扫描,不读取数据块。
    (4)还有一些常用的select优化技巧:
    (5)A.只查询那些需要访问的字段,来代替select*
    B、将过滤记录越多的where语句向前移:在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。
     6、索引的作用,聚集索引与非聚集索引的区别 
    索引是一个数据库对象,使用索引,可以是数据库程序无须对整个数据进行扫描,就可以在其中找到目标数据,从而提高查找效率。索引的底层采用的是B树。
    聚集索引:根据记录的key再表中排序数据行。
    非聚集索引:独立于记录的结构,非聚集所以包含的`key,且每个键值项都有指向该简直的数据行的指针。
    聚集索引与非聚集索引的区别:
    (1)聚集索引的物理存储按索引排序,非聚集所以的物理存储不按索引排序。
    (2) 聚集索引插入,更新数据的速度比非聚集索引慢,单查询速度更快。
    (3) 聚集索引的叶级结点保存的是时间的数据项,而非聚集结点的叶级结点保存的是指向数据项的指针。
    (4)一个表只能有一个聚集索引(因为只有一种排序方式),但可以有多个非聚集索引。
     7、存储过程与函数的区别 
    (1)函数有返回值,存储过程没有返回值。
    (2) 因为存储过程没有返回值,所以不能将存储过程的执行结果赋值给变量;函数有返回值类型,调用函数时,可以将函数的执行结果赋值给变量。也就是说,函数可以在select语句中使用,而存储过程则不能。
    
  ;

3. SQL数据分析面试题

 1、现有交易数据表user_goods_table,
                                           老板想知道每个用户购买的外卖品类偏好分布,并找出每个用户购买最多的外卖品类是哪个。
   2、现有交易数据表user_sales_table,
                                           老板想知道支付金额在前20%的用户。
   3、现有用户登录表user_login_table,
                                           老板想知道连续7天都登录平台的重要用户。
   4、给定一张用户签到表user_attendence,表中包含三个字段,分别是用户ID:【user_id】,日期:【date】,是否签到:【is_sign_in】,0否1是。
   4-1、计算截至当前(假设当前时间为2020-04-27),每个用户已经连续签到的天数:
   要求输出用户ID【user_id】和连续签到天数【recent_continuous_days】
   4-2、计算有史以来 用户最大连续签到天数 :
   要求输出用户ID【user_id】和最大连续签到天数

SQL数据分析面试题

4. SQL Server DBC遇到的面试题

 Q. 我的SQL Server数据表中有一列允许为空(NULL)值。在该列有非空值的时候,我想让该列的值为唯一值。通过编程实现这一目标的最佳做法是什么呢?如果我在该列中设置一个UNIQUE约束,我可以只在一个记录中保有空值。我正在使用触发器来强制执行这个限制,但是你能推荐一种更简单的方法来确保所有非空的值都是唯一的吗? A. SQL Server没有内置的机制可以禁止非空值产生重复,所以你需要使用一个自定义的CHECK约束来实现这个限制。例如,以下代码就可以实现你所要的那种完整性。 USE tempdb Create table t1 (c1 int NULL, c2 char(5) NULL) Create trigger mytrigger on t1 for insert, update as BEGIN IF (select max(cnt) from (select count(i.c1) as cnt from t1, inserted i where t1.c1=i.c1 group by i.c1) x) > 1 ROLLBACK TRAN END 在SQL Server 2000中,你还可以使用INSTEAD OF触发器来执行这个限制。同INSTEAD OF触发器有关的更多信息,请参阅以下文章,要查看这些文章,请访问SQL Server Magazine,在InstantDoc(快速文档)框中输入InstantDoc编号,然后点击“Go”。Tw.WingWiT.CoM文章包括: INSTEAD OF触发器的使用窍门;InstantDoc编号 15828 视图中的INSTEAD OF触发器;InstantDoc 编号 15791 INSTEAD OF触发器;InstantDoc 编号 15524
  SQL Server Profiler和参数化语句 问:自从升级到SQL Server 2000后,我在SQL事件查看器中遇到了一个问题:我无法捕获带有参数的Transact-SQL语句。我希望获得查询执行过程中参数的实际取值,而并非诸如@p1这样的参数形式。请问如何在不引用跟踪过程中其它行的情况下对参数取值加以置换。 答:您必须获取跟踪过程的其它部分(如存储过程StmtCompleted所返回的结果),并将这些部分收集在一起(语句放在最前面)以捕获完整的查询内容。之所以会出现这样的结果,其原因在于从SQL Server关系型引擎恢复数据的SQL事件查看器方法。这样的问题在SQL Server 7.0中同样存在。然而,由于当事件产生时,位于引擎内部的参数取值是未知的,因此,我们无法在这一时刻做出修改。
  lishixinzhi/Article/program/SQLServer/201404/30297 
   

5. 数据库经典笔试题和面试题答案

如下这些有关数据库知识考查的经典笔试题,非常全面,对计算机专业毕业生参加笔试会很有帮助,建议大家收藏。
    一、选择题
 
    1. 下面叙述正确的是___c___。
 
    A、算法的执行效率与数据的存储结构无关
 
    B、算法的空间复杂度是指算法程序中指令(或语句)的条数
 
    C、算法的有穷性是指算法必须能在执行有限个步骤之后终止
 
    D、以上三种描述都不对
 
    2. 以下数据结构中不属于线性数据结构的是___c___。
 
    A、队列B、线性表C、二叉树D、栈
 
    3. 在一棵二叉树上第5层的结点数最多是__b____。2的(5-1)次方
 
    A、8 B、16 C、32 D、15
 
    4. 下面描述中,符合结构化程序设计风格的是___a___。
 
    A、使用顺序、选择和重复(循环)三种基本控制结构表示程序的控制逻辑
 
    B、模块只有一个入口,可以有多个出口
 
    C、注重提高程序的执行效率 D、不使用goto语句
 
    5. 下面概念中,不属于面向对象方法的是___d___。
 
    A、对象 B、继承 C、类 D、过程调用
 
    6. 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是___b___。
 
    A、可行性分析 B、需求分析 C、详细设计 D、程序编码
 
    7. 在软件开发中,下面任务不属于设计阶段的是__d____。
 
    A、数据结构设计 B、给出系统模块结构 C、定义模块算法 D、定义需求并建立系统模型
 
    8. 数据库系统的核心是___b___。
 
    A、数据模型 B、数据库管理系统 C、软件工具 D、数据库
 
    9. 下列叙述中正确的是__c____。
 
    A、数据库是一个独立的系统,不需要操作系统的支持
 
    B、数据库设计是指设计数据库管理系统
 
    C、数据库技术的根本目标是要解决数据共享的问题
 
    D、数据库系统中,数据的物理结构必须与逻辑结构一致
 
    10. 下列模式中,能够给出数据库物理存储结构与物理存取方法的是___a___。
 
    A、内模式 B、外模式 C、概念模式 D、逻辑模式
 
    11. Visual FoxPro数据库文件是___d___。
 
    A、存放用户数据的文件 B、管理数据库对象的系统文件
 
    C、存放用户数据和系统的文件 D、前三种说法都对
 
    12. SQL语句中修改表结构的命令是___c___。
 
    A、MODIFY TABLE B、MODIFY STRUCTURE
 
    C、ALTER TABLE D、ALTER STRUCTURE
 
    13. 如果要创建一个数据组分组报表,第一个分组表达式是"部门",第二个分组表达式是"性别",第三个分组表达式是"基本工资",当前索引的索引表达式应当是__b____。
 
    A、部门+性别+基本工资 B、部门+性别+STR(基本工资)
 
    C、STR(基本工资)+性别+部门 D、性别+部门+STR(基本工资)
 
    14. 把一个项目编译成一个应用程序时,下面的叙述正确的是___a___。
 
    A、所有的项目文件将组合为一个单一的应用程序文件
 
    B、所有项目的包含文件将组合为一个单一的应用程序文件
 
    C、所有项目排除的文件将组合为一个单一的应用程序文件
 
    D、由用户选定的项目文件将组合为一个单一的应用程序文件
 
    15. 数据库DB、数据库系统DBS、数据库管理系统DBMS三者之间的关系是_a___。
 
    A、DBS包括DB和DBMS B、DBMS包括DB和DBS
 
    C、DB包括DBS和DBMS D、DBS就是DB,也就是DBMS
 
    16. 在"选项"对话框的"文件位置"选项卡中可以设置___b___。
 
    A、表单的默认大小 B、默认目录
 
    C、日期和时间的显示格式 D、程序代码的颜色
 
    17. 要控制两个表中数据的完整性和一致性可以设置"参照完整性",要求这两个表_a_。
 
    A、是同一个数据库中的两个表 B、不同数据库中的两个表
 
    C、两个自由表 D、一个是数据库表另一个是自由表
 
    18. 定位第一条记录上的命令是___a___。
 
    A、GO TOP B、GO BOTTOM C、GO 6 D、SKIP
 
    19. 在关系模型中,实现"关系中不允许出现相同的元组"的约束是通过__b____。
 
    A、候选键 B、主键 C、外键 D、超键
 
    20. 设当前数据库有10条记录(记录未进行任何索引),在下列三种情况下,当前记录号为1时;EOF()为真时;BOF()为真时,命令?RECN()的结果分别是___a___。
 
    A、1,11,1 B、1,10,1 C、1,11,0 D、1,10,0
 
    21. 下列表达式中结果不是日期型的是___c___。
 
    A、CTOD("2000/10/01") B、{^99/10/01}+365
 
    C、VAL("2000/10/01") D、DATE()
 
    22. 只有满足联接条件的记录才包含在查询结果中,这种联接为___c___。
 
    A、左联接 B、右联接 C、内部联接 D、完全联接
 
    23. 索引字段值不唯一,应该选择的索引类型为___b___。
 
    A、主索引 B、普通索引 C、候选索引 D、唯一索引
 
    24. 执行SELECT 0选择工作区的结果是___b___。
 
    A、选择了0号工作区 B、选择了空闲的最小号工作区
 
    C、关闭选择的工作区 D、选择已打开的工作区
 
    25. 从数据库中删除表的命令是___a___。
 
    A、DROP TABLE B、ALTER TABLE C、DELETE TABLE D、USE
 
    26. DELETE FROM S WHERE 年龄>60语句的功能是__b____。
 
    A、从S表中彻底删除年龄大于60岁的记录
 
    B、S表中年龄大于60岁的记录被加上删除标记
 
    C、删除S表 D、删除S表的年龄列       1    2

数据库经典笔试题和面试题答案

6. SQL查询面试题与答案

 SQL查询面试题与答案
                         SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。下面是我搜集的SQL查询面试题与答案,欢迎大家阅读。
    
         SQL查询面试题与答案一         1.一道SQL语句面试题,关于group by表内容:
         2005-05-09 胜
         2005-05-09 胜
         2005-05-09 负
         2005-05-09 负
         2005-05-10 胜
         2005-05-10 负
         2005-05-10 负
         如果要生成下列结果, 该如何写sql语句?
         胜 负
         2005-05-09 2 2
         2005-05-10 1 2
         ------------------------------------------
         create table #tmp(rq varchar(10),shengfu nchar(1))
         insert into #tmp values('2005-05-09','胜')
         insert into #tmp values('2005-05-09','胜')
         insert into #tmp values('2005-05-09','负')
         insert into #tmp values('2005-05-09','负')
         insert into #tmp values('2005-05-10','胜')
         insert into #tmp values('2005-05-10','负')
         insert into #tmp values('2005-05-10','负')
         1)select rq, sum(case when shengfu='胜' then 1 else 0 end)'胜',sum(case when shengfu='负' then 1 else 0 end)'负' from #tmp group by rq
         2) select N.rq,N.胜,M.负 from (
         select rq,胜=count(*) from #tmp where shengfu='胜'group by rq)N inner join
         (select rq,负=count(*) from #tmp where shengfu='负'group by rq)M on N.rq=M.rq
         3)select a.col001,a.a1 胜,b.b1 负 from
         (select col001,count(col001) a1 from temp1 where col002='胜' group by col001) a,
         (select col001,count(col001) b1 from temp1 where col002='负' group by col001) b
         where a.col001=b.col001
         2.请教一个面试中遇到的SQL语句的查询问题
         表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
         ------------------------------------------
         select (case when a>b then a else b end ),
         (case when b>c then b esle c end)
         from table_name
         3.面试题:一个日期判断的sql语句?
         请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日期与时间)
         ------------------------------------------
         select * from tb where datediff(dd,SendTime,getdate())=0
         4.有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):
         大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。
         显示格式:
         语文 数学 英语
         及格 优秀 不及格
         ------------------------------------------
         select
         (case when 语文>=80 then '优秀'
         when 语文>=60 then '及格'
         else '不及格') as 语文,
         (case when 数学>=80 then '优秀'
         when 数学>=60 then '及格'
         else '不及格') as 数学,
         (case when 英语>=80 then '优秀'
         when 英语>=60 then '及格'
         else '不及格') as 英语,
         from table
         5.在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型,并解释下两者的区别?
         ------------------------------------------
         用户临时表:create table #xx(ID int, IDValues int)
         系统临时表:create table ##xx(ID int, IDValues int)
         区别:
         用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的.
         当创建它的进程消失时这个临时表就自动删除.
         全局临时表对整个SQL Server实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.
         6.sqlserver2000是一种大型数据库,他的`存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。
         ------------------------------------------
         它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQL Server的存储容量是可以扩大的.
         SQL Server 2000 数据库有三种类型的文件:
         主要数据文件
         主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。
         次要数据文件
         次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。
         日志文件
         日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。
         7.请用一个sql语句得出结果
         从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格式向大家请教。
         如使用存储过程也可以。
         table1
         月份mon 部门dep 业绩yj
         -------------------------------
         一月份 01 10
         一月份 02 10
         一月份 03 5
         二月份 02 8
         二月份 04 9
         三月份 03 8
         table2
         部门dep 部门名称dname
         --------------------------------
         01 国内业务一部
         02 国内业务二部
         03 国内业务三部
         04 国际业务部
         table3 (result)
         部门dep 一月份 二月份 三月份
         --------------------------------------
         01 10 null null
         02 10 8 null
         03 null 5 8
         04 null null 9
         ------------------------------------------
         1)
         select a.部门名称dname,b.业绩yj as '一月份',c.业绩yj as '二月份',d.业绩yj as '三月份'
         from table1 a,table2 b,table2 c,table2 d
         where a.部门dep = b.部门dep and b.月份mon = '一月份' and
         a.部门dep = c.部门dep and c.月份mon = '二月份' and
         a.部门dep = d.部门dep and d.月份mon = '三月份' and
         2)
         select a.dep,
         sum(case when b.mon=1 then b.yj else 0 end) as '一月份',
         sum(case when b.mon=2 then b.yj else 0 end) as '二月份',
         sum(case when b.mon=3 then b.yj else 0 end) as '三月份',
         sum(case when b.mon=4 then b.yj else 0 end) as '四月份',
         sum(case when b.mon=5 then b.yj else 0 end) as '五月份',
         sum(case when b.mon=6 then b.yj else 0 end) as '六月份',
         sum(case when b.mon=7 then b.yj else 0 end) as '七月份',
         sum(case when b.mon=8 then b.yj else 0 end) as '八月份',
         sum(case when b.mon=9 then b.yj else 0 end) as '九月份',
         sum(case when b.mon=10 then b.yj else 0 end) as '十月份',
         sum(case when b.mon=11 then b.yj else 0 end) as '十一月份',
         sum(case when b.mon=12 then b.yj else 0 end) as '十二月份',
         from table2 a left join table1 b on a.dep=b.dep
         8.华为一道面试题
         一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数。
         ------------------------------------------
         select id, Count(*) from tb group by id having count(*)>1
         select * from(select count(ID) as count from table group by ID)T where T.count>1
         SQL查询面试题与答案二         1、查询不同老师所教不同课程平均分从高到低显示
         SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(Score) AS 平均成绩
         FROM SC AS T,Course AS C ,Teacher AS Z
         where T.C#=C.C# and C.T#=Z.T#
         GROUP BY C.C#
         ORDER BY AVG(Score) DESC
         2、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004)
         [学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩
         SELECT DISTINCT top 3
         SC.S# As 学生学号,
         Student.Sname AS 学生姓名 ,
         T1.score AS 企业管理,
         T2.score AS 马克思,
         T3.score AS UML,
         T4.score AS 数据库,
         ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分
         FROM Student,SC LEFT JOIN SC AS T1
         ON SC.S# = T1.S# AND T1.C# = '001'
         LEFT JOIN SC AS T2
         ON SC.S# = T2.S# AND T2.C# = '002'
         LEFT JOIN SC AS T3
         ON SC.S# = T3.S# AND T3.C# = '003'
         LEFT JOIN SC AS T4
         ON SC.S# = T4.S# AND T4.C# = '004'
         WHERE student.S#=SC.S# and
         ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
         NOT IN
         (SELECT
         DISTINCT
         TOP 15 WITH TIES
         ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
         FROM sc
         LEFT JOIN sc AS T1
         ON sc.S# = T1.S# AND T1.C# = 'k1'
         LEFT JOIN sc AS T2
         ON sc.S# = T2.S# AND T2.C# = 'k2'
         LEFT JOIN sc AS T3
         ON sc.S# = T3.S# AND T3.C# = 'k3'
         LEFT JOIN sc AS T4
         ON sc.S# = T4.S# AND T4.C# = 'k4'
         ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);
         3、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
         SELECT SC.C# as 课程ID, Cname as 课程名称
         ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85]
         ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70]
         ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60]
         ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]
         FROM SC,Course
         where SC.C#=Course.C#
         GROUP BY SC.C#,Cname;
         4、查询学生平均成绩及其名次
         SELECT 1+(SELECT COUNT( distinct 平均成绩)
         FROM (SELECT S#,AVG(score) AS 平均成绩
         FROM SC
         GROUP BY S#
         ) AS T1
         WHERE 平均成绩 > T2.平均成绩) as 名次,
         S# as 学生学号,平均成绩
         FROM (SELECT S#,AVG(score) 平均成绩
         FROM SC
         GROUP BY S#
         ) AS T2
         ORDER BY 平均成绩 desc;
         5、查询各科成绩前三名的记录:(不考虑成绩并列情况)
         SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
         FROM SC t1
         WHERE score IN (SELECT TOP 3 score
         FROM SC
         WHERE t1.C#= C#
         ORDER BY score DESC
         )
         ORDER BY t1.C#;
         6、查询每门课程被选修的学生数
         select c#,count(S#) from sc group by C#;
         7、查询出只选修了一门课程的全部学生的学号和姓名
         select SC.S#,Student.Sname,count(C#) AS 选课数
         from SC ,Student
         where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;
         8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
         Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2
         from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2
         9、查询所有课程成绩小于60分的同学的学号、姓名;
         select S#,Sname
         from Student
         where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);
         10、查询没有学全所有课的同学的学号、姓名;
         select Student.S#,Student.Sname
         from Student,SC
         where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);
         11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
         select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';
         12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名;
         select distinct SC.S#,Sname
         from Student,SC
         where Student.S#=SC.S# and C# in (select C# from SC where S#='001');
         13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
         update SC set score=(select avg(SC_2.score)
         from SC SC_2
         where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平');
         14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;
         select S# from SC where C# in (select C# from SC where S#='1002')
         group by S# having count(*)=(select count(*) from SC where S#='1002');
         15、删除学习“叶平”老师课的SC表记录;
         Delect SC
         from course ,Teacher
         where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平';
         16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、
         号课的平均成绩;
         Insert SC select S#,'002',(Select avg(score)
         from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');
         17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
         SELECT S# as 学生ID
         ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库
         ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企业管理
         ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语
         ,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩
         FROM SC AS t
         GROUP BY S#
         ORDER BY avg(t.score)
         18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
         SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分
         FROM SC L ,SC AS R
         WHERE L.C# = R.C# and
         L.score = (SELECT MAX(IL.score)
         FROM SC AS IL,Student AS IM
         WHERE L.C# = IL.C# and IM.S#=IL.S#
         GROUP BY IL.C#)
         AND
         R.Score = (SELECT MIN(IR.score)
         FROM SC AS IR
         WHERE R.C# = IR.C#
         GROUP BY IR.C#
         );
         19、按各科平均成绩从低到高和及格率的百分数从高到低顺序
         SELECT t.C# AS 课程号,max(course.Cname)AS 课程名,isnull(AVG(score),0) AS 平均成绩
         ,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数
         FROM SC T,Course
         where t.C#=course.C#
         GROUP BY t.C#
         ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC
         20、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)
         SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企业管理平均分
         ,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企业管理及格百分数
         ,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 马克思平均分
         ,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 马克思及格百分数
         ,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分
         ,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分数
         ,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 数据库平均分
         ,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 数据库及格百分数
         FROM SC
    ;

7. 面试常问的数据库问题及答案

目前在职场中很难找到非常合格的数据库开发人员。有人说:“SQL开发是一门语言,它很容易学,但是很难掌握。” 
在面试应聘的SQL Server数据库开发人员时,我运用了一套标准的基准技术问题。下面这些问题是我觉得能够真正有助于淘汰不合格应聘者的问题。它们按照从易到难的顺序排列。当你问到关于主键和外键的问题时,后面的问题都十分有难度,因为答案可能会更难解释和说明,尤其是在面试的情形下。 
你能向我简要叙述一下SQL Server 2000中使用的一些数据库对象吗? 
你希望听到的答案包括这样一些对象:表格、视图、用户定义的函数,以及存储过程;如果他们还能够提到像触发器这样的对象就更好了。如果应聘者不能回答这个基本的问题,那么这不是一个好兆头。 
NULL是什么意思? 
NULL(空)这个值是数据库世界里一个非常难缠的东西,所以有不少应聘者会在这个问题上跌跟头您也不要觉得意外。 
NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。假设您的SQL Server数据库里有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 UNKNOWN值进行比较,并在逻辑上希望获得一个答案。您必须使用IS NULL操作符。 
  
什么是索引?SQL Server 2000里有什么类型的索引? 
任何有经验的数据库开发人员都应该能够很轻易地回答这个问题。一些经验不太多的开发人员能够回答这个问题,但是有些地方会说不清楚。 
简单地说,索引是一个数据结构,用来快速访问数据库表格或者视图里的数据。在SQL Server里,它们有两种形式:聚集索引和非聚集索引。聚集索引在索引的叶级保存数据。这意味着不论聚集索引里有表格的哪个(或哪些)字段,这些字段都会按顺序被保存在表格。由于存在这种排序,所以每个表格只会有一个聚集索引。非聚集索引在索引的叶级有一个行标识符。这个行标识符是一个指向磁盘上数据的指针。它允许每个表格有多个非聚集索引。 
什么是主键?什么是外键? 
主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(尽管可能是同一个表格)里的一系列相连的字段。那么这些相连的字段就是外键。 
什么是触发器?SQL Server 2000有什么不同类型的触发器? 
让未来的数据库开发人员知道可用的触发器类型以及如何实现它们是非常有益的
 
触发器是一种专用类型的存储过程,它被捆绑到SQL Server 2000的表格或者视图上。在SQL Server 2000里,有INSTEAD-OF和AFTER两种触发器。INSTEAD-OF触发器是替代数据操控语言(Data Manipulation Language,DML)语句对表格执行语句的存储过程。例如,如果我有一个用于TableA的INSTEAD-OF-UPDATE触发器,同时对这个表格执行一个更新语句,那么INSTEAD-OF-UPDATE触发器里的代码会执行,而不是我执行的更新语句则不会执行操作。 
AFTER触发器要在DML语句在数据库里使用之后才执行。这些类型的触发器对于监视发生在数据库表格里的数据变化十分好用。 
您如何确一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里? 
这个与关系相关的问题有两个可能的答案。第一个答案(而且是您希望听到的答案)是使用外键限制。外键限制用来维护引用的完整性。它被用来确保表格里的字段只保存有已经在不同的(或者相同的)表格里的另一个字段里定义了的值。这个字段就是候选键(通常是另外一个表格的主键)。 
另外一种答案是触发器。触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。由于这个原因,微软建议开发人员使用外键限制而不是触发器来维护引用的完整性。 
对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑? 
你正在寻找进行与数据操控有关的应聘人员。对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。 
你可以用什么来确保表格里的字段只接受特定范围里的值? 
这个问题可以用多种方式来回答,但是只有一个答案是“好”答案。您希望听到的回答是Check限制,它在数据库表格里被定义,用来限制输入该列的值。 
触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。因此,微软建议使用Check限制而不是其他的方式来限制域的完整性。 
如果应聘者能够正确地回答这个问题,那么他的机会就非常大了,因为这表明他们具有使用存储过程的经验。 
返回参数总是由存储过程返回,它用来表示存储过程是成功还是失败。返回参数总是INT数据类型。 
OUTPUT参数明确要求由开发人员来指定,它可以返回其他类型的数据,例如字符型和数值型的值。(可以用作输出参数的数据类型是有一些限制的。)您可以在一个存储过程里使用多个OUTPUT参数,而您只能够使用一个返回参数。 
什么是相关子查询?如何使用这些查询? 
经验更加丰富的开发人员将能够准确地描述这种类型的查询。 
相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会真正请求外部查询的值,从而形成一个类似于循环的状况。

面试常问的数据库问题及答案

8. oracle数据库面试题

1、b没有访问表employee的权限,或者有权限但是在做desc时没有加用户名在表前面。
2、在建表时设置了max extent参数导致了表extent数满了之后不能再进行扩展。
3、tablespace full表示该表空间没有可扩展的块了,这是设置了datafile为autoextend off后或者系统中没有可扩展的物理空间导致。
4、首先我需要有一张主表(pri)拥有关键字段(id),然后分两种情况,一种是目标表不存在的情况那么我需要建立目标表,如:create table oerder(id not null,aa char(8),id_p int, primary key(id),forergn key (id_p) references pri(id));。另一种情况是目标表存在,则增加约束条件:alter table order add foreign key (id_p) references pri(id);
5、pct_increase代表的是表在做了第一次extent后,下次再扩展时的增量,它是一个百分比值,也就是说,如果你设置了该值为50那么在表下一次扩展时扩展量就增加为150%。这是个很“恐怖”的设置,如果你使用了它那么有可能你会发现你的表空间很快就没有可扩展的地方了。
6、英文不好,题目意思没读懂。
7、这题还是分两种情况,一种是nt server就是你的database server,那么你可能需要先在nt server上确认listener已经启动,然后进行ping和tracert看看是否是网络问题,最后检查pc上的tnsnames.ora配置文件是否正确,在pc上做tracerc看网络链接是否正常?检查pc上防火墙的设置等。如果nt server 不是你的database server那么说明你的database server的网络链接是正常的,那么需要的就是:检查pc上的tnsnames.ora配置文件是否正确,在pc上做tracerc看网络链接是否正常,检查pc上防火墙的设置等。当然还有一种比较特殊的情况,在pc安装了64位win操作系统+32位的oracle时会发生在cmd下可以进行链接,但是使用oracle的其他连接方式如客户端,oem等等就会报tns错误,这是oracle本身的bug。
8、char和varchar2最根本的区别就在于一个是固定长度,另一个是可变长度。它们对空间的占用量是不同的,在同样长度的字符下char类型的需要用空字符补充不足的字符数,而varchar2则不会。当然运行效率上char占优。
9、这个太长,懒得打了。