現有教學數據庫JX_DB,作業


現有教學數據庫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分的學生學號與姓名。

 
 

各表數據如下:

Student表:

Sno

Sname

Sex

bdate

Sdept

15202101

劉芳

2001/3/12

計算機系

15202102

張曉晨

2002/1/24

計算機系

15202103

王文選

2000/11/15

計算機系

15202104

張玲

2001/8/19

計算機系

15202105

李莉萍

2003/6/3

計算機系

 

Course表:

Cno

Cname

Lhour

Credit

Semester

CS-110

計算機導論

32

2

CS-201

數據結構

80

5

CS-221

軟件工程

64

4

EE-122

電路基礎

48

3

EE-201

電工電子

80

5

 

SC表:

Sno

Cno

Grade

15202101

CS-110

95

15202101

CS-201

90

15202102

CS-110

85

15202102

EE-201

80

15202103

CS-110

82

15202103

CS-201

75

15202103

EE-122

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#(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;

 

 

 

 

 

 

創建的視圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM