目录
注意下面答案仅供参考,只是本人得做题答案!!!
五、对象关系型数据库——以PostgreSQL为例
5-1PostgreSQL-入门
第1关:历史和特性
-
1、
PostgreSQL
对象关系数据库管理系统的发展经历了哪几个阶段?(ACD)A、The Berkeley POSTGRES Project
B、Postgres93
C、Postgres95
D、PostgreSQL -
2、
PostgreSQL
哪一年加入了对SQL
语言的支持?(C)A、1986
B、1993
C、1994
D、1995 -
3、
PostgreSQL
理论上最多能管理多大的数据量?(C)A、数TB
B、数PB
C、无限
第2关:安装和启动
步骤 1:重置命令行
点击右上角重置命令行,以还原系统环境。
步骤 2:创建新的数据库集群
执行以下命令,使用 postgres
用户创建一个新的数据库集群,路径为 /usr/local/pgsql/new_cluster
。
# 创建一个空目录
sudo mkdir -p /usr/local/pgsql/new_cluster
# 更改目录拥有者
sudo chown postgres /usr/local/pgsql/new_cluster
# 初始化数据库集群
sudo -u postgres /usr/lib/postgresql/9.5/bin/initdb -D /usr/local/pgsql/new_cluster
步骤 3:关闭当前后台的 server
由于安装软件时,后台自动开启了一个 server
,为避免端口冲突,需要先关闭它。
service postgresql stop
步骤 4:启动 server 管理新集群
使用 postgres
用户运行一个 server
,管理新创建的集群。
sudo -u postgres /usr/lib/postgresql/9.5/bin/pg_ctl -D /usr/local/pgsql/new_cluster start
步骤 5:验证 server 是否正在后台运行
可以使用以下命令查看 server
是否正在后台运行:
ps -ef | grep postgres
通过以上步骤,你就完成了使用 postgres
用户创建新的数据库集群,并启动一个 server
来管理该集群的操作。此时,平台应该能够成功查询到 new_cluster
对应的后台 server
。
第3关:交互方法
步骤 1:重置命令行
点击右上角重置命令行,以还原系统环境。
步骤 2:以 postgres 的身份连接本地 server 的 template1 数据库
使用以下命令以 postgres
用户身份连接到本地 server
的 template1
数据库:
sudo -u postgres psql -d template1
执行上述命令后,会进入 psql
的交互环境,命令行提示符会变为类似 template1=#
的形式。
步骤 3:点击评测
在退出交互环境前,点击评测按钮进行测试。
步骤 4:退出交互环境(在评测完成后)
当评测完成后,若要退出 psql
交互环境,可以使用元命令 \q
:
template1=# \q
通过以上步骤,你就完成了以 postgres
的身份连接本地 server
的 template1
数据库的操作,并在退出交互环境前进行了评测。
5-2PostgreSQL-数据定义
第1关:初识 SQL 语法
-
1、请选择SQL语言支持的注释格式。(BC)
A、//
B、/* */
C、--
D、- -
2、若要删除数据库中的表,应该使用哪一种语言?(A)
A、数据定义语言
B、数据查询语言
C、数据操作语言
第2关:玩转数据库
-- 请根据下方提示,在正确位置填写代码或脚本。
drop database if exists my_db;
/********** Begin *********/
--创建数据库 my_db
CREATE DATABASE my_db;
/********** End *********/
第3关:深入表创建
-- 请根据下方提示,在正确位置填写代码或脚本。
drop table IF EXISTS bookings;
drop table IF EXISTS facilities;
drop table IF EXISTS members;
/********** Begin *********/
--创建表members
CREATE TABLE members (
memid INT PRIMARY KEY,
surname VARCHAR(200) NOT NULL,
firstname VARCHAR(200) NOT NULL,
address VARCHAR(300) NOT NULL,
zipcode INT NOT NULL,
telephone VARCHAR(20) NOT NULL,
recommendedby INT,
joindate TIMESTAMP NOT NULL,
FOREIGN KEY (recommendedby) REFERENCES members(memid)
);
--创建表facilities
create table facilities(
facid INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
membercost NUMERIC NOT NULL,
guestcost NUMERIC NOT NULL,
initialoutlay NUMERIC NOT NULL,
monthlymaintenance NUMERIC NOT NULL
);
--创建表bookings
create table bookings(
bookid INT PRIMARY KEY,
facid INT,
memid INT,
starttime TIMESTAMP NOT NULL,
slots INT NOT NULL,
FOREIGN KEY (facid) REFERENCES facilities(facid),
FOREIGN KEY (memid) REFERENCES members(memid)
);
/********** End *********/
第4关:管理表结构
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
--修改members表
ALTER TABLE members RENAME COLUMN surname TO secname;
--修改facilities表
ALTER TABLE facilities ALTER COLUMN name TYPE varchar(20);
--修改bookings表
ALTER TABLE bookings DROP COLUMN slots;
/********** End *********/
5-3PostgreSQL-数据操作
第1关:数据插入
-- 请在下方 Begin-End之间的区域,根据提示填写SQL代码或脚本,完成数据插入。
/********** Begin *********/
-- 向facilities表插入表格中的数据
INSERT INTO facilities (facid, name, membercost, guestcost, initialoutlay, monthlymaintenance)
VALUES
(0, 'Tennis Court 1', 5, 25, 10000, 200),
(1, 'Tennis Court 2', 5, 25, 8000, 200),
(2, 'Badminton Court', 0, 15.5, 4000, 50),
(3, 'Table Tennis', 0, 5, 320, 10),
(4, 'Massage Room 1', 35, 80, 4000, 3000),
(5, 'Massage Room 2', 35, 80, 4000, 3000),
(6, 'Squash Court', 3.5, 17.5, 5000, 80),
(7, 'Snooker Table', 0, 5, 450, 15),
(8, 'Pool Table', 0, 5, 400, 15);
/********** End *********/
第2关:数据删除
-- 请在下方Begin-End之间的区域,根据提示填写代码或脚本,完成指定数据的删除操作。
/********** Begin *********/
-- 删除表facilities的数据
DELETE FROM facilities
WHERE
facid IN (2, 4, 6);
/********** End *********/
第3关:数据更新
-- 请在下方Begin-End之间的区域,根据提示填写SQL代码或脚本,完成指定数据的更新。
/********** Begin *********/
-- 修改表facilities的数据
UPDATE facilities
SET
membercost = 2.5
WHERE
facid = 2;
UPDATE facilities
SET
monthlymaintenance = 100
WHERE
facid = 6;
/********** End *********/
5-4PostgreSQL-查询理论
第1关:并、交、叉
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
2
3
/********** End *********/
第2关:选择、投影、笛卡尔积
第3关:各种连接
5-5PostgreSQL-单表查询
第1关查询语法入门
-
1、下面哪个子句是
A、SELECTSELECT
查询管道中必需的子句?(A)
B、FROM
C、WHERE
D、HAVING -
2、
A、选择、投影和连接SELECT
子句、FROM
子句和WHERE
子句分别对应于什么关系操作?(D)
B、选择、连接和投影
C、投影、选择和连接
D、投影、连接和选择
第2关断言和操作符
-- 请在下方 Begin-End之间的区域填写SQL代码或脚本,完成查询操作。
/********** Begin *********/
-- 从facilities表查询符合条件的数据
SELECT * FROM facilities WHERE membercost>0 AND guestcost%5=0;
/********** End *********/
第3关函数和聚合
-- 请在下方 Begin-End区域之间填写SQL代码或脚本,完成查询操作。
/********** Begin *********/
-- 从facilities表查询符合条件的数据
SELECT SUM(membercost) FROM facilities WHERE length(name)>12;
/********** End *********/
第4关分组和过滤
-- 请在下方Begin-End之间的区域填写SQL代码或脚本,完成指定的查询操作。
/********** Begin *********/
-- 从facilities表查询符合条件的数据
SELECT AVG(guestcost)
FROM
facilities
WHERE
membercost>0
GROUP BY
membercost;
/********** End *********/
第5关排序和限定
-- 请在下方 Begin-End之间的区域,根据提示填写SQL代码或脚本,完成指定的查询操作。
/********** Begin *********/
-- 从facilities表查询符合条件的数据
SELECT monthlymaintenance FROM facilities ORDER BY monthlymaintenance DESC LIMIT 1 OFFSET 2;
/********** End *********/
5-6PostgreSQL-多表查询
第1关详解表连接
-- 请在下方Begin-End之间的区域,根据提示填写SQL代码或脚本,完成多表查询操作。
/********** Begin *********/
-- 从members表和bookings表查询符合条件的数据
SELECT bookings.starttime
FROM members
INNER JOIN bookings ON members.memid = bookings.memid
WHERE members.surname = 'Smith' AND members.firstname = 'Darren';
/********** End *********/
第2关使用子查询
-- 请在下方Begin-End之间的区域,根据提示填写SQL代码或脚本,完成多表查询操作。
/********** Begin *********/
-- 从members表和bookings表查询符合条件的数据
SELECT members.telephone
FROM members
LEFT JOIN bookings
ON members.memid = bookings.memid
WHERE bookings.memid IS NULL;
/********** End *********/
第3关复合查询
-
1、union、intersect、except分别相当于什么关系操作?(A)
A、并、交、差
B、并、差、交
C、差、交、并
D、差、并、交 -
2、字段列表相容的含义是什么(多选)?(AB)
A、数量要相同
B、字段类型对应兼容
C、字段名对应相同
5-7PostgreSQL-视图索引事务
第1关视图
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
-- 创建一个名为simple_facilities的视图
CREATE VIEW simple_facilities
AS
SELECT name , membercost from facilities ;
/********** End *********/
第2关索引
-
1、关于索引的作用,以下说法正确的是?(B)
A、节省磁盘空间
B、在某些情况下,提高查询数据的速度
C、在某些情况下,提高插入数据的速度 -
2、PostgreSQL默认创建什么类型的索引?(A)
A、B-Tree
B、Hash
C、GIN
D、BRIN -
3、当插入数据、删除数据、修改数据影响到索引时,应该如何使索引保持同步?(C)
A、删除索引,然后重新建立。
B、手动刷新索引。
C、依赖数据库系统自动更新索引。
第3关事务
-
1、和数据库事务相关的几个操作是?(ABC)
A、BEGIN;
B、ROLLBACK;
C、COMMIT;
D、END; -
2、其他连接不能看到未提交的事务操作,是由事务的什么属性决定的?(B)
A、原子性
B、隔离性
C、一致性
D、持久性 -
3、如果某个事务提交成功后发生了系统错误,关于该事务的操作以下说法正确的是?(B)
A、所有操作将回滚
B、所有操作已经持久化
C、操作结果处于不确定状态
5-8PostgreSQL-数据库系统管理
第1关表空间
-
1、表空间的主要用途是?(A)
A、控制数据库对象的存储位置。
B、把数据库对象放到一个保密位置。
C、用于数据库的备份。 -
2、什么样的目录才能创建表空间?(ABC)
A、空目录。
B、用户是目录拥有者。
C、用户有目录读写权限。 -
3、为什么非空的表空间无法删除?(AB)
A、数据库系统设定的规则。
B、为了数据安全。
C、数据库系统的Bug。
第2关角色管理
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
-- 创建名为postgres2的角色,带有登录权限。
CREATE ROLE postgres2 LOGIN;
-- 创建名为postgres3的角色,带有登录权限和创建数据库权限。
CREATE ROLE postgres3 LOGIN CREATEDB;
-- 创建名为postgres4的角色,带有登录权限、创建数据库权限和创建角色权限。
CREATE ROLE postgres4 LOGIN CREATEDB CREATEROLE;
-- 创建名为postgres5的超级用户。
CREATE ROLE postgres5 SUPERUSER;
/********** End *********/
第3关备份和恢复
# 请根据下方提示,在正确位置填写代码或脚本。
#********** Begin *********#
# 备份数据库
# 使用 pg_dump 工具备份 postgres 数据库到 dump.sql 文件
sudo -u postgres pg_dump postgres > dump.sql
#********** End *********#
5-9PostgreSQL-客户端编程
第1关JDBC 环境部署
-
1、部署PostgreSQL的Java开发环境,至少需要安装哪些软件包?(AB)
A、JDK
B、JDBC驱动
C、Java IDE -
2、JDBC和JDBC驱动的区别是?(B)
A、无区别,等价专业名词。
B、JDBC是接口标准,JDBC驱动是后端实现。
C、JDBC驱动是接口标准,JDBC是后端实现。
第2关:JDBC 连接数据库
-
1、JDBC连接PostgreSQL数据库,需要明确提供哪些信息?(BC)
A、主机IP或域名
B、目标数据库
C、数据库用户名和密码
D、主机端口 -
2、DriverManager类的getConnection方法是如何确定使用哪种JDBC驱动的?(B)
A、通过源代码的import列表确定。
B、通过url变量的postgresql字段确定。
C、通过在文件系统搜寻JDBC驱动确定。
第3关:JDBC 数据库查询
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class App {
private final String url = "jdbc:postgresql://localhost/postgres";
private final String user = "postgres";
private final String password = "123456";
public static void main(String[] args) {
App app = new App();
app.getInfo();
}
public void getInfo() {
try {
// 1. 连接数据库
Connection conn = DriverManager.getConnection(url, user, password);
// System.out.println("Connected to the PostgreSQL server successfully."); // 注释掉这行
// 2. 创建Statement对象
Statement stmt = conn.createStatement();
// 3. 执行SQL语句
String SQL = "SELECT name FROM facilities WHERE membercost > 0";
ResultSet rs = stmt.executeQuery(SQL);
// 4. 处理ResultSet对象
while (rs.next()) {
System.out.println(rs.getString("name"));
}
// 关闭资源
rs.close();
stmt.close();
conn.close();
} catch (SQLException ex) {
System.out.println(ex.getMessage());
}
}
}
六、SQLite嵌入式关系型数据库
6-1SQLite3-数据库的基本操作
第1关:创建数据库
#!/bin/bash
# 请根据下方提示,在正确位置填写代码或脚本。
#*********begin*********#
sqlite3 database.db "CREATE TABLE IF NOT EXISTS test_table (id INTEGER PRIMARY KEY, name TEXT);"
#********* end *********#
第2关:附加数据库
#!/bin/bash
# 请根据下方提示,在正确位置填写代码或脚本。
sqlite3 db1.db << EOF
/*********begin*********/
ATTACH DATABASE 'db2.db' AS cc_db;
/********* end *********/
.databases
EOF
第3关:分离数据库
#!/bin/bash
# 请根据下方提示,在正确位置填写代码或脚本。
sqlite3 db1.db << EOF
attach 'db2.db' as dbTest;
/*********begin*********/
DETACH DATABASE dbTest;
/********* end *********/
.databases
EOF
6-2SQLite3-表的基本操作
第1关:创建表
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
--***创建students学生表***--
CREATE TABLE students(
stuno text NOT NULL,
stuname text NOT NULL
);
--***创建classes课程表***--
CREATE TABLE classes(
classno text NOT NULL,
classname text NOT NULL
);
--***创建grades成绩表***--
CREATE TABLE grades(
stuno text NOT NULL,
classno text NOT NULL,
score integer NOT NULL
);
/********** End *********/
第2关:删除和修改表
-- 请根据下方提示,在正确位置填写代码或脚本。
create table students(
nbr text primary key
);
/********** Begin *********/
alter table students rename to teachers;
alter table teachers add column age integer;
/********** End *********/
第3关:导入导出表
#!/bin/bash
# 请根据下方提示,在正确位置填写代码或脚本。
# 在database1.db中创建了teachers表。
sqlite3 database1.db 'create table teachers(id integer primary key, age integer);'
#********** Begin *********#
# 请你把database1.db中的teachers表导出到teachers.sql文件中。
sqlite3 database1.db ".output teachers.sql" ".dump teachers" ".output stdout"
# 请你把导出的sql文件导入到database2.db中。
sqlite3 database2.db < teachers.sql
#********** End *********#
6-3SQLite3-关系操作
第1关:简单关系操作
# 请根据下方提示,在正确位置填写答案。
#********* S-R *********#
#********* Begin *********#
201205 小马
201206 小河
201299 小强
#********* End *********#
#********* R∪S *********#
#********* Begin *********#
201201 小明
201219 小红
201266 小花
201205 小马
201206 小河
201299 小强
#********* End *********#
#********* R∩S *********#
#********* Begin *********#
201266 小花
#********* End *********#
第2关:进阶关系操作
# 请根据下方提示,在正确位置填写答案。
#********* S1 *********#
#********* Begin *********#
小花 20 女 数学
小红 25 女 物理
#********* End *********#
#********* S2 *********#
#********* Begin *********#
小花 20
小红 25
#********* End *********#
#********* T1 *********#
#********* Begin *********#
小花 20 陈老师 30 女 数学
小花 20 李老师 35 女 物理
小花 20 张老师 32 男 语文
小花 20 刘老师 33 男 体育
小红 25 陈老师 30 女 数学
小红 25 李老师 35 女 物理
小红 25 张老师 32 男 语文
小红 25 刘老师 33 男 体育
#********* End *********#
第3关:高级关系操作
# 请根据下方提示,在正确位置填写答案。
#********* S1 *********#
#********* Begin *********#
小花 20 女 数学 陈老师 30 女 数学
小红 25 女 物理 李老师 35 女 物理
小明 22 男 语文 张老师 32 男 语文
#********* End *********#
#********* S2 *********#
#********* Begin *********#
小花 20 女 数学 陈老师 30 女 数学
小红 25 女 物理 李老师 35 女 物理
小明 22 男 语文 张老师 32 男 语文
小强 26 男 物理 李老师 35 女 物理
#********* End *********#
#********* S3 *********#
#********* Begin *********#
小花 20 女 数学 陈老师 30 女
小红 25 女 物理 李老师 35 女
小明 22 男 语文 张老师 32 男
小强 26 男 物理 李老师 35 女
#********* End *********#
6-4SQLite3-单表查询语法(一)
第1关:select语句与操作管道
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
SELECT id
FROM
students
WHERE
sex = '女'
AND
age = 25;
/********** End *********/
第2关:where语法-常用操作符
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
SELECT id
FROM students
WHERE (sex = '女' AND age = 25) OR height > 170;
/********** End *********/
第3关:where语法-LIKE操作符
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
SELECT name
FROM students
WHERE id like '%1111';
/********** End *********/
6-5SQLite3-单表查询语法(二)
第1关:函数和聚合
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
SELECT AVG(age)
FROM students
WHERE length(name)=2;
/********** End *********/
第2关:分组和过滤
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
SELECT sex , AVG(age)
FROM students
GROUP BY sex;
/********** End *********/
第3关:排序和限定
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
SELECT name
FROM students
ORDER BY age ASC
LIMIT 1, 1;
/********** End *********/
6-6SQLite3-多表查询语法(一)
第1关:交叉连接
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
SELECT students.id, students.name, students.sex, students.age,
courses.id, courses.name, courses.credit,
scores.student_id, scores.course_id, scores.score
FROM students, courses, scores;
-- 显式语法
SELECT students.id, students.name, students.sex, students.age,
courses.id, courses.name, courses.credit,
scores.student_id, scores.course_id, scores.score
FROM students
CROSS JOIN courses
CROSS JOIN scores;
/********** End *********/
第2关:内连接
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
SELECT s.id, s.name, s.sex, s.age,
c.id AS course_id, c.name, c.credit,
sc.student_id, sc.course_id, sc.score
FROM students s, courses c, scores sc
WHERE sc.student_id = s.id AND sc.course_id = c.id;
/********** End *********/
第3关:外连接
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
SELECT students.name, scores.course_name, scores.score
FROM students
LEFT JOIN scores ON students.id = scores.student_id;
/********** End *********/
6-7SQLite3-多表查询语法(二)
第1关:使用别名
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
SELECT e.employeeName AS employeeName, m.employeeName AS managerName
FROM workers e
JOIN workers m ON e.managerID = m.employeeID
ORDER BY e.employeeID ASC;
/********** End *********/
第2关:子查询
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
SELECT *
FROM students
WHERE age IN (
SELECT age
FROM students
WHERE name IN ('刘同', '冯高')
)
ORDER BY id ASC;
/********** End *********/
第3关:复合查询
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
-- in型子查询
SELECT id
FROM students
WHERE id NOT IN (SELECT student_id FROM scores)
ORDER BY id ASC;
-- except复合查询
SELECT id
FROM students
EXCEPT
SELECT student_id
FROM scores
ORDER BY id ASC;
/********** End *********/
6-8SQLite3-修改数据
第1关:插入记录
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
INSERT INTO students (id, name, sex, age) VALUES ('20191111', '马思', '女', 22);
INSERT INTO students (id, name, sex, age) VALUES ('20191112', '张纯', '女', 23);
INSERT INTO students (id, name, sex, age) VALUES ('20191113', '赵欣', '男', 22);
/********** End *********/
select * from students;
第2关:更新和删除
-- 请根据下方提示,在正确位置填写代码或脚本。
/********** Begin *********/
-- 修正马菲菲同学的学号
UPDATE students
SET id = '20171113'
WHERE name = '马菲菲';
-- 删除赵飞飞同学的信息
DELETE FROM students
WHERE name = '赵飞飞';
/********** End *********/
select * from students;