问答题 某职工社团管理系统有如下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
【答案解析】