一、SQL定義語句
--1. 用子查詢實現如下查詢:
--()查詢選了“C001”課程的學生姓名和所在系。
SELECT Sname,Sdept from SC,Student WHERE SC.Sno=Student.Sno AND Cno='C001'
--()查詢通信工程系成績分以上的學生的學號和姓名。
SELECT Student.Sno,Sname FROM SC,Student WHERE SC.Sno=Student.Sno AND Sdept='通信工程系' AND Grade>80
--()查詢計算機系考試成績最高的學生的姓名。
---SELECT Sname ,Grade FROM SC,Student WHERE Sdept='計算機系' AND SC.Sno=Student.Sno ORDER BY Grade DESC;
SELECT TOP 1 Sname FROM SC,Student WHERE Sdept='計算機系' AND SC.Sno=Student.Sno ORDER BY Grade DESC;
--()查詢年齡最大的男生的姓名、所在系和年齡。
--SELECT Sname,Sdept,Sage FROM Student WHERE Sex='男' ORDER BY Sage DESC
SELECT TOP 1 Sname,Sdept,Sage FROM Student WHERE Sex='男' ORDER BY Sage DESC
--2. 查詢C001課程的考試成績高於該課程平均成績的學生的學號和成績。
SELECT Sno,Grade FROM SC WHERE Cno='C001' AND Grade>(SELECT avg(Grade) FROM SC );
--3. 查詢計算機系學生考試成績高於計算機系學生平均成績的學生的姓名、考試的課程名和考試成績。
SELECT Sname,Cname,Grade
FROM SC s,Student,Course c
WHERE s.Sno=Student.Sno AND
c.Cno=s.Cno AND
Sdept='計算機系' and
Grade > (
select AVG(Grade)
from SC,Student
where SC.Sno = Student.Sno AND c.Cno=s.Cno AND
Sdept = '計算機系'
)
select Sname, Cname, Grade
from Student, SC, Course
where Student.Sno = SC.Sno AND
SC.Cno = Course.Cno AND
Sdept = '計算機系' AND
Grade > (
select AVG(Grade)
from SC,Student
where SC.Sno = Student.Sno AND Sdept = '計算機系'
)
--4. 查詢VB課程考試成績高於VB平均成績的學生姓名和VB成績。
SELECT Sname,Grade
FROM SC,Student,Course
WHERE SC.Sno=Student.Sno AND
Course.Cname='VB' AND
Course.Cno = SC.Cno AND
Grade > (SELECT avg(Grade) FROM SC,Course WHERE Course.Cname='VB' AND Course.Cno=SC.Cno)
--5. 查詢沒選VB的學生姓名和所在系。
SELECT Sname,Sdept FROM Student WHERE Sname NOT IN (SELECT SC.Sno FROM SC,Student,Course WHERE Cname='VB' and Course.Cno=SC.Cno AND Student.Sno= SC.Sno )
--6. 查詢每個學期學分最高的課程信息,列出開課學期、課程名和學分。
SELECT Semester,Cname,Credit from Course c1 WHERE Credit = (SELECT max(Credit) FROM Course c2 WHERE c1.Semester=c2.Semester)
--7. 查詢每門課程考試成績最高的學生信息,列出課程號、學生姓名和最高成績,結果按課程號升序排序,不包括沒考試的課程。
SELECT Course.Cno,Course.Cname,Sname,maxgrade from Course,Student,SC,(SELECT Cno,max(Grade) from SC GROUP BY Cno) as max_grade(Cno,maxgrade) WHERE max_grade.Cno=Course.Cno AND maxgrade=SC.Grade AND SC.Sno=Student.Sno ORDER BY Course.Cno ASC
--8. 查詢計算機系學生姓名、年齡和年齡情況,其中年齡情況爲:如果年齡小於,則顯示“偏小”;如果年齡在-22,則顯示“合適”;
--如果年齡大於,則顯示“偏大”。
select Sname , Sage,case when Sage <18 then '偏小'when Sage between 18 and 22 then '合適'when Sage >22 then '偏大'end '年齡情況' from Student where Sdept = '計算機系'
--9. 統計每門課程的選課人數,包括有人選的課程和沒有人選的課程,列出課程號,選課人數及選課情況,其中選課情況爲:
--如果此門課程的選課人數超過人,則顯示“人多”;如果此門課程的選課人數在~,則顯示“一般”;如果此門課程的選課人數在~
--0,則顯示“人少”;如果此門課程沒有人選,則顯示“無人選”。
SELECT Cno,count(*) '選課人數', CASE WHEN count(*)>100 THEN '人多' when count(*) BETWEEN 40 AND 100 THEN '一般' WHEN count(*) BETWEEN 1 AND 40 THEN '人少' end '無人選' from SC group by Cno;
--10. 查詢計算機系選了VB課程的學生姓名、所在系和考試成績,並將結果保存到新表VB_Grade中。
--Select …into VB_Grade
SELECT Sname,Sdept,Grade into VB_Grade from SC, Student,Course WHERE SC.Sno=Student.Sno AND Course.Cno=SC.Cno AND Cname='VB'
--11. 統計每個系的女生人數,並將結果保存到新表Girls中。
SELECT Sdept,count(*) FROM Student where Sex='女' GROUP BY Sdept ;
--12. 創建一個新表,表名爲test,其結構爲(COL1, COL 2, COL 3),其中,
--COL1:整型,允許空值。
--COL2:普通編碼定長字符型,長度爲,不允許空值。
--COL3:普通編碼定長字符型,長度爲,允許空值。
--試寫出按行插入如下數據的語句(空白處表示是空值)。
create table test
(
COL1 int NULL,
COL2 char(10) NOT NULL,
COL3 char(10) NULL
)
insert into test values
(NULL, 'B1', NULL),
(1, 'B2','C2'),
(2, 'B3', NULL);
--13.利用第題建立的VB_Grade表,將信息管理系選了VB課程的學生姓名、所在系和考試成績插入到VB_Grade表中。
insert into VB_Grade(Sname, Sdept, Grade)
select Sname, Sdept, Grade
from Student, SC, Course
where Student.Sno = SC.Sno AND SC.Cno = Course.Cno
AND Sdept = '信息管理系' AND Cname = 'VB' ;
--14. 將所有選修C001課程的學生的成績加分。
UPDATE SC SET Grade=Grade+10 WHERE Cno='C001'
--15. 將計算機系所有學生的“計算機文化學”的考試成績加分。
UPDATE SC SET Grade=Grade+10 WHERE Sno IN (SELECT Sno from Student where Sdept='計算機系' ) AND Cno IN (SELECT Cno from Course WHERE Cname='計算機文化學')
--16. 修改“VB”課程的考試成績,如果是通信工程系的學生,則增加分;如果是信息管理系的學生則增加分,其他系的學生不加分。
--提示:根據系別判斷加分,case when
UPDATE SC SET Grade= Grade+ CASE Sdept WHEN '通信工程系' THEN 10 else 0 end FROM Student,SC,Course WHERE SC.Sno=Student.Sno AND Course.Cno=SC.Cno AND Cname='VB'
--17. 刪除成績小於分的學生的選課記錄。
DELETE FROM SC WHERE Grade<50;
--18. 刪除計算機系VB考試成績不及格學生的VB選課記錄。
DELETE FROM SC
FROM SC,Student,Course WHERE SC.Sno=Student.Sno
AND Course.Cno=Course.Cno AND Sdept='計算機系' AND
Cname='VB' AND Grade<60
--19. 刪除“VB”考試成績最低的學生的VB修課記錄。
DELETE FROM SC FROM SC,Course
WHERE SC.Cno=Course.Cno AND Cname='VB'
AND Grade=(SELECT MIN(Grade) FROM SC,Course WHERE SC.Cno=Course.Cno AND Cname='VB')
--20. 刪除沒人選的課程的基本信息。
DELETE FROM Course FROM Course left join SC on Course.Cno=SC.Cno WHERE SC.Cno IS NULL