查詢指定列
[例1] 查詢全體學生的學號與姓名。
SELECT Sno,Sname
FROM Student;
[例2] 查詢全體學生的姓名、學號、所在系。
SELECT Sname,Sno,Sdept
FROM Student;
[例3] 查詢全體學生的詳細記錄。
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
或
SELECT *
FROM Student;
[例4] 查全體學生的姓名及其出生年份。
SELECT Sname,2004-Sage /*假定當年的年份為2004年*/ FROM Student;
[例5] 查詢全體學生的姓名、出生年份和所有系,要求用小 寫字母表示所有系名
SELECT Sname,„Year of Birth: ‘,2004-Sage,
ISLOWER(Sdept)
FROM Student;
[例6] 查詢選修了課程的學生學號。
SELECT Sno FROM SC;
等價於:
SELECT ALL Sno FROM SC;
[例7] 查詢計算機科學系全體學生的名單。
SELECT Sname www.111cn.net
FROM Student
WHERE Sdept=„CS‟;
[例8] 查詢所有年齡在20歲以下的學生姓名及其年齡。 SELECT Sname,Sage
FROM Student
WHERE Sage < 20;
[例9] 查詢考試成績有不及格的學生的學號。
SELECT DISTINCT Sno
FROM SC
WHERE Grade<60;
[例10] 查詢年齡在20~23歲(包括20歲和23歲)之間的學生的 姓名、系別和年齡
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
[例11] 查詢年齡不在20~23歲之間的學生姓名、系別和年齡
SELECT Sname,Sdept,Sage
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;
[例12]查詢信息系(IS)、數學系(MA)和計算機科學系(CS)學生的姓名和 性別。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( ‘IS’,’MA’,’CS’ );
[例13]查詢既不是信息系、數學系,也不是計算機科學系的學生的姓名和性別。 SELECT Sname,Ssex
FROM Student
WHERE Sdept NOT IN ( ‘IS’,’MA’,’CS’ );
[例14] 查詢學號為200215121的學生的詳細情況。
SELECT *
FROM Student
WHERE Sno LIKE „200215121′;
等價於:
SELECT *
FROM Student
WHERE Sno = ‘ 200215121 ‘;
[例15] 查詢所有姓劉學生的姓名、學號和性別。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE „劉%‟;
[例16] 查詢姓”歐陽”且全名為三個漢字的學生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE ‘歐陽__’;
[例17] 查詢名字中第2個字為”陽”字的學生的姓名和學號。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE „__陽%‟;
[例18] 查詢所有不姓劉的學生姓名。
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname NOT LIKE ‘劉%’;
[例19] 查詢DB_Design課程的課程號和學分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE ‘DB_Design’ ESCAPE ‘„;
[例20] 查詢以”DB_”開頭,且倒數第3個字符為 i的課程的詳細情況。 SELECT *
FROM Course
WHERE Cname LIKE ‘DB_%i_ _’ ESCAPE ‘ „;
[例21] 某些學生選修課程后沒有參加考試,所以有選課記錄,但沒 有考試成績。查詢缺少成績的學生的學號和相應的課程號。 SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL
[例22] 查所有有成績的學生學號和課程號。
SELECT Sno,Cno
FROM SC
WHERE Grade IS NOT NULL;
[例23] 查詢計算機系年齡在20歲以下的學生姓名。
SELECT Sname
FROM Student
WHERE Sdept= ‘CS’ AND Sage<20;
改寫[例12]
[例12] 查詢信息系(IS)、數學系(MA)和計算機科學系 (CS)學生的姓名和性別。
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( ‘IS’,’MA’,’CS’ )
可改寫為:
SELECT Sname,Ssex
FROM Student
WHERE Sdept= ‘ IS ‘ OR Sdept= ‘ MA’ OR Sdept= ‘ CS ‘;
[例24] 查詢選修了3號課程的學生的學號及其成績,查詢結果按分 數降序排列。
SELECT Sno,Grade
FROM SC
WHERE Cno= ‘ 3 ‘
ORDER BY Grade DESC;
[例25] 查詢全體學生情況,查詢結果按所在系的系號升序排 列,同一系中的學生按年齡降序排列。
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
[例26] 查詢學生總人數。
SELECT COUNT(*)
FROM Student;
[例27] 查詢選修了課程的學生人數。
SELECT COUNT(DISTINCT Sno)
FROM SC;
[例28] 計算1號課程的學生平均成績。
SELECT AVG(Grade)
FROM SC
WHERE Cno= ‘ 1 ‘;
[例29] 查詢選修1號課程的學生最高分數。
SELECT MAX(Grade)
FROM SC
WHER Cno= „ 1 ‟;
[例30]查詢學生200215012選修課程的總學分數。
SELECT SUM(Ccredit)
FROM SC, Course
WHER Sno=’200215012′ AND SC.Cno=Course.Cno;
[例31] 求各個課程號及相應的選課人數。
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno;
[例32] 查詢選修了3門以上課程的學生學號。
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3;
[例33] 查詢每個學生及其選修課程的情況
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno = SC.Sno;
[例34] 對[例33]用自然連接完成。
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student,SC
WHERE Student.Sno = SC.Sno;
[例35]查詢每一門課的間接先修課(即先修課的先修課)
SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno = SECOND.Cno;
[例 36] 改寫[例33]
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT OUT JOIN SC ON (Student.Sno=SC.Sno);
[例37]查詢選修2號課程且成績在90分以上的所有學生
SELECT Student.Sno, Sname
FROM Student, SC
WHERE Student.Sno = SC.Sno AND
/* 連接謂詞*/
SC.Cno= „2‟ AND SC.Grade > 90; /* 其他限定條件 */
[例38]查詢每個學生的學號、姓名、選修的課程名及成績
SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course /*多表連接*/
WHERE Student.Sno = SC.Sno
and SC.Cno = Course(www.111cn.net).Cno;
[例39] 查詢與“劉晨”在同一個系學習的學生。
此查詢要求可以分步來完成
① 確定“劉晨”所在系名
SELECT Sdept
FROM Student WHERE Sname= ‘ 劉晨 ‘;
結果為: CS
② 查找所有在IS系學習的學生。
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept= ‘ CS ‘;
將第一步查詢嵌入到第二步查詢的條件中
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname= „ 劉晨 ‟);
此查詢為不相關子查詢。
用自身連接完成[例39]查詢要求
SELECT S1.Sno,S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept = S2.Sdept AND
S2.Sname = ‘劉晨’;
[例40]查詢選修了課程名為“信息系統”的學生學號和姓名 SELECT Sno,Sname ③ 最后在Student關系中 FROM Student 取出Sno和Sname WHERE Sno IN
(SELECT Sno ② 然后在SC關系中找出選 FROM SC 修了3號課程的學生學號 WHERE Cno IN
(SELECT Cno ① 首先在Course關系中找出 FROM Course “信息系統”的課程號,為3號 WHERE Cname= „信息系統‟
)
);
用連接查詢實現[例40]
SELECT Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno = SC.Sno AND
SC.Cno = Course.Cno AND
Course.Cname=„信息系統‟;
例:假設一個學生只可能在一個系學習,並且必須屬於一個 系,則在[例39]可以用 = 代替IN :
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept =
(SELECT Sdept
FROM Student
WHERE Sname= „劉晨‟);
[例41]找出每個學生超過他選修課程平均成績的課程
號。
SELECT Sno, Cno
FROM SC x
WHERE Grade >=(SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno);
[例42] 查詢其他系中比計算機科學某一學生年齡
小的學生姓名和年齡
SELECT Sname,Sage
FROM Student
WHERE Sage < ANY (SELECT Sage
FROM Student WHERE Sdept= ‘ CS ‘) AND Sdept <> „CS ‘ ; /*父查詢塊中 的條件 */
用聚集函數實現[例42]
SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MAX(Sage)
FROM Student www.111cn.net
WHERE Sdept= „CS ‘)
AND Sdept <> ‘ CS ‟;
[例43] 查詢其他系中比計算機科學系所有學生年齡都小 的學生姓名及年齡。
方法一:用ALL謂詞
SELECT Sname,Sage
FROM Student
WHERE Sage < ALL
(SELECT Sage
FROM Student
WHERE Sdept= ‘ CS ‘)
AND Sdept <> ‘ CS ‟;
方法二:用聚集函數
SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MIN(Sage)
FROM Student
WHERE Sdept= ‘ CS ‘)
AND Sdept <>’ CS ‟;
[例44]查詢所有選修了1號課程的學生姓名。
用嵌套查詢
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno= ‘ 1 ‘);
用連接運算
SELECT Sname
FROM Student, SC
WHERE Student.Sno=SC.Sno AND SC.Cno= ’1′;
[例45] 查詢沒有選修1號課程的學生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno = Student.Sno AND Cno=’1′);
[例39]查詢與“劉晨”在同一個系學習的學生。
可以用帶EXISTS謂詞的子查詢替換:
SELECT Sno,Sname,Sdept
FROM Student S1
WHERE EXISTS
(SELECT *
FROM Student S2
WHERE S2.Sdept = S1.Sdept AND
S2.Sname = „劉晨‟);
[例46] 查詢選修了全部課程的學生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno= Student.Sno AND Cno= Course.Cno )
);
[例47]查詢至少選修了學生200215122選修的全部課程的學
生號碼。
用NOT EXISTS謂詞表示:
SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
(SELECT *
FROM SC SCY
WHERE SCY.Sno = ‘ 200215122 ‘ AND
NOT EXISTS
(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND
SCZ.Cno=SCY.Cno));
[例48] 查詢計算機科學系的學生及年齡不大於19歲的學生。
方法一:
� SELECT *
� FROM Student
� WHERE Sdept= ‘CS’
� UNION
� SELECT *
� FROM Student
� WHERE Sage<=19;
方法二:
SELECT DISTINCT *
FROM Student
WHERE Sdept= ‘CS’ OR Sage<=19;
[例49] 查詢選修了課程1或者選修了課程2的學生。
SELECT Sno
FROM SC
WHERE Cno=’ 1 ‘
UNION
SELECT Sno
FROM SC
WHERE Cno= ‘ 2 ‘;
[例50] 查詢計算機科學系的學生與年齡不大於19歲
的學生的交集
SELECT *
FROM Student
WHERE Sdept=’CS’
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19
注:sql server 無交運算
[例50] 實際上就是查詢計算機科學系中年齡不大
於19歲的學生
SELECT *
FROM Student
WHERE Sdept= „CS‟ AND Sage<=19;
[例51] 查詢選修課程1的學生集合與選修課程2的學生集
合的交集
SELECT Sno
FROM SC
WHERE Cno=’ 1 ‘
INTERSECT
SELECT Sno
FROM SC
WHERE Cno=’2 ‘;
[例51]實際上是查詢既選修了課程1又選修了課程2
的學生
SELECT Sno
FROM SC
WHERE Cno=’ 1 ‘ AND Sno IN
(SELECT Sno FROM SC
WHERE Cno=’ 2 ‘);
[例52] 查詢計算機科學系的學生與年齡不大於19歲的學
生的差集。
SELECT *
FROM Student
WHERE Sdept=’CS’
EXCEPT
SELECT *
FROM Student
WHERE Sage <=19;
注:sql server 無差運算
[例52]實際上是查詢計算機科學系中年齡大於19歲
的學生
SELECT *
FROM Student
WHERE Sdept= ‘CS’ AND Sage>19;
from:http://www.111cn.net/database/mssqlserver/59038.htm