数据库期末考

单项选择题(2*10)

数据库设计题(10*2)

  1. ER图:画出整张ER图,并且注明对应关系

  2. 把ER图转换为关系模式,每一个实体有哪些属性

    学生(学号, 姓名, 班级)

    课程(课程号, 课程名)

关系数据库设计理论(15)

  1. 列出所有的键
  2. 有没有存在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

猜你喜欢

转载自blog.csdn.net/Eimhin_Tang/article/details/103916370