|
1.常用的比較運算符 2.算術比較操作 (1)算術比較運算符 <,<=,>,>=,=,!= BETWEEN…AND… (2)查詢學習了課程C2的學生 SELECT * FROM Sc WHERE Cno='C2' (3)查詢年齡大于19的學生 SELECT * FROM Student WHERE Age>19 SELECT * FROM Student WHERE NOT Age<=19 (4)查詢課程號為C2且成績高于85分以上的學生 SELECT * FROM Sc WHERE Cno='C2' AND G>85 (5)查詢選修C1或C2且不低于70分的學生 SELECT * FROM Sc WHERE (Cno='C1' OR Cno='C2') AND G>=70 (6)查詢成績在60至75之間的學生 SELECT * FROM Sc WHERE G>=60 AND G<=75 SELECT * FROM Sc WHERE G BETWEEN 60 AND 75 |
3.字符串的匹配操作 (1)兩個通配符 百分號(%):與零個或多個字符組成的字符串匹配 下劃線(_):與單個字符匹配 (2)查詢計算機系的學生 SELECT * FROM Student WHERE Dept = 'CS' SELECT * FROM Student WHERE Dept LIKE 'CS' (3)查詢不以P開頭的課程 SELECT * FROM Course WHERE Cn NOT LIKE 'P%' (4)查詢第二個字符為o的課程 SELECT * FROM Course WHERE Cn LIKE '_o%' (5)查詢姓趙的學生(漢字?) SELECT * FROM Student WHERE Sn LIKE '趙%' SELECT * FROM Student WHERE Sn LIKE '趙_' (6)轉義字符 為了使字符串中包含特殊字符(即%和_),SQL允許定義轉義字符。轉義字符緊靠特殊字符并放在它前面,表示該特殊字符將被當成普通字符 在LIKE比較中使用ESCAPE關鍵字來定義轉義符 LIKE 'ab\%cd%' ESCAPE '\' 匹配所有以“ab%cd”開頭的字符串 LIKE 'ab\\cd%' ESCAPE '\' 匹配所有以“ad\cd”開頭的字符串 | |
4.空值的比較操作 (1)說明 SQL中允許列值為空,空值用保留字NULL表示 用IS NULL測試列值是否為空值 如果要測試非空值,可用短語IS NOT NULL 空值的存在增加了算術操作和比較操作的復雜性。SQL中規(guī)定,涉及到+、-、*、/的算術表達式中有一個值是空值時,表達式的值也是空值。涉及到空值的比較操作的結果認為是false 在聚合函數(shù)中遇到空值時,除了COUNT(*)外,都跳過空值而去處理非空值 (2)查詢沒填的課程名 SELECT * FROM Course WHERE Cn IS NULL SELECT * FROM Course WHERE LEN(ALLTRIM(Cn))=0 |
5.集合成員資格的比較 (1)格式 <元組> [NOT] IN(<集合>) (2)說明 判斷元組是否在子查詢的結果(即集合)中的操作,稱為“集合成員資格比較” 這里的集合可以是一個SELECT查詢語句,或者是元組的集合,但其結構應與前面元組的結構相同 IN操作符表示:如果元組在集合內,那么其邏輯值為TRUE,否則為FALSE (3)查詢選修了課程C1、C2或C3的學號(下面是2種等價方法) SELECT DISTINCT Sno FROM Sc WHERE Cno='C1' OR Cno='C2' OR Cno='C3' | SELECT DISTINCT Sno FROM Sc WHERE Cno IN ('C1', 'C2', 'C3') | (4)查詢既不是計算機系,也不是數(shù)學系的學生 SELECT * FROM Student WHERE Dept NOT IN ('CS','MA') SELECT * FROM Student WHERE NOT Dept IN ('CS','MA') (5)查詢沒有選修C2課程的學生姓名 SELECT Sname FROM Student WHERE Sno NOT IN (SELECT Sno FROM Sc WHERE Cno='C2') (6)查詢每門課程的成績均在80分以上的姓名 SELECT Sname FROM Student WHERE Sno NOT In (SELECT * FROM Sc WHERE Grade<80) |
6.集合成員的算術比較 (1)形式 <元組> θ ALL | SOME | ANY(<集合>) (2)說明 這里要求“元組”與集合中“元組”的結構一致 θ是算術比較運算符,“θ ALL”操作表示左邊那個元組與右邊集合中每一個元組滿足θ運算,“θ SOME”操作表示左邊那個元組與右邊集合中至少一個元組滿足θ運算。ANY和SOME是同義詞,早期的SQL標準用ANY,為避免與英語中ANY意思混淆,后來的標準都改為SOME (3)查詢選修了C2的學生姓名(每段代碼最后是查詢結果:學生的編號集合) SELECT Sname FROM Student,Sc WHERE Student.Sno=Sc.Sno AND Cno='C2' 查詢結果{16345} | SELECT Sname FROM Student WHERE Sno IN (SELECT Sno FROM Sc WHERE Cno='C2') 查詢結果{13456} | SELECT Sname FROM Student WHERE Sno=ANY (SELECT Sno FROM Sc WHERE Cno='C2') 查詢結果{13456} | SELECT Sname FROM Student WHERE Sno=SOME (SELECT Sno FROM Sc WHERE Cno='C2') 查詢結果{13456} | (4)查詢選修了C2的學生中成績最高的學號(除錯誤的2種方法外,其余2種為正確的等價方法) SELECT Sno,MAX(Grade) FROM Sc WHERE Sno IN (SELECT Sno FROM Sc WHERE Cno='C2') | | 錯誤原因:“該語句語義為:選C2的學生,在所有課程中獲得最高分數(shù)的學生” | | SELECT Sno FROM Sc WHERE Cno='C2' AND Grade >= (SELECT MAX(Grade) FROM Sc WHERE Cno='C2') | | | SELECT Sno FROM Sc WHERE Cno='C2' AND Grade>= ALL (SELECT Grade FROM Sc WHERE Cno='C2') | | | SELECT X.Sno,MAX(X.Grade) FROM Sc X,Sc Y WHERE X.Sno=Y.Sno AND Y.Cno='C2' | | 錯誤原因:“該語句語義為:所有選課的學生,在所有課程中獲得最高分數(shù)的學生” | | (5)查詢沒有選修C6課程的學生姓名(下面是2種等價方法) SELECT Sname FROM Student WHERE Sno NOT in (SELECT Sno FROM Sc WHERE Cno='C6') | SELECT Sname FROM Student WHERE Sno != all (SELECT Sno FROM Sc WHERE Cno='C6') | (6)檢索平均成績最高的學生學號 SELECT Sno FROM SC GROUP BY Sno HAVING AVG(Grade) >= ALL (SELECT AVG(Grade) FROM SC GROUP BY Sno) | |
7.集合空否的測試 (1)形式 [NOT] EXISTS (<集合>) (2)說明 不帶NOT的操作,當集合非空時(即至少存在一個元組),其邏輯值為true,否則為false 帶NOT的操作,當集合為空時,其值為true,否則為false (3)查詢選修了C6的學生姓名(相關子查詢)(除了第4個,其余是等價方法) SELECT Sname FROM Student,Sc WHERE Student.Sno=Sc.Sno AND Cno='C6' | SELECT Sname FROM Student WHERE Sno=ANY (SELECT Sno FROM Sc WHERE Cno='C6') | SELECT Sname FROM Student WHERE Sno in (SELECT Sno FROM Sc WHERE Cno='C6') | SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM Sc WHERE Cno='C6') | | 錯誤原因:“該語句語義為:所有選課的學生” | | SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM Sc WHERE Cno='C6' AND Sno=Student.Sno) | (4)查詢沒有選修C6課程的學生姓名(下面是3種等價方法) SELECT Sname FROM Student WHERE Sno NOT in (SELECT Sno FROM Sc WHERE Cno='C6') | SELECT Sname FROM Student WHERE Sno!=all (SELECT Sno FROM Sc WHERE Cno='C6') | SELECT Sname FROM Student WHERE NOT EXISTS (SELECT * FROM Sc WHERE Cno='C6' AND Sno=Student.Sno) | (5)查詢所有學生都選修的課程名稱(查詢這樣的課程名稱,這門課程是沒有一個學生不選的) SELECT Cname FROM Course WHERE NOT EXISTS (SELECT * FROM Student WHERE NOT EXISTS (SELECT * FROM Sc WHERE Student.Sno=Sc.Sno And Sc.Cno=Course.Cno)) | (6)查詢至少選修了與S4學生選修的全部課程相同的姓名 SELECT sname FROM student WHERE NOT EXISTS (SELECT * FROM sc scx WHERE Scx.Sno='S4' and NOT EXISTS (SELECT * FROM Sc Scy WHERE Scy.Sno=Student.Sno and Scy.Cno =Scx.Cno)) | (7)查詢至少選修了學生S4選修的全部課程的學號(不存在這樣的課程,學生S4選修了,而其他學生沒有選) SELECT Distinct Sno FROM Sc A WHERE NOT EXISTS (SELECT * FROM Sc B WHERE B.Sno='S4' And NOT EXISTS (SELECT * FROM Sc C WHERE C.Sno=A.Sno And C.Cno=B.Cno)) | |
8.集合中重復元組存在否的測試 (1)形式 [NOT] UNIQUE(<集合>) (2)說明 不帶NOT的操作,當集合中不存在重復元組時,其邏輯值為true,否則為false 帶NOT的操作,當集合中存在重復元組時,其邏輯值為true,否則為false (3)在基本表T和C中檢索只開設了一門課程的教師工號和姓名 SELECT Tno, Tname FROM Teacher WHERE UNIQUE (SELECT Tno FROM Course WHERE Course.Tno = Teacher.Tno) | |