数据库SQL语句中 查询选修了全部课程的学生的学号和姓名
一、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语句中 查询选修了全部课程的学生的学号和姓名的更多相关文章
- 查询选修了全部课程的学生姓名_如何解?-MS-SQLServer/应用实例
查询选修了全部课程的学生姓名:student 是学生表 course 是选课表 sc 是课程表select snamefrom studentwhere not exists(select *from ...
- SQL查询选修了所有课程的学生姓名
select sname from student where not exists (select * from course where not exists (select * from s ...
- 数据库SQL语句中根据当前日期计算其他日期小结
问题描述:我们在写存储过程和函数的时候经常会碰到利用当前日期计算出上周开始日期.结束日期,或者计算上个月的开始日期结束日期等问题.最近写了几个存储过程和函数,其中都涉及到了日期计算问题,在这里简单做一 ...
- sql语句中查询出的数据添加一列,并且添加默认值
查询出数据,并且要添加一列表中都不存在的数据,且这一列的值都是相等的 select app_id,app_secret from wx_ticket group by app_id; 查询出的数据是 ...
- SQL语句中带有EXISTS谓词的子查询的理解与使用
EXISTS:代表存在量词. 在SQL中,把具有全称量词的谓词查询问题转换成等价的存在量词的谓词查询予以实现. 如有三个表,Student(Sno,Sname),Course(Cno,Cname),S ...
- SQL语句中exists/not exists的用法分析
作者:Dsw 比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT ...
- SQL语句在查询分析器中可以执行,代码中不能执行
问题:SQL语句在查询分析器中可以执行,代码中不能执行 解答:sql中包含数据库的关键字,将关键字用[]括起来,可以解决. 后记:建数据库的时候尽量避免使用关键字. 例子: sql.Format(&q ...
- SQL 2005 中查询或执行另外的数据库操作的方法
原文:SQL 2005 中查询或执行另外的数据库操作的方法 摘要: 如果,你想在一台数据库服务器上,查询另一个台数据服务器的数据该如何做呢?如果,你想在同一台数据服务器上,在不同的数据库之间查询数据, ...
- SQL语句中的单引号处理以及模糊查询
为了防止程序SQL语句错误以及SQL注入,单引号必须经过处理.有2种办法: 1.使用参数,比如SELECT * FROM yourTable WHERE name = @name; 在C#中使用Sql ...
随机推荐
- linux进程管理之进程创建
所谓进程就是程序执行时的一个实例. 它是现代操作系统中一个很重要的抽象,我们从进程的生命周期:创建,执行,消亡来分析一下Linux上的进程管理实现. 一:前言 进程管理结构; 在内核中,每一个进程对应 ...
- 【Qt编程】基于Qt的词典开发系列<一>--词典框架设计及成品展示
去年暑假的时候,作为学习Qt的实战,我写了一个名为<我爱查词典>的词典软件.后来由于导师项目及上课等原因,时间不足,所以该软件的部分功能欠缺,性能有待改善.这学期重新拿出来看时,又有很多东 ...
- iOS雷达图 iOS RadarChart实现
实现效果 刚拿到设计稿的时候大概看了一眼,当时心里想着放张背景图,然后计算下相应点的坐标,在最上面画一层就OK了,其实一开始实现的时候也确实是这么做的,然后我就日了狗了,发现设计稿上多层五边形的间隔不 ...
- overridePendingTransition的简介
1 Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画. 它包括两个部分:一部分是第一个activity退出时的动画:另外一部分时第二个activity ...
- ActiveMQ系列之四:用ActiveMQ构建应用
Broker:相当于一个ActiveMQ服务器实例 命令行启动参数示例如下: 1:activemq start :使用默认的activemq.xml来启动 2:activemq start xbean ...
- Android特效专辑(五)——自定义圆形头像和仿MIUI卸载动画—粒子爆炸
Android特效专辑(五)--自定义圆形头像和仿MIUI卸载动画-粒子爆炸 好的,各位亲爱的朋友,今天讲的特效还是比较炫的,首先,我们会讲一个自定义圆形的imageView,接着,我们会来实现粒子爆 ...
- Android开源经典项目
目前包括: Android开源项目第一篇--个性化控件(View)篇 包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...
- 实现Android Native端爆破源码
尝试在移动端so侧做一些内存修改,使之走向不通的逻辑,一下为将要爆破的APP源码 JAVA侧: package com.example.grady.sectestone; import android ...
- contentType,charset和pageEncoding的区别
简单点总结就是jsp页面头上这样写 <%@ page contentType="text/html;charset=GBK" %> 页面用GBK编码 pageEnco ...
- access treeview读取数据表成树并与子窗体联动
Private Sub Form_Load()Dim i As IntegerDim rst As DAO.RecordsetSet rst = CurrentDb.OpenRecordset(&qu ...