数据库SQL语句题库及分析_第1页
数据库SQL语句题库及分析_第2页
数据库SQL语句题库及分析_第3页
数据库SQL语句题库及分析_第4页
数据库SQL语句题库及分析_第5页
已阅读5页,还剩19页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

数据库SQL语句题库及分析一、单项选择题(共10题,每题1分,共10分)下列查询某学生表中所有记录的SQL语句,写法正确的是?A.SELECT*FROM学生表B.GET*FROM学生表C.QUERY*FROM学生表D.SEARCH*FROM学生表答案:A解析:SQL标准中数据查询的核心关键字是SELECT,其余选项中的GET、QUERY、SEARCH均不属于SQL标准的查询关键字,因此只有A选项写法正确。下列关于主键约束的特点,描述正确的是?A.允许存储NULL空值B.允许存储重复值C.要求值唯一且不允许为空D.只能存储数字类型的数据答案:C解析:主键的核心作用是唯一标识表中的每一行数据,因此要求主键列的值必须唯一且不能为NULL,因此A、B选项错误;主键可以是数字、字符串等多种数据类型,只要满足唯一非空要求即可,因此D选项错误。下列聚合函数中,用于计算列的平均值的是?A.COUNT()B.AVG()C.SUM()D.MAX()答案:B解析:COUNT()用于统计行数,SUM()用于计算列值的总和,MAX()用于计算列的最大值,只有AVG()用于计算列的平均值,因此B选项正确。要对分组聚合后的结果进行筛选,应当使用下列哪个子句?A.WHEREB.HAVINGC.ORDERBYD.GROUPBY答案:B解析:WHERE子句用于分组前对原始数据进行筛选,ORDERBY用于对查询结果进行排序,GROUPBY用于对数据进行分组,只有HAVING子句用于对分组聚合后的结果进行筛选,因此B选项正确。下列向学生表中插入一条新记录的SQL语句,写法正确的是?A.INSERTINTO学生表VALUES(‘张三’,18,‘高二’)B.ADD学生表VALUES(‘张三’,18,‘高二’)C.INSERT学生表SET‘张三’,18,‘高二’D.PUTINTO学生表VALUES(‘张三’,18,‘高二’)答案:A解析:SQL标准中数据插入的关键字是INSERTINTO,ADD是修改表结构时新增字段的关键字,PUT不属于SQL标准插入关键字,C选项的INSERTSET语法不符合标准插入要求,因此只有A选项正确。DISTINCT关键字的核心作用是?A.对查询结果去重B.对查询结果排序C.对数据进行分组D.对数据进行筛选答案:A解析:排序使用ORDERBY关键字,分组使用GROUPBY关键字,筛选使用WHERE关键字,只有去重使用DISTINCT关键字,因此A选项正确。下列关于左连接(LEFTJOIN)的查询结果描述正确的是?A.仅返回两个表中关联条件匹配的行B.返回左表的所有行,右表中匹配关联条件的行会返回对应值,不匹配的返回NULLC.返回右表的所有行,左表中匹配关联条件的行会返回对应值,不匹配的返回NULLD.返回两个表的所有行,无论是否匹配关联条件答案:B解析:A选项是内连接(INNERJOIN)的特点,C选项是右连接(RIGHTJOIN)的特点,D选项是全连接(FULLJOIN)的特点,只有B选项是左连接的特点,因此B选项正确。执行UPDATE语句时如果忘记添加WHERE子句,会出现什么结果?A.仅更新表中的第一行数据B.数据库会报错,语句不执行C.更新表中所有行的对应字段值D.仅更新表中符合默认条件的行答案:C解析:UPDATE语句的WHERE子句用于指定需要更新的行范围,如果未添加WHERE子句,会默认对全表所有行的对应字段进行更新,这是SQL编写中非常容易出现的高危错误,因此C选项正确。下列删除某张表的所有数据和表结构的SQL语句,写法正确的是?A.DROPTABLE学生表B.DELETETABLE学生表C.REMOVETABLE学生表D.CLEARTABLE学生表答案:A解析:DELETE仅用于删除表中的数据,不会删除表结构,REMOVE、CLEAR均不属于SQL标准删除表的关键字,只有DROPTABLE会同时删除表的所有数据和表结构,因此A选项正确。若要查询学生表中排名第2到第10条的记录,分页查询的偏移量应当设置为?A.1B.2C.9D.10答案:A解析:SQL分页查询的偏移量从0开始计数,第1条记录对应偏移量0,因此第2条记录对应偏移量1,因此A选项正确。二、多项选择题(共10题,每题2分,共20分)下列SQL语句中,属于DML(数据操作语言)范畴的有?A.SELECTB.INSERTC.UPDATED.CREATE答案:ABC解析:DML是用于操作表中数据的语句,包含查询、插入、更新、删除四类,CREATE属于DDL(数据定义语言),用于创建表、库等结构,不属于DML范畴,因此正确选项为ABC。下列函数中,属于SQL标准聚合函数的有?A.SUM()B.COUNT()C.AVG()D.UPPER()答案:ABC解析:聚合函数是对一组值进行计算返回单个值的函数,SUM、COUNT、AVG都属于聚合函数,UPPER()是将字符串转为大写的字符串函数,不属于聚合函数,因此正确选项为ABC。下列运算符/关键字中,可以在WHERE子句中使用的有?A.=B.LIKEC.IND.GROUPBY答案:ABC解析:等于运算符=、模糊匹配运算符LIKE、范围匹配关键字IN都可以作为WHERE子句的筛选条件,GROUPBY是独立的分组子句,不能放在WHERE子句内部,因此正确选项为ABC。下列属于SQL标准支持的表约束类型的有?A.PRIMARYKEYB.FOREIGNKEYC.UNIQUED.CHECK答案:ABCD解析:SQL标准支持的约束包含主键约束(PRIMARYKEY)、外键约束(FOREIGNKEY)、唯一约束(UNIQUE)、检查约束(CHECK)、非空约束(NOTNULL)五类,因此四个选项均正确。下列属于SQL标准支持的联表查询连接类型的有?A.INNERJOINB.LEFTJOINC.RIGHTJOIND.CROSSJOIN答案:ABCD解析:内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、交叉连接(CROSSJOIN)均属于SQL标准支持的连接类型,因此四个选项均正确。下列关于GROUPBY子句的说法正确的有?A.SELECT子句中的非聚合列必须出现在GROUPBY子句中B.GROUPBY可以和HAVING子句搭配使用,筛选分组后的结果C.GROUPBY可以和ORDERBY子句搭配使用,对分组后的结果排序D.GROUPBY必须和聚合函数搭配使用,不能单独使用答案:ABC解析:GROUPBY的语法要求SELECT的非聚合列必须在GROUPBY中出现,避免逻辑混乱,因此A正确;HAVING就是用来筛选GROUPBY的分组结果,因此B正确;分组后的结果同样可以用ORDERBY排序,因此C正确;GROUPBY可以单独使用,作用是对指定列去重,不需要搭配聚合函数,因此D错误。下列关于DELETE和TRUNCATE的区别描述正确的有?A.DELETE可以通过WHERE子句筛选删除指定行,TRUNCATE只能清空全表所有数据B.TRUNCATE的执行速度比DELETE更快C.DELETE会触发表上的相关触发器,TRUNCATE不会触发触发器D.TRUNCATE支持事务回滚,DELETE不支持事务回滚答案:ABC解析:DELETE是逐行删除,支持WHERE筛选,TRUNCATE是直接释放数据页,只能清空全表,因此A正确;DELETE需要逐行记录操作日志,TRUNCATE仅记录数据页释放的日志,因此速度更快,B正确;DELETE是DML语句,会触发触发器,TRUNCATE是DDL语句,不会触发触发器,C正确;DELETE作为DML支持事务回滚,TRUNCATE作为DDL一般不支持回滚,因此D错误。下列关于SQL子查询的说法正确的有?A.子查询可以放在WHERE子句中,作为筛选条件B.子查询的结果可以作为临时表,供外层查询关联使用C.子查询支持多层嵌套D.子查询的执行顺序晚于外层查询答案:ABC解析:子查询可以作为WHERE的筛选条件,也可以作为临时表使用,支持多层嵌套,因此A、B、C均正确;子查询的执行顺序一般早于外层查询,先得到子查询的结果再交给外层查询使用,因此D错误。下列关于数据库索引的作用描述正确的有?A.可以大幅提升查询语句的执行效率B.会降低INSERT、UPDATE、DELETE等数据修改操作的速度C.可以通过唯一索引保证列值的唯一性D.表上的索引数量越多越好答案:ABC解析:索引通过提前排序存储的方式加快查询速度,唯一索引可以保证列值不重复,因此A、C正确;修改数据时需要同步维护索引结构,因此会降低增删改的速度,B正确;索引过多会占用大量存储空间,进一步拖慢增删改的速度,因此并不是越多越好,D错误。下列属于ALTERTABLE语句支持的操作的有?A.新增表字段B.修改已有字段的数据类型C.删除已有表字段D.修改表的名称答案:ABC解析:ALTERTABLE支持新增、修改、删除表字段,修改字段约束等操作,因此A、B、C正确;修改表名一般使用单独的RENAMETABLE语句,不属于ALTERTABLE的标准操作,因此D错误。三、判断题(共10题,每题1分,共10分)SQL关键字对大小写不敏感,SELECT和select的执行效果完全相同。答案:正确解析:绝大多数主流数据库对SQL关键字的大小写没有强制要求,仅部分对大小写敏感的数据库会对表名、字段名、数据值的大小写有要求,关键字本身大小写不影响执行效果,行业惯例一般将关键字大写提升可读性。COUNT(*)统计行数时,会包含列值为NULL的行。答案:正确解析:COUNT(*)统计的是表中的总行数,不会排除某列值为NULL的行;如果使用COUNT(列名)的写法,才会排除该列值为NULL的行。FOREIGNKEY外键约束的核心作用是保证两个表之间的参照完整性。答案:正确解析:外键约束要求从表的外键列值必须在主表的关联主键列中存在,避免出现无效的关联数据,保证两个表之间的参照关系合法。ORDERBY子句默认使用降序排序。答案:错误解析:ORDERBY子句默认使用ASC升序排序,如果需要降序排序,需要手动添加DESC关键字。使用LIKE进行模糊查询时,%通配符代表匹配任意单个字符。答案:错误解析:%通配符代表匹配0个或多个任意字符,_通配符才代表匹配任意单个字符。INSERT语句支持一次插入多条记录。答案:正确解析:SQL标准支持INSERTINTO表名(列名)VALUES(值1),(值2),(值3)…的语法,可以一次插入多条记录,提升插入效率。HAVING子句可以单独使用,不需要和GROUPBY子句搭配。答案:错误解析:HAVING子句的作用是筛选分组聚合后的结果,必须依附于GROUPBY子句使用,不能单独出现。TRUNCATETABLE语句会同时删除表的结构和所有数据。答案:错误解析:TRUNCATETABLE仅删除表中的所有数据,会保留表的结构;DROPTABLE语句才会同时删除表的结构和数据。UNION运算符合并两个查询结果时,会自动去除重复的记录。答案:正确解析:UNION的特性是合并结果集后自动去重,如果需要保留所有重复记录,应当使用UNIONALL运算符。视图是虚拟表,本身不存储实际数据,数据来自底层的基础表。答案:正确解析:视图仅存储对应的查询逻辑,查询视图时会执行对应的查询语句从底层基础表取数,本身不会持久化存储数据。四、简答题(共5题,每题6分,共30分)简述WHERE子句和HAVING子句的核心区别。答案:第一,作用阶段不同,WHERE是在分组和聚合计算之前对原始数据进行筛选,HAVING是在分组和聚合计算完成之后对分组结果进行筛选;第二,支持的内容不同,WHERE子句中不能使用聚合函数作为筛选条件,而HAVING子句可以直接使用聚合函数作为筛选条件;第三,依赖关系不同,WHERE可以单独使用,不需要搭配GROUPBY子句,而HAVING必须和GROUPBY子句配合使用,不能独立存在。解析:实际使用中应当尽量优先使用WHERE筛选数据,减少后续分组聚合的处理数据量,提升查询效率;只有需要对聚合结果进行筛选时,再使用HAVING子句。简述DELETE、TRUNCATE、DROP三种语句的核心区别。答案:第一,操作对象不同,DELETE和TRUNCATE仅操作表中的数据,保留表结构,DROP会同时删除表的数据和表结构;第二,操作性质不同,DELETE是DML数据操作语言,支持事务回滚,TRUNCATE和DROP是DDL数据定义语言,执行后一般无法回滚;第三,执行效率不同,DELETE需要逐行记录操作日志,执行速度慢,TRUNCATE直接释放数据页,执行速度快,DROP的执行速度最快;第四,触发规则不同,DELETE会触发表上的相关触发器,TRUNCATE和DROP不会触发触发器。解析:实际使用中需要删除指定行时使用DELETE加WHERE筛选,需要清空全表保留表结构时优先使用TRUNCATE,不需要保留该表时使用DROP语句。简述主键约束和唯一约束的核心区别。答案:第一,空值支持不同,主键约束要求列值非空且唯一,唯一约束允许列值存在一个NULL值;第二,数量限制不同,一个表只能有一个主键约束,但是可以有多个唯一约束;第三,作用定位不同,主键用来唯一标识表中的每一行记录,是表行的全局身份标识,唯一约束是用来避免业务列出现重复数据,不承担行标识的作用。解析:例如用户表中用户ID可以设为主键,作为用户行的唯一标识,用户的身份证号可以设为唯一约束,避免重复录入同一个身份证号的用户信息。简述常见的SQL注入攻击的预防手段。答案:第一,使用预编译语句也就是参数化查询,将SQL逻辑和用户输入的参数分离,避免用户输入的内容被解析为SQL语法的一部分;第二,对用户输入的内容进行严格校验,限制输入的长度、格式,过滤特殊字符和SQL关键字;第三,遵循最小权限原则,给数据库操作账号分配最小必要权限,避免账号拥有删表、修改表结构等高权限,降低注入后的危害;第四,避免在前端页面直接输出数据库的报错信息,防止攻击者通过报错信息获取数据库的表结构、字段等敏感信息。解析:预编译参数化查询是目前预防SQL注入最有效的手段,几乎所有主流开发框架都内置支持预编译功能,正确使用可以避免绝大多数SQL注入风险。简述索引的优缺点以及创建索引的注意事项。答案:第一,优点方面,索引可以大幅提升查询语句的执行效率,同时可以通过唯一索引保证列数据的唯一性,还可以加快表之间的关联查询速度;第二,缺点方面,索引会占用额外的存储空间,同时会减慢INSERT、UPDATE、DELETE等数据修改操作的速度,因为修改数据时需要同步维护对应的索引结构;第三,创建注意事项,优先给经常作为WHERE查询条件、JOIN关联条件、ORDERBY排序条件的列创建索引,避免给重复值多的列、很少查询的列、频繁修改的列创建索引,控制单表的索引数量,避免创建过多冗余索引。解析:索引是典型的空间换时间的优化手段,合理创建索引可以大幅提升系统性能,不合理的索引反而会拖慢系统整体运行效率,需要结合业务场景权衡创建。五、论述题(共3题,每题10分,共30分)结合实际业务场景,论述常用的SQL性能优化手段。答案:论点:SQL性能优化需要从数据筛选、索引使用、查询逻辑、表结构四个维度综合调整,结合业务场景选择最合适的优化手段,平衡性能收益和维护成本。论据:第一,优先进行数据提前筛选,减少后续处理的数据量。编写查询时尽量在最内层的WHERE子句中完成无关数据的过滤,避免后续分组、关联时处理大量无效数据。例如查询某部门工资高于5000元的员工平均工资,先在WHERE子句中筛选部门编号和工资高于5000元的员工,再进行分组计算,比先全表分组再用HAVING筛选部门和工资的写法,性能可以提升数倍,因为提前过滤了90%以上的无关数据。第二,合理创建和使用索引,避免索引失效。优先给高频查询条件、关联条件、排序条件的列创建联合索引,编写查询时避免在索引列上做函数计算、类型转换,避免使用不等于、开头模糊匹配等会导致索引失效的写法。例如用户表的手机号列创建了索引,查询条件写WHERELEFT(手机号,3)=’138’会导致索引失效,全表扫描耗时几秒,改成WHERE手机号LIKE’138%’就能正常使用索引,查询耗时可以降到几十毫秒。第三,优化查询逻辑,减少不必要的资源消耗。避免使用SELECT*查询所有字段,只查询业务需要的字段,减少数据传输和内存占用;避免多层嵌套子查询,尽量用关联查询代替;避免不必要的多表关联,适当冗余常用字段减少关联次数。例如订单表中冗余用户名字段,每次查询订单信息时就不需要关联用户表获取用户名,减少一次联表开销,对于高频查询场景性能提升非常明显。第四,合理优化表结构,降低查询复杂度。对于数据量超过百万级的大表,可以根据业务查询维度进行分表或者分区,避免单表数据量过大导致全表扫描耗时过长;对于长度较大且很少查询的字段,单独拆分到扩展表中,避免主表查询时加载大量无效大字段。结论:SQL性能优化不能盲目套用规则,需要先通过执行计划定位性能瓶颈,再针对性选择优化手段,同时要平衡优化的收益和代码的可维护性,避免过度优化导致后续业务迭代成本过高。结合实例论述SQL语句编写过程中的常见错误及规避方法。答案:论点:SQL编写常见错误可以分为语法错误、逻辑错误、性能错误、安全错误四类,通过良好的编写习惯和测试校验可以避免绝大多数错误,降低线上故障概率。论据:第一类是语法错误,常见的有SQL关键字拼写错误、字符串未加引号、列名或表名拼写错误、缺少语句结束符等,这类错误属于低级错误,但是非常容易出现。规避方法是使用支持语法检查的SQL编辑器编写语句,关键字统一大写更容易发现拼写错误,写完语句后先在测试环境执行验证,确认语法无误再提交。例如把SELECT拼写成SELETE,编辑器的语法检查会直接标红提示,不需要等到执行时才发现问题。第二类是逻辑错误,常见的有UPDATE、DELETE语句忘记加WHERE子句导致全表更新/删除、多表关联时缺少关联条件导致笛卡尔积、分组时非聚合列未放在GROUPBY中导致结果错误等,这类错误会导致数据损坏或者结果错误,危害非常大。规避方法是执行UPDATE、DELETE之前先写对应的SELECT语句确认筛选的行是否正确,确认无误后再执行修改语句;多表关联后先查询前10条数据,确认关联结果符合预期再全量查询;分组聚合后手动校验几条已知的结果,确认计算逻辑正确。例如要更新某个用户的手机号,先执行SELECT*FROM用户WHERE用户ID=xxx确认是要修改的目标用户,再执行UPDATE语句,避免误更新全表所有用户的手机号。第三类是性能错误,常见的有未加查询条件导致全表扫描、索引失效、关联过多表、子查询嵌套过深等,这类错误会导致查询耗时过长,影响系统稳定性。规避方法是写完复杂SQL后查看执行计划,确认是否走了正确的索引,是否存在全表扫描;对于关联超过3个表的复杂查询,考虑拆分多个简单查询或者冗余字段减少关联;避免嵌套超过3层的子查询,改成关联查询提升效率。例如一个关联了8个表的报表查询,执行耗时超过5秒,拆分成两个分别关联3个表的查询,总耗时可以降到几百毫秒。第四类是安全错误,最常见的是直接拼接用户输入到SQL语句中,导致SQL注入漏洞,攻击者可以利用漏洞盗取数据或者删除全表。规避方法是所有涉及用户输入的查询全部使用预编译参数化查询,绝对不要手动拼接SQL字符串。例如用户登录功能,如果直接把用户输入的账号密码拼接到SQL中,攻击者输入’OR1=1-就可以绕过登录验证,使用预编译查询的话,用户输入的内容会被当成普通字符串处理,不会被解析为SQL逻辑,完全避免注入风险。结论:SQL编写需要养成“先校验再执行、先测试再上线”的习惯,每一步都做好验证,就可以避免绝大多数常见错误,保障数据安全和系统稳定性。结合实例对比分析子查询和关联查询的适用场景及优劣。答案:论点:子查询和关联查询没有绝对的好坏之分,需要结合业务场景、数据量、性能要求、可维护性等多个维度综合选择最合适的写法。论据:首先明确两者的定义,子查询是嵌套在另一个查询中的查询语句,结果作为外层查询的条件或者临时表;关联查询是通过JOIN关键字将多

温馨提示

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

评论

0/150

提交评论