Mysql45题

Mysql45题,第1张

数据准备:

学生表 Student:

科目表 Course

教师表 Teacher

成绩表 SC

45题预览:

题目

1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数

1.1 查询同时存在" 01 "课程和" 02 "课程的情况

1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null ) 1.3 查询不存在" 01 "课程但存在" 02 "课程的情况

2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

3.查询在 SC 表存在成绩的学生信息

4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )

4.1 查有成绩的学生信息

5.查询「李」姓老师的数量

6.查询学过「张三」老师授课的同学的信息

7.查询没有学全所有课程的同学的信息

8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息

9.查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息

10.查询没学过"张三"老师讲授的任一门课程的学生姓名

11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息

13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

14.查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺 15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次

16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺 16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺

17.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比

18.查询各科成绩前三名的记录

19.查询每门课程被选修的学生数

20.查询出只选修两门课程的学生学号和姓名

21.查询男生、女生人数

22.查询名字中含有「风」字的学生信息

23.查询同名同性学生名单,并统计同名人数

24.查询 1990 年出生的学生名单

25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩

27.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数

28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)

29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数

30.查询不及格的课程

31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名

32.求每门课程的学生人数

33.假设成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

34.假设成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩

35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

36.查询每门功成绩最好的前两名

37.统计每门课程的学生选修人数(超过 5 人的课程才统计)。

38.检索至少选修两门课程的学生学号

39.查询选修了全部课程的学生信息

40.查询各学生的年龄,只按年份来算

41.按照出生日期来算,当前月日 <出生年月的月日则,年龄减一

42.查询本周过生日的学生

43.查询下周过生日的学生

44.查询本月过生日的学生

45.查询下月过生日的学生

详细

1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数

理清思路:

(1)学生信息和课程分数分布对应于student表和sc表

所以,我们需要把它们关联起来

(2)需要比较同一学生的不同成绩,所以需要再关联成绩表sc

(3)利用where进行筛选

1.1 查询同时存在" 01 "课程和" 02 "课程的情况

?什么叫做同时存在‘01‘和’02‘课程

?这里是指cid=’01‘ and cid ='02'?

理清思路:同一个学生既选了01课程,又选了02课程

1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )

?如何让不存在某课程时显示为null

利用左关联(left join)

?case when--no

1.3 查询不存在" 01 "课程但存在" 02 "课程的情况

思路:找到不存在01课程的记录后,

然后再进行关联(Inner join)找存在02的课程

或者

2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

思路:

成绩在sc表,学生姓名在student表,二者可以通过学生编号sid进行关联。

首先,从sc表中查询平均成绩大于60的学生的信息

ERROR 1111 (HY000): Invalid use of group function

出现这个错就要往group by这里考虑,要记得:group by +having+聚合函数。

一些错误尝试:

成功查询:

接着:通过学生编号sid与student表进行关联

发现结果明显不对,

继续修改:

注意:多个表进行关联时要明确字段的归属表;查询聚合函数的结果时,比如avg(score),最好进行重命名。

存在疑问:

上面两种写法的差别就在于 子查询的avg(score)是否重命名,但是二者的结果明显有差异,想请问是为什么?是不是哪里没注意到?

解答:

mysql对于group by的特殊规定:

如果用了group by,select语句里除了group by后面跟着的列名以外,只能有聚合函数。

如果除了group by后面跟着的列名和聚合函数还有其他列名,sql就会只输出第一行,而且如果是'*',也会只输出第一行记录。

举例说明:

总结:

如果用了group by +聚合函数,那么在查询的时候最好是只查询聚合函数(+group by 后的列名)避免在查询其余字段时只显示一条记录的情况。

注意:聚合函数是一定要查询的。

3.查询在 SC 表存在成绩的学生信息

思路:

(1)首先确定表:sc表和student表

发现名字有重复,

(2)利用group by sid去除重复的学生信息查询,具体如下:

注意:更严谨的写法:

