❶ sql:查询出同时选了2号和3号课程且成绩均已及格的学生姓名(子查询)
select 姓名判让
from 学生表 where 学号 in (
select 学号
from 选课表掘塌局
where 课程号 in (2, 3) and 成绩 >= 60
group by 学衫春号 having count(*) = 2)
❷ 在SQL Server数据库中,查一个人同时至少选择两种科目的学号应该怎么写啊
--科目表
create table subject
(
sid int identity primary key,
name varchar(20)
)
insert into subject
select '数明梁学' union
select '语文' union
select '英语'
--个人信息表
create table people
(
tid int identity primary key,
name varchar(20) not null,
sex varchar(2) not null check(sex in('男','女')),
age int
)
insert into people
select 'aaa','男',16 union
select 'bbb','女',17 union
select 'ccc','男',18
--成绩表
create table Score
(
id int identity primary key,
score float,
sid int,
tid int
)
insert into score
select 80,1,1 union
select 70,2,1 union
select 50,3,1 union
select 90,1,2 union
select 70,2,2 union
select 80,3,2 union
select 60,1,3 union
select 50,2,3 union
select 40,3,3
--查一个人同时至少选择两种科目的学号
select tid
from @score
group by tid
having count(tid)>=2
--查及格率
--创建存升团储过程
if exists(select * from sysobjects where name='proc_test')
drop procere proc_test
go
create procere proc_test
@jgl float output,
@jige float=1,
@bujige float=1
as
select @jige=count(tid) from [score] where score>=60
select @bujige=count(tid) from [score]
set @jgl=@jige/@bujige
go
--引用激笑运
declare @jgltest float
exec proc_test @jgltest output
set @jgltest=cast(@jgltest as decimal(2,2))*100
select cast(@jgltest as varchar(20))+'%' as 及格率
go
❸ 查询选修2号课程且成绩在90分
‘壹’ 求“建立查询,查找选修“保险学”且成绩在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 a.sno from studentcourse a join course b
on a.cno=b.cno
where b.cname='数据库原理' and a.score>90)
select a.sclass as 班级,count(*) as 不及格回人数答 from
student a join studentcourse b
on a.sno=b.sno
where b.score<60
group by a.sclass
‘叁’ 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 sc.Cnum,sc.name 课程名称,s.num 学号,s.name 姓名,sc.Score
from 学生表 s
left join 课程表 sc on sc.Snum = s.Snum
where sc.Cnum = 'C1' and sc.Score > '90';
兄弟,由于你只是给我看了你写的语句,我不知道你专的表结构,以及属字段信息,所以有些地方我已经用别名帮你取出来了,你自己修改一下。
你的语句问题不大,犯了一点错,就是90分以上了,题目都很明确了,那么就不是=号了,而是大于号,至于说其它的你说没数据,你先select * from一下,看看有没有数据,如果真没有,你可以留下qq,我帮你看看,反正今天周末不上班,我可以抽空帮你看看具体问题。
有问题在留言吧。
‘玖’ 根据用户要求输出某门课程(由键盘输入课程号)成绩在90分以上(含90分)且总分在前五名的学生情况
#include<stdio.h>
#include<string.h>
#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;
char*subject_str[SUBJECT_END]=
{
[SUBJECT_YUWEN]="语文",
[SUBJECT_SHUXUE]="数学",
[SUBJECT_YINGYU]="英语",
};
//根据学生成绩进行冒泡排序
voidranking(STUDENT_T*a,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_T*a,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_T*a,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,char*argv[])
{
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
字段名如不符,请自行替换
❹ SQL语言、查询同时选择了一号课和三号课同学的学号
select * from table where 课号 in ('一号','三号')
❺ 用SQL查询同时选修了1号课和2号课的学生学号
sno 指的是什么?cno指什么? 上面的sql语句是不可能实现同样的功能的。
sno如果是指学生学号;
cno是指课程号的话。
where cno=’1‘ and cno=’2‘
是指课程号是1和2 的学生信息。
where sno=’1‘ and sno in(select sno
from SC
where sno=’2‘)
是指学生学号是1和2 的学生,事实上,作为主键的sno没有可能同时是1和2的。
❻ 用SQL语句写出完成如下查询
近来在巩固SQL中,以下语句经过运行,完全正确,有问题请加MSN:[email protected]
--1.查询同时只选修了1号和2号课程的学生的学号
SELECT DISTINCT SNO FROM SC WHERE SNO IN (SELECT DISTINCT S1.SNO FROM SC AS S1,SC AS S2 WHERE S1.SNO=S2.SNO AND ((S1.CNO=1 AND S2.CNO=2) OR (S1.SNO=2 AND S2.SNO=1))) GROUP BY SNO HAVING COUNT(*)=2
或者:
SELECT SNO FROM SC GROUP BY SNO HAVING (COUNT(*)=2 AND MIN(CNO)=1 AND MAX(CNO)=2)
--2.查询至少选修了1号和2号课程的学生的学号,按学号降序排列
SELECT DISTINCT S1.SNO FROM SC AS S1,SC AS S2 WHERE S1.SNO=S2.SNO AND ((S1.CNO=1 AND S2.CNO=2) OR (S1.CNO=2 AND S2.CNO=1) ) ORDER BY S1.SNO DESC
--3.查询被3门以上(包含3门)课程作为直接先行课的课程号
SELECT CPNO FROM C GROUP BY CPNO HAVING COUNT(*)>=3
--4.查询平均分在80分以下的学生的学号和选修的课程名
SELECT DISTINCT SNO,(SELECT CNAME FROM C WHERE CNO=SC.CNO) FROM SC GROUP BY SNO,CNO HAVING AVG(GRADE)<80
❼ 在SQL Server数据库中,查一个人同时至少选择两种科目的学号应该怎么写啊
大概引用楼上的楼上的:
科目表: sid name;
个人信息表: tid name ;
成绩表: id score sid tid;
SELECT tid as 学号, COUNT(sid) AS 科目数 FROM 成绩表 GROUP BY tid HAVING COUNT(sid) >= 2
❽ 数据库sql查询同时选修了选修课1和选修课2的学生学号
select Sno from sc where Cno in('课1','课2') group by Sno having count(*)=2
❾ 检索至少同时选修了c03和c06两门课的学生学号用SQL语句怎么写
course -- 选课表
studentid -- 学号
courseid -- 课程编号
select aa.studentid from (select studentid from course where courseid = 'c03' union all select studentid from course where courseid = 'c06') aa group by aa.studentid having count(1)>1