一、SQL语言查询选修了全部课程的学生的学号和姓名。

两种解决途径:

第一种:

  我们可以表示为在SC表中某个学生选修的课程数等于C表中课程总数。相应的SQL语言如下:

select S#,SNAME
from S
where S# in
(select S#
from SC
group by S# --根据Sno分组,统计每个学生选修了几门课程。如果等于C表课程的总数,就是我们要找的S#
having count(*) = (select count(*) from C))--统计C表中共有几门课程

第二种:

  问题:查询选修了全部课程的学生的学号和姓名。

  可以转换为:查询没有一门课没有被该生选择的学生的学号和姓名。

  相应的SQL语言如下:

select S#,SNAME -- 在 S 表里选 S#,SNAME
from S
where not exists -- 不存在
(select * -- 课程
from C
where not exists -- 没有
(select * -- 被该生选择的课程
from SC
where SC.S#=S.S# and SC.C#=C.C#)) -- 相关查询,三个表进行连接

  这个查询语句可以这样理解:

  查询没有一门课没有被该生选择的学生的学号和姓名。

  第一个select 必定是在 S 表里选 S#,SNAME

  select S#,SNAME

  from S

  where (不存在)

  第二个select 是课程,来自C表)

  select *

  from C

  where (没有)

  第三个select是课程被该生选择,来自SC表)

  select *

  from SC

  where (SC学号对应S表学号,SC表课程号对应C表课程号) 

二、SQL语言查询选修了学号为“2001050105”的学生所选全部课程的学生姓名。

  问题:查询选修了学号为“2001050105”的学生所选全部课程的学生姓名。

  可以转换为:查询没有一门课(被学号“2001050105”的学生选择的课)没有被该生选择的学生的姓名。

  相应的SQL语言如下:

select St_Name -- 从st_info表中选择姓名
from st_info
where not exists -- 不存在
(select * --被学号为‘2001050105’的学生选择的课程
from s_c_info as sc_1
where st_id='' and not exists --没有
    (select * --被该生选择
    from s_c_info as sc_2
    where sc_2.st_id=st_info.St_ID and sc_2.c_no=sc_1.c_no))

  这个查询语句可以这样理解:

  查询没有一门课(被学号“2001050105”的学生选择的课)没有被该生选择的学生的姓名。

  第一个select从st_info 中选出St_name

  select St_Name

  from st_info

  where (不存在)

  第二个select 是从s_c_info表中选出学号为“2001050105”的学生选择的课程

  select *

  from s_c_info as sc_1

  where st_id='2001050105' and (不存在)

  第三个select是从s_c_info表中选出课程被该生选择的记录

  select *

  from s_c_info as sc_2

  where(sc_2学号对应st_info学号,sc_2表课程号对应sc_1表的课程号)

  之所以起别名sc_1和sc_2主要是他们来自同一个表,但是我们首先是从s_c_info表中选出了学号为“2001050105”的学生的选修记录并放到了sc_1中,这样在最后关联的时候就可以直接关联。

三、总结:

  上述两个问题,其实解题思维是一样的,都是运用了两次 not exists 双重否定表示肯定,理解了这两个问题,在遇到相似的问题,可以进行相应的转化。那么该问题既然是双重否定,那么可不可以用两个 exists 呢?显然不可以。自己思考一下吧。如果理解了上述问题,很简单的就可以知道原因。

