数据库考试(小题+知识点)
Posted 咸鱼的小世界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库考试(小题+知识点)相关的知识,希望对你有一定的参考价值。
1.基本关系代数运算有哪些?
2.假设有关系R和S,关系代数表达式R-(R-S)表示的是
- R×S
- R-S
- R∩S
- R∪S
这题体现了:其他运算可以由基本关系代数运算表示。
基本关系代数运算
3.关系数据库中的投影操作是指
- 关系数据库中的投影操作是指从关系中抽出特定字段
- 关系数据库中的选择操作是指从关系中抽出特定记录
4.关系代数运算是以( 集合运算)为基础的运算 。
- 关系演算是以 谓词运算 为基础的运算
5.下面的选项不是关系数据库基本特征的是( )。
- 与行的次序无关
- 不同的列应有不同的数据类型
- 不同的列应有不同的列名
- 与列的次序无关
6.自然连接是构成新关系的有效方法。一般情况下,当对关系R和S使用自然连接时,要求R和S含有一个或多个共有的________
- A. 行
- B. 元组
- C. 记录
- D. 属性
7.在通常情况下,下面的关系中不可以作为关系数据库的关系是_______.
- A. R3(学生号,学生名,宿舍号)
- B. R4(学生号,学生名,简历)
- C. R2(学生号,学生名,班级号)
- D. R1(学生号,学生名,性别)
- 在关系数据库中,一个关系必须满足以下几个条件:
- 1. 每个属性具有原子性,即每个属性不能再分解;
- 2. 关系中的每个元组都是唯一的,不能重复;
- 3. 关系中的属性是无序的,不能直接引用某个属性。
- 在本题中,A、C、D三个关系都满足以上三个条件,可以作为关系数据库的关系。而B关系中的简历属性不具备原子性,无法直接处理和引用,因此不符合关系数据库的要求,不能作为关系数据库的关系。
8.关系代数中的连接操作是由( )操作组合而成 。
- A. 投影和笛卡尔积
- B. 选择和投影
- C. 投影、选择、笛卡尔积
- D. 选择和笛卡尔积
9.现有如下关系: 患者(患者编号,患者姓名,性别,出生日期,所在单位) 医疗(患者编号,医生编号,医生姓名,诊断日期,诊断结果) 其中,医疗关系中的外码是( )。
- A. 患者姓名
- B. 患者编号和患者姓名
- C. 医生编号和患者编号
- D. 患者编号
- 外码应是另一个关系的主码,
- 如再增加一个关系:医生(医生编号),则医生编号也是医疗关系的外码
10.一个关系数据库文件中的各条记录__________。
- A. 前后顺序可以任意颠倒,不影响库中的数据关系
- B. 前后顺序可以任意颠倒,但排列顺序不同,统计处理的结果就可能不同
- C. 前后顺序不能任意颠倒,一定要按照输入的顺序排列
- D. 前后顺序不能任意颠倒,一定要按照关键字段值的顺序排列
11.有两个关系R(A,B,C)和S(B,C,D),将R和S进行自然连接,得到的结果包含几个列。
- A. 6
- B. 5
- C. 2
- D. 4
12.关系模型中,一个码是( )。
- A. 由一个或多个属性组成,其值能够惟一标识关系中一个元组
- B. 可以由多个任意属性组成
- C. 以上都不是
- D. 至多由一个属性组成
13.关系操作中,操作的对象和结果是____
- A. 列
- B. 记录
- C. 集合
- D. 元组
14.一张职工表,包含“性别”属性,要求该属性只能取“男”或“女”,这属于___
- A. 实体完整性
- B. 用户定义的完整性
- C. 参照完整性
- D. 关系不变性
15.关系模型的三类完整性约束是什么?它们是什么意思?
- 关系模型的三类完整性约束是指实体完整性、参照完整性和用户定义的完整性,它们的意思如下:
- 1. 实体完整性:关系模型中的每个实体必须具有一个可以唯一标识该实体的主键,而且主键值不能为空。实体完整性保证了表中每个实体的唯一性和完整性,也保证了表中数据的一致性。
- 2. 参照完整性:在多个表之间建立引用关系时,被引用表的数据必须存在于引用表中。参照完整性保证了数据的正确性和一致性。
- 3. 用户定义的完整性:根据需求自定义的完整性约束,可以对某些属性的取值范围或某些特定条件进行限制,以确保数据的正确性和一致性。例如,在一个表中限制某个属性取值必须是数字或者日期等。
16.关系模型中,非主属性不可能出现在任何候选码中
- A. 对
- B. 错
我的答案: 对正确答案: 对
17.什么是主码、外码、候选码、全码?
超键
在关系中能唯一标识元组的属性集称为关系模式的超键(只要有一个键唯一,再随便组其他的键,合起来叫主键)
主码(主键,主关键字,primary key)
主关键字是表的行的唯一标识的候选关键字。一个表只有一个主关键字。 主键可以由一个字段,也可以由多个字段组成,分别称为单字段主键或多字段主键。并且它可以唯一确定表中的一行数据,或者可以唯一确定一个实体。外码(外键,外关键字,foreign key)(不含多余属性的超键)
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。(图中,上面的是从表,下面的是主表)
候选码(candidate key)
- 若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何、子集都不能再标识,则称该属性组为(超级码)候选码。
- 例如:在学生实体中,“学号”是能唯一的区分学生实体的,同时又假设“姓名”、“班级”的属性组合足以区分学生实体,那么学号和姓名,班级都是(超级码)候选码。
- 简单的说,候选码(超级码)就是可以被选为主码的属性或属性组。当一个关系有N个属性或属性组可以唯一标识时,则说明该关系有N个候选码,可以选定其中一个作为主码。
- 候选码中出现过的属性称为主属性;非主属性就是不包含在任何候选码中的属性
- 例如:关系 工人(工号,身份证号,姓名,性别,部门).显然工号和身份证号都能够唯一标示这个关系,所以都是候选码。工号、身份证号这两个属性就是主属性。其他的“姓名”“性别”“部门”就是非主属性。(如果主码是一个属性组,那么属性组中的属性都是主属性)
全码(all key)
- 关系模型的所有属性组 组成 该关系模式的 候选码,称为全码。即所有属性当作一个码。若关系中只有一个候选码,且这个候选码中包含全部属性,则该候选码为全码
- 如,关系模式R(T,C,S),属性T表示教师,属性C表示课程,属性S表示学生。假如设一个教师可以讲授多门课程,某门课程可以有多个教师讲授,学生可以听不同教师讲授的不同课程,那么,要区分关系中的每一个元组,这个关系模式R的码(主键)应为全属性T、C和S,即All-key
18.SQL语言是_____语言
- A. 网络数据库
- B. 非数据库
- C. 层次数据库
- D. 关系数据库
19.关于SQL语言,下列说法正确的是
- A. SQL采用的是面向记录的操作方式,以记录为单位进行操作
- B. SQL作为嵌入式语言语法与独立的语言有较大差别
- C. 数据控制功能不是SQL语言的功能之一
- D. SQL是非过程化的语言,用户无须指定存取路径
20. 数据库中建立索引是为了
- A. 加快建表速度
- B. 提高安全性
- C. 节省存储空间
- D. 加快存取速度
21.下列说法不正确的是
- A. 基本表和视图中都存储数据
- B. 可以从基本表或视图上定义视图
- C. 可以使用SQL对基本表和视图进行操作
- D. 基本表和视图一样,都是关系
22.SQL数据操纵语句包括SELECT,INSERT,UPDATE,DELETE等,最重要且使用最频繁的是_____
- A. INSERT
- B. DELETE
- C. UPDATE
- D. SELECT
23.SQL具有两种使用方式,交互式SQL和______
- A. 提示式SQL
- B. 解释式SQL
- C. 多用户SQL
- D. 嵌入式SQL
- SQL具有两种使用方式,交互式SQL和嵌入式SQL。
- 交互式SQL是通过命令行或图形界面等方式,直接输入SQL语句与数据库进行交互操作的方式。而嵌入式SQL是将SQL语句嵌入到编程语言中,通过编程语言对数据库进行操作的方式。
- 嵌入式SQL可以使得应用程序与数据库进行无缝连接,从而实现更加灵活、高效的数据操作。
- 提示式SQL和解释式SQL都不是SQL的使用方式。
- 提示式SQL是一种交互式SQL的变种,可以通过提示符引导用户输入SQL命令。
- 解释式SQL是一种SQL语言的解释器,可以将SQL语句解释成可以执行的代码。
24.SQL,修改表结构的是_____
- A. ALTER
- B. CREATE
- C. INSERT
- D. UPDATE
25.视图是数据库系统三级模式中的()
- A. 模式映像
- B. 内模式
- C. 模式
- D. 外模式
- 视图(View)是从一个或几个基本表(视图)中导出的表。它是一种虚拟的表,不是一个实际存在的表,数据库中只存放视图的定义,而不存放视图对应的数据,数据仍存放在原来的基本表中。
- 视图是基于 SQL 查询语句的结果集所创建的,一但基本表中的数据变化,从视图中查询出的数据也就随之改变了。
- 视图像一个窗口,可看到自己感兴趣的数据及其变化
- 定义:
CREATE VIEW testview
AS
SELECT语句
26.SQL,实现数据检索的语句是____
- A. DELETE
- B. UPDATE
- C. SELECT
- D. INSERT
27.对表中数据进行删除的操作是()
- A. DELETE
- B. UPDATE
- C. DROP
- D. ALTER
28.以下试题基于这样的三个表即学生表S、课程表C和学生选课表SC,它们的结构如下
S(S#, SN, SEX, AGE, DEPT)
C(C#, CN)
SC(S#, C#, GRADE)
其中:S#为学号,SN为姓名,SEX为性别,AGE为年龄,DEPT为系别,C#为课程号,CN为课程名, GRADE为成绩
检索选修4门以上课程的学生总成绩(不统计不及格的课)并按总成绩降序排列出来。正确的 SELECT语句是
- A. SELECT S#, SUM(GRADE)
FROM SC
WHERE GRADE>=60
ORDER BY 2 DESC
GROUP BY S#
HAVING COUNT(*)>=4 - B. SELECT S#, SUM(GRADE)
FROM SC
WHERE GRADE>=60
GROUP BY S#
ORDER BY 2 DESC
HAVING COUNT(*)>=4 - C. SELECT S#, SUM(GRADE)
FROM SC
WHERE GRADE>=60
HAVING COUNT(*)>=4
GROUP BY S#
ORDER BY 2 DESC - D. SELECT S#, SUM(GRADE)
FROM SC
WHERE GRADE>=60
GROUP BY S#
HAVING COUNT(*)>=4
ORDER BY 2 DESC
29.关系运算中花费时间可能最长的是
- A. 笛卡尔积
- B. 选择
- C. 除
- D. 投影
30.自然连接与等值连接的差别在于()
- A. 等值连接要求相等的分量一定是公共属性,而后者则相反
- B. 等值连接不把重复的属性除去;而自然连接要把重复的属性除去
- C. 自然连接不把重复的属性除去;而等值连接要把重复的属性除去
- D. 等值连接与自然连接本质完全一样
31.(填空题)设有学生成绩数据库XSCJ,
Student(学号,姓名,专业名,性别,出生时间,总学分,备注)。
Course(课程号,课程名,开课学期,学时,学分)
StuCourse(学号,课程号,成绩)。
试写出以下操作的SQL语句:
查询修读“计算机基础”的学生姓名;注意在SQL语言中,字符串“计算机基础”要写成\'计算机基础\'
SELECT ____填空 ____1____FROM Student a, Course b, StuCourse c
WHERE ____填空 ____2____AND ____填空 ____3____AND ____填空 ____4____
- 正确答案:
- (1) 第1空:
姓名
第2空:
b.课程号=c.课程号
第3空:
a.学号=c.学号
第4空:
b.课程名=\'计算机基础\'
32.嵌套查询是指讲一个查询块嵌套在另一个查询块的WHILE子句或____子句中。
- 答案:
- (1) HAVING
33.等值连接一定是自然连接,但自然连接不一定是等值连接。
- A. 对
- B. 错
Java开发工程师(Web方向) - 03.数据库开发 - 期末考试
期末考试
编程题
本编程题包含4个小题,覆盖知识点从基础的JDBC、连接池到MyBatis。
有一款在线教育产品“天天向上”主要实现了在手机上查看课程表的功能。该产品的后端系统有一张保存了所有客户课程信息的数据库表,表结构如下:
请使用JDBC编写一段程序,实现读取用户名为“ZhangSan”的同学的所有课程名称,输出到控制台终端。
答:
数据库:
/usr/local/mysql/bin ./mysql -u root -p mysql> CREATE DATABASE final_assignment; mysql> grant all privileges on final_assignment.* to matt@localhost; mysql> quit ./mysql -u matt -p; mysql> use final_assignment; mysql> CREATE TABLE Enrollment ( -> id int auto_increment primary key, -> UserName varchar(100) not null, -> courseName varchar(100) not null -> ); mysql> INSERT INTO Enrollment VALUES (null, "ZhangSan", "Math"); mysql> INSERT INTO Enrollment VALUES (null, "Lisi", "Math"); mysql> INSERT INTO Enrollment VALUES (null, "ZhangSan", "Graphics");
JDBC程序:
public class curriculum { static final String DRIVER_NAME = "com.mysql.jdbc.Driver"; static final String URL = "jdbc:mysql://localhost/final_assignment"; static final String USER_NAME = "matt"; static final String PASSWORD = "matt"; public static void curriculumDataProcessing() throws ClassNotFoundException { Connection conn = null; PreparedStatement ptmt = null; ResultSet rs = null; String sql = "select CourseName from Enrollment where UserName = ?"; String userName = "ZhangSan"; Class.forName(DRIVER_NAME); try { conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD); ptmt = conn.prepareStatement(sql); ptmt.setString(1, userName); // System.out.println(ptmt.toString()); rs = ptmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString("courseName")); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if(conn!=null) conn.close(); if(ptmt!=null) ptmt.close(); if(rs!=null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void main(String[] args) throws ClassNotFoundException { curriculumDataProcessing(); } }
输出:
使用游标方式读取题目1中所有用户的所有课程的课程名称和用户名称,输出到控制台终端。
答:
在题1的代码中修改:
static final String URL = "jdbc:mysql://localhost/final_assignment?useCursorFetch=true";
String sql = "select UserName, CourseName from Enrollment";
ptmt.setFetchSize(2);
System.out.println(rs.getString("userName") + ": " + rs.getString("courseName"));
删除ptmt.setString(1, userName);
public class CurriculumFetchQ2 { static final String DRIVER_NAME = "com.mysql.jdbc.Driver"; static final String URL = "jdbc:mysql://localhost/final_assignment?useCursorFetch=true"; static final String USER_NAME = "matt"; static final String PASSWORD = "matt"; public static void curriculumDataProcessing() throws ClassNotFoundException { Connection conn = null; PreparedStatement ptmt = null; ResultSet rs = null; String sql = "select UserName, CourseName from Enrollment"; Class.forName(DRIVER_NAME); try { conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD); ptmt = conn.prepareStatement(sql); ptmt.setFetchSize(2); rs = ptmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString("userName") + ": " + rs.getString("courseName")); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if(conn!=null) conn.close(); if(ptmt!=null) ptmt.close(); if(rs!=null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void main(String[] args) throws ClassNotFoundException { curriculumDataProcessing(); } }
使用DBCP数据库连接池实现题目1中需要完成的功能。
答:
1. add external jar -> commons-dbcp2-2.1.1.jar
2.
package com.sheng.database.finalassignment; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.commons.dbcp2.BasicDataSource; public class CurriculumDBCPQ3 { public static BasicDataSource ds = null; public static final String DRIVER_NAME = "com.mysql.jdbc.Driver"; public static final String URL = "jdbc:mysql://localhost/final_assignment"; public static final String USER_NAME = "matt"; public static final String PASSWORD = "matt"; public static void dbpoolInit() throws ClassNotFoundException { // initialization ds = new BasicDataSource(); ds.setDriverClassName(DRIVER_NAME); ds.setUrl(URL); ds.setUsername(USER_NAME); ds.setPassword(PASSWORD); ds.setMaxTotal(2); } public static void curriculumDataProcessing() { Connection conn = null; PreparedStatement ptmt = null; ResultSet rs = null; String sql = "select CourseName from Enrollment where UserName = ?"; String userName = "ZhangSan"; try { conn = ds.getConnection(); ptmt = conn.prepareStatement(sql); ptmt.setString(0, userName); rs = ptmt.executeQuery(); while(rs.next()) { System.out.println(rs.getString("courseName")); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (conn!=null) conn.close(); if (ptmt!=null) ptmt.close(); if (rs!=null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } } } public void run() { long start = System.currentTimeMillis(); while(System.currentTimeMillis() - start < 10000) { curriculumDataProcessing(); } } public static void main (String[] args) throws ClassNotFoundException { dbpoolInit(); for (int i = 0; i < 10; i++) { curriculumDataProcessing(); } } }
由于录入课程错误,现在需要编写一段程序,实现将“ZhangSan”的“math”课程交给“LiSi”,
你需要完成将“ZhangSan”的“math”课程记录删除,然后新插入一个“LiSi”的“math”课程,且两个过程要作为一个事务执行。
答:
package com.sheng.database.finalassignment; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class CurriculumTransactionQ4 { static final String DRIVER_NAME = "com.mysql.jdbc.Driver"; static final String URL = "jdbc:mysql://localhost/final_assignment"; static final String USER_NAME = "matt"; static final String PASSWORD = "matt"; public static void updateDataInfoByTransaction () throws ClassNotFoundException { Connection conn = null; PreparedStatement ptmt1 = null; PreparedStatement ptmt2 = null; String sql1 = "DELETE FROM Enrollment WHERE userName=? AND courseName=?"; String sql2 = "INSERT INTO Enrollment VALUES (null, ?, ?)"; String userName1 = "ZhangSan"; String userName2 = "ZhangSan"; String courseName = "Math"; Class.forName(DRIVER_NAME); try { conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD); conn.setAutoCommit(false); ptmt1 = conn.prepareStatement(sql1); ptmt1.setString(1, userName1); ptmt1.setString(2, courseName); ptmt1.execute(); ptmt2 = conn.prepareStatement(sql2); ptmt2.setString(1, userName2); ptmt2.setString(2, courseName); ptmt2.execute(); conn.commit(); } catch (SQLException e) { if(conn!=null) { try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } e.printStackTrace(); } finally { try { if (conn != null) conn.close(); if (ptmt1 != null) ptmt1.close(); if (ptmt2 != null) ptmt2.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void main(String[] args) throws ClassNotFoundException { updateDataInfoByTransaction(); } }
运行后的数据库表内容:
以上是关于数据库考试(小题+知识点)的主要内容,如果未能解决你的问题,请参考以下文章