❶ 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