1.學生表
Student(SID,Sname,Sage,Ssex) --SID 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別學習
2.課程表測試
Course(CID,Cname,TID) --CID --課程編號,Cname 課程名稱,TID 教師編號spa
3.教師表ci
Teacher(TID,Tname) --TID 教師編號,Tname 教師姓名數學
4.成績表io
SC(SID,CID,score) --SID 學生編號,CID 課程編號,score 分數table
添加測試數據
1.學生表ast
create table Student(SID varchar(10),Sname nvarchar(10),Sage datetime,Ssex varchar(10));date
insert into Student values('01' , '趙雷' , '1990-01-01' , '男');select
insert into Student values('02' , '錢電' , '1990-12-21' , '男');
insert into Student values('03' , '孫風' , '1990-05-20' , '男');
insert into Student values('04' , '李雲' , '1990-08-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吳蘭' , '1992-03-01' , '女');
insert into Student values('07' , '鄭竹' , '1989-07-01' , '女');
insert into Student values('08' , '王菊' , '1990-01-20' , '女');
2.課程表
create table Course(CID varchar(10),Cname nvarchar(10),TID varchar(10));
insert into Course values('01' , '語文' , '02');
insert into Course values('02' , '數學' , '01');
insert into Course values('03' , '英語' , '03');
3.教師表
create table Teacher(TID varchar(10),Tname nvarchar(10));
insert into Teacher values('01' , '張三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');
4.成績表
create table SC(SID varchar(10),CID varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);
--一、查詢"01"課程比"02"課程成績高的學生的 信息及課程分數--1.一、查詢同時存在"01"課程和"02"課程的狀況
select a.* , b.score 課程01的分數,c.score 課程02的分數 from Student a , SC b , SC c
where a.SID = b.SID and a.SID = c.SID and b.CID = '01' and c.CID = '02' and b.score > c.score;
--1.二、存在"01"課程但可能不存在"02"課程的狀況(不存在時顯示爲null)
select a.* , b.score 課程01的分數,c.score 課程02的分數 from Student a
left join SC b on a.SID = b.SID and b.CID = '01'
left join SC c on a.SID = c.SID and c.CID = '02'
where b.score > ifnull(c.score,0);
此語句中student表爲左表
ifnull(a,b):若a不爲null則返回a,不然返回b
--三、查詢平均成績大於等於60分的同窗的學生編號和學生姓名和平均成績
二者道理相同
個人方法:
select a.sid, a.sname, avg(b.score)
from student a,sc b
where a.sid = b.sid group by a.sid having avg(b.score) >= 60;
答案的方法:
select a.SID , a.Sname , cast(avg(b.score) as decimal(18,2)) avg_score
from Student a , sc b
where a.SID = b.SID
group by a.SID , a.Sname
having cast(avg(b.score) as decimal(18,2)) >= 60
order by a.SID
Cast(字段名 as 轉換的類型 )
cast(a as b):將a字段的值轉換爲b類型
--4.二、查詢在sc表中不存在成績的學生信息的SQL語句。(此處的不存在成績指的是選了課以後沒有成績的同窗,而不是爲選課的同窗,容易誤寫爲
select *
from student
where sid
not in (select distinct sid from sc);)
實際是查詢成績爲空的同窗以下:
select a.* from student a where a.sid in (select sc.sid from sc where ifnull(sc.score,0) = 0);
--五、查詢全部同窗的學生編號、學生姓名、選課總數、全部課程的總成績--5.一、查詢全部有成績的SQL。
select a.SID 學生編號 , a.Sname 學生姓名 , count(b.CID) 選課總數, sum(score) 全部課程的總成績
from Student a , SC b
where a.SID = b.SID
group by a.SID,a.Sname
order by a.SID
--5.二、查詢全部(包括有成績和無成績)的SQL。
select a.SID 學生編號 , a.Sname 學生姓名 , count(b.CID) 選課總數, sum(score) 全部課程的總成績
from Student a left join SC b
on a.SID = b.SID
group by a.SID,a.Sname
order by a.SID
--七、查詢學過"張三"老師授課的同窗的信息(此語句中使用distinct是由於張三老師教過不僅一門課)
select distinct Student.* from Student , SC , Course , Teacher
where Student.SID = SC.SID and SC.CID = Course.CID and Course.TID = Teacher.TID and Teacher.Tname = '張三'
order by Student.SID
--八、查詢沒學過"張三"老師授課的同窗的信息
select m.* from Student m where SID not in (select distinct SC.SID from SC , Course , Teacher where SC.CID = Course.CID and Course.TID = Teacher.TID and Teacher.Tname = '張三') order by m.SID
--九、查詢學過編號爲"01"而且也學過編號爲"02"的課程的同窗的信息
個人方法:
select *
from student
where sid in (select sid from sc where cid = '01')
and sid in (select sid from sc where cid = '02');
--方法1
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = '01' and exists (Select 1 from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = '02') order by Student.SID
--方法2
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = '02' and exists (Select 1 from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = '01') order by Student.SID
--方法3
select m.* from Student m where SID in
(
select SID from
(
select distinct SID from SC where CID = '01'
union all
select distinct SID from SC where CID = '02'
) t group by SID having count(1) = 2
)
order by m.SID
--十、查詢學過編號爲"01"可是沒有學過編號爲"02"的課程的同窗的信息
個人方法1
select student.*
from student where student.sid in(select sid from sc where cid = '01' and sid not in (select sid from sc where cid = '02'));
個人方法2
select *
from student
where sid in (select sid from sc where cid = '01')
and sid not in (select sid from sc where cid = '02');
--方法1
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = '01' and not exists (Select 1 from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = '02') order by Student.SID
--方法2
select Student.* from Student , SC where Student.SID = SC.SID and SC.CID = '01' and Student.SID not in (Select SC_2.SID from SC SC_2 where SC_2.SID = SC.SID and SC_2.CID = '02') order by Student.SID
--十一、查詢沒有學全全部課程的同窗的信息
個人方法1:
select
a.*
from student a,sc b
where a.sid = b.sid
group by a.sid having count(a.sid) < (select count(*) from course);
個人方法2:
select *
from student
where sid in (select sid from sc group by sid having count(*) < (select count(*) from course));
--11.一、
select Student.*
from Student , SC
where Student.SID = SC.SID
group by Student.SID , Student.Sname , Student.Sage , Student.Ssex having count(CID) < (select count(CID) from Course)
--11.2
select Student.*
from Student left join SC
on Student.SID = SC.SID
group by Student.SID , Student.Sname , Student.Sage , Student.Ssex having count(CID) < (select count(CID) from Course)
--十二、查詢至少有一門課與學號爲"01"的同窗所學相同的同窗的信息
個人方法1:
select distinct student.*
from student , sc
where student.sid = sc.sid
and student.sid != '01'
and sc.cid
in (select cid from sc where sid = '01');
select distinct Student.* from Student , SC where Student.SID = SC.SID and SC.CID in (select CID from SC where SID = '01') and Student.SID <> '01'
--1三、查詢和"01"號的同窗學習的課程徹底相同的其餘同窗的信息(答案不對)
select Student.* from Student where SID in
(select distinct SC.SID from SC where SID <> '01' and SC.CID in (select distinct CID from SC where SID = '01')
group by SC.SID having count(1) = (select count(1) from SC where SID='01'))
--1三、1 查詢和"01"號的同窗學習的課程數相同的其餘同窗的信息
select student.* from student where student.sid in(
select a.sid
from sc a where a.sid != '01' group by a.sid having count(a.sid) = (select count(*) from sc where sid= '01'));
--1四、查詢沒學過"張三"老師講授的任一門課程的學生姓名(注意此處應該使用distinct,由於張三老師可能教不僅一門課)
方法1:
select student.sname
from student
where sid
in (select sid from sc
where cid
not in (select course.cid from course,teacher where course.tid = teacher.tid and teacher.tname = '張三'));
方法2:select student.* from student where student.SID not in
(select distinct sc.SID from sc , course , teacher where sc.CID = course.CID and course.TID = teacher.TID and teacher.tname = '張三')
order by student.SID
--1五、查詢兩門及其以上不及格課程的同窗的學號,姓名及其平均成績(易錯題)
注意此處要使用最後面的group by 不然顯示的是全部學生總成績的平均值
select student.sid,student.sname,avg(sc.score)
from student,sc
where student.sid = sc.sid
and student.sid in (select distinct sid from sc where score < 60 group by sid having count(*) >= 2) group by student.sid;
select student.SID , student.sname , cast(avg(score) as decimal(18,2)) avg_score from student , sc
where student.SID = SC.SID and student.SID in (select SID from SC where score < 60 group by SID having count(1) >= 2)
group by student.SID , student.sname
--1六、檢索"01"課程分數小於60,按分數降序排列的學生信息
select student.* , sc.CID , sc.score from student , sc
where student.SID = SC.SID and sc.score < 60 and sc.CID = '01'
order by sc.score desc
--1七、按平均成績從高到低顯示全部學生的全部課程的成績以及平均成績
注意:
錯誤認識:
之前認爲要把和兩張表都有關聯的中間表放在關聯語句的中間(不然返回結果不一致),以下語句:先寫的是student表,而後鏈接sc表,最後是course表。sc表在中間
實際緣由是:不是必定要把與其餘表關聯的表放在中間,而是左鏈接會顯示左表的所有內容,誰做爲左表纔是顯示結果的關鍵,所以會出現左表不一樣顯示結果不一樣
select a.SID 學生編號 , a.Sname 學生姓名 ,
max(case c.Cname when '語文' then b.score else null end) 語文 ,
max(case c.Cname when '數學' then b.score else null end) 數學 ,
max(case c.Cname when '英語' then b.score else null end) 英語 ,
max(case c.cname when '政治' then b.score else null end) 政治,
cast(avg(b.score) as decimal(18,2)) 平均分
from Student a
left join SC b on a.SID = b.SID
left join Course c on b.CID = c.CID
group by a.SID , a.Sname
order by 平均分 desc;
--1八、查詢各科成績最高分、最低分和平均分:以以下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
--及格爲>=60,中等爲:70-80,優良爲:80-90,優秀爲:>=90
注意此語句中雖然每一個課程的總人數(即(select count(1) from SC where CID = m.CID) as decimal(18,2)語句)用到過屢次,可是不能給其在第一次中進行命名,用到下一次中,會產生語法錯誤。
試驗以下(cast((select count(1) from SC where CID = m.CID and score >= 60)*100.0 / ((select count(1) from SC where CID = m.CID) as decimal(18,2) lv)) 及格率 ,
cast((select count(1) from SC where CID = m.CID and score >= 70 and score < 80 )*100.0 / lv) 中等率 ,),報語法錯誤。
--方法1
select m.CID 課程編號 , m.Cname 課程名稱 ,
max(n.score) 最高分 ,
min(n.score) 最低分 ,
cast(avg(n.score) as decimal(18,2)) 平均分 ,
cast((select count(1) from SC where CID = m.CID and score >= 60)*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2)) 及格率 ,
cast((select count(1) from SC where CID = m.CID and score >= 70 and score < 80 )*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2)) 中等率 ,
cast((select count(1) from SC where CID = m.CID and score >= 80 and score < 90 )*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2)) 優良率 ,
cast((select count(1) from SC where CID = m.CID and score >= 90)*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2)) 優秀率
from Course m , SC n
where m.CID = n.CID
group by m.CID , m.Cname
order by m.CID;
--方法2
select m.CID 課程編號 , m.Cname 課程名稱 ,
(select max(score) from SC where CID = m.CID) 最高分 ,
(select min(score) from SC where CID = m.CID) 最低分 ,
(select cast(avg(score) as decimal(18,2)) from SC where CID = m.CID) 平均分 ,
cast((select count(1) from SC where CID = m.CID and score >= 60)*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2)) 及格率,
cast((select count(1) from SC where CID = m.CID and score >= 70 and score < 80 )*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2)) 中等率 ,
cast((select count(1) from SC where CID = m.CID and score >= 80 and score < 90 )*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2)) 優良率 ,
cast((select count(1) from SC where CID = m.CID and score >= 90)*100.0 / (select count(1) from SC where CID = m.CID) as decimal(18,2)) 優秀率
from Course m
order by m.CID;
--20、查詢學生的總成績並進行排名
select m.SID 學生編號 ,
m.Sname 學生姓名 ,
ifnull(sum(score),0) 總成績
from Student m left join SC n on m.SID = n.SID
group by m.SID , m.Sname
order by 總成績 desc;