数据库——SQL-SERVER练习(2)连接与子查询

一.实验准备

1.复制实验要求文件及“CREATE-TABLES.SQL”文件, 粘贴到本地机桌面。

2.启动SQL-SERVER服务。

3. 运行查询分析器, 点击菜单《文件》/《打开》, 打开CREATE-TABLES.SQL, 并运行, 建立学生数据库STUDB及表STUDENT, COURSE, SC。

4. 点击菜单《文件》/《新建》, 建立一个空查询窗口。开始实验。

5.本次实验环境是xp虚拟机,SQL-SERVER迷你版。

 

CREATE-TABLES.SQL”文件 https://www.cnblogs.com/wkfvawl/p/10843788.html

 

二.实验内容

 

 

1查询每门课的课号和先行课的先行课号(自我连接)

SELECT FIRST.CNO,SECOND.CPNO
FROM COURSE FIRST,COURSE SECOND
WHERE FIRST.CPNO=SECOND.CNO

 

 

2 查询每门课的课号,课名,先行课号,先行课名(自我连接)

SELECT FIRST.CNO,FIRST.CNAME,SECOND.CPNO,SECOND.CNAME CPNAME
FROM COURSE FIRST,COURSE SECOND
WHERE FIRST.CPNO*=SECOND.CNO

 

 

3 查询年龄比CS系平均年龄大的学生名(>子查询)

SELECT SNAME
FROM STUDENT
WHERE SAGE >
(
      SELECT AVG(SAGE)
      FROM STUDENT
      WHERE SDEPT='CS'
)

 

 

4 查询选修学生人数>=2的课程名 (IN子查询)

SELECT CNAME
FROM COURSE
WHERE CNO IN
(
      SELECT COUNT(*)
      FROM SC
      GROUP BY CNO
      HAVING COUNT(*)>=2
)

 

 

5   查询所有选修了1号课程的学生姓名(用EXISTS子查询)

SELECT SNAME
FROM STUDENT
WHERE EXISTS
(
      SELECT *
      FROM SC
      WHERE SNO=STUDENT.SNO AND CNO='1'
)

 

 

6  查询所有选修了1号课程的学生姓名(IN 子查询)

SELECT SNAME
FROM STUDENT
WHERE SNO IN
(
      SELECT SNO
      FROM SC
      WHERE CNO='1'
)

 

 

7  查询所有选修了1号课程的学生姓名(用连接)

SELECT SNAME
FROM STUDENT,SC
WHERE  SC.SNO=STUDENT.SNO AND CNO='1'

 

 

8. 查询未选1号课的学生号,学生名(用NOT EXISTS子查询)

SELECT SNO,SNAME
FROM STUDENT
WHERE NOT EXISTS
(
      SELECT *
      FROM SC
      WHERE SNO=STUDENT.SNO AND CNO='1'
)

 

 

9  选修了所有课的学生名
  (查询学生名, 条件是不存在这样的课, 该生不选) :

 

SELECT SNAME
FROM STUDENT
WHERE NOT EXISTS
(
   SELECT *
   FROM COURSE
   WHERE NOT EXISTS
        (
          SELECT *
          FROM SC
          WHERE SNO=STUDENT.SNO
            AND CNO=COURSE.CNO
         )
)

 

10 . 被所有学生选修的课名
  (查询课程名, 条件是不存在这样的学生, 不选该课)

 换个说法,不存在这样的学生, 该课不选?

SELECT CNAME
FROM COURSE
WHERE NOT EXISTS
(
   SELECT *
   FROM STUDENT
   WHERE NOT EXISTS
        (
          SELECT *
          FROM SC
          WHERE SNO=STUDENT.SNO
                AND CNO=COURSE.CNO
         )
)

 

11.选修了95002选修所有课的学生名
查询语义: 查询学生名, 条件是对于95002选了的课中不存在这样的课,该生不选

不存在这样的课, 95002选并且该生不选.

 

SELECT SNAME
FROM STUDENT
WHERE NOT EXISTS
(
   SELECT *
   FROM COURSE
   WHERE EXISTS
   (
      SELECT *
      FROM SC
      WHERE SNO='95002' AND CNO=COURSE.CNO
    )
    AND
    NOT EXISTS
    (
      SELECT *
      FROM SC
      WHERE SNO=STUDENT.SNO AND CNO=COURSE.CNO
    )
)

 

 

posted @ 2019-05-09 13:26 王陸 阅读(...) 评论(...) 编辑 收藏