数据库SQL语句中 查询选修了全部课程的学生的学号和姓名 理解

查询选修了全部课程的学生姓名。SELECTSnameFROMStudentWHERENOTEXISTS(SELECT*FROMCourseWHERENOTEXISTS(S... 查询选修了全部课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno= Student.Sno
AND Cno= Course.Cno);
怎么理解 求详解。。很迷糊的说。
看来分少了没人回答啊。。高分!!
展开
 我来答
刘强威123
2012-04-12
知道答主
回答量:2
采纳率:0%
帮助的人:2.3万
展开全部
#include<iostream.h>
typedef int Type;
#define ERROR 0;
#define stacksize 100
typedef struct {Type data[stacksize];
int top;} sqstack; //这是在定义栈的类型

typedef struct Node
{Type data;
struct Node *next; }*LinkList,Node; //这是在定义链表的类型

void initstack(sqstack &S)
{ S.top=0;
}

void push(sqstack &S,Type e) //补充入栈的几条操作语句
{
if (S.top == stacksize )
{
cout<<"栈已经满了。"; //---栈满---

}
else { S.top = S. top+1;

S.data[ S.top-1 ]=e;
}

}

void pop(sqstack &S, Type &e) //补充出栈的几条操作语句

{
if (S.top==0)
cout<<"栈为空!!!";
else { S.top--;
e=S.data[S.top];}
}

bool StackEmpty(sqstack s)
{
if(s.top==0) return true;
else return false;
}

LinkList InitList()
{ LinkList head;
head=new Node;
head->next=NULL;
return head;}

void printlist(LinkList L) //这是一个输出表元的函数
{ LinkList p;
p=L->next;
cout<<"→ 头结点";
while(p!=NULL)
{ cout<<"→"<<p->data; //补充一条语句用来输出链表结点的值
p= p->next;}
}

void CreateListR(LinkList &L, int n)
{ LinkList r;
L=r=InitList( );
LinkList p;

for (int i=1;i<=n;i++)
{
p = new Node ; //建立新结点
cin>> p->data;
r->next =p ;
r=p ;
}
r->next=NULL;
}

void funl(LinkList &L,sqstack &S) //此处补充一个实现链表逆转的操作函数, 用栈来作为辅助空间,实现逆转
{
LinkList p=L->next;
while(p!=NULL)
{
push(S,p->data);
p=p->next;
}
p=L->next;
while(p!=NULL)
{
pop(S,p->data);
p=p->next;

}

}

void main()
{ LinkList y;
sqstack s;
initstack(s);
int n;
cout<<"请输入N的值,它代表y中元素个数:";
cin>>n;
cout<<"\n";
CreateListR(y,n);
cout<<"\n这是链表y中的元素:";
printlist(y); /*此处调用上面的函数输出y表中的元素 */
cout<<"\n\n\n";
funl(y,s); //补充一条调用函数语句,将链表实现逆转
cout<<"这是逆转后链表y中的元素:";
printlist(y); /*此处调用上面的函数输出y表中的元素 */
cout<<"\n";
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
雨夜的缘分
2012-04-05
知道答主
回答量:16
采纳率:0%
帮助的人:13.4万
展开全部
1,SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno
在sc表中查询符合Sno= Student.Sno AND Cno= Course.Cno这两个条件的所有数据,
2,SELECT * FROM Course WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno);这句的意思是在course表中查询不满足1,中的所有数据
3,SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM Course WHERE NOT EXISTS (SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno));
这整句的意思就是查询student表中所有不满足2,数据,就是选修了全部课程的学生了

只所以会有这么多查询,可能Sno= Student.Sno AND Cno= Course.Cno这两个条件是是sc表查询的条件分散在另外两个表中,引用了双重否定,也就是肯定的意思,达到可以让Student.Sno ,Course.Cno,在sc表中作为条件的目的

够详细吧!!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lanniao007
2012-04-05 · TA获得超过1012个赞
知道小有建树答主
回答量:1489
采纳率:40%
帮助的人:440万
展开全部
从里往外看:
1,SELECT * FROM Course WHERE NOT EXISTS
(SELECT * FROM SC WHERE Sno= Student.Sno AND Cno= Course.Cno
------》》》:查询出Course表中没有在SC表登记相关学号和科目NO的名单。可能是缺考学生信息。
外层:
2,SELECT Sname FROM Student WHERE NOT EXISTS
查询出学生姓名。除了1查询得出结果之外的学生姓名。也就是说找出所有参加考试并登记的名单。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
神龙逆水
2022-06-27 · TA获得超过1258个赞
知道小有建树答主
回答量:374
采纳率:75%
帮助的人:70.4万
展开全部
select Sname from Student where not exists(
select * from Course where not exists(
select * from SC where Sno=Student.Sno and Cno=Course.cno
))

枚举每个学生S,查询所有课程C,查看选修SC中是否有记录
即学生S,是否选修了全部课程C,在SC表中有记录
如果学生S全部选修了C课程,那么在SC表中一定都有记录,这就让select * from Course where not exists 没有记录
从而查到这个学生S确实全部选修了C
其实你可以认为中间的查询实际上去找学生S在C课程中,没有在SC里出现的记录,即没选这门课程C,当查完SC表后,第二句select 留下的记录是没选这门课程C的记录
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cry1146889122
2012-04-05
知道答主
回答量:26
采纳率:0%
帮助的人:15.3万
展开全部
双重否定就是肯定,在Student表中找学习了全部课程的学生,也就是说在Student表中找学生,在Course表中不存在一门课程,这个学生没有学。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式