(1)先写查询分组字段的子查询

(2)将(1)中的字段进行嵌套查询

注意:group by是分开写的

4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null

(1)确定涉及的表的范围:

student,sc

(2)

思路:

修改:

(2)

(3)

也可以考虑先连接在查询,但还是建议上述这种方式。

4.1 查有成绩的学生信息

(1)首先确定使用的表范围

sc和student

(2)首先获得成绩表上的学生id

(3)根据id去查学生信息

?这个和第三题是完全一样的吗

回答:思路基本一致。

参考答案:

思路是:看学生表上的id是否在sc表的id中(即,判断存在)in/exists

5.查询「李」姓老师的数量

6.查询学过「张三」老师授课的同学的信息

(1)四张表都要用到

(2)四个嵌套

有什么简便方法吗?

回答:参考答案也是逐步嵌套查询实现的。

7.查询没有学全所有课程的同学的信息

(1)关键词:‘所有课程’在course表,‘同学信息’在student表,但是二者需要sid进行关联,所以还需要用到sc表

(2)如何筛选'所有课程’??

利用课程数目来进行限定。

a.course表获取总课程数

b.按照sid分组,对sc表中的课程数进行计数

c.接着从sc中筛选出课程数=3的学生sid

d.查询(3)中对应学生sid的学生信息

8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息

(1)关键词:

‘至少有一门课’--课程in学号01同学的课程,‘学号01同学的课程’--course表,‘同学信息’--student表

(2)思路:

a. 01同学学习了什么课程

发现01同学三门课程都学了,所以其余学生只要学习的课程数大于0即可。

b. 学号01之外的学生id有哪些

c. 如何查询其余学生的课程信息,比如cid?

利用其余学生的id进行分组再计数,筛选

出次数大于0的学生id,再根据该id进行学生信息的查询。

9.查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息

(1)确定相关表:

’01号同学学习的课程‘-sc表;

’其他同学的信息‘-student表;

(2)思路:

a. 01号同学学习了哪些课程

发现01同学学了三门课,

b.再查询总共有几门课?

所以,总共有3门课,01同学全部学习了,

c. 查询其余学生中学习课程数目为3的学生id

d. 再跟进相应id在student表中查询学生信息

10.查询没学过"张三"老师讲授的任一门课程的学生姓名

(1)确定相关表:

‘张三老师tid’--teacher;

‘张三老师授课cid’--course;

‘被授课的学生sid’--sc;

‘学生姓名sname’--student;

先找出学习过张三老师课程的学习,再not in即可。

(2)思路:

a.从teacher表中查询张三老师的tid

b.从course表中查询张三老师的授课cid

c. 从sc中查询学习cid=02的学生sid

d.利用not in 查询没学过张三老师课程的学生信息

11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

(1)根据关键字确定相关表:

‘不及格课程数>2’ score<60--sc表,且count(1)>3

'姓名'--student 表

(2)思路:

a. 从sc表查询score小于60的sid,并根据sid分组计数

b.内连接得到不及格课程数目大于等于2的sid,sname以及avg_score

12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息

(1)根据关键词确定相关表:

‘01课程分数小于60’ --sc表

‘学生信息’--student

(2)思路及实现:

a.先从sc表查询01课程分数小于60并按分数降序排列的学生信息

b.根据(1)中的sid从student中查询学生信息

13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

(1)根据关键词确定相关表

‘平均成绩’--sc表

(2)思路及实现过程:

a. 先按照平均成绩从高到低显示学生sc

还要显示每个学生的每一科目的成绩吗?

回答:是的,给sc表增加一列avg_score。

14.查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

(1)根据关键词确定相关表:

‘成绩’ --sc;

‘课程name’--course;

(2)思路及实现:

a. 按照cid对sc表进行分组,并进行初步聚合函数的查询

b.继续完善

?如何计算各种率

回答:考察条件计数的技巧 case when

修改成题目要求格式:

15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺

(1)根据关键词确定相关表:

sc表

(2)思路:

借助赋值变量@i实现

a.原始数据增加一列@rank

b.

没有指定关联条件的inner join (笛卡尔积),每一行都会与之进行关联

注意:

篇幅所限本文只写了MySQL25题,像其他的Redis,SSM框架,算法,计网等技术栈的面试题后面会持续更新,个人整理的1000余道面试八股文会放在文末给大家白嫖,最近有面试需要刷题的同学可以直接翻到文末领取。

如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果使用非自增主键(如果身份z号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置, 频繁的移动、分页 *** 作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE(optimize table)来重建表并优化填充页面。

Server层按顺序执行sql的步骤为:

简单概括:

可以分为服务层和存储引擎层两部分,其中:

服务层包括连接器、查询缓存、分析器、优化器、执行器等 ,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

存储引擎层负责数据的存储和提取 。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认的存储引擎。

Drop、Delete、Truncate都表示删除,但是三者有一些差别:

Delete 用来删除表的全部或者一部分数据行,执行Delete之后,用户需要提交(commmit)或者回滚(rollback)来执行删除或者撤销删除,会触发这个表上所有的delete触发器。

Truncate 删除表中的所有数据,这个 *** 作不能回滚,也不会触发这个表上的触发器,TRUNCATE比Delete更快,占用的空间更小。

Drop 命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。

因此,在不再需要一张表的时候,用Drop;在想删除部分数据行时候,用Delete;在保留表而删除所有数据的时候用Truncate。

隔离级别脏读不可重复读幻影读 READ-UNCOMMITTED 未提交读READ-COMMITTED 提交读REPEATABLE-READ 重复读SERIALIZABLE 可串行化读

MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ (可重读)

这里需要注意的是 :与 SQL 标准不同的地方在于InnoDB 存储引擎在 REPEATABLE-READ(可重读)事务隔离级别 下使用的是 Next-Key Lock 锁 算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以 说InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 已经可以完全保证事务的隔离性要 求,即达到了 SQL标准的SERIALIZABLE(可串行化)隔离级别。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内 容):,但是你要知道的是InnoDB 存储引擎默认使用 REPEATABLE-READ(可重读)并不会有任何性能损失

InnoDB 存储引擎在分布式事务 的情况下一般会用到SERIALIZABLE(可串行化)隔离级别。

主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。

文件与数据库都是需要较大的存储,也就是说,它们都不可能全部存储在内存中,故需要存储到磁盘上。而所谓索引,则为了数据的快速定位与查找,那么索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数,因此B+树相比B树更为合适。数据库系统巧妙利用了局部性原理与磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入,而红黑树这种结构,高度明显要深的多,并且由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性。

最重要的是,B+树还有一个最大的好处:方便扫库。

B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持,这是数据库选用B+树的最主要原因。

B+树查找效率更加稳定,B树有可能在中间节点找到数据,稳定性不够。

B+tree的磁盘读写代价更低:B+tree的内部结点并没有指向关键字具体信息的指针(红色部分),因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一块盘中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多,相对来说IO读写次数也就降低了;

B+tree的查询效率更加稳定:由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引,所以,任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;

视图是一种虚拟的表,通常是有一个表或者多个表的行或列的子集,具有和物理表相同的功能 游标是对查询出来的结果集作为一个单元来有效的处理。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

而在 MySQL 中,恢复机制是通过回滚日志(undo log)实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后在对数据库中的对应行进行写入。当事务已经被提交之后,就无法再次回滚了。

回滚日志作用:1)能够在发生错误或者用户执行 ROLLBACK 时提供回滚相关的信息 2) 在整个系统发生崩溃、数据库进程直接被杀死后,当用户再次启动数据库进程时,还能够立刻通过查询回滚日志将之前未完成的事务进行回滚,这也就需要回滚日志必须先于数据持久化到磁盘上,是我们需要先写日志后写数据库的主要原因。