数据库SQL语句中 查询选修了全部课程的学生的学号和姓名的更多相关文章

  1. 查询选修了全部课程的学生姓名_如何解?-MS-SQLServer/应用实例

    查询选修了全部课程的学生姓名:student 是学生表 course 是选课表 sc 是课程表select snamefrom studentwhere not exists(select *from ...

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

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

  3. 数据库SQL语句中根据当前日期计算其他日期小结

    问题描述:我们在写存储过程和函数的时候经常会碰到利用当前日期计算出上周开始日期.结束日期,或者计算上个月的开始日期结束日期等问题.最近写了几个存储过程和函数,其中都涉及到了日期计算问题,在这里简单做一 ...

  4. sql语句中查询出的数据添加一列,并且添加默认值

    查询出数据,并且要添加一列表中都不存在的数据,且这一列的值都是相等的 select app_id,app_secret from wx_ticket group by app_id; 查询出的数据是 ...

  5. SQL语句中带有EXISTS谓词的子查询的理解与使用

    EXISTS:代表存在量词. 在SQL中,把具有全称量词的谓词查询问题转换成等价的存在量词的谓词查询予以实现. 如有三个表,Student(Sno,Sname),Course(Cno,Cname),S ...

  6. SQL语句中exists/not exists的用法分析

    作者:Dsw 比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT ...

  7. SQL语句在查询分析器中可以执行,代码中不能执行

    问题:SQL语句在查询分析器中可以执行,代码中不能执行 解答:sql中包含数据库的关键字,将关键字用[]括起来,可以解决. 后记:建数据库的时候尽量避免使用关键字. 例子: sql.Format(&q ...

  8. SQL 2005 中查询或执行另外的数据库操作的方法

    原文:SQL 2005 中查询或执行另外的数据库操作的方法 摘要: 如果,你想在一台数据库服务器上,查询另一个台数据服务器的数据该如何做呢?如果,你想在同一台数据服务器上,在不同的数据库之间查询数据, ...

  9. SQL语句中的单引号处理以及模糊查询

    为了防止程序SQL语句错误以及SQL注入,单引号必须经过处理.有2种办法: 1.使用参数,比如SELECT * FROM yourTable WHERE name = @name; 在C#中使用Sql ...

随机推荐

  1. URLClassLoader

    package com.reflect.load; import java.net.URL; import java.net.URLClassLoader; import java.sql.Conne ...

  2. How Tomcat Works 读书笔记 八 载入器 上

    Java的类载入器 详细资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...

  3. 一个简单的基于 DirectShow 的播放器 2(对话框类)

    上篇文章分析了一个封装DirectShow各种接口的封装类(CDXGraph):一个简单的基于 DirectShow 的播放器  1(封装类) 本文继续上篇文章,分析一下调用这个封装类(CDXGrap ...

  4. OpenCV OpenGL手写字符识别

    另外一篇文章地址:这个比较详细,但是程序略显简单,现在这个程序是比较复杂的 http://blog.csdn.net/wangyaninglm/article/details/17091901 整个项 ...

  5. rails自动生成大量记录的方法

    因为我们可能rails new了一个网站出来,但是里面没有测试数据,我们不能傻乎乎的在new.html.erb里面一个的手动输入吧?于是我们可以写一个小的脚本来帮助在数据库中插入大量数据:高版本的ra ...

  6. G1 GC技术解析

    介绍 G1 GC,全称Garbage-First Garbage Collector,通过-XX:+UseG1GC参数来启用.G1收集器是工作在堆内不同分区上的收集器,分区既可以是年轻代也可以是老年代 ...

  7. Implement int sqrt(int x).

    自己设计函数,实现求根号.x是非负整数. Input: 8 Output: 2 当开出根号后有小数,则省略小数部分.. 思路:只要找到一个数a,a*a<=x而且(a+1)*(a+1)>x, ...

  8. IT实用技术资源整理

    花了一下午整理出了常用的且比较实用的网站,以及一些收藏的资源,希望对大家有帮助! 常用技术资料 Python中文开发者社区 Python中文官方文档 开源中国社区 Python机器学习 jmeter插 ...

  9. 使用 JMeter 进行压力测试

    一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试,他可以帮助我们发现系统中的瓶颈问题,减少发布到生产环境后出问题的几率:预估系统的承载能力,使我们能根据其做出一些应对措施.所以压力测 ...

  10. Activex、OLE、COM、OCX、DLL之间有什么区别?

    来源:http://www.blogjava.net/Jack2007/archive/2008/04/27/196392.html         熟悉面向对象编程和网络编程的人一定对ActiveX ...