牛客网-SQL专项训练20

①学生、书店和图书三个实体集之间的联系属于:多元联系。

解析:

参与联系的实体集个数大于2个时,为多元联系;这里学生、书店、图书是三个实体,为多元联系。

二元联系指只有两个实体集参与的联系;

自反联系描述了同一实体集内两部分实体之间的联系,是一种特殊的二元联系;一对一联系是二元联系下的一种细分。

②下列不属于触发事件的是(A)

 触发器是与表有关的数据库对象,在 insert/update/delete 之前或之后触发并执行触发器中定义的 SQL语句

 

 AFTER触发器又称后触发器,在执行了INSERT、UPDATE、DELETE语句操作之后执行AFTER触发器。

 ③检索销量表中销量最好的商品id和销量(假设每件商品只有一个订单),下列SQL语句正确的是(D)

 

 解析:

A选项:where子句后面不能使用聚合函数max()

B、C选项:首先B选项的group by 销量,这个销量并没有在Select后面出现,语法就是错误的。C选项,就对商品id进行分组,然后找寻最大销量,题中说假设每件商品只有一个订单,其实这效果等同于查询所有的数据---select * from  销量表

D选项:先从销量表中找到最大销量值,然后再找到销量和最大销量值相同的商品。就算是有销量一样的不同商品,那么查询出来的将是多个销量相同的商品,也是符合题意的。

④”确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新”是对下列选项哪一个事务隔离级别的描述()

解析:

在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。
● 未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
● 授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
● 可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
● 序列化(Serializable):提供严格的事务隔离。最严格的事务隔离级别,要求所有事物被串行执行,不能并发执行,可避免脏读、不可重复读,幻读情况的发生。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。读未提交是事务隔离级别的最低级别; 

⑤表结构如下:

以下查询语句结果是:

 解析:

count(字段):不会统计null值。

A.SELECT sum(score) / count(*) FROM score WHERE cno = 2;
count(*)统计是所有学生的个数,就算成绩为空, sum(score) / count(*)得到的也是所有学生的平均分数

B.SELECT sum(score) / count(id) FROM score WHERE cno = 2;
id为非空,从而count(id)得到也是学生的个数,sum(score) / count(id)也是所有学生的平均分数

C.SELECT sum(score) / count(sno) FROM score WHERE cno = 2;
sno为非空,从而count(sno)得到也是学生的个数,sum(score) / count(sno)也是所有学生的平均分数

D.SELECT sum(score) / count(score) FROM score WHERE cno = 2;
score可能为空,空值在统计时会被忽略,所以count(score)和sum(score)统计的只是score不为空的学生的成绩,计算得到的平均分也只是有成绩的学生的平均分,无法计算所有学生的平均分。

E.SELECT sum(score) / count(1) FROM score WHERE cno = 2;
count(1)的统计结果也包含null,与count(*)一样,所以得到的还是所有学生的平均成绩

F.SELECT avg(score) FROM score WHERE cno = 2;
avg(score)会忽略掉为空值的学生,计算的是有成绩的学生

 

posted on 2022-09-22 21:16  我不想一直当菜鸟  阅读(121)  评论(0编辑  收藏  举报