某职工社团管理系统有如下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人的社会团体的名称和负责人。
参考答案:(A)
CREATE TABLE 职工(
职工号 CHAR(H) PRIMARY KEY,
姓名 CHAR (H) NOT NULL,
年龄 SMALLINT,
性别 CHAR (B),
CONSTRAINT CA CHECK (性别 IN (’男’,’女’)))
CREATE TABLE 社会团体 (
编号 CHAR(H) PRIMARY KEY,
名称 CHAR(H) NOT NULL,
负责人 CHAR(H),
活动地点 VARCHAR(E0),
CONSTRAINT CB FOREIGN KEY(负责人) REFERENCES 职工(职工号))
CREATE TABLE 参与 (
职工号 CHAR(H),
编号 CHAR(H),
参与日期 DATETLME,
CONSTRAINT CC PRIMARY KEY(职工号,编号),
CONSTRAINT CD FOREIGN KEY (职工号) REFERENCES 职工(职工号))
(B)
CREATE VIEW 社团负责人(编号,名称,负责人职工号,负责人姓名,负责人性别)
AS SELECT 编号,名称,负责人,姓名,性别
FROM 社会团体,职工
WHERE 社会团体.负责人=职工.职工号
CREATE VIEW 参与人情况(职工号,姓名,社团编号,社团名称,参与日期)
AS SELECT 职工.职工号,姓名,社会团体.编号,名称,参与日期
FROM 职工,社会团体,参与
WHERE 职工.职工号=参与.职工号 AND 参与.编号=社会团体.编号
(C)
SELECT DISTINCT 职工.职工号,姓名
FROM 职工,社会团体,参与
WHERE 职工.职工号=参与.职工号 AND 参与.编号=社会团体.编号
AND 社会团体.名称 IN (’羽毛球队’,’秧歌队’,’冬泳队’)
(D)
SELECT 职工号,姓名
FROM 职工
WHERE 职工号 IN
(SELECT 职工号
FROM 参与
WHERE 编号 IN
(SELECT 编号
FROM 社会团体
WHERE 名称=’冬泳队’))
AND 年龄>E0
(E)
SELECT 编号,名称
FROM 社会团体
WHERE 负责人 IS NULL
(F)
SELECT *
FROM 职工
WHERE NOT EXISTS (
SELECT *
FROM 参与
WHERE 参与.职工号=职工.职工号)
(G)
SELECT AVG(年龄)
FROM 职工
WHERE 姓名 LIKE ’李%’ AND性别=’男’ AND EXISTS (
SELECT *
FROM 参与
WHERE 参与.职工号=职工.职工号)
(H)
SELECT *
FROM 职工 AS EA
WHERE EA.姓名<>’肖波’ AND EXISTS
(SELECT JA.编号
FROM 参与 AS JA
WHERE JA.职工号=EA.职工号 AND JA.编号=ANY
(SELECT JB.编号
FROM 职工 AS EB, 参与 AS JB
WHERE EB.职工号=JB. 职工号 AND EB.姓名=’肖波’))
(I)
SELECT *
FROM 职工
WHERE ((年龄 BETWEEN DE AND EE) AND 性别=’女’) OR
((年龄 BETWEEN E0 AND F0) AND 性别=’男’)
(A0)
SELECT *
FROM 职工
WHERE NOT EXISTS (
SELECT *
FROM 参与
WHERE NOT EXISTS (
SELECT *
FROM 社会团体
WHERE 参与.职工号=职工.职工号 AND 参与.编号=社会团体.编号))
(AA)
SELECT 职工号
FROM 职工
WHERE NOT EXISTS (
SELECT *
FROM 参与 AS 参与 A
WHERE 参与 A.职工号=’000A’ AND NOT EXISTS (
SELECT *
FROM 参与 AS 参与 B
WHERE 参与 B.编号=参与A.编号 AND 参与B.职工号=职工.职工号))
(AB)
SELECT 姓名
FROM 职工
WHERE 年龄>(
SELECT 年龄
FROM 职工,社会团体
WHERE 社会团体.负责人=职工.职工号 AND 社会团体.名称=’秧歌队’)
(AC)
SELECT 姓名
FROM 职工
WHERE 年龄>ALL(
SELECT 年龄
FROM 职工,社会团体,参与
WHERE 社会团体.编号=参与.编号 AND 职工.职工号=参与.职工号
AND 社会团体.名称=’秧歌队’)
(AD)
SELECT 社会团体.名称,COUNT(参与.职工号)
FROM 社会团体,参与
WHERE 社会团体.编号=参与.编号
GROUP BY 参与.编号,社会团体.名称
(AE)
SELECT 社会团体.名称,COUNT(参与.职工号)
FROM 社会团体,参与
WHERE 社会团体.编号=参与.编号
GROUP BY 参与.编号,社会团体.名称
HAVING COUNT(参与.职工号)<=ALL (
SELECT COUNT(参与.职工号)
FROM 参与
GROUP BY 参与.编号)
(AF)
SELECT 社会团体.名称,职工.姓名
FROM 职工,社会团体,参与
WHERE 社会团体.编号=参与.编号
AND 社会团体.负责人=职工.职工号
GROUP BY 参与.编号,社会团体.名称,职工.姓名
HAVING COUNT (参与.编号)>B0