问答题
某职工社团管理系统有如下3个基本表:
职工(
职工号
,姓名,年龄,性别)
社会团体(
编号
,名称,负责人,活动地点)
参与(
职工号,编号
,参与日期)
其中:
·职工表的主码为职工号,职工姓名不能为空。
·社会团体表的主码为编号,外码为负责人,被参照表为职工表,参照属性为职工号,社会团体名称不能为空。
·参与表的主码为职工号和编号,职工号为外码,被参照表为职工表,参照属性为职工号,编号为外码,被参照表为社会团体表,参照属性为编号。
试用SQL语句实现以下操作。
(1)定义职工表、社会团体表和参与表,并说明其主码和参照关系。
(2)定义两个视图:
社团负责人(编号,名称,负责人职工号,负责人姓名,负责人性别)
参与人情况(职工号,姓名,社团编号,社团名称,参与日期)
(3)查询参与羽毛球队、秧歌队或冬泳队的职工号和姓名。
(4)查询参与冬泳队且年龄大于50岁的职工的职工号和姓名。
(5)查询还没有确定负责人的社会团体编号和名称。
(6)查询没有参与任何社会团体的职工情况。
(7)查询姓“李”且参与至少一个社会团体的男员工的平均年龄。
(8)查询与“肖波”至少参与一个相同社会团体的所有职工信息。
(9)查询年龄在45~55岁之间的女职工或年龄在50~60岁之间的男职工的所有信息。
(10)查询参与了全部社会团体的职工情况。
(11)查询参与了职工号为“0001”的职工所参与的全部社会团体的职工号。
(12)查询与“秧歌队”负责人年龄相同的职工的姓名。
(13)查询比“秧歌队”中所有职工年龄都大的职工的姓名。
(14)查询并统计每个社会团体的名称和参与人数。
(15)查询并统计参与人数最少的社会团体的名称和参与人数。
(16)查询并统计参与人数超过20人的社会团体的名称和负责人。
【正确答案】
【答案解析】(1)
CREATE TABLE 职工(
职工号 CHAR(8) PRIMARY KEY,
姓名 CHAR (8) NOT NULL,
年龄 SMALLINT,
性别 CHAR (2),
CONSTRAINT C1 CHECK (性别 IN ("男","女")))
CREATE TABLE 社会团体 (
编号 CHAR(8) PRIMARY KEY,
名称 CHAR(8) NOT NULL,
负责人 CHAR(8),
活动地点 VARCHAR(50),
CONSTRAINT C2 FOREIGN KEY(负责人) REFERENCES 职工(职工号))
CREATE TABLE 参与 (
职工号 CHAR(8),
编号 CHAR(8),
参与日期 DATETLME,
CONSTRAINT C3 PRIMARY KEY(职工号,编号),
CONSTRAINT C4 FOREIGN KEY (职工号) REFERENCES 职工(职工号))
(2)
CREATE VIEW 社团负责人(编号,名称,负责人职工号,负责人姓名,负责人性别)
AS SELECT 编号,名称,负责人,姓名,性别
FROM 社会团体,职工
WHERE 社会团体.负责人=职工.职工号
CREATE VIEW 参与人情况(职工号,姓名,社团编号,社团名称,参与日期)
AS SELECT 职工.职工号,姓名,社会团体.编号,名称,参与日期
FROM 职工,社会团体,参与
WHERE 职工.职工号=参与.职工号 AND 参与.编号=社会团体.编号
(3)
SELECT DISTINCT 职工.职工号,姓名
FROM 职工,社会团体,参与
WHERE 职工.职工号=参与.职工号 AND 参与.编号=社会团体.编号
AND 社会团体.名称 IN ("羽毛球队","秧歌队","冬泳队")
(4)
SELECT 职工号,姓名
FROM 职工
WHERE 职工号 IN
(SELECT 职工号
FROM 参与
WHERE 编号 IN
(SELECT 编号
FROM 社会团体
WHERE 名称="冬泳队"))
AND 年龄>50
(5)
SELECT 编号,名称
FROM 社会团体
WHERE 负责人 IS NULL
(6)
SELECT *
FROM 职工
WHERE NOT EXISTS (
SELECT *
FROM 参与
WHERE 参与.职工号=职工.职工号)
(7)
SELECT AVG(年龄)
FROM 职工
WHERE 姓名 LIKE "李%" AND性别="男" AND EXISTS (
SELECT *
FROM 参与
WHERE 参与.职工号=职工.职工号)
(8)
SELECT *
FROM 职工 AS E1
WHERE E1.姓名<>"肖波" AND EXISTS
(SELECT J1.编号
FROM 参与 AS J1
WHERE J1.职工号=E1.职工号 AND J1.编号=ANY
(SELECT J2.编号
FROM 职工 AS E2, 参与 AS J2
WHERE E2.职工号=J2. 职工号 AND E2.姓名="肖波"))
(9)
SELECT *
FROM 职工
WHERE ((年龄 BETWEEN 45 AND 55) AND 性别="女") OR
((年龄 BETWEEN 50 AND 60) AND 性别="男")
(10)
SELECT *
FROM 职工
WHERE NOT EXISTS (
SELECT *
FROM 参与
WHERE NOT EXISTS (
SELECT *
FROM 社会团体
WHERE 参与.职工号=职工.职工号 AND 参与.编号=社会团体.编号))
(11)
SELECT 职工号
FROM 职工
WHERE NOT EXISTS (
SELECT *
FROM 参与 AS 参与 1
WHERE 参与 1.职工号="0001" AND NOT EXISTS (
SELECT *
FROM 参与 AS 参与 2
WHERE 参与 2.编号=参与1.编号 AND 参与2.职工号=职工.职工号))
(12)
SELECT 姓名
FROM 职工
WHERE 年龄>(
SELECT 年龄
FROM 职工,社会团体
WHERE 社会团体.负责人=职工.职工号 AND 社会团体.名称="秧歌队")
(13)
SELECT 姓名
FROM 职工
WHERE 年龄>ALL(
SELECT 年龄
FROM 职工,社会团体,参与
WHERE 社会团体.编号=参与.编号 AND 职工.职工号=参与.职工号
AND 社会团体.名称="秧歌队")
(14)
SELECT 社会团体.名称,COUNT(参与.职工号)
FROM 社会团体,参与
WHERE 社会团体.编号=参与.编号
GROUP BY 参与.编号,社会团体.名称
(15)
SELECT 社会团体.名称,COUNT(参与.职工号)
FROM 社会团体,参与
WHERE 社会团体.编号=参与.编号
GROUP BY 参与.编号,社会团体.名称
HAVING COUNT(参与.职工号)<=ALL (
SELECT COUNT(参与.职工号)
FROM 参与
GROUP BY 参与.编号)
(16)
SELECT 社会团体.名称,职工.姓名
FROM 职工,社会团体,参与
WHERE 社会团体.编号=参与.编号
AND 社会团体.负责人=职工.职工号
GROUP BY 参与.编号,社会团体.名称,职工.姓名
HAVING COUNT (参与.编号)>20