SqlServer技术题选择题简答题1、触发器的作用?//触发器是一种特殊的存储过程,主要是通过表的事件(对表的增,删,改操作)来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发2、什么是存储过程?用什么来调用?//存储过程是一个预编译的SQL语句的集合,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。3、什么是内存泄漏?//一般我们所说的内存泄漏指的是堆内存的泄漏。堆内存是程序从堆中为其分配的,大小任意的,使用完后要显示释放内存。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后程序调用delete释放该内存,否则就说该内存就不能被使用,我们就说该内存被泄漏了。(简单描述:程序在堆中分配了内存,使用完后没有释放,其他程序也不能使用这块内存,我们就说这块内存泄露了。)4、动态查询如何实现?表的结构变化后,如果不需要修改程序,如何设计和实现查询?//将查询封装进存储过程中,通过调用存储过程实现动态调用;表结构发生变化后修改相应的存储过程即可再不修改程序的情况下实现查询。5、触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别?//事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次6、游标的作用?如何知道游标已经到了最后?//游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后7、取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。//答答案1:selecttop10*fromAwhereid(selectmax(id)from(selecttop30idfromA)asA)答案2:selecttop10*fromAwhere(idnotin(selecttop30idfromA))//测试代码createddatabasetestdbgousetestdbgocreatetableA(idintidentityprimarykey,aavarchar(10))godeclare@iintset@i=1while(@i=100)begindeclare@tempvarchar(100)set@temp='aaa'+convert(varchar,@i)insertintoAvalues(@temp)set@i=@i+1endgoselect*fromAgoselecttop10*fromAwhereid(selectmax(id)from(selecttop30idfromA)asA)8、要求查询表A中存在ID重复三次以上的记录。答案1:select*from(selectaa,count(aa)ascountfromagroupbyaa)TwhereT.count3答案2:select*fromawhereaain(selectaafromagroupbyaahavingcount(aa)3)//测试代码createdatabasetestdbgousetestdbgocreatetableA(idintidentityprimarykey,aavarchar(10))godeclare@iintset@i=1while(@i=100)begindeclare@tempvarchar(100)set@temp='aaa'+convert(varchar,@i)if(@i%10=0)set@temp='bbb'if(@i%3=0)set@temp='ccc'if(@i%6=0)set@temp='ddd'insertintoAvalues(@temp)set@i=@i+1endgoselect*fromAgo9、某字段有10条重复记录,请把对应表中的记录查询出来?//表名appeal_base_info字段appeal_type(number)SELECT*formappeal_base_infowhereappeal_typein(selectappeal_typefromappeal_base_infogroupbyappeal_typehavingcount(appeal_type)=10)10、一张主表,一张从表,请将两张表的所有记录查询出来?//主表:appeal_base_info主键:base_id(number)主表:appeal_person_info主键:person_id(number)外键:base_id(number)select*fromppeal_base_infoafulljoin,appeal_person_infobona.base_id=b.base_id//测试代码createtablea1(idint,aa1int)goInsertintoa1values(1,11)insertintoa1values(2,12)insertintoa1values(3,13)insertintoa1values(4,14)insertintoa1values(5,15)insertintoa1values(6,16)gocreatetablea2(idint,aa2int)goinsertintoa2values(1,21)insertintoa2values(2,22)insertintoa2values(3,23)insertintoa2values(7,24)insertintoa2values(8,25)insertintoa2values(9,26)goselect*froma1joina2ona1.id=a2.id--内连接select*froma1leftjoina2ona1.id=a2.id--左外连接,返回左表所有记录select*froma1rightjoina2ona1.id=a2.id--右外连接,返回右表所有记录select*froma1fulljoina2ona1.id=a2.id--完全外连接,返回两张表所有记录11、请说出数据库中存储过程和函数的区别?//存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的,用户可以调用存储过程。函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。12、谈谈你对数据库中“视图”的看法。//视图是一种虚拟表,通常是作为来自一个或多个表的行或列的子集创建的。视图本质上讲,就是保存在数据库中的select查询。视图并不是数据库中存储的数据值的集合。对最终用户的好处:结果更容易理解、获得数据更容易。对开发人员的好处:限制数据检索更容易、维护应用程序更方便。13、什么是规范化?三范式的定义是什么?//从数据库的表中,除去冗余数据的过程称为规范化。三范式的定义:第一范式的定义:如果一个表中没有重复组(每一字段只存储一个值)。第二范式的定义:如果一个表属于1NF,任何属性只依赖于关键字,则这个表属于第二范式(必须先符合1NF的条件,且每一行都能被唯一的识别)第三范式的定义:如果一个表属于2NF,且不包含传递依赖性(没有一个非关键属性依赖于另一个非关键属性)14、什么是索引?它的优、缺点各是什么?//索引:是一个数据库对象,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单,然后根据指定的排序次序排列这些指针优点:提高查询执行的速度。强制实施数据的唯一性。提高表之间联接的速度。缺点:存储索引要占用磁盘空间。数据修改需要更长的时间,因为索引也要更新。15、如何优化数据库,如何提高数据库的性能。//优化数据库主要是优化查询语句,通过高性能的查询语句可以提高数据库的性能。16、现有三张表:tablestudent(intstuId,varchar(20)dtuName),tablecourse(intcouId,varchar(30)couName),tablesuccess(intstuId,intcouId,intgrade)a)查出被学生选修的课程信息,去掉重复的课程信息//答案1:select*fromcoursewherecouIdin(selectdistinctcouIdfromsuccess)//答案2:SELECTDISTINCTc.*FROMcourseAScINNERJOINsuccessASsONc.couId=s.couIdb)查出学生选修的课程门数和学生姓名,并按所选修课程门数倒序排序//SELECTs.stuName,count(a.couId)AS‘选修的课程门数’FROMstudentASsINNERJOINsuccessASaONs.stuId=a.stuIdGROUPBYs.stuNameORDERBY‘选修的课程门数’DESCc)查出没有被学生选修的课程信息//select*fromcousewherecouIdnotin(selectdistinctcoutIdfromsuccess)d)查出分数最高的学生名称和分数最高的课程名称//答案1:SELECTTOP1s.stuName,c.couName,max(a.grade)ASgradeFROMstudentASsINNERJOINsuccessASaONs.stuId=a.stuIdINNERJOINcourseAScONc.couId=a.couIdGROUPBYs.stuName,c.couName,gradeORDERBYgradeDESC//答案2:selecta.stuName,c.couName,b.gradefromstudentajoin(selecttop1stuId,couId,gradefromsuccessorderbygradedesc)bona.stuId=b.stuIdjoincourseonb.couId=c.couIde)查出没有选修课程的学生信息//select*fromstudentwherestuIdnotin(selectdistinctstuIdfromsuccess)17、如何处理几十万条并发数据?//用存储过程或事务。取得最大标识的时候同时更新..注意主键不是自增量方式这种方法并发的时候是不会有重复主键的..取得最大标识要有一个存储过程来获取。18、维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?//答:尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。19、什么是事务?什么是锁?//答:事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性20、什么叫视图?游标是什么?//答:视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改