单项选择题(2*10)
数据库设计题(10*2)
-
ER图:画出整张ER图,并且注明对应关系
-
把ER图转换为关系模式,每一个实体有哪些属性
学生(学号, 姓名, 班级)
课程(课程号, 课程名)
关系数据库设计理论(15)
- 列出所有的键
- 有没有存在BCNF冲突,如果涉及到,列出冲突,并进行优化,再分解关系集合
写出关系代数表达式(10*2)
写出SQL语句(8题共45分)
表创建(主键,外键)
CREATE TABLE Movies(
id INT IDENTITY(1,1),
title NCHAR(50) UNIQUE,
year INT NOT NULL,
date DATETIME,
genre NVARCHAR(30) CHECK(genre in ('喜剧', ‘动作’)),
studioName NVARCHAR(30),
producerC# INT,
PRIMARY KEY(id, title, year),
CONSTRAINT studioName_ck CHECK(studioName='20世纪福克斯' or date IS NOT NULL)
);
元组的增加
INSERT INTO Studio(name, address, presC#) VALUES ('20世纪福克斯', '美国', 1)
复制表:
数据库需要存在表
CREATE TABLE numpart(
ID INT IDENTITY(1,1) PRIMARY KEY,
name VARCHAR(255)
);
INSERT INTO numpart
SELECT MovieStar.name
FROM MovieStar
WHERE MovieStar.name NOT IN (
SELECT starName
FROM StarsIn
)
数据库不需要存在表
SELECT TOP 3 studioName, COUNT(*) AS num INTO temp
FROM Movies
WHERE [year] >= 1990
AND [year] <= 2000
AND studioName IS NOT NULL
GROUP BY studioName
ORDER BY COUNT(*) DESC
元组的删除(是否需要设置条件)
DELETE FROM MovieStar
WHERE name IN (
SELECT starName
FROM StarsIn
GROUP BY starName
HAVING COUNT(*) <= 2
)
数据的更新(如果原数据出现故障/损坏/丢失情况,删除原数据,新增)
UPDATE Movies
SET length = length * 1.05
WHERE genre = 'cartoon'
UPDATE Movies
SET studioName = 'Disney'
WHERE studioName = 'Fox'
查找数据
SELECT address
FROM Studio
WHERE name='81 Film'
SELECT starName
FROM StarsIn
WHERE movieYear=1980
OR movieTitle LIKE '%LOVE%'
SELECT MovieStar.name
FROM Movies JOIN StarsIn
ON Movies.title = StarsIn.movieTitle
AND Movies.[year] = StarsIn.movieYear JOIN MovieStar
ON StarsIN.starName = MovieStar.name
WHERE MovieStar.gender = 'M'
AND Movies.title = 'The Faithful'
SELECT name
FROM MovieExec
WHERE cert# IN (
SELECT producerC#
FROM Movies
WHERE title IN (
SELECT movieTitle
FROM StarsIn
WHERE starName='Harrison Ford'
)
)
SELECT studioName, COUNT(*) number
FROM Movies
GROUP BY studioName
HAVING COUNT(*) >= 2
SELECT studioName
FROM Movies
GROUP BY studioName
HAVING COUNT(title) >= ALL (
SELECT COUNT(*)
FROM Movies
GROUP BY studioName
)
创建视图
CREATE VIEW LongMovies
AS
SELECT title
FROM Movies
WHERE length > ALL (
SELECT length
FROM Movies
WHERE title LIKE '%Star Wars%'
)
CREATE VIEW AvgLength(name, average_film_length)
AS
SELECT MovieExec.name, AVG(Movies.length)
FROM Movies JOIN MovieExec
ON Movies.producerC# = MovieExec.cert#
WHERE year < 1950
GROUP BY MovieExec.name