『壹』 求“建立查询,查找选修“保险学”且成绩在90分以上的所有学生的学号、姓名、成绩”的SQL语言
现在我们从后面的子查询向前分解:
1所有未选过的课程的数据集:
select from 课程 where not exists(
select from 选读 where 课程号=课程课程号)
2所有没被某位学号为 @学号 的学生选过的课程的记录集(@学号学生的未选课程):
select from 课程 where not exists(
select from 选读 where 学号=@学号 and 课程号=课程课程号)
请注意,多出了学号的筛选即,学号=@学号。
3遍历每一个主查询的学号,每一个学号都按第二筛选方法筛选出:没有未选课程的学生的学号。(不包括在第查询方法查询出的“有未学课程的学号的记录集”中的记录。)
请注意:用主查询中的 学生学号 代替了@学号。
select 学生姓名 from 学生
where not exists(
select from 课程 where not exists(
select from 选读 where 学号=学生学号 and 课程号=课程课程号))
这已经是整个查询语句,可以看出子查询中用学生学号替换了第2步中的 @学号,(没忘了吧,第二步求的是没有选修全部课程的某个学生)。
用上面的讲解方法不知道是不是更好理解一点。
===============
针对您最后的补充:
为什么不用
from 学生,课程,选读?
答:因为from 学生,课程,选读 也就是
SELECT FROM 学生,课程,选读 WHERE 条件
这样的型式只能组成内联接,而内联接我们只知道,只有三个表按联接条件都符合才会被选中,而我们要的是有不符合后面两表的的学生才符合条件,所以用内联接是不可行的。
要不然where句怎么可以调用三个关系的属性呢
答:在SQL SERVER中规定:所有子表都是可以通过表名调用其上面任意层次的表中的字段的。所以,不是只有内联接才可以调用多个表的属性。
『贰』 从学生选课数据库中查询选修“数据库原理”课并且成绩在90分以上的学生名单,请写出SQL语句
select sname from student
where sno in(
select asno from studentcourse a join course b
on acno=bcno
where bcname='数据库原理' and ascore>90)
select asclass as 班级,count() as 不及格回人数答 from
student a join studentcourse b
on asno=bsno
where bscore<60
group by asclass
『叁』 sql 嵌套查询选修"计算机文化学"且成绩高于此课程平均成绩的学生学号和成绩
由于不知道原题目,只能假设了,假设学号:No;成绩: score ;选修课程:kc; 从成绩表 sc中查询版
select No,score from sc where kc='计算权机文化学' and score >(
select avg(score) from sc where kc='计算机文化学')
将假设的字段和表名换成拟题目中的字段和表名
『肆』 SQL:查询出同时选了2号和3号课程且成绩均已及格的学生姓名(子查询)
select 姓名
from 学生表 where 学号 in (
select 学号
from 选课表
where 课程内号 in (2, 3) and 成绩容 >= 60
group by 学号 having count() = 2)
『伍』 SQL语句查询查看90分以上学生的成绩课程名称学生姓名怎么写
select 成绩,课程名称,姓名 from 成绩,学生基本信息,课程名称 where学生基本信息学号=成绩学号 and 成绩课程编号=课程名称课程编号 and 成绩>90
『陆』 查询选修课0004号课程且成绩大于78分的学生姓名 sql相似句 数据库
SELECT姓名FROM学生表WHERE学号IN(SELECT学号FROM选课表
WHERE课程号='0004'AND成绩>78)
『柒』 查询选修了3门以上课程且平均成绩均在80以上的学号(写出SQL命令
select 学号
from 成绩表
group by 学号
having count()>3 and avg(成绩)>80
『捌』 求选修课程号位C1且成绩在90分以上的学生学号,姓名和成绩。
select scCnum,scname 课程名称,snum 学号,sname 姓名,scScore
from 学生表 s
left join 课程表 sc on scSnum = sSnum
where scCnum = 'C1' and scScore > '90';
兄弟,由于你只是给我看了你写的语句,我不知道你专的表结构,以及属字段信息,所以有些地方我已经用别名帮你取出来了,你自己修改一下。
你的语句问题不大,犯了一点错,就是90分以上了,题目都很明确了,那么就不是=号了,而是大于号,至于说其它的你说没数据,你先select from一下,看看有没有数据,如果真没有,你可以留下qq,我帮你看看,反正今天周末不上班,我可以抽空帮你看看具体问题。
有问题在留言吧。
『玖』 根据用户要求输出某门课程(由键盘输入课程号)成绩在90分以上(含90分)且总分在前五名的学生情况
#include<stdioh>
#include<stringh>
#defineMAX_STUDENT_NUM512//学生个数
typedefenum{
SUBJECT_YUWEN,
SUBJECT_SHUXUE,
SUBJECT_YINGYU,
SUBJECT_END
}SUBJECT_TYPE_T;
typedefstructstudent
{
charname[32];//姓名
intindex;//学号
intscore[SUBJECT_END];//单项成绩数组
intavg_score;//平均成绩
intrank;//名次
inttotal_score;//总成绩
}STUDENT_T;
charsubject_str[SUBJECT_END]=
{
[SUBJECT_YUWEN]="语文",
[SUBJECT_SHUXUE]="数学",
[SUBJECT_YINGYU]="英语",
};
//根据学生成绩进行冒泡排序
voidranking(STUDENT_Ta,intcnt)
{
inti=0;
intj=0;
STUDENT_Ttmp={0};
for(i=0;i<cnt;i++)
{
for(j=i+1;j<cnt;j++)
{
if(a[i]total_score<a[j]total_score)
{
memcpy(&tmp,&a[j],sizeof(STUDENT_T));
memcpy(&a[j],&a[i],sizeof(STUDENT_T));
memcpy(&a[i],&tmp,sizeof(STUDENT_T));
}
}
}
//计算名次
for(i=0;i<cnt;i++)
{
//名次要考虑到并列的情况
if(0==i||a[i]total_score!=a[i-1]total_score)
{
j=i+1;
}
a[i]rank=j;
}
}
//计算平均成绩
voidaverage(STUDENT_Ta,intcnt)
{
inti=0;
intj=0;
for(i=0;i<cnt;i++)
{
for(j=0;j<SUBJECT_END;j++)
{
a[i]avg_score+=a[i]score[j];
}
a[i]avg_score/=SUBJECT_END;
}
}
//根据分数和名词找到学生并打印
voidprint_student_by_score_rank(STUDENT_Ta,intcnt,intscore,intrank)
{
inti=0,j=0,h=0,subject=0;
for(j=0;j<SUBJECT_END;j++)
{
printf("学科%s:%d",subject_str[j],j);
}
printf(" ");
printf("请输入想要对比的学科号: ");
scanf("%d",&subject);
for(i=0;i<cnt;i++)
{
if(a[i]score[subject]>=score&&a[i]rank<=rank)
{
h=1;
printf("名次:%d姓名:%s学号:%d平均成绩:%d",a[i]rank,a[i]name,a[i]index,a[i]avg_score);
for(j=0;j<SUBJECT_END;j++)
{
printf("学科%s:%d",subject_str[j],a[i]score[j]);
}
printf(" ");
}
}
if(0==h)
{
printf("没有%s成绩在%d以上且排名在前%d的学生 ",subject_str[subject],score,rank);
}
}
intmain(intargc,charargv[])
{
inti=0;
intj=0;
intrank=0;
intcnt=MAX_STUDENT_NUM;
STUDENT_Tstudent[MAX_STUDENT_NUM]={0};
chartmp[32]={0};
printf("请输入学生人数: ");
scanf("%d",&cnt);
if(cnt>MAX_STUDENT_NUM)
{
printf("最多%d个学生 ",MAX_STUDENT_NUM);
return;
}
//输入学生信息
printf("请按序号依次输入%d个学生的信息 ",cnt);
for(i=0;i<cnt;i++)
{
printf(" 第%d个学生: ",i+1);
printf("姓名: ");
scanf("%s",student[i]name);
printf("学号: ");
scanf("%d",&student[i]index);
for(j=0;j<SUBJECT_END;j++)
{
printf("%s成绩: ",subject_str[j]);
scanf("%d",&student[i]score[j]);
}
//计算每个学生的总成绩
for(j=0;j<SUBJECT_END;j++)
{
student[i]total_score+=student[i]score[j];
}
}
//计算每个学生的平均成绩
average(student,cnt);
//根据总成绩进行排序
ranking(student,cnt);
//根据成绩和名词找到学生
print_student_by_score_rank(student,cnt,90,5);
return0;
}
这是我以前回答的一个类似问题的答案,我改了下,只通过编译,没怎么试,你如果试的有问题自己改改就行了。
『拾』 用SQL语句查询选修CJ001号课程且成绩在80以上的所有学生
按照以往经验的上课学的三张表
selecta姓名from学生表a,成绩表bwherea学号=b学号andb课程号='CJ001'andb成绩>80
字段名如不符,请自行替换
选修了2号课程的学生的姓名
SELECT Sname
FROM Student , SC
WHERE StudentSno = SCSno AND Cno = 2
计算机系又不及格课程的学生名单
SELECT Sname
FROM Student , SC
WHERE StudentSno = SCSno AND Sdept = '计算机' AND Score < 60
学生张林的“数据库原理”成绩
SELECT Score
FROM Student , SC , Course
WHERE StudentSno = SCSno AND SCCno = CourseCno AND Sname = '张林'
select 课程课程号,课程课程名\x0d\from 课程 where 课程号 in(\x0d\ select distinct 课程号 from 选课\x0d\ group by 课程号\x0d\ having count() =(select count() from 学生)\x0d\\x0d\)\x0d\\x0d\根据人数判断 ,比较土,可以这样试试。
以上就是关于查询选修2号课程且成绩在90分全部的内容,包括:查询选修2号课程且成绩在90分、已知学生选课数据库模式: Student(Sno, Sname,Sage, Sdept) Course(Cno,Cname) SC(Sno,Cno,Score)、数据库中怎么查询学生选修了的课程号和课程名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)