SQL测试题及答案

SQL测试题

1.你怎么设计数据库?
2.什么是数据库索引?索引的种类有哪些?

3.什么情况下设置了索引但无法使用 (什么情况下索引会失效)?
4.说说对 SQL 语句优化有哪些方法?
5.Statement 接口与 PreparedStatement 接口区别
6.在进行数据库编程时,连接池有什么作用?
7.事务的 ACID 是指什么?
8.编写以下 3 条 SQL 语句
有以下这个表:
Student(S
Course(C
SC(S
Teacher(T
(1)查询所有同学的学号、姓名、选课数、总成绩;
(2)查询不同老师所教不同课程平均分从高到低显示
(3)查询课程编号"002"的成绩比课程编号"001"课程低的所有同学的学号、姓
名;

1.你怎么设计数据库?

1)收集数据
2)标识对象
3)标识每个对象的属性
4)标识对象之间的关系
5)绘制E-R图
6)将E-R转换为表格
7)应用三大范式规范化表格
三大范式:
第一范式:无重复的列。
第二范式:属性完全依赖于主键。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。
第三范式:属性不依赖于其它非主属性。第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

2.什么是数据库索引?索引的种类有哪些?

数据库索引:
    数据库索引是对数据库表中一列或多列的值进行排序的一种结构,
    使用索引可快速访问数据库表中的特定信息。
    在数据库中,索引的含义与日常意义上的"索引"一词并无多大区别(就像查字典一样),
    它是用于提高数据库表数据访问速度的数据库对象。

索引类型:
    唯一索引、主键索引、聚集索引
1)唯一索引:
    唯一索引是不允许其中任何两行具有相同索引的索引。
2)主键索引:
    数据库表中一列或列组合(字段)的值唯一标识表中的每一行。该列称为表的主键。
3)聚集索引:
    在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。
    如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。

3.什么情况下设置了索引但无法使用 (什么情况下索引会失效)?

1)如果条件中有or,即使其中有条件也不会使用
2)对于多列索引,不是使用的第一部分,则不会使用索引
3)like查询是以%开头
4)如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不适用索引
5)如果mysql预计使用全表扫描要比使用索引块,则不使用索引

4.说说对 SQL 语句优化有哪些方法?

1)对查询进行优化,要尽量避免全表扫描,首先考虑在where及order by 涉及的列上建立索引。

2)应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃索引而进行全表扫描,如:
select id from t where num is null;
最好不要给数据库留NULL,尽可能使用NOT NULL填充数据库
备注、描述、评论之类的可以设置为NULL,其他的,最好不要使用NULL

3)应尽量避免在where子句中使用 != 或 <> 操作符,否则引擎将放弃使用索引而进行全表扫描。

4)应尽量避免在where子句中使用or来连接条件,
如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,
如:
select id from t where num=10 or name='admin';
上面语句可以换成这样查询:
select id from t where num=10
union all
select id from t where name='admin';

5)in和not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用between就不要用in了:
select id from t where num between 1 and 3
很多时候用exists代替in是一个很好的选择。

5.Statement 接口与 PreparedStatement 接口区别

关系:preparedstatement继承自Statement接口;
区别:
1)Statement用于执行静态SQL语句并返回它所生成结果的对象。
2)preparedStatement接口代码可读性高,无需拼接SQL语句,语句和代码分离。
3)preparedStatement接口执行效率高,它预编译和缓存了结构相同的SQL语句。
4)PreparedStatement接口安全性更高,避免了产生SQL注入。
5)Statement接口在创建语句对象时,不带参数,进行查询更新操作时,再传入完整的SQL语句;
而PreparedStatement接口创建预处理语句对象,传入带?的SQL语句,进行查询更新操作,而且不带参数。

6.在进行数据库编程时,连接池有什么作用?

 由于创建连接和释放连接都有很大开销(尤其是数据库服务器不在本地时,每次建立都需要进行TCP的三次握手,
释放连接需要进行TCP四次握手,造成的开销是不可忽视的)。
    为了提升系统访问数据库的性能,可以事先创建若干连接置于连接池中,需要时直接从连接池获取,使用结束
    时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销,这是典型的用空间换取时间的策略。
    (浪费了空间存储连接,但节省了创建和释放连接的时间)

7.事务的 ACID 是指什么?

actomicity(原子性):
    表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败
consistency(一致性):
    表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态
isolation(隔离性):
    事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,
    要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
durability(持久性):
    持久性事务完成之后,它对于系统的影响是永久性的。

8.编写以下 3 条 SQL 语句
有以下这个表:

Student(S
Course(C
SC(S
Teacher(T

(1)查询所有同学的学号、姓名、选课数、总成绩;

select s.sno 学号,s.Sname 姓名,count(SC.cno) 选课数,sum(SC.score) 总成绩
from Student s,SC
where s.sno=SC.sno group by SC.sno,s.sname;

(2)查询不同老师所教不同课程平均分从高到低显示

select avg(SC.score)  from Teacher t,Course c,SC
where t.tid=c.tid and c.cno=SC.cno
group by t.tid  order by avg(SC.score) desc;

(3)查询课程编号”002″的成绩比课程编号”001″课程低的所有同学的学号、姓名;

select t1.sno,t1.sname from
(select s.sno,s.sname,score  from Student s,Course c,SC where s.sno=SC.sno and c.cno=SC.cno and c.cno='002') as t1,
(select s.sno,s.sname,score  from Student s,Course c,SC where s.sno=SC.sno and c.cno=SC.cno and c.cno='001') as t2
where  t1.sno=t2.sno and t1.score<t2.score;

本篇测试题的答案不唯一,仅供参考。如有更好的答案或者建议可在下方留言,我会第一时间留意更新。

Original: https://blog.csdn.net/weixin_45819587/article/details/119989520
Author: 进击的小白hyh
Title: SQL测试题及答案

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/817161/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球