InnoDB

MyISAM

总结

数据库并发会带来脏读、幻读、丢弃更改、不可重复读这四个常见问题,其中:

脏读 :在第一个修改事务和读取事务进行的时候,读取事务读到的数据为100,这是修改之后的数据,但是之后该事务满足一致性等特性而做了回滚 *** 作,那么读取事务得到的结果就是脏数据了。

幻读 :一般是T1在某个范围内进行修改 *** 作(增加或者删除),而T2读取该范围导致读到的数据是修改之间的了,强调范围。

丢弃修改 :两个写事务T1 T2同时对A=0进行递增 *** 作,结果T2覆盖T1,导致最终结果是1 而不是2,事务被覆盖

不可重复读 :T2 读取一个数据,然后T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。

第一个事务首先读取var变量为50,接着准备更新为100的时,并未提交,第二个事务已经读取var为100,此时第一个事务做了回滚。最终第二个事务读取的var和数据库的var不一样。

T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。

T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。例如:事务1读取某表中的数据A=50,事务2也读取A=50,事务1修改A=A+50,事务2也修改A=A+50,最终结果A=100,事务1的修改被丢失。

T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。

悲观锁,先获取锁,再进行业务 *** 作,一般就是利用类似 SELECT … FOR UPDATE 这样的语句,对数据加锁,避免其他事务意外修改数据。当数据库执行SELECT … FOR UPDATE时会获取被select中的数据行的行锁,select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。

乐观锁,先进行业务 *** 作,只在最后实际更新数据时进行检查数据是否被更新过。Java 并发包中的 AtomicFieldUpdater 类似,也是利用 CAS 机制,并不会对数据加锁,而是通过对比数据的时间戳或者版本号,来实现乐观锁需要的版本判断。

分库与分表的目的在于,减小数据库的单库单表负担,提高查询性能,缩短查询时间。

通过分表 ,可以减少数据库的单表负担,将压力分散到不同的表上,同时因为不同的表上的数据量少了,起到提高查询性能,缩短查询时间的作用,此外,可以很大的缓解表锁的问题。分表策略可以归纳为垂直拆分和水平拆分:

水平分表 :取模分表就属于随机分表,而时间维度分表则属于连续分表。如何设计好垂直拆分,我的建议:将不常用的字段单独拆分到另外一张扩展表. 将大文本的字段单独拆分到另外一张扩展表, 将不经常修改的字段放在同一张表中,将经常改变的字段放在另一张表中。对于海量用户场景,可以考虑取模分表,数据相对比较均匀,不容易出现热点和并发访问的瓶颈。

库内分表 ,仅仅是解决了单表数据过大的问题,但并没有把单表的数据分散到不同的物理机上,因此并不能减轻 MySQL 服务器的压力,仍然存在同一个物理机上的资源竞争和瓶颈,包括 CPU、内存、磁盘 IO、网络带宽等。

分库与分表带来的分布式困境与应对之策 数据迁移与扩容问题----一般做法是通过程序先读出数据,然后按照指定的分表策略再将数据写入到各个分表中。分页与排序问题----需要在不同的分表中将数据进行排序并返回,并将不同分表返回的结果集进行汇总和再次排序,最后再返回给用户。

不可重复读的重点是修改,幻读的重点在于新增或者删除。

视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的 sql *** 作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。

视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有order by 则对视图再次order by将被覆盖。

创建视图:create view xxx as xxxx

对于某些视图比如未使用联结子查询分组聚集函数Distinct Union等,是可以对其更新的,对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。

B+tree的磁盘读写代价更低,B+tree的查询效率更加稳定 数据库索引采用B+树而不是B树的主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。

B+树的特点

在最频繁使用的、用以缩小查询范围的字段,需要排序的字段上建立索引。不宜:1)对于查询中很少涉及的列或者重复值比较多的列 2)对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。

如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称 之为“覆盖索引”。

