数据库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);
怎么理解 求详解。。很迷糊的说。
看来分少了没人回答啊。。高分!! 展开
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno= Student.Sno
AND Cno= Course.Cno);
怎么理解 求详解。。很迷糊的说。
看来分少了没人回答啊。。高分!! 展开
17个回答
展开全部
#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";
}
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";
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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表中作为条件的目的
够详细吧!!!!
在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表中作为条件的目的
够详细吧!!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
从里往外看:
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查询得出结果之外的学生姓名。也就是说找出所有参加考试并登记的名单。
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查询得出结果之外的学生姓名。也就是说找出所有参加考试并登记的名单。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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的记录
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的记录
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
双重否定就是肯定,在Student表中找学习了全部课程的学生,也就是说在Student表中找学生,在Course表中不存在一门课程,这个学生没有学。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询