数据库与 SQL练习卷(附答案)

免费可打印的数据库与 SQL练习卷:8 道题,从简单到考试水平,附答案。可打印或另存为 PDF。

教师请注意: 可免费打印、复印并在课堂上使用。每份新练习题都有新的数值和独立的答案。欢迎在课程页面添加指向 ExamProblems 的链接。

姓名: ____________________   日期: ____________

1.简单

什么是代理键?

  1. A由电子邮件地址等真实数据构成的键
  2. B引用另一个表的键
  3. C只在视图中使用的键
  4. D没有业务含义的人工标识符,例如自增 id
2.简单

哪条 SQL 语句向表中添加新行?

  1. AALTER
  2. BSELECT
  3. CUPDATE
  4. DINSERT
3.简单

INNER JOIN 返回:

  1. A仅返回两个表中值相匹配的行
  2. B两个表中的所有行
  3. C左表中的所有行,没有匹配时以 NULL 填充
  4. D不匹配的行
4.中等

什么是脏读?

  1. A读取另一个尚未提交的事务所写入的数据
  2. B两次读取同一行并得到相同的值
  3. C从损坏的磁盘读取数据
  4. D不带 WHERE 子句读取数据
5.中等

函数依赖 A → B 是什么意思?

  1. AB 的每个值都恰好对应 A 的一个值
  2. BA 的每个值都恰好对应 B 的一个值
  3. CA 是引用 B 的外键
  4. DA 和 B 都是主键
6.中等

哪个查询返回每个部门的最高工资?

  1. ASELECT dept, MAX(salary) FROM emp GROUP BY dept
  2. BSELECT dept, MAX(salary) FROM emp ORDER BY dept
  3. CSELECT MAX(dept), salary FROM emp GROUP BY salary
  4. DSELECT dept, salary FROM emp WHERE salary = MAX(salary)
7.困难

一个表有一百万行,布尔列 is_active 中有 95% 为 TRUE。为什么对于 WHERE is_active = TRUE,优化器可能不使用 is_active 上的索引?

  1. A索引把 TRUE 当作 NULL 处理
  2. B大多数行都匹配,因此全表扫描比大量索引查找更便宜
  3. C优化器从不在 WHERE 子句中使用索引
  4. D不能在布尔列上创建索引
8.困难

表 enrolment(student_id, course_id, student_name, grade) 的键是 (student_id, course_id)。它违反了哪个范式?

  1. A第一范式,因为 grade 列的值不是原子的
  2. B第二范式,因为 student_name 只依赖于 student_id
  3. C只违反第三范式,因为 grade 依赖于 student_name
  4. D都不违反,它满足 BCNF

答案

  1. 1. D · 没有业务含义的人工标识符,例如自增 id
  2. 2. D · INSERT
  3. 3. A · 仅返回两个表中值相匹配的行
  4. 4. A · 读取另一个尚未提交的事务所写入的数据
  5. 5. B · A 的每个值都恰好对应 B 的一个值
  6. 6. A · SELECT dept, MAX(salary) FROM emp GROUP BY dept
  7. 7. B · 大多数行都匹配,因此全表扫描比大量索引查找更便宜
  8. 8. B · 第二范式,因为 student_name 只依赖于 student_id

完整分步解答:请在 examproblems.com 上练习本主题。