我们知道在InnoDB存储引 擎中,如果不是主键索引,叶子节点存储的是主键+列值。最终还是要“回表”,也就是要通过主键再查找一次,这样就 会比较慢。覆盖索引就是把要查询出的列和索引是对应的,不做回表 *** 作!

举例

学号姓名性别年龄系别专业 20020612李辉男20计算机软件开发 20060613张明男18计算机软件开发 20060614王小玉女19物理力学 20060615李淑华女17生物动物学 20060616赵静男21化学食品化学 20060617赵静女20生物植物学

主键为候选键的子集,候选键为超键的子集,而外键的确定是相对于主键的。

一、不定项选择题(共40题,每小题2.5分,总分100分)1. 数据库管理系统的发展历经了如下那些模型阶段( ACDE )A. 层次模型 B. 结构模型 C. 关系模型D. 网状模型 E.对象模型2. 关系型数据库的核心单元是(B)A. 对象B. 表C. 行 D. 列3. 对于关系型数据库来说,表之间存在下面那些关系( ABC )A. 一对一关系 B. 一对多关系C. 多对多关系 D. 继承关系4. 在SQL中,下面对于数据定义语言(DDL)描述正确的是( D )。A. DDL关心的是数据库中的数据 B. 完成数据的增、删、改、查 *** 作C. 控制对数据库的访问D. 定义数据库的结构5. MySQL是一种(C)数据库管理系统。A. 层次型 B. 网络型C. 关系型 D. 对象型6. SQL中,下列 *** 作有语法错误的是( B )A. AGE IS NOT NULL B. NOT(AGE IS NULL)C. SNAME=‘王五’D. SNAME=‘王%’7. SQL中,下列关于创建、管理数据库的 *** 作语句不正确的是( CDE )A. CREATE DATABASE InstantB. USE Instant C. NEW DATABASE Instant D. Connection InstantE. Delete DATEBASE Instant8. 在MySQL中,不存在的数据类型是(F)。A. INT B. TEXT C. DECIMALD. VARCHAR E. DATETIME F. VARCHAR2 9. 在MySQL中,下列关于创建数据库表的描述正确的是( C )。A. 在创建表时必须设定列的约束B. 在删除表的时候通过外键约束连接在一起的表会被一同删除C. 在创建表时必须设置列类型 D. 通过CREATE TABLE new_t SELECT * FROM old_t复制表的同时,表的约束能够一起被复制到新表中10. 根据数据完整性实施的方法,可以将其分为( ACDF )A. 实体完整性 B. 表完整性 C.域完整性D. 引用完整性 E. 记录完整性F.用户自定义完整性11. 下面关于域完整性的方法,不正确的是( A )。A. 主键约束B. 外键约束C.检查约束D. 非空约束E. 默认值12. 下面关于创建和管理索引正确的描述是( C )。A. 创建索引是为了便于全表扫描B. 索引会加快DELETE、UPDATE和INSERT语句的执行速度C. 索引被用于快速找到想要的记录D. 大量使用索引可以提高数据库的整体性能13. SQL中,“AGE IN(20,22)”的语义是( D )。A. AGE<=22 AND AGE >=20 B. AGE <22 AND AGE >20C. AGE =20 AND AGE =22D. AGE =20 OR AGE =2214. 有一个关系:学生(学号,姓名,系别),规定学号的值域是8个数字组成的字符串,这一规则属于(C)A. 实体完整性约束B. 参照完整性约束C. 用户自定义完整性约束 D. 关键字完整性约束15. 下面SQL是来源于考试成绩表t_exam:学号stuId、科目编号subId、成绩score,考试日期:ex_date。有以下sql,它表示的意思是:( B )Select stu_id,subId,count(*) as xFrom t_examWhere ex_date=’2008-08-08’Group stu_id,subIdHaving count(*)>1 Order by x descA. 找出’2008-08-08’这天某科考试2次及以上的学生记录B. 找出’2008-08-08’这天,某科考试2次及以上的学生记录,考试次数多的放在前面C. 找出’2008-08-08’这天,某科考试2次及以上的学生记录,考试次数少的放在前面D. 根据学号和学科分组,找出每个人考试科数,最后考试次数多的放在前面16. EMP表如下所示,下面哪些SQL语句的返回值为3:( BD )EMP雇员号 雇员名 部门号 工资 001  张山  02 2000010  王宏达 01 1200056  马林生 02 1000101  赵敏04 A. select count(*) from empB. select count(distinct 部门号) from empC. select count(*) from emp group by 雇员号D. select count(工资) from emp17. 下面那一项不是SELECT语句对数据的 *** 作:(D)A. 投影B. 联接C. 并 D. 级联18. 下面关于SQL数据查询 *** 作描述正确的有:( ABD )A. 投影 *** 作是选择对表中的哪些列进行查询 *** 作B. 使用DISTINCT关键字可以过滤查询中重复的记录C. 在模糊查询中,通配符“%”表示匹配单个字符,而“_”表示匹配零个或多个字符D. 在MySQL中使用LIMIT关键字限制从数据库中返回记录的行数19. 在SQL语言中,条件“BETWEEN 20 AND 30”表示年龄在20到30之间,且( A )。A. 包括20岁和30岁B. 不包括20岁和30岁C. 包括20岁,不包括30岁 D. 不包括20岁,包括30岁20. SQL语言中,删除EMP表中全部数据的命令正确的是(C)。A. delete * from emp B. drop table empC. truncate table emp D. 没有正确答案21. 有关索引的说法错误的是( AD )A. 索引的目的是为增加数据 *** 作的速度B. 索引是数据库内部使用的对象C. 索引建立得太多,会降低数据增加删除修改速度D. 只能为一个字段建立索引22. 下列哪个关键字在Select语句中表示所有列( A )A. * B. ALL C. DESC D. DISTINCT23. 在表中设置外键实现的是哪一类数据完整性( B )A. 实体完整性 B. 引用完整性C. 用户定义的完整性 D. 实体完整性、引用完整性和用户定义的完整性24. 下面正确表示Employees表中有多少非NULL的Region列的SQL语句是( B )A. SELECT count(* ) from EmployeesB. SELECT count(ALL Region) from EmployeesC. SELECT count(Distinct Region) from EmployeesD. SELECT sum(ALL Region) from Employees25. 下面可以通过聚合函数的结果来过滤查询结果集的SQL子句是(C)A. WHERE子句 B. GROUP BY子句C. HAVING 子句 D. ORDER BY子句26. t_score(stu_id,sub_id,score),即成绩表(学号,科目编号,成绩)。学生如果某科没有考试,则该科成绩录入null。能够获取各位学生的平均成绩的选项是( A )A. select avg(nvl(socre,0)) from score group by stu_idB. select stu_id,avg(sorce) from scoreC. select stu_id,avg(score) from scoreD. select stu_id,sum(score)/count(score) from score27. 若要求查找S表中,姓名的第一个字为'王'的学生学号和姓名。下面列出的SQL语句中,哪个是正确的(B)A. SELECT Sno,SNAME FROM S WHERE SNAME=′王%′B. SELECT Sno,SNAME FROM S WHERE SNAME LIKE′王%′C. SELECT Sno,SNAME FROM S WHERE SNAME LIKE′王_′D. 全部28. 若要求“查询选修了3门以上课程的学生的学生号”,正确的SQL语句是( B )A. SELECT Sno FROM SC GROUP BY Sno WHERE COUNT(*)>3B. SELECT Sno FROM SC GROUP BY Sno HAVING( COUNT(*)>3)C. SELECT Sno FROM SC ORDER BY Sno WHERE COUNT(*)>3D. SELECT Sno FROM SC ORDER BY Sno HAVING COUNT(*)>= 329. 对下面的查询语句描述正确的是(D)Select StudentID,Name, (select count(*) from StudentExamwhere StudentExam.StudentID = Student.StudentID) as ExamsTakenfrom Studentorder by ExamsTaken descA. 从Student表中查找StudentID和Name,并按照升序排列B. 从Student表中查找StudentID和Name,并按照降序排列C. 从Student表中查找StudentID、Name和考试次数D. 从Student表中查找StudentID、Name,并从StudentExam表中查找与StudentID一致的学生考试次数,并按照降序排列30. 下面题基于学生-课程数据库中的三个基本表:学生信息表:s(sno, sname, sex, age, dept) 主键为sno课程信息表:c(cno, cname, teacher) 主键为cno学生选课信息表:sc(sno, cno, grade) 主键为(sno, cno)“从学生选课信息表中找出无成绩的学生信息”的SQL语句是( C d)A. SELECT * FROM sc WHERE grade=NULLB. SELECT * FROM sc WHERE grade IS ‘ ’C. SELECT * FROM sc WHERE grade IS NULLD. SELECT * FROM sc WHERE grade =‘ ’31. 当子查询返回多行时,可以采用的解决办法是( C )。A. 使用聚合函数 B. Where条件判断C. 使用IN运算符D. 使用Group by进行分组32. 下面关于在子查询中使用运算符描述不正确的是( D )。A. 使用IN运算符用于查找字段值属于某一组值的行B. 使用Exists运算符用于测试子查询是否返回行,如果返回其值就为真C. 使用ALL运算符用于测试子查询结果集的所有行是否满足指定的条件D. 使用Any运算符用于测试子查询结果集中的一行或多行不满足指定的条件33. 下面关于组合查询描述不正确的是(D )。A. 从一个表中获取的数据必须和其它表中的数据具有相同的列数B. 两个表中相对应的列必须具有相同的数据类型C. UNION的结果集列名与第一个SELECT语句的结果集中的列名相同D. UNION的结果集列名与第二个SELECT语句的结果集中的列名相同E. UNION ALL运算符返回每个数据集的所有成员34. 下面关于联接的描述正确的是(A)。A. 内联接使用比较运算符根据每个表共有的列值来匹配两个表中的行B. 左外联接结果集包含从右边的表返回的所有行C. 右外联接结果集包含从左边的表返回的所有行D. 全外联接返回左表和右表中的所有匹配的行35. 下面关于数据库设计过程正确的顺序描述是( C )。A. 需求收集和分析、逻辑设计、物理设计、概念设计B. 概念设计、需求收集和分析、逻辑设计、物理设计C. 需求收集和分析、概念设计、逻辑设计、物理设计D. 需求收集和分析、概念设计、物理设计、逻辑设计36. ER图属于下面哪一种数据库设计模型( B )。A. 物理数据模型B. 概念数据模型C. 逻辑数据模型D. 需求模型37. 非主键必须完全依赖于主键列,这属于下列范式的内容( BC )A. 1NFB. 2NF C. 3NFD. 都没有的38. 如果一个字段的数据必须来源另一个表的主键,那么要在这个字段上建立( B )。A. PK(主键) B. FK(外键) C. UK(唯一键) D. 复合主键39. 根据三个范式的定义,下面哪个选项的设计是正确的( C )职工编号姓名工种车间车间主任1001 李宁车工一车间 周杰1002 王海铣工一车间 周杰1003 赵亮钳工二车间 吴明1001 李宁钳工二车间 吴明A. 员工表、工种表、车间表B. 员工表、工种表、车间表、车间主任表C. 员工表、工种表、车间表、员工工种表、员工车间表D. 以上设计均不正确 40. 下列说法中,哪些是正确的( BD )A. RDBMS是数据库管理系统的简称B. 各行记录都不能重复,是第二范式要求的C. 在数据库设计中一定要满足第三范式D. 索引越多,查询越快,数据更新越慢


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7244473.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存