SQL 语句查询
題目1:
問題描述:
?S (SNO,SNAME) 學(xué)生關(guān)系。SNO 為學(xué)號(hào),SNAME 為姓名
?C (CNO,CNAME,CTEACHER) 課程關(guān)系。CNO 為課程號(hào),CNAME 為課程名,CTEACHER 為任課教師
?SC(SNO,CNO,SCGRADE) 選課關(guān)系。SCGRADE 為成績
?1.(1)找出選修過“李明”老師講授課程的所有學(xué)生姓名
?--實(shí)現(xiàn)代碼:法一
Select *
FROM SC,C,S
Where SC.CNO=C.CNO AND SC.SNO=S.SNO AND CTEACHER='李明'
---法二:-------------
Select *
FROM S
Where Sno IN( Select Sno
????????????? FROM C,SC
????????????? Where C.[Cno]=SC.[Cno] AND CTEACHER='李明')
?
(2)找出沒有選修過“李明”老師講授課程的所有學(xué)生姓名
?--實(shí)現(xiàn)代碼:法一
Select SName
FROM S
Where [Sno] NOT IN( Select SC.[Sno]
??????????????????? FROM SC,C
??????????????????? Where SC.CNO=C.CNO AND CTEACHER='李明')
?
(3)找出沒有選修過課程號(hào)為"1"的所有學(xué)生姓名
?--實(shí)現(xiàn)代碼
Select SName
FROM S
Where [Sno] NOT IN( Select [Sno] FROM SC Where CNO='1')
?
------------------------------------------------------------------------------------------------------------------------------------------
?2. 列出有二門以上(含兩門)不及格課程的學(xué)生姓名及其平均成績
?--實(shí)現(xiàn)代碼:
Select S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)
FROM S,SC,( Select SNO
???????????????????? FROM SC
???????????????????? Where SCGRADE<60
???????????????????? GROUP BY SNO
???????????????????? HAVING COUNT(DISTINCT CNO)>=2 )A
Where S.SNO=A.SNO AND SC.SNO=A.SNO
GROUP BY S.SNO,S.SNAME
?--------------------------------------------------------------------------------------------------------------------------------------
?3. (1)列出既學(xué)過“語文”課程,又學(xué)過“數(shù)學(xué)”課程的所有學(xué)生姓名
?--實(shí)現(xiàn)代碼:法一
Select S.SNO,S.SNAME
FROM S,(
?? Select SC.SNO
?? FROM SC,C
?? Where SC.CNO=C.CNO AND C.CNAME IN('語文','數(shù)學(xué)')
?? GROUP BY SNO
?? HAVING COUNT(DISTINCT c.CNO)=2 )SC
Where S.SNO=SC.SNO
---法二:--------------------------
select *
from (select s.sno from s,sc,c where s.sno=sc.sno and sc.cno=c.cno and c.cname='語文')t1,
???? (select s.sno from s,sc,c where s.sno=sc.sno and sc.cno=c.cno and c.cname='數(shù)學(xué)')t2,
????? s
where t1.sno=t2.sno and t1.sno=s.sno
------------------
(2)使用標(biāo)準(zhǔn)SQL嵌套語句查詢選修全部課程的學(xué)員姓名
法一:一句SQL語句即可。注意有下劃線的部分!
?
Select S.SNO,S.SNAME
FROM S,(
??????? Select SNO
??????? FROM SC
??????? GROUP BY SNO
??????? HAVING COUNT(*)=(select count(*) from c) )SC
Where S.SNO=SC.SNO
?
(3)查詢選修課程超過2門的學(xué)員學(xué)號(hào)
?--實(shí)現(xiàn)代碼:
???????????????????? Select Sno? FROM SC GROUP BY Sno HAVING COUNT(Cno)>2
查詢選修課程超過2門的學(xué)員學(xué)號(hào)及姓名
?--實(shí)現(xiàn)代碼:
Select SNo,SNAME
FROM S
Where Sno IN(Select Sno? FROM SC GROUP BY Sno HAVING COUNT(Cno)>2)
?
(4)列出人數(shù)大于3的各科最高成績的列表,顯示科目號(hào)、成績兩個(gè)字段
---正解如下:(科目號(hào)為2、3的選課人數(shù)大于3人)
Select cno,max(scgrade)as'最高分'
FROM SC
Where cno IN (Select cno FROM SC GROUP BY cno HAVING COUNT(sno)>3)
group by cno
order by cno
-----------------------------------------------------------------------------------------------------------------------------------
4. 列出“語文”課比“數(shù)學(xué)”課同學(xué)該門課成績高的所有學(xué)生的學(xué)號(hào)、姓名及分?jǐn)?shù)
?--實(shí)現(xiàn)代碼:法一?
select *
from (select s.sno,s.sname,sc.SCGRADE from s,sc,c
????? where s.sno=sc.sno and sc.cno=c.cno and c.cname='語文' )t1,
?????? (select s.sno,s.sname,sc.SCGRADE from s,sc,c
????? where s.sno=sc.sno and sc.cno=c.cno and c.cname='數(shù)學(xué)' )t2
where t1.sno=t2.sno and t1.SCGRADE>t2.SCGRADE
------------------------------------------------------------------------------------------------------------------------------------?
5. 查詢選修了課程的學(xué)員人數(shù)
?--實(shí)現(xiàn)代碼:
?Select 學(xué)員人數(shù)=COUNT(DISTINCT [Sno]) FROM SC
?
總結(jié):
1、select * from a,b where a.id=b.id 和
???? select * from a inner join b on a.id=b.id 結(jié)果集相同;
2、在作“找出沒有選修過“李明”老師講授課程的所有學(xué)生姓名”這種題時(shí),
?? --用Where [Sno] NOT IN(在此可以是SQL語句生成的一列值)比較好。
?? Select SName
?? FROM S
?? Where [Sno] NOT IN( Select SC.[Sno]
?????????????????????????????????? FROM SC,C
?????????????????????????????????? Where SC.CNO=C.CNO AND CTEACHER='李明')
3、可以將select count(*) from c直接代入SQL語句,而不是非要寫成存儲(chǔ)過程;
??? Select S.SNO,S.SNAME
??? FROM S,(
?????????? Select SC.SNO
?????????? FROM SC,C
?????????? Where SC.CNO=C.CNO
?????????? GROUP BY SNO
?????????? HAVING COUNT(*)=(select count(*) from c) )SC
??? Where S.SNO=SC.SNO
題名是這樣的:
studentname??? classname????? grade??
?mike?????????? english????????? 65
?mike?????????? math???????????? 75
?Jerry????????? english????????? 80
?Jerry????????? math???????????? 68
?Lida?????????? english????????? 88
?Lida?????????? chinese????????? 77
?Lida?????????? math???????????? 90
求出各科成績都大于75分的學(xué)生。
即得到如下結(jié)果
studentname??? classname????? grade
?Lida???????????? english????????? 88
?Lida???????????? chinese????????? 77
?Lida???????????? math???????????? 90
?
select t1.studentname,classname,grade
from # t1,(select studentname
?????????? from #
?????????? where grade>75
?????????? group by studentname
?????????? having count(*)=(select count(*) from (select distinct classname from #)A)) t2
where t1.studentname=t2.studentname
?
注:
1、from (select distinct classname from #)A 中的"A"一定要有,將(select distinct classname from #)得到的記錄集看成一個(gè)新的表A。
2、在SQL語句中,用group by 語句時(shí),一般都會(huì)用到count(),sum(),avg(),max(),min()等函數(shù);
但,當(dāng)不使用group by語句,而直接使用這些函數(shù)時(shí),則表示將所有數(shù)據(jù)集看成一個(gè)組來處理。
?
第二題:
已知一個(gè)關(guān)系數(shù)據(jù)庫的模式如下:
職工EMP(職工號(hào),姓名,工資,所在部門)
部門DEPT(部門號(hào),部門名,部門經(jīng)理的職工號(hào))
(1)、使用查詢分析器建表,要求如下:
A、每個(gè)表的主外碼。
B、職工姓名和部門名不能為空。
C、工資取800到5000這間整數(shù)。
(2)、插入如下數(shù)據(jù):
職工(E01 趙 2500??? D02??????
E02 錢 3000??? D02??????
E03 孫 6000??? D01??????
E04 李 5500??? D01??????
E05 周 3500??? D03??????
E06 吳 2000??? D04??????
E07 鄭 3000??? D04?? )
部門(D01,人事,E04
D02,信息,E01
D03,銷售,E05
D04,財(cái)務(wù),E06)
(3)、用SQL表達(dá)以下的查詢:找出那些工資高于其所在部門經(jīng)理工資的職工的姓名及其工資。
select *
from emp A,(select emp.姓名,emp.工資,dept.*
??????????? from emp,dept
??????????? where emp.職工號(hào)=dept.部門經(jīng)理的職工號(hào))B
where A.所在部門=B.部門號(hào)and A.工資>B.工資 (4)、用SQL完成:將D01號(hào)部門經(jīng)理的工資改為該部門所有職工的平均工資。
update emp
set工資=(select avg(工資) from emp where 所在部門='D01')
from emp,dept
where emp.職工號(hào)=dept.部門經(jīng)理的職工號(hào)AND所在部門='D01'
(5)、新增加一個(gè)廣告部門,編號(hào)為D05。 insert into dept values('D05','廣告','E08') 小結(jié):不要急于答題,先審好題看清表結(jié)構(gòu),再下筆! 在(3)題中,職工號(hào)(E01..)是主鍵,是標(biāo)識(shí)字段。要先確定標(biāo)識(shí)字段,再按照標(biāo)識(shí)字段去理思路,用(E01..)將兩個(gè)表相連即可得到部門表中各經(jīng)理的姓名、工資等情況數(shù)據(jù)集B,此數(shù)據(jù)集的記錄數(shù)=部門(dept)表的記錄數(shù)。然后再將數(shù)據(jù)集B與職工(emp)表相連,即可得到“出那些工資高于其所在部門經(jīng)理工資的職工的姓名及其工資”。
第一題:創(chuàng)建如下三個(gè)基本表,表結(jié)構(gòu)如下:
borrower:
借書證號(hào) 姓名 系名 班級(jí)
03001??????? 李壘??? 信息系?? 03-1?????
03002??????? 趙????? 信息???? 03-1?????
03003??????? 錢????? 計(jì)算機(jī)?? 03-2?????
03004??????? 孫????? 計(jì)算機(jī)?? 03-3?????
......
loans:
借書證號(hào) 圖書登記號(hào) 借書日期
03001??????? t01?????????? 2004?????
03001??????? t02?????????? 2004?????
03001??????? t03?????????? 2004?????
03002??????? t01?????????? 2005?????
03002??????? t02?????????? 2005?????
03003??????? t03?????????? 2006?????
03003??????? t04?????????? 2006?????
03004??????? t05?????????? 2007?????
.......
BOOKS:
索書號(hào) 書名 作者 圖書登記號(hào) 出版社 價(jià)格
TP311.13 數(shù)據(jù)結(jié)構(gòu) 李衛(wèi) T01 科學(xué) 19.00
TP311.13 數(shù)據(jù)結(jié)構(gòu) 李衛(wèi) T02 科學(xué) 19.00
TP.065 數(shù)據(jù)結(jié)構(gòu)導(dǎo)論李衛(wèi) ?? T03 北航 16.50
TP.1599 數(shù)據(jù)通信 楊志 T04 清華 28.50 (1)、檢索借了3本書以下的學(xué)生的借書證號(hào),姓名,系名和借書數(shù)量。
---正解如下------------
select *
from borrower B,(select count(*) as 借書數(shù)量,借書證號(hào) as 借書證號(hào)
??????????????????? from loans
??????????????????? group by 借書證號(hào)
??????????????????? having count(*)<3) A
where B.借書證號(hào)=A.借書證號(hào) (2)、檢索借書和趙壘同學(xué)所借書中的任意一本相同的學(xué)生的姓名,系名,書名,借書日期。
---正解如下------------
select姓名,系名,圖書登記號(hào),借書日期
from borrower bb,loans ll
where bb.借書證號(hào)=ll.借書證號(hào) and 姓名<>'李壘'
and圖書登記號(hào) in (select 圖書登記號(hào)
??????????????????? from borrower b,loans l
??????????????????? where b.借書證號(hào)=l.借書證號(hào) and b.姓名='李壘') (3)、建立信管系學(xué)生借書的視圖SB,該視圖的屬性列由借書證號(hào),姓名,班級(jí),圖書登記號(hào),書號(hào),出版社和借書日期組成
?
第二題:
現(xiàn)有一個(gè)學(xué)生選修課程的數(shù)據(jù)庫,其中存放以下三個(gè)表:
學(xué)生(學(xué)號(hào),姓名,性別,年齡,系別)
課程(課程號(hào),課程名,任課教師);
選修(學(xué)號(hào),課程號(hào),分?jǐn)?shù));
請(qǐng)用SQL完成以下功能:
(1)、建表,在定義中要求聲明:
A、每個(gè)表的主外碼。
B、學(xué)生的年齡介于16到30。
C、學(xué)生的姓名和課程名不能為空。
D、選課成績要么為空值,要么取0到100的整數(shù)。
(2)、插入如下數(shù)據(jù):
學(xué)生(101,張三,男,16,數(shù)學(xué)
????? 102,李四,男,18,計(jì)算機(jī)
????? 103,王玲,女,17,中文
????? 105,李飛,男,19,計(jì)算機(jī)
????? 109,趙四,女,18,歷史
????? 110,李平,男,20,化學(xué))
課程(203,操作系統(tǒng),程羽
279,高等數(shù)學(xué),王備
210,現(xiàn)代文學(xué),王林
243,有機(jī)化學(xué),沈同
204,數(shù)據(jù)結(jié)構(gòu),張青)
選修(101,203,82
105,203,59
102,279,90
101,279,88
105,279,82
110,279,68
109,210,72
103,210,90
110,243,92
101,204,85
105,204,91
102,204,56
101,210,77
101,243,88)
(3)、用SQL語然完成下列查詢:
1、列出張三同學(xué)選修的所有課程的名稱和成績
------正解如下----------------
select課程名,分?jǐn)?shù)
from學(xué)生,選修,課程
where學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào)and選修.課程號(hào)=課程.課程號(hào)and姓名='張三' 2、列出所有課程都及格了的同學(xué)的名字
------正解如下----------------
select t1.姓名
from學(xué)生t1,(select 學(xué)號(hào)
?????????? from 選修
?????????? where 分?jǐn)?shù)>=60
?????????? group by 學(xué)號(hào)
?????????? having count(*)=(select count(*) from (select distinct 課程號(hào)from課程)A)) t2
where t1.學(xué)號(hào)=t2.學(xué)號(hào) 3、列出在選修張青老師所教授課程的學(xué)生中,成績最高的學(xué)生姓名和成績
------正解如下----------------
select top 1 姓名,分?jǐn)?shù)
from學(xué)生,選修
where學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào) and 學(xué)生.學(xué)號(hào) in (select 學(xué)號(hào) from 課程,選修 where 選修.課程號(hào)=課程.課程號(hào) and 任課教師='張青')
order by 分?jǐn)?shù) desc
(4)、刪除所有成績不及格的選課記錄
delete from 選修where分?jǐn)?shù)<60 (5)、將105號(hào)同學(xué)選修203號(hào)課程的成績改為該門課程的平均成績
??
update選修
set分?jǐn)?shù)=(select avg(分?jǐn)?shù)) from 選修where課程號(hào)='203')
from選修
where學(xué)號(hào)='105' and 課程號(hào)='203'
問題描述:
?S (SNO,SNAME) 學(xué)生關(guān)系。SNO 為學(xué)號(hào),SNAME 為姓名
?C (CNO,CNAME,CTEACHER) 課程關(guān)系。CNO 為課程號(hào),CNAME 為課程名,CTEACHER 為任課教師
?SC(SNO,CNO,SCGRADE) 選課關(guān)系。SCGRADE 為成績
?1.(1)找出選修過“李明”老師講授課程的所有學(xué)生姓名
?--實(shí)現(xiàn)代碼:法一
Select *
FROM SC,C,S
Where SC.CNO=C.CNO AND SC.SNO=S.SNO AND CTEACHER='李明'
---法二:-------------
Select *
FROM S
Where Sno IN( Select Sno
????????????? FROM C,SC
????????????? Where C.[Cno]=SC.[Cno] AND CTEACHER='李明')
?
(2)找出沒有選修過“李明”老師講授課程的所有學(xué)生姓名
?--實(shí)現(xiàn)代碼:法一
Select SName
FROM S
Where [Sno] NOT IN( Select SC.[Sno]
??????????????????? FROM SC,C
??????????????????? Where SC.CNO=C.CNO AND CTEACHER='李明')
?
(3)找出沒有選修過課程號(hào)為"1"的所有學(xué)生姓名
?--實(shí)現(xiàn)代碼
Select SName
FROM S
Where [Sno] NOT IN( Select [Sno] FROM SC Where CNO='1')
?
------------------------------------------------------------------------------------------------------------------------------------------
?2. 列出有二門以上(含兩門)不及格課程的學(xué)生姓名及其平均成績
?--實(shí)現(xiàn)代碼:
Select S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)
FROM S,SC,( Select SNO
???????????????????? FROM SC
???????????????????? Where SCGRADE<60
???????????????????? GROUP BY SNO
???????????????????? HAVING COUNT(DISTINCT CNO)>=2 )A
Where S.SNO=A.SNO AND SC.SNO=A.SNO
GROUP BY S.SNO,S.SNAME
?--------------------------------------------------------------------------------------------------------------------------------------
?3. (1)列出既學(xué)過“語文”課程,又學(xué)過“數(shù)學(xué)”課程的所有學(xué)生姓名
?--實(shí)現(xiàn)代碼:法一
Select S.SNO,S.SNAME
FROM S,(
?? Select SC.SNO
?? FROM SC,C
?? Where SC.CNO=C.CNO AND C.CNAME IN('語文','數(shù)學(xué)')
?? GROUP BY SNO
?? HAVING COUNT(DISTINCT c.CNO)=2 )SC
Where S.SNO=SC.SNO
---法二:--------------------------
select *
from (select s.sno from s,sc,c where s.sno=sc.sno and sc.cno=c.cno and c.cname='語文')t1,
???? (select s.sno from s,sc,c where s.sno=sc.sno and sc.cno=c.cno and c.cname='數(shù)學(xué)')t2,
????? s
where t1.sno=t2.sno and t1.sno=s.sno
------------------
(2)使用標(biāo)準(zhǔn)SQL嵌套語句查詢選修全部課程的學(xué)員姓名
法一:一句SQL語句即可。注意有下劃線的部分!
?
Select S.SNO,S.SNAME
FROM S,(
??????? Select SNO
??????? FROM SC
??????? GROUP BY SNO
??????? HAVING COUNT(*)=(select count(*) from c) )SC
Where S.SNO=SC.SNO
?
(3)查詢選修課程超過2門的學(xué)員學(xué)號(hào)
?--實(shí)現(xiàn)代碼:
???????????????????? Select Sno? FROM SC GROUP BY Sno HAVING COUNT(Cno)>2
查詢選修課程超過2門的學(xué)員學(xué)號(hào)及姓名
?--實(shí)現(xiàn)代碼:
Select SNo,SNAME
FROM S
Where Sno IN(Select Sno? FROM SC GROUP BY Sno HAVING COUNT(Cno)>2)
?
(4)列出人數(shù)大于3的各科最高成績的列表,顯示科目號(hào)、成績兩個(gè)字段
---正解如下:(科目號(hào)為2、3的選課人數(shù)大于3人)
Select cno,max(scgrade)as'最高分'
FROM SC
Where cno IN (Select cno FROM SC GROUP BY cno HAVING COUNT(sno)>3)
group by cno
order by cno
-----------------------------------------------------------------------------------------------------------------------------------
4. 列出“語文”課比“數(shù)學(xué)”課同學(xué)該門課成績高的所有學(xué)生的學(xué)號(hào)、姓名及分?jǐn)?shù)
?--實(shí)現(xiàn)代碼:法一?
select *
from (select s.sno,s.sname,sc.SCGRADE from s,sc,c
????? where s.sno=sc.sno and sc.cno=c.cno and c.cname='語文' )t1,
?????? (select s.sno,s.sname,sc.SCGRADE from s,sc,c
????? where s.sno=sc.sno and sc.cno=c.cno and c.cname='數(shù)學(xué)' )t2
where t1.sno=t2.sno and t1.SCGRADE>t2.SCGRADE
------------------------------------------------------------------------------------------------------------------------------------?
5. 查詢選修了課程的學(xué)員人數(shù)
?--實(shí)現(xiàn)代碼:
?Select 學(xué)員人數(shù)=COUNT(DISTINCT [Sno]) FROM SC
?
總結(jié):
1、select * from a,b where a.id=b.id 和
???? select * from a inner join b on a.id=b.id 結(jié)果集相同;
2、在作“找出沒有選修過“李明”老師講授課程的所有學(xué)生姓名”這種題時(shí),
?? --用Where [Sno] NOT IN(在此可以是SQL語句生成的一列值)比較好。
?? Select SName
?? FROM S
?? Where [Sno] NOT IN( Select SC.[Sno]
?????????????????????????????????? FROM SC,C
?????????????????????????????????? Where SC.CNO=C.CNO AND CTEACHER='李明')
3、可以將select count(*) from c直接代入SQL語句,而不是非要寫成存儲(chǔ)過程;
??? Select S.SNO,S.SNAME
??? FROM S,(
?????????? Select SC.SNO
?????????? FROM SC,C
?????????? Where SC.CNO=C.CNO
?????????? GROUP BY SNO
?????????? HAVING COUNT(*)=(select count(*) from c) )SC
??? Where S.SNO=SC.SNO
題名是這樣的:
studentname??? classname????? grade??
?mike?????????? english????????? 65
?mike?????????? math???????????? 75
?Jerry????????? english????????? 80
?Jerry????????? math???????????? 68
?Lida?????????? english????????? 88
?Lida?????????? chinese????????? 77
?Lida?????????? math???????????? 90
求出各科成績都大于75分的學(xué)生。
即得到如下結(jié)果
studentname??? classname????? grade
?Lida???????????? english????????? 88
?Lida???????????? chinese????????? 77
?Lida???????????? math???????????? 90
?
select t1.studentname,classname,grade
from # t1,(select studentname
?????????? from #
?????????? where grade>75
?????????? group by studentname
?????????? having count(*)=(select count(*) from (select distinct classname from #)A)) t2
where t1.studentname=t2.studentname
?
注:
1、from (select distinct classname from #)A 中的"A"一定要有,將(select distinct classname from #)得到的記錄集看成一個(gè)新的表A。
2、在SQL語句中,用group by 語句時(shí),一般都會(huì)用到count(),sum(),avg(),max(),min()等函數(shù);
但,當(dāng)不使用group by語句,而直接使用這些函數(shù)時(shí),則表示將所有數(shù)據(jù)集看成一個(gè)組來處理。
?
第二題:
已知一個(gè)關(guān)系數(shù)據(jù)庫的模式如下:
職工EMP(職工號(hào),姓名,工資,所在部門)
部門DEPT(部門號(hào),部門名,部門經(jīng)理的職工號(hào))
(1)、使用查詢分析器建表,要求如下:
A、每個(gè)表的主外碼。
B、職工姓名和部門名不能為空。
C、工資取800到5000這間整數(shù)。
(2)、插入如下數(shù)據(jù):
職工(E01 趙 2500??? D02??????
E02 錢 3000??? D02??????
E03 孫 6000??? D01??????
E04 李 5500??? D01??????
E05 周 3500??? D03??????
E06 吳 2000??? D04??????
E07 鄭 3000??? D04?? )
部門(D01,人事,E04
D02,信息,E01
D03,銷售,E05
D04,財(cái)務(wù),E06)
(3)、用SQL表達(dá)以下的查詢:找出那些工資高于其所在部門經(jīng)理工資的職工的姓名及其工資。
select *
from emp A,(select emp.姓名,emp.工資,dept.*
??????????? from emp,dept
??????????? where emp.職工號(hào)=dept.部門經(jīng)理的職工號(hào))B
where A.所在部門=B.部門號(hào)and A.工資>B.工資 (4)、用SQL完成:將D01號(hào)部門經(jīng)理的工資改為該部門所有職工的平均工資。
update emp
set工資=(select avg(工資) from emp where 所在部門='D01')
from emp,dept
where emp.職工號(hào)=dept.部門經(jīng)理的職工號(hào)AND所在部門='D01'
(5)、新增加一個(gè)廣告部門,編號(hào)為D05。 insert into dept values('D05','廣告','E08') 小結(jié):不要急于答題,先審好題看清表結(jié)構(gòu),再下筆! 在(3)題中,職工號(hào)(E01..)是主鍵,是標(biāo)識(shí)字段。要先確定標(biāo)識(shí)字段,再按照標(biāo)識(shí)字段去理思路,用(E01..)將兩個(gè)表相連即可得到部門表中各經(jīng)理的姓名、工資等情況數(shù)據(jù)集B,此數(shù)據(jù)集的記錄數(shù)=部門(dept)表的記錄數(shù)。然后再將數(shù)據(jù)集B與職工(emp)表相連,即可得到“出那些工資高于其所在部門經(jīng)理工資的職工的姓名及其工資”。
第一題:創(chuàng)建如下三個(gè)基本表,表結(jié)構(gòu)如下:
borrower:
借書證號(hào) 姓名 系名 班級(jí)
03001??????? 李壘??? 信息系?? 03-1?????
03002??????? 趙????? 信息???? 03-1?????
03003??????? 錢????? 計(jì)算機(jī)?? 03-2?????
03004??????? 孫????? 計(jì)算機(jī)?? 03-3?????
......
loans:
借書證號(hào) 圖書登記號(hào) 借書日期
03001??????? t01?????????? 2004?????
03001??????? t02?????????? 2004?????
03001??????? t03?????????? 2004?????
03002??????? t01?????????? 2005?????
03002??????? t02?????????? 2005?????
03003??????? t03?????????? 2006?????
03003??????? t04?????????? 2006?????
03004??????? t05?????????? 2007?????
.......
BOOKS:
索書號(hào) 書名 作者 圖書登記號(hào) 出版社 價(jià)格
TP311.13 數(shù)據(jù)結(jié)構(gòu) 李衛(wèi) T01 科學(xué) 19.00
TP311.13 數(shù)據(jù)結(jié)構(gòu) 李衛(wèi) T02 科學(xué) 19.00
TP.065 數(shù)據(jù)結(jié)構(gòu)導(dǎo)論李衛(wèi) ?? T03 北航 16.50
TP.1599 數(shù)據(jù)通信 楊志 T04 清華 28.50 (1)、檢索借了3本書以下的學(xué)生的借書證號(hào),姓名,系名和借書數(shù)量。
---正解如下------------
select *
from borrower B,(select count(*) as 借書數(shù)量,借書證號(hào) as 借書證號(hào)
??????????????????? from loans
??????????????????? group by 借書證號(hào)
??????????????????? having count(*)<3) A
where B.借書證號(hào)=A.借書證號(hào) (2)、檢索借書和趙壘同學(xué)所借書中的任意一本相同的學(xué)生的姓名,系名,書名,借書日期。
---正解如下------------
select姓名,系名,圖書登記號(hào),借書日期
from borrower bb,loans ll
where bb.借書證號(hào)=ll.借書證號(hào) and 姓名<>'李壘'
and圖書登記號(hào) in (select 圖書登記號(hào)
??????????????????? from borrower b,loans l
??????????????????? where b.借書證號(hào)=l.借書證號(hào) and b.姓名='李壘') (3)、建立信管系學(xué)生借書的視圖SB,該視圖的屬性列由借書證號(hào),姓名,班級(jí),圖書登記號(hào),書號(hào),出版社和借書日期組成
?
第二題:
現(xiàn)有一個(gè)學(xué)生選修課程的數(shù)據(jù)庫,其中存放以下三個(gè)表:
學(xué)生(學(xué)號(hào),姓名,性別,年齡,系別)
課程(課程號(hào),課程名,任課教師);
選修(學(xué)號(hào),課程號(hào),分?jǐn)?shù));
請(qǐng)用SQL完成以下功能:
(1)、建表,在定義中要求聲明:
A、每個(gè)表的主外碼。
B、學(xué)生的年齡介于16到30。
C、學(xué)生的姓名和課程名不能為空。
D、選課成績要么為空值,要么取0到100的整數(shù)。
(2)、插入如下數(shù)據(jù):
學(xué)生(101,張三,男,16,數(shù)學(xué)
????? 102,李四,男,18,計(jì)算機(jī)
????? 103,王玲,女,17,中文
????? 105,李飛,男,19,計(jì)算機(jī)
????? 109,趙四,女,18,歷史
????? 110,李平,男,20,化學(xué))
課程(203,操作系統(tǒng),程羽
279,高等數(shù)學(xué),王備
210,現(xiàn)代文學(xué),王林
243,有機(jī)化學(xué),沈同
204,數(shù)據(jù)結(jié)構(gòu),張青)
選修(101,203,82
105,203,59
102,279,90
101,279,88
105,279,82
110,279,68
109,210,72
103,210,90
110,243,92
101,204,85
105,204,91
102,204,56
101,210,77
101,243,88)
(3)、用SQL語然完成下列查詢:
1、列出張三同學(xué)選修的所有課程的名稱和成績
------正解如下----------------
select課程名,分?jǐn)?shù)
from學(xué)生,選修,課程
where學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào)and選修.課程號(hào)=課程.課程號(hào)and姓名='張三' 2、列出所有課程都及格了的同學(xué)的名字
------正解如下----------------
select t1.姓名
from學(xué)生t1,(select 學(xué)號(hào)
?????????? from 選修
?????????? where 分?jǐn)?shù)>=60
?????????? group by 學(xué)號(hào)
?????????? having count(*)=(select count(*) from (select distinct 課程號(hào)from課程)A)) t2
where t1.學(xué)號(hào)=t2.學(xué)號(hào) 3、列出在選修張青老師所教授課程的學(xué)生中,成績最高的學(xué)生姓名和成績
------正解如下----------------
select top 1 姓名,分?jǐn)?shù)
from學(xué)生,選修
where學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào) and 學(xué)生.學(xué)號(hào) in (select 學(xué)號(hào) from 課程,選修 where 選修.課程號(hào)=課程.課程號(hào) and 任課教師='張青')
order by 分?jǐn)?shù) desc
(4)、刪除所有成績不及格的選課記錄
delete from 選修where分?jǐn)?shù)<60 (5)、將105號(hào)同學(xué)選修203號(hào)課程的成績改為該門課程的平均成績
??
update選修
set分?jǐn)?shù)=(select avg(分?jǐn)?shù)) from 選修where課程號(hào)='203')
from選修
where學(xué)號(hào)='105' and 課程號(hào)='203'
總結(jié)