查询选修全部课程的学生姓名和所属单位

原创 2015年07月09日 23:17:19
查询选修全部课程的学生姓名和所属单位

在解答这个问题之前先举一个小例子,现有3张表
S (SI,SN,SD,SA) SI,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
C (CI,CN ) CI,CN 分别代表课程编号、课程名称
SC ( SI,CI,G ) SI,CI,G 分别代表学号、所选修的课程编号、学习成绩
查看SC表中的全部信息如下:

这里写图片描述
要求返回每个SC表中每个学生选修的课数
执行如下语句:

SELECT
    sc.SI 学号,
    COUNT(sc.CI) 选课门数
FROM
    sc,c
GROUP BY
    sc.SI

执行结果如下:
这里写图片描述

执行如下语句:

SELECT
    sc.SI 学号,
    COUNT(sc.CI) 选课门数
FROM
    sc
GROUP BY
    sc.SI

执行结果如下:
这里写图片描述

相信看到这里应该知道我要说的是什么问题了,可以看到两次查询语句的唯一差别就是 from sc和from sc,c,然而结果却相差很多,这个就是由于关联查询造成的,从sc、c两张表中选择时结果会存在很多重复的行,所以需要剔除重复的行,因此在查询时如果涉及到多张表,使用group by分组获取数据时一定要记得剔除重复数据。
下面解决第一个问题
使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位
解决方法1:

先在sc表中按学号分组找出选修所有课程的学生的学号,然后在S中通过SI去取学员学号和所属单位

SELECT
    s.SN 姓名,
    s.SD 单位
FROM
    s
WHERE
    s.SI IN (
        SELECT
            sc.SI
        FROM
            sc,
            c
        GROUP BY
            sc.SI
        HAVING
            COUNT(DISTINCT sc.CI) = (SELECT COUNT(*) FROM c)
    )

解决方法二:

SELECT
    s.SI,
    s.SD
FROM
    s
WHERE
    NOT EXISTS (
        SELECT
            *
        FROM
            c
        WHERE
            NOT EXISTS (
                SELECT
                    *
                FROM
                    sc
                WHERE
                    CI = s.SI
                AND CI = c.CI
            )
    )

两种方法相比,第一种更加灵活易懂,更加考验了使用SQL查询的能力,但是要记得剔除重复数据

版权声明:本文为博主原创文章,未经博主允许不得转载。

SQL查询选修了所有课程的学生姓名

select sname from student where not exists (select * from course where not exists   (select * ...

SQL面试题

问题描述:  为管理岗位业务培训信息,建立3个表:  S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄  C (C#,CN ) C#,CN 分别...
  • wangzff
  • wangzff
  • 2012年02月07日 10:24
  • 1717

高级sql学习——with子句!!!

使用WITH AS 语句可以为一个子查询语句块定义一个名称,使用这个子查询名称可以在查询语句的很多地方引用这个子查询。Oracle 数据库像对待内联视图或临时表一样对待被引用的子查询名称,从而起到一定...

JDK容器与并发—Queue—Interface

框架概览 接口介绍 Queue       俗称队列,其设计目标是存储处理前的元素。在Collection基础上,新增了入队、出队、访问队首元素的方法: 1)Queue有两套功能相同的方法:a...

查询选修了全部课程的学生姓名

首先头脑中有三点概念:     1 。  EXISTS 子查询找到的提交             NOT EXISTS 子查询中 找不到的提交            说明:不要去翻译...

查询选修了全部课程的学生姓名

首先头脑中有三点概念:1 。 EXISTS 子查询找到的提交 NOT EXISTS 子查询中 找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕。 2 。 建立程序循...

一个SQL查询出每门课程的成绩都大于80的学生姓名

http://www.cnblogs.com/hongyan5682/p/4816444.html name   kecheng    fenshu  张三     语文     81 ...

定义一个表示学生信息的类Student,要求如下:  (1)类Student的成员变量: sNO 表示学号;sName表示姓名;sSex表示性别;sAge表示年龄;sJava:表示Java课程成绩。

/*定义一个表示学生信息的类Student,要求如下: (1)类Student的成员变量: sNO 表示学号;sName表示姓名;sSex表示性别;sAge表示年龄;sJava:表示Java课程成...

问题:设计一个大学教师和学生管理程序, 教师包括 编号、姓名、职称和教研室 数据的输入输出; 大学生包括编号、姓名、性别、班号、英语、高等数学和数据结构三门课程成绩的输入输出和计算平均分; 研究生包

问题:设计一个大学教师和学生管理程序, 教师包括 编号、姓名、职称和教研室 数据的输入输出; 大学生包括编号、姓名、性别、班号、英语、高等数学和数据结构三门课程成绩的输入输出和计算平均分; 研究生包...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:查询选修全部课程的学生姓名和所属单位
举报原因:
原因补充:

(最多只允许输入30个字)