问答题 某职工社团管理系统有如下3个基本表:
职工(职工号,姓名,年龄,性别)
社会团体(编号,名称,负责人,活动地点)
参与(职工号,编号,参与日期)
其中:
·职工表的主码为职工号,职工姓名不能为空。
·社会团体表的主码为编号,外码为负责人,被参照表为职工表,参照属性为职工号,社会团体名称不能为空。
·参与表的主码为职工号和编号,职工号为外码,被参照表为职工表,参照属性为职工号,编号为外码,被参照表为社会团体表,参照属性为编号。
试用SQL语句实现以下操作。

问答题 定义职工表、社会团体表和参与表,并说明其主码和参照关系。
【正确答案】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),
参与日期 DATETIME,
CONSTRAINT C3 PRIMARY KEY(职工号,编号),
CONSTRAINT C4 FOREIGN KEY (职工号) REFERENCES 职工 (职工号))
【答案解析】
问答题 定义两个视图:
社团负责人(编号名称,负责人职工号,负责人姓名,负责人性别)
参与人情况(职工号,姓名,社团编号,社团名称,参与日期)
【正确答案】CREATE VIEW 社团负责人(编号,名称,负责人职工号,负责人姓名,负责人性别)
AS SELECT 编号,名称,负责人,姓名,性别
FROM 社会团体,职工
WHERE 社会团体.负责人=职工.职工号
CREATE VIEW 参与人情况(职工号,姓名,社团编号,社团名称,参与日期)
AS SELECT 职工.职工号,姓名,社会团体.编号,名称,参与日期
FROM 职工,社会团体,参与
WHERE 职工.职工号=参与.职工号 AND 参与.编号=社会团体.编号
【答案解析】
问答题 查询参与羽毛球队、秧歌队或冬泳队的职工号和姓名。
【正确答案】SELECT DISTINCT 职工.职工号,姓名
FROM 职工,社会团体,参与
WHERE 职工.职工号=参与.职工号 AND 参与.编号=社会团体.编号
AND 社会团体.名称 IN('羽毛球队','秧歌队','冬泳队')
【答案解析】
问答题 查询参与冬泳队且年龄大于50岁的职工的职工号和姓名。
【正确答案】SELECT 职工号,姓名
FROM 职工
WHERE 职工号 IN
(SELECT 职工号
FROM 参与
WHERE 编号 IN
(SELECT 编号
FROM 社会团体
WHERE 名称='冬泳队'))
AND 年龄>50
【答案解析】
问答题 查询还没有确定负责人的社会团体编号和名称。
【正确答案】SELECT 编号,名称
FROM 社会团体
WHERE 负责人 IS NULL
【答案解析】
问答题 查询没有参与任何社会团体的职工情况。
【正确答案】SELECT *
FROM 职工
WHERE NOT EXISTS(
SELECT *
FROM 参与
WHERE 参与.职工号=职工.职工号)
【答案解析】
问答题 查询姓“李”且参与至少一个社会团体的男员工的平均年龄。
【正确答案】SELECT AVG(年龄)
FROM 职工
WHERE 姓名 LIKE '李%'AND 性别='男' AND EXISTS (
SELECT *
FROM 参与
WHERE 参与.职工号=职工.职工号)
【答案解析】
问答题 查询与“肖波”至少参与一个相同社会团体的所有职工信息。
【正确答案】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.姓名='肖波'))
【答案解析】
问答题 查询年龄在45~55岁之间的女职工或年龄在50~60岁之间的男职工的所有信息。
【正确答案】SELECT *
FROM 职工
WHERE ((年龄 BETWEEN 45 AND 55) AND 性别='女') OR
((年龄 BETWEEN 50 AND 60) AND 性别='男')
【答案解析】
问答题 查询参与了全部社会团体的职工情况。
【正确答案】SELECT *
FROM 职工
WHERE NOT EXISTS(
SELECT *
FROM 参与
WHERE NOT EXISTS(
SELECT *
FROM 社会团体
WHERE 参与.职工号=职工.职工号 AND 参与.编号=社会团体.编号))
【答案解析】
问答题 查询参与了职工号为“0001”的职工所参与的全部社会团体的职工号。
【正确答案】SELECT 职工号
FROM 职工
WHERE NOT EXISTS(
SELECT *
FROM 参与 AS 参与 1
WHERE 参与1.职工号='0001' AND NOT EXISTS(
SELECT *
FROM 参与 AS 参与 2
WHERE 参与 2.编号=参与 1.编号 AND 参与 2.职工号=职工.职工号))
【答案解析】
问答题 查询与“秧歌队”负责人年龄相同的职工的姓名。
【正确答案】SELECT 姓名
FROM 职工
WHERE 年龄>(
SELECT 年龄
FROM 职工,社会团体
WHERE 社会团体.负责人=职工.职工号 AND 社会团体.名称='秧歌队')
【答案解析】
问答题 查询比“秧歌队”中所有职工年龄都大的职工的姓名。
【正确答案】SELECT 姓名
FROM 职工
WHERE 年龄>ALL(
SELECT 年龄
FROM 职工,社会团体,参与
WHERE 社会团体.编号=参与.编号 AND 职工.职工号=参与.职工号
AND 社会团体.名称='秧歌队')
【答案解析】
问答题 查询并统计每个社会团体的名称和参与人数。
【正确答案】SELECT 社会团体.名称,COUNT(参与.职工号)
FROM 社会团体,参与
WHERE 社会团体.编号=参与.编号
GROUP BY 参与.编号,社会团体.名称
【答案解析】
问答题 查询并统计参与人数最少的社会团体的名称和参与人数。
【正确答案】SELECT 社会团体.名称,COUNT(参与.职工号)
FROM 社会团体,参与
WHERE 社会团体.编号=参与.编号
GROUP BY 参与.编号,社会团体.名称
HAVING COUNT(参与.职工号)<=ALL(
SELECT COUNT(参与.职工号)
FROM 参与
GROUP BY 参与.编号)
【答案解析】
问答题 查询并统计参与人数超过20人的社会团体的名称和负责人。
【正确答案】SELECT 社会团体.名称,职工.姓名
FROM 职工,社会团体,参与
WHERE 社会团体.编号=参与.编号
AND 社会团体.负责人=职工.职工号
GROUP BY 参与.编号,社会团体.名称,职工.姓名
HAVING COUNT(参与.编号)>20
【答案解析】