数据库-面试题.docx_第1页
数据库-面试题.docx_第2页
数据库-面试题.docx_第3页
数据库-面试题.docx_第4页
数据库-面试题.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库面试题(注:由于技术题库部分内容来源于网络,内容仅供参考,请面试官根据实际情况甄选使用)1、事务 事务是指一个工作单元,它包含了一组数据操作命令,并且所有的命令作为一个整体一起向系统提交或撤消请求操作,即这组命令要么都执行,要么都不执行。例如,网上购物的交易过程至少包括以下几个步骤的操作:(1)更新客户所购商品的库存信息。(2)保存客户付款信息。(3)生成订单井且保存到数据库中。(4)更新用户相关信息,如购物数量等 。 在正常的情况下,这些操作都将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果遇到突然掉电或是其他意外情况,导致这一系列过程中任何一个环节出了差错,如在更新商品库存信息时发生异常、顾客银行账户余额不足等,都将导致整个交易过程失败。而一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态,即原有的库存信息没有被更新、用户也没有付款、订单也没有生成。否则,数据库的信息将会不一致,或者出现更为严重的不可预测的后果,数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。 事务必须满足4个属性即原子性(atomicity)、一致性(consistency )、隔离性(isolation)、持久性( durability),即ACID 4种属性。2、什么是存储过程,与函数有什么区别? SQL语句执行的叶候要先编译然后再被执行。在大型数据库系统中,为了提高效率,将为了完成特定功能的SQL语句集进行编译优化后,存储在数据库服务器中,用户通过指定的存储过程的名字来调用执行。存储程是一组予编译的SQL语句。 使用存储过程可以增强SQL语言的功能和灵活性,由于可以用流程控制语句编写存储过程,有很强的灵活性,所以可以完成复杂的判断和运算,且可以保证数据的安全性和完整性,同时,存储过程可以使没有权限的用户在控制之下间接地存取数据库,也保证了数据的安全。但存储过程不等于函数,两者虽然本质上没有区别,但具体而言有以下几个方面的区别: (1)存储过程一般是作为个独立的部分来执行的,而函数可以作为查询语句的一个部分来调用。由于函数可以返回一个对象,因此它一般在查询语句中位于From关键字的后面。 (2)一般而言,存储过程实现的功能较复杂,而函数实现的功能针对性比较强。 (3)函数需要用括号包住输入的参数,且只能返回一个值或表对象,存储过程可以返回多个参数。 (4)函数可以嵌入在SQL中使用,可以在select中调用,存储过程不行。 (5)函数不能直接操作实体表,只能操作内建表 (6)存储过程在创建时即在服务器上进行了编译,执行速度更快。3、什么是死锁? 在操作系统中有若干程序并发执行,它们不断地申请、释放资源,在此过程中,由于争夺资源而处于无限期的等待状态,造成程序无法继续执行,若无外力作用,它们都将无法推进下去,这时称系统处于死锁状态或系统产生了死锁。此时便只能通过外来打破这种状态。 产生死锁的原因有以下3点。 (1)首先,系统资源不足,在系统中常常有多个进程共享资源的情况,如打印机,这些资源在同一时刻只能被一个进程使用。当资源数目不能满足进程时,便可能因为抢夺资源产生死锁。 (2)其次,进程运行推进顺序不对,进程在运行中具有异步性,当进程推进顺序不当时,便产生死锁。例如,进程P1和P2,两进程同时具有R1和R2两个资源时,才能执行,当两进程并发执行时,若P1保持资源R1,P2保持资源R2,双方都在等待对方释放资源,此时便发生了死锁。 (3)最后,资源分配不当,如果系统资源充足,进程的资源请求都能得到满足,死锁的可能性会被大大降低,而进程推进顺序与速度不同,也可能会产生死锁。总的来说,产生死锁有4个必要条件:1) 互斥,每个资源每次只能被一个进程使用;2)请求与保持等待,一个进程因请求资源而被阻塞时,对已获得的资源保持不放;3)不可剥夺,进程已获得的资源,在未使用完之前,不能强制剥夺;4)环路等待,若干进程之间形成首尾相接的等待资源关系。 所以,为了预防死锁,就要打破产生死锁的4个条件中的一个或多个,网此需要最大限度地增加系统资源,合理地安排进程的顺序井确定合理的分配资源的算法。避免死锁是在资源的动态分配过程中,采取有效的方法防止系统进入不安全状态,达到预防死锁的目的,其中最具代表性的方法就是银行家算法。4、什么是共享锁?互斥锁? 在数据库中,锁主要是对数据进行读/写的一种保护机制,从数据库系统的角度来看,一般可以将锁分为共享锁和互斥锁。共享锁简称S锁,也叫读锁。用于不更改或不更新数据的操作(只读操作),如select语句。如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。共享锁可阻止其他并发运行的程序获取重叠的独占锁定,但是允许该程序获取重叠的共享锁定。其他用户可以获取共享锁锁定的资源,但是不能进行修改该共事锁。在执行select命令时,SQL Server 通常会对对象进行共享锁锁定。若事务T对数据D加S锁,则其他事务只能对D加S 锁,而不能加X锁,直至T释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。通常加共享锁的数据页被读取完毕后 ,共享锁就会立即被释放。互斥锁简称X锁,也叫排他锁,用于数据修改操作,如insert、update或delete。确保不会同时对同一资源进行多重更新。为了保证数据操作的完整性,引入了互斥锁。用互斥锁来保证在任意时刻,只能有一个线程访问对象。若事务T对数据D加X锁,则其他任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排他锁,所以排他锁又称为写锁。 而对于锁的使用,也有一定的限制,需要遵守两个事项:1)先锁后操作;2)事务结束之后必须解锁。5、什么是CHECK约束? CHECK约束是指限制表中某一列或某些列中可接受的数据值或数据格式,它用于限制列的取值范围,使用形式为:CHECK(约束表达式),如果是对单列定义CHECK 约束,那么该列只允许特定的值;如果是对一个表定义CHECK约束,那么此约束会在特定的列中对值进行限制。例如,对于一个员工信息表,给员工的年龄属性添加了一个约束,即年龄必须大于0且小于等于120,那么用户在输入年龄的时候,就必须遵守该约束,输入负数或者121就无法输入。6、什么是视图 视图是由从数据库的基本表中选取出来的数据组成的逻辑窗口,不同于基本表。它是一个虚表,在数据库中,存放的只是视图的定义而己,不存放视图包含的数据项,这些项目仍然存放在原来的基本表结构中。 视图的作用非常多,主要有以下几点:首先可以简化数据查询语句;其次可以使用户能从多角度看待同一数据;然后,通过引入视图,可以提高数据的安全性;最后,视图提供了一定程度的逻辑独立性等 。 通过引入视图机制,用户可以将注意力集中在其关心的数据上而非全部数据,这样就大大提高了用户效率与用户满意度,而且如果这些数据来源于多个基本表结构,或者数据不仅来自于基本表结构,还有一部分数据来源于其他视图,井且搜索条件又比较复杂时,需要编写的查询语句就会比较繁琐,此时定义视图就可以便数据的查询语句变得简单可行。定义视图可以将表与表之间复杂的操作连接和搜索条件对用户不可见,用户只需要简单地对一个视图进行查询即可,所以增加了数据的安全性,但是不能提高查询的效率。7、什么是触发器? 触发器是一种特殊类型的存储过程,它由事件触发,而不是程序调用或手工启动。当数据库有特殊自操作时,对这些操作由数据库中的事件来触来自动完成这些SQL语句。使用触发器可以月来保证数据的有效性和完整性,完成比约束更复杂的数据约束。根据SQL语句的不同,触发器可分为两类:DML触发器和DLL触发器。 DML触发器是当数据库服务器发生数据操作语言事件时执行的存储过程,有After和Instead Of两种触发器。After触发器被激活触发是在记录改变之后进行的一种触发器。Instead Of触发器是在记录变更之前,去执行触发器本身所定义的操作,而不是执行原来SQL语句里的操作。DLL触发器是在响应数据定义语言事件时执行的存储过程。 触发器的主要作用表现在以下几个方面: (1)增加安全性。 (2)利用触发器记录所进行的修改以及相关信息,跟踪用户对数据库的操作,实现审计。 (3)维护那些通过创建表时的声明约束不可能实现的复杂的完整性约束以及对数据库中特定事件进行监控与响应。 (4)实现复杂的非标准的数据库相关完整性规则、同步实时地复制表中的数据。 (5)触发器是自动的,它们在对表的数据做了任何修改之后就会被激活。例如,可以自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。以某企业财务管理为例,如果企业的资金链出现短缺,并且达到某种程度时,则发送警告信息。 引申:触发器分为事前触发和事后触发,两者有什么区别?语旬组触发和行组触发有什么区别? 事前触发发生在事件发生之前验证一些条件或进行有一些准备工作;事后触发器发生在事件发生之后,做收尾工作,保证事务的完整性。而事前触发可以获得之前和新的字段值。语句级触发器可以在语句执行之前或之后执行,而行级触发在触发器所影响的每一行触发一次。8、什么是索引? 索引是一种提高数据库查询速度的机制,它是一个在数据库的表或视图上按照某个关键字段的值,升序或降序排序创建的对象。当用户查询索引字段时,它可以快速地执行检索操作,借助索引,在执行查询的时候不需要扫描整个表就可以快速地找到所需要的数据。索引是与表或视图关联的磁盘上结构,即对表中列值排序的一种结构 ,可以加快从表或视图中检索行的速度,执行查询时不必扫描整个表就能更快速的访问数据库中的信息。 一条索引记录包含键值和逻辅指针。创建索引时,系统分配一个索引页。在表中插入一行 数据,同时也向该索引页中插入一行索引记录。索引记录包含的索引字段值比真 实数据量小,节省了空间。 索引的类型有聚焦索引和非聚焦索引。聚集索引是表中的行的物理顺序与键值的逻辑顺序一样 ,一个表只能有一个聚焦索引。与非聚焦索引相比,聚焦索引一般情况下可以获得更快的数据访问速度。非聚焦索引是数据存储与索引存储不在同一个地方。索引中有指针,该指针指向数据的存储位置,索引中的项目按索引之前的顺序存储,而表中的信息技另一种顺序存储。 创建索引可以大大提高系统的性能,主要表现在以下几个方面:1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;2)通过索引,可以大大加快数据的检索速度;3)通过索引可以加速表和表之间的连接,从而有效实现数据的参考完整性;4)在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间;5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 索引可以有效地提高查询效率,那为什么不将所有的列都建立索引呢?其实索引尽管可以带来方便,但并非越多越好,过多的索引也会带来许多不利的问题。首先,创建索引和维护索 引要耗费时间、空间。当数据量比较小时,这种问题还不够突出:而当数据量比较大时,这种 缺陷会比较明显,效率会非常低下。其次,除了数据表 占数据空间之外,每一个索引还需要占用一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大,从而造成不必要的空间浪费。最后,当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,从而降低了数据的维护速度。9、什么是回滚? 为了保证在应用程序、数据库或系统出现错误后,数据库能够被还原,以保证数据库的完整性 ,所以需要进行回滚。回滚(rollback)就是在事务提交之前将数据库数据恢复到事务修改之前数据库数据状态。 需要注意回楼与撤销的区别。回滚是指将数据库的状态恢复到执行事务之前的状态,其中可能会使用UNDO日志进行回漆。撤销是一种记录日志的方式,并不是主要服务于事务回滚,而是主要用于系统从故障中恢复。例如,系统突然断电,系统要根据UNDO日志对未完成的事务进行处理,保证数据库的状态为执行这些事务前的状态。10、数据备份有哪些种类? 在网络运行与维护过程中,经常有一些难以预料的因素会导致数据的丢失,如硬件损坏、 操作失误等,而且丢失的数据通常又会对企业的业务产生非常不利的影响,所以必须不定期地对在据进行及时备份,以便在灾难发生后能够迅速地恢复数据 。数据备份就是保存数据的备份,目的是为了预防灾难造成的数据损失。它一般分为完全备份、差异备份、事务日志备份 、增量备份几大类。 (1)完全备份是将数据库中的全部信息进行备份,它是恢复的基线,在进行完全备份时,不但备份数据库的数据文件、日志文件,还需要备份文件的存储位置信息以及数据库中的全部对象和相关信息。在对数据库进行完全备份时,所有未完成 的事务或发生在备份过程 中的事务部将 被忽略,如果使用完全数据库备份类型,那么从开始备份到开始恢复这段时间内发生的任何针对数据库的修改都将无法恢复。所以,只有在一定的要求或条件下才使用这种备份类型。 (2)差异备份是备份从最近的完全备份之后对数据所作的修改,它以完全备份为基准点,备份完全各份之后变化了的数据文件、日志文件以及数据库中其他被修改的内容。差异备份耗费的时间比完全备份少,但也会占用一些时间,同完全备份一样,差异备份过程中也允许用户访问数据库井对数据进行操作,并且在差异备份过程中会把这些操作也一起备份起来。 (3)事务日志备份是备份从上次备份之后的日志记录,而且在默认情况下,事务日志备份完成后要截断日志,事务日志备份记录了用户对数据进行的修改操作。随着时间的推移,日志中的记录数会越来越多,容量有时比数据库备份大,这样势必会占满整个磁盘空间。因此,为了避免这种情况的发生,必须定期地将日志记录中不必要的记录清除掉,以节省空间。清除掉无用日志记录的过程叫做截断日志。 (4)增量备份是针对于上一次备份的,备份上一次备份后所有发生变化的文件。在增量备份过程中,只备份有标记的选中的文件和文件夹,它清除标记,即备份后标记文件。 例如,对于数据库而言 ,按照生活规律,一般应该在星期一进行完全备份,在星期二至星期五进行差异备份。如果在星期五数据被破坏了,则只需要还原星期一完全的备份和星期四的差异备份。这种策略备份数据需要较多的时间,但还原数据使用较少的时间。 再例如,在星期一进行完全备份,在星期二至星期五进行增量备份。如果在星期五数据被破坏了,则需要还原星期一正常的备份和从星期二至星期五的所有增量备份。这种策略备份数 据需要较多的时间,但还原数据使用较少的时间。 与数据备份相对应的就是数据恢复,数据恢复是指将数据恢复到事故之前的状态,可以将其看成数据备份操作的逆过程。数据备份是数据恢复的前提,数据恢复是数据备份的目的,无法恢复的数据备份是没有任何意义的。11、什么是游标? 在数据库中,游标提供了一种对从表中检索出的数据进行操作的灵活手段。它实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。 游标总是与一条SQL选择语句相关联,因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。 游标允许应用程序对查询语句select返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作。它还提供对基于游标位置而对表中数据进行删除或更新的能力。而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。 游标的优点有以下两个方面的内容:(1)在使用游标的表中,对行提供删除和更新的能力。(2)游标将面向集合的数据库管理系统和面向行的程序设计连接了起来。12、并发环境下如何保证数据的一致性? 并发一般是指多用户间时访问相同的数据。数据一致性是指系统中每个用户都能够取得具备一致性的数据,同时还能够看到自己或其他用户所提交的事务对数据的修改。 在并发环境下,一般可以采用多种机制来保证数据的一致性。例旧,Oracle系统提供的事务级的一致性、行级锁、表级锁等。下面只介绍行级锁。 提交读和串行性事务都使用行级锁,都会在试图修改一个没有提交的并行事务更新的行时的产生等待。第二个事务等待其他事务提交或者撤销来释放它的锁,才能更新给定的行。不管等待的是什么级别的隔离事务,若其他事务回滚了,都可以对以前锁定的行进行修改。13、如果数据库日志满了会出现什么情况? 日志文件(Log File)记录所装对数据库数据的修改,主要是保户数据库以防止故障,以及复数据时使恢复用。其特点如下: (1)每一个数据库至少包含两个日志文件组。每个日志文件组至少包含两个日志文件成员; (2)日志文件组以循环方式进行写操作; (3)每一个日志文件成员对应一个物理文件。 通过日志文件来记录数据库事务可以最大限度地保证数据的一致性与安全性,但一旦数据库中日志满了,就只能执行查询等读操作,不能执行更改、备份等操作。其原因是任何写操作都要记录日志,也就是说基本上处干不能使用的状态。14、如何判断谁往数据库中插入了一行数据? 可以通过以下3种方法来达到这个目的:事先打开审计功能、表上建立触发器或者查看logmnr等。 (1)审计功能。 先设置audit_trail参数,决定审计结果的保存地点,然后执行audit insert on schema.table_name whenever successful;当有执行insert 操作的动作后,根据 audit_trail参数到相应位置去看审计结果即可。 (2)触发器。 create or replace trigger tgname after insert on tbname 判断此表是否被插入记录 for each row begin insert into ta(日期) values(sysdate); commrt; end; 只需要将代码中的bname换成实际的表的名称即可。需要注意的是,建立触发器实质上也是审计,只是它是基于值的审计比数据库审计慢。 (3)通过logmnr日志查看。 logmnr是Oracle公司提供的分析工具,该工具轻巧实用,使用该工具可以轻松获得Oracle重作日志文件 (归档日志文件)中的具体内容,而且该工具可以分析出所有对于数据库操作的 DML(insert、update、delete等)语句、DDL语句等,另外还可分析得到一些必要的回滚语句。所以,该工具特别适用于调试、审计或者回滚某个特定的事务。15、三个范式即:属性唯一, 记录唯一, 表唯一第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在ABC的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:关键字段非关键字段x非关键字段y16、NULL是什么意思NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。假设您的SQL Server数据库里有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个UNKNOWN值进行比较,并在逻辑上希望获得一个答案。您必须使用IS NULL操作符。使用ISNULL(var,value)来进行NULL判断:当var为NULL的时候,var = value,并且返回value17、什么是索引?SQL Server 2000里有什么类型的索引?索引是一个数据结构,用来快速访问数据库表格或者视图里的数据。在SQL Server里,它们有两种形式:聚集索引和非聚集索引。聚集索引在索引的叶级保存数据。这意味着不论聚集索引里有表格的哪个(或哪些)字段,这些字段都会按顺序被保存在表格,物理顺序和逻辑顺序一致。由于存在这种排序,所以每个表格只会有一个聚集索引。非聚集索引在索引的叶级有一个行标识符。它允许每个表格有多个非聚集索引。18、什么是主键?什么是外键?主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表(可能是同一表)里的字段。那么这些相连的字段就是外键。19、什么是触发器?SQL Server 2000有什么不同类型的触发器?有INSTEAD-OF和AFTER两种触发器。触发器是一种专用类型的存储过程,它被捆绑到表格或者视图上。INSTEAD-OF触发器是替代数据操控语言(DML)语句对表格执行语句的存储过程。例如,如果我有一个用于TableA的INSTEAD-OF-UPDATE触发器,同时对这个表格执行一个更新语句,那么INSTEAD-OF-UPDATE触发器里的代码会执行,而不是我执行的更新语句则不会执行操作。AFTER触发器要在DML语句在数据库里使用之后才执行。这些类型的触发器对于监视发生在数据库表格里的数据变化十分好用。20、您如何确一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里?第一个答案(而且是您希望听到的答案)是使用外键限制。外键限制用来维护引用的完整性integrity。它被用来确保表格里的字段只保存有已经在不同的(或者相同的)表格里的另一个字段里定义了的值。这个字段就是候选键(通常是另外一个表格的主键)。另外一种答案是触发器。触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。由于这个原因,微软建议开发人员使用外键限制而不是触发器来维护引用的完整性。21、对一个投入使用的在线事务处理表格(OLTP)有过多索引需要有什么样的性能考虑?对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。22、你可以用什么来确保表格里的字段只接受特定范围里的值?Check限制,它在数据库表格里被定义,用来限制输入该列的值。触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。23、返回参数总是由存储过程返回,它用来表示存储过程是成功还是失败。返回参数总是INT数据类型。OUTPUT参数明确要求由开发人员来指定,它可以返回其他类型的数据,例如字符型和数值型的值。(可以用作输出参数的数据类型是有一些限制的。)您可以在一个存储过程里使用多个OUTPUT参数,而您只能够使用一个返回参数。24、什么是相关子查询?如何使用这些查询?相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会真正请求外部查询的值,从而形成一个类似于循环的状况。25、某一列允许NULL值,但希望确保所有的非空(Non-NULL)值都是唯一的SQL Server没有实现非NULL值唯一性的内建机制,因此需要通过自定义的trigger:Createtriggermytriggeront1forinsert,updateasBEGINIF(selectmax(cnt)from(selectcount(i.c1)ascntfromt1,inserted iwheret1.c1=i.c1groupbyi.c1)x)1ROLLBACKTRANEND26、显示数据库中的最后一条记录的所有字段(ID是自增的)SELECTtop 1 *FROMTable_NameORDER BYID DESC-或者SELECT*FROMTable_NameWHEREID=(SELECTMAX (ID)FROMTable_Name)27、显示数据库中的最后十条记录的所有字段(ID是自增的DESC做降序ASC做升序)SELECTtop 10 *FROMTable_NameORDER BYID DESC28、对来自表authors的前十个作者的state列进行更新UPDATEsSETs.saleprice=s.saleprice+2FROM(SELECTTOP10*FROMsalesORDERBYsaleid)ASt1,sales sWHEREs.saleid=t1.saleid-或者UPDATEsSETs.saleprice=s.saleprice+2FROMsales sWHEREs.saleidin(SELECTTOP10 saleidFROMsalesORDERBYsaleid)29、找出公司里收入最高的前三名员工select top 3 * from t1order by a desc -或者Select top 3 *,ROW_NUMBER() OVER(order by a DESC)as No fromt1(根据分析,执行计划中的顺序:sort (order by )+ top 3,然后是where等条件)30、找出公司里收入最高(低)的三-五名员工select top 3 a from t1 wherea in ( select top 5 a from t1order by a asc) order by a desc-弊端:参与排序的一定要是index,或者unique,且选出来的只能是单一的一个列-所以用下面的方法SELECT top (10-3+1) * FROM (SELECT TOP 10 * FROM customers Order by zip asc)t order by zip desc31、显示出员工的平均工资大于3000元的部门名称(用SQL语句)注意Full outer join,left join, right join,inner join区别和联系SELECTDept_NameFROMt_DeptWHEREID in (SELECTDept_IDFROMt_SalaryGROUPBYDept_ID-对部门分组(即:相同部门的,进行同一操作)Havingavg(Salary)3000)32、找出那些工资高于他们所在部门的平均工资的员工select last_name, dept_id, salary from s_emp awhere salary(select avg(salary) from s_emp where dept_id=a.dept_id)33、找出那些工资高于他们所在部门的manager的工资的员工。select id, last_name, salary, manager_idfrom s_emp awhere salary(select salaryfrom s_emp where id=a.manager_id)34、有两个表分别如下:表A(varchar(32) NAME,int GRADE)数据:ZHANGSHAN 80, LISI 60, WANGWU 84表B(varchar(32) NAME,int AGE)数据:ZHANGSHAN 26, LISI 24, WANGWU 26, WUTIAN 261)写SQL语句得到如下查询结果:NAME GRADE AGEZHANGSHAN80 26LISI 60 24WANGWU 84 26WUTIAN NULL 26答:select * from A right join B on A.NAME = B.NAME2)写SQl语句根据名字(NAME)相同按年龄(AGE)分组得到不同年龄的人的平均成绩,并写出结果。答:avg(grade) group by name, age4.横表竖起来请写出SQl语句实现题目要求的结果:写一个SQL完成左边的表变成右边的表。表的结构要求结果ProductID SALE_YEAR SALES001 2001 10002 2001 15003 2002 12003 2003 10productID 2001 2002 2003001 10 002 15 003 12 1035、交叉表的列数是确定的selectname,sum(casesubjectwhen数学thensourceelse0end)as数学,sum(casesubjectwhen英语thensourceelse0end)as英语,sum(casesubjectwhen语文thensourceelse0end)as语文fromtestgroupbyname36、交叉表的列数是不确定的declaresqlvarchar(8000)setsql=select name,selectsql=sql+sum(case subject when +subject+then source else 0 end) as +subject+,from(selectdistinctsubjectfromtest)asaselectsql=left(sql,len(sql)-1)+ from test group by nameexec(sql)36、SQLServer删除重复数据记录有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复。37、写出SQl语句(或SQL语句组),查询所有id_no重复的记录。selectdept_ID from salarygroup by dept_ID having count(dept_ID) 138、对于第一种重复,比较容易解决,使用select distinct * from tableName就可以得到无重复记录的结果集。如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除select distinct * into #Tmp from tableNametruncate table tableNameselect * into tableName from #Tmpdrop table #Tmp发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。39、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下:假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集select identity(int,1,1) as autoID, * into #Tmp from tableNameselect min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoIDselect * from #Tmp where autoID in(select autoID from #tmp2)最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)40、部分关键字段重复,且记录中有ID. (*这个比较实用*)第一种方法可一次删除所有重复的.(只保留重复中ID最小的记录)。delete from table where id not in ( selectmin(id) from table group by name)第二种方法每次只删除重复中ID最大的一条记录。delete from table where id in ( select max(id) from table group by name havingcount(*)1)41、使用SQL程序删除declare max integer,id integerdeclare cur_rows cursor local for select主字段,count(*) from表名group by主字段having count(*) 1open cur_rowsfetch cur_rows into id,maxwhile fetch_status=0beginselect max = max -1set rowcount maxdelete from表名where主字段= idfetch cur_rows into id,maxendclose cur_rowsset rowcount 042、自己还得出的办法:select * from user1 where id not in (select top 1 id from user1 where name = ) -两个name相等比较重要,否则就不对了。但是group by更加好一些删就这样写delete from user1 where id not in (select

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论