現有教學數據庫JX_DB,數據庫有以下三個基本表:
學生表student,它由學號sno、姓名sname、性別sex、出生日期Bdate、所在系dept五個屬性構成。其中,學號不能為空,值是唯一的;
課程表course,它由課程號cno、課程名cname、學時數lhour、學分數creadit、開設學期semester五個屬性組成。主鍵是cno,要求主鍵非空且唯一;
選課表SC,它由學號sno、課程號cno、成績grade三個屬性組成。其中主鍵是(sno,cno),且主屬性son、cno分別外鍵關聯自學生表和課程表,grade默認值為null。
請使用MySQL語句創建數據庫和數據庫表並導入數據,然后寫出SQL語句完成以下操作:
(1)為學生表的sno屬性創建唯一索引;
(2)查詢年齡大於19歲的學生姓名和出生年月;
(3)查詢學習課程號為CS-221的課程的學生學號與姓名;
(4)查詢至少選修課程號為CS-110和CS-201的學生學號與姓名;
(5)查詢2000年出生的學生姓名及其秋季所修課程的課程號及成績;
(6)查詢秋季學期有一門以上課程獲90分以上成績的學生;
(7)查詢只有一個人選修的課程號和課程名;
(8)查詢沒有選修EE-201課程的學生學號與姓名;
(9)查詢每門課程的選課人數;
(10)查詢選修了3門以上課程的學生學號與姓名;
(11)查詢計算機系所開課程的最高成績、最低成績和平均成績。如果某門課程的成績不全(即為NULL),則課程不予統計,結果按CNO升序排列;
(12)查詢2003年出生的學生和選修機電系所開課程(EE標志)的學生學號與姓名(即求並集);
(13)查詢計算機系2003年出生的學生詳細信息(即求交集);
(14)查詢選修了CS-110課程但沒有選修CS-201課程的學生學號與姓名(即求差集);
(15)將一個新學生記錄(學號15202106,姓名韓曉婷,性別女,出生年月2004-5-8,所在系計算機系)插入到Student表中;
(16)創建一個女學生成績臨時表Fgrade,表中包括Sname、Cno、Grade三個屬性,然后查詢相應女學生成績數據並存儲;
(17)修改選修數據結構的選課成績,若低於80,則統一提高5%;
(18)將SC表中缺成績的學生成績置0;
(19)刪除王姓同學的選課記錄;
(20)定義一個視圖Grade_AVG,表示學生的平均成績,其中包括Sno、Sname和Avggrade(平均成績)三個屬性,並此視圖上查詢平均成績大於90分的學生學號與姓名。
|
#(1)為學生表的sno屬性創建唯一索引
create unique index sno on student(sno);
好像沒什么反應。。。。
#(2)查詢年齡大於19歲的學生姓名和出生年月;
select Sname,bdate
from student
where year(bdate)<='2002';
這個簡單,year()查找了半天
#(3)查詢學習課程號為CS-221的課程的學生學號與姓名;
select Student.Sno,Student.Sname
from student,sc
where Student.Sno=SC.Sno and sc.Cno='CS-221';
這個什么都沒有
#(4)查詢至少選修課程號為CS-110和CS-201的學生學號與姓名;
select sc.Sno,sname
from sc,student
where sc.sno in (select sno from sc where cno='CS-110') and cno='CS-201'and sc.Sno=Student.Sno;
用連接表就可以了
#(5)查詢2000年出生的,學生姓名及其秋季所修課程的課程號及成績;
select Sname,Course.Cno,sc.Grade
from student,course,sc
where Student.bdate like '2000%'
and Student.Sno=SC.Sno and Course.Cno=SC.Cno and Semester='秋 ' ;
同樣是連接表
#(6)查詢秋季學期有一門以上課程獲90分以上成績的學生;
select *
from student,course,sc
where Grade>90
and Student.Sno=SC.Sno and Course.Cno=SC.Cno and Semester='秋 ' ;
還是連接表
#(7)查詢只有一個人選修的課程號和課程名;
select Course.cno,Cname
from sc scx,course
where scx.Cno=Course.Cno and scx.Cno NOT IN (select Cno from sc where SC.sno !=scx.sno);
子查詢中的意思是所有都選了的,只選一個的沒有在這個范圍內,意思是查詢成績表中的課號而學號不等於scx中的學號的人,弄了好久
#(8)查詢沒有選修EE-201課程的學生學號與姓名;
select distinct Student.Sno,Sname
from student,course,sc
where Student.Sno=SC.Sno and Course.Cno=SC.Cno and
Course.Cno not in(select Course.Cno from Course where SC.Cno= 'EE-201'
);
套娃
#(9)查詢每門課程的選課人數
SELECT cno,COUNT(cno)
FROM sc
GROUP BY Cno ;
用聚集函數
#(10)查詢選修了3門以上課程的學生學號與姓名;
SELECT SC.sno,Student.Sname
FROM sc,student
where Student.Sno=SC.Sno
HAVING COUNT(SC.sno) > 3 ;
同上
#(11)查詢計算機系所開課程的最高成績、最低成績和平均成績。如果某門課程的成績不全(即為NULL),則課程不予統計,結果按CNO升序排列;
select cno,max(grade),min(grade),avg(grade)
from sc
where cno like'CS%' group by cno
having cno not in(select cno
from sc
where grade is NULL)
order by cno;
#(12)查詢2003年出生的學生和選修機電系所開課程(EE標志)的學生學號與姓名(即求並集);
select sc.sno,sname
from student,sc
where student.sno=sc.sno and sc.cno like'EE%'
union
select sno,sname
from student
where bdate like'2003%';
其實就是and嘛
#(13)查詢計算機系2003年出生的學生詳細信息(即求交集);
select *
from student
where bdate like'2003%'and sdept='計算機系 ';
取交集
#(14)查詢選修了CS-110課程但沒有選修CS-201課程的學生學號與姓名(即求差集);
select sc.sno,sname
from student,sc
where student.sno=sc.sno and
cno not in(select cno
from sc
where cno='CS-201')and cno='CS-110';
#(15)將一個新學生記錄(學號15202106,姓名韓曉婷,性別女,出生年月2004-5-8,所在系計算機系)插入到Student表中;
insert into student
values(15202106,'韓曉婷','女','2004/5/8','計算機');
運行一次就進去了
#(16)創建一個女學生成績臨時表Fgrade,表中包括Sname、Cno、Grade三個屬性,然后查詢相應女學生成績數據並存儲;
create temporary table Fgrade
(select distinct Student.Sname,SC.Cno,SC.grade
from student,sc
where student.sex='女' and student.sno=sc.sno);
drop temporary table Fgrade;
雖然創建了臨時表,並且儲存了,但是沒有去看看
#(17)修改選修數據結構的選課成績,若低於80,則統一提高5%;
SET SQL_SAFE_UPDATES = 0;
update sc set grade=grade+grade*0.05
where grade<80;
select *from sc;
更新數據
分數顯著提高了,但是這里的王姓同學已經沒了
#(18)將SC表中缺成績的學生成績置0;
update sc set grade=0
where grade is NULL;
#19)刪除王姓同學的選課記錄;
delete from sc
where Sno in(select sno
from student
where sname like'王%');
03沒掉了
#(20)定義一個視圖Grade_AVG,表示學生的平均成績,其中包括Sno、Sname和Avggrade(平均成績)三個屬性,並此視圖上查詢平均成績大於90分的學生學號與姓名。
create view Grade_AVG(Sno,Sname,Avggrade)
as
select sc.Sno,Sname,avg(grade)
from student,sc
where student.sno=sc.sno
group by sno;
select * from Grade_AVG;
select sno,sname from Grade_AVG
where Avggrade>90;
創建的視圖