SQL-資料查詢
阿新 • • 發佈:2019-01-04
•學生-課程資料庫
學生表:Student(Sno,Sname,Ssex,Sage,Sdept)
課程表:Course(Cno,Cname,Cpno,Ccredit)
學生選課表:SC(Sno,Cno,Grade)
單表查詢:
查詢學生表中的全部詳細記錄:
select * from student;
查詢經過計算的值:
select
[ all | distinct ]
from
< table | view >
[ where <conditions> ]
[ group by <condition1> [having conditions-1] ]
[ order by <column2> [asc |desc] ]
預設的升序也就是asc
distinct取消重複的行
基於數值的過濾條件
例:查詢所有年齡在20歲以下的學生姓名及其年齡。
select Sname ,Sage from student where age<20; 基於範圍的過濾條件
例:查詢年齡在20~23歲(包括20歲和23歲)之間的學生的姓名、系別和年齡。
select Sname, Sdept, Sage from student where Sage between 20 and 23; 基於給定集合的過濾條件
例:查詢資訊系(IS)、數學系(MA)和計算機科學系(CS)學生的姓名和性別。
select Sname,Ssex from student
where Sdept in ( 'IS', 'MA','CS' );
當匹配模板為固定字串時
用 = 運算子取代 LIKE 謂詞
用 != 或 <>運算子取代NOT LIKE 謂詞
當模糊查詢時
% (百分號) 代表任意長度(長度可以為0)的字串
_ (下橫線) 代表任意單個字元
當用戶要查詢的字串本身就含有 % 或 _ 時,要使用ESCAPE'<換碼字元>' 短語對萬用字元進行轉義。
•基於文字的過濾條件
例:查詢學號為95001的學生的詳細情況 select * from student whrere Sno like '95001';/////或者 where Sno='95001';
•基於文字的過濾條件
例:查詢名字中第2個字為“陽”字的學生的姓名和學號
select Sname,Sno from student where Sname like '_陽%'; 查詢不姓劉的學生的姓名和學號 select Sname,Sno from student where Sname not like '劉%'; 查詢 db_ 開頭 且倒數第三個字元是 i 的課程的詳細情況 select * from course where Cname like 'db\_%i_ _' escape ' \ ' ; 針對空值的過濾條件
查詢所有有成績的學生學號和課程號 select Sno, Cno from SC where grade is not null; •多重條件查詢
用邏輯運算子AND和 OR來聯結多個查詢條件 ¤AND的優先順序高於OR 可以用括號改變優先順序
例:查詢資訊系(IS)、數學系(MA)和計算機科學系(CS)學生的姓名和性別。
select Sname,Ssex from student where Sdept='IS' or Sdept='MA' or Sdept='CS'; 使用ORDER BY子句 可以按一個或多個屬性列排序
升序:ASC; 降序:DESC; 預設值為升序 當排序列含空值時(Null為無窮小) ASC:排序列為空值的元組最先顯示 DESC:排序列為空值的元組最後顯示 例:查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列。
select * from student order by Sdept asc, Sage desc; 或者 select * from student order by Sdept , Sage desc; COUNT([DISTINCT|ALL]*)統計元組個數 COUNT([DISTINCT|ALL]<column> )計算一列中值的個數 SUM( [DISTINCT|ALL]<column>)
計算值的總和並返回總數 AVG( [DISTINCT|ALL]<column> )
返回指定列中的平均值 MIN( [DISTINCT|ALL]<column> )
返回自變數中指定列的最小值 MAX( [DISTINCT|ALL]<column> )
返回自變數中指定列的最大值 DISTINCT短語:在計算時要取消指定列中的重複值
ALL短語:不取消重複值
ALL為預設值 NULL除了計算count(*)外,不參與其他計算 聚集函式
例:查詢學生總人數。
select count(*) from student; 例:查詢選修了課程的學生人數。 select count(distinct Sno) from SC; 聚集函式
例:計算1號課程的學生平均成績。
select avg(grade) from SC where Cno='1'; 使用GROUPBY子句分組 細化聚集函式的作用物件 未對查詢結果分組,聚集函式將作用於整個查詢結果 用where 對查詢結果分組後,聚集函式將分別作用於每個組 用having count 只有滿足HAVING短語指定條件的組才輸出 HAVING短語與WHERE子句的區別:作用物件不同 WHERE子句作用於基表或檢視,從中選擇滿足條件的元組。 HAVING短語作用於組,從中選擇滿足條件的組。 查詢結果分組 練習:查詢有3門以上課程是90分以上的學生的學號及(90分以上的)課程數 select Sno,count(*) from SC where Grade>=90 group by sno having count(*)>=3; 連線查詢 自身連線 查詢每一門課的間接先修課(即先修課的先修課)
select First.cno,Second.cpno from Course First,Course Second where First.cpno=Second.cno; 左連線:以左邊的表為標準對右邊的表進行連線 右連線:以右邊的表為標準對左邊的表進行連線。 外連線與普通連線的區別 普通連線操作只輸出滿足連線條件的元組 外連線操作以指定表為連線主體,將主體表中不滿足連線條件的元組一併輸出 查詢每個學生及其選修課程的情況,即使學生一門課也沒有選也要輸出學生資訊。
select student.Sno,Sname,Ssex,Sage,Sdept,Cno,grade from student left join SC on student.Sno=SC.Sno 例:查詢選修2號課程且其成績在90分以上的所有學生的學號、姓名
select Sno,Sname from Student,SC where student.Sno=SC.Sno and SC.grade>90 and SC.Cno='2'; 一個SELECT-FROM-WHERE語句稱為一個查詢塊 將一個查詢塊巢狀在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢,稱為巢狀查詢 子查詢的限制:不能使用ORDER BY子句 帶有IN謂詞的子查詢 例:查詢選修課程名為“資訊系統”的學生學號和姓名 select Sno,Sname from student where sno in( select sno from SC where Cno in( select Cno from Course where Cname='資訊系統'; ) ) 帶有ANY或ALL謂詞的子查詢
例:查詢其他系中比資訊系中某一個學生年齡小的學生姓名和年齡
select Sname,Sage from student where age< any( select age from student where Sdept='IS' ) and Sdept!='IS'; 或者 select Sname,Sage from student where age< ( select max(age) from student where Sdept='IS' ) and Sdept!='IS'; any為小於其中的某一個就可以,而all小於其中的所有==小於最小的 巢狀查詢分類 不相關子查詢 子查詢的查詢條件不依賴於父查詢 處理方式:由裡向外逐層處理
相關子查詢 子查詢的查詢條件依賴於父查詢 處理方式: •首先取外層查詢中表的第一個元組,根據它與內層查詢相關的屬性值處 理內層查詢,若WHERE子句返回值為真,則取此元組放入結果表; •然後再取外層表的下一個元組; •重複這一過程,直至外層表全部檢查完為止 由EXISTS引出的子查詢,其目標列表達式通常都用* ,因為帶EXISTS的子查詢只返回真值或假值,給出列名無實際意義
帶有EXISTS謂詞的子查詢
例:查詢所有選修了1號課程的學生姓名。 select Sname from student where exists( select * from SC where Sno=student.Sno and Cno='1';) 帶有EXISTS謂詞的子查詢 例:查詢選修了全部課程的學生姓名。 select Sname from student where not exists( select *from Course where not exists(select *from SC where Sno=student.Sno and Cno=course.Cno ) ); 集合查詢 並: 例:查詢計算機科學系的學生或年齡不大於19歲的學生。 select *from student where Sdept='CS' unoin select *from student where Sage<19; 交集 查詢選修課程1的學生集合與選修課程2的學生集合的交集
select Sno from SC where Cno='1' intersect select Sno from SC where Cno='2'; 例:查詢計算機科學系的學生與年齡不大於19歲的學生的差集。 select Sno from student where Sdept='CS' minus select Sno from student where Sage>19;
例:查詢所有年齡在20歲以下的學生姓名及其年齡。
select Sname ,Sage from student where age<20; 基於範圍的過濾條件
例:查詢年齡在20~23歲(包括20歲和23歲)之間的學生的姓名、系別和年齡。
select Sname, Sdept, Sage from student where Sage between 20 and 23; 基於給定集合的過濾條件
例:查詢資訊系(IS)、數學系(MA)和計算機科學系(CS)學生的姓名和性別。
例:查詢學號為95001的學生的詳細情況 select * from student whrere Sno like '95001';/////或者 where Sno='95001';
select Sname,Sno from student where Sname like '_陽%'; 查詢不姓劉的學生的姓名和學號 select Sname,Sno from student where Sname not like '劉%'; 查詢 db_ 開頭 且倒數第三個字元是 i 的課程的詳細情況 select * from course where Cname like 'db\_%i_ _' escape ' \ ' ; 針對空值的過濾條件
查詢所有有成績的學生學號和課程號 select Sno, Cno from SC where grade is not null; •多重條件查詢
用邏輯運算子AND和 OR來聯結多個查詢條件 ¤AND的優先順序高於OR 可以用括號改變優先順序
例:查詢資訊系(IS)、數學系(MA)和計算機科學系(CS)學生的姓名和性別。
select Sname,Ssex from student where Sdept='IS' or Sdept='MA' or Sdept='CS'; 使用ORDER BY子句 可以按一個或多個屬性列排序
升序:ASC; 降序:DESC; 預設值為升序 當排序列含空值時(Null為無窮小) ASC:排序列為空值的元組最先顯示 DESC:排序列為空值的元組最後顯示 例:查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列。
select * from student order by Sdept asc, Sage desc; 或者 select * from student order by Sdept , Sage desc; COUNT([DISTINCT|ALL]*)統計元組個數 COUNT([DISTINCT|ALL]<column> )計算一列中值的個數 SUM( [DISTINCT|ALL]<column>)
計算值的總和並返回總數 AVG( [DISTINCT|ALL]<column> )
返回指定列中的平均值 MIN( [DISTINCT|ALL]<column> )
返回自變數中指定列的最小值 MAX( [DISTINCT|ALL]<column> )
返回自變數中指定列的最大值 DISTINCT短語:在計算時要取消指定列中的重複值
ALL短語:不取消重複值
ALL為預設值 NULL除了計算count(*)外,不參與其他計算 聚集函式
例:查詢學生總人數。
select count(*) from student; 例:查詢選修了課程的學生人數。 select count(distinct Sno) from SC; 聚集函式
例:計算1號課程的學生平均成績。
select avg(grade) from SC where Cno='1'; 使用GROUPBY子句分組 細化聚集函式的作用物件 未對查詢結果分組,聚集函式將作用於整個查詢結果 用where 對查詢結果分組後,聚集函式將分別作用於每個組 用having count 只有滿足HAVING短語指定條件的組才輸出 HAVING短語與WHERE子句的區別:作用物件不同 WHERE子句作用於基表或檢視,從中選擇滿足條件的元組。 HAVING短語作用於組,從中選擇滿足條件的組。 查詢結果分組 練習:查詢有3門以上課程是90分以上的學生的學號及(90分以上的)課程數 select Sno,count(*) from SC where Grade>=90 group by sno having count(*)>=3; 連線查詢 自身連線 查詢每一門課的間接先修課(即先修課的先修課)
select First.cno,Second.cpno from Course First,Course Second where First.cpno=Second.cno; 左連線:以左邊的表為標準對右邊的表進行連線 右連線:以右邊的表為標準對左邊的表進行連線。 外連線與普通連線的區別 普通連線操作只輸出滿足連線條件的元組 外連線操作以指定表為連線主體,將主體表中不滿足連線條件的元組一併輸出 查詢每個學生及其選修課程的情況,即使學生一門課也沒有選也要輸出學生資訊。
select student.Sno,Sname,Ssex,Sage,Sdept,Cno,grade from student left join SC on student.Sno=SC.Sno 例:查詢選修2號課程且其成績在90分以上的所有學生的學號、姓名
select Sno,Sname from Student,SC where student.Sno=SC.Sno and SC.grade>90 and SC.Cno='2'; 一個SELECT-FROM-WHERE語句稱為一個查詢塊 將一個查詢塊巢狀在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢,稱為巢狀查詢 子查詢的限制:不能使用ORDER BY子句 帶有IN謂詞的子查詢 例:查詢選修課程名為“資訊系統”的學生學號和姓名 select Sno,Sname from student where sno in( select sno from SC where Cno in( select Cno from Course where Cname='資訊系統'; ) ) 帶有ANY或ALL謂詞的子查詢
例:查詢其他系中比資訊系中某一個學生年齡小的學生姓名和年齡
select Sname,Sage from student where age< any( select age from student where Sdept='IS' ) and Sdept!='IS'; 或者 select Sname,Sage from student where age< ( select max(age) from student where Sdept='IS' ) and Sdept!='IS'; any為小於其中的某一個就可以,而all小於其中的所有==小於最小的 巢狀查詢分類 不相關子查詢 子查詢的查詢條件不依賴於父查詢 處理方式:由裡向外逐層處理
相關子查詢 子查詢的查詢條件依賴於父查詢 處理方式: •首先取外層查詢中表的第一個元組,根據它與內層查詢相關的屬性值處 理內層查詢,若WHERE子句返回值為真,則取此元組放入結果表; •然後再取外層表的下一個元組; •重複這一過程,直至外層表全部檢查完為止 由EXISTS引出的子查詢,其目標列表達式通常都用* ,因為帶EXISTS的子查詢只返回真值或假值,給出列名無實際意義
帶有EXISTS謂詞的子查詢
例:查詢所有選修了1號課程的學生姓名。 select Sname from student where exists( select * from SC where Sno=student.Sno and Cno='1';) 帶有EXISTS謂詞的子查詢 例:查詢選修了全部課程的學生姓名。 select Sname from student where not exists( select *from Course where not exists(select *from SC where Sno=student.Sno and Cno=course.Cno ) ); 集合查詢 並: 例:查詢計算機科學系的學生或年齡不大於19歲的學生。 select *from student where Sdept='CS' unoin select *from student where Sage<19; 交集 查詢選修課程1的學生集合與選修課程2的學生集合的交集
select Sno from SC where Cno='1' intersect select Sno from SC where Cno='2'; 例:查詢計算機科學系的學生與年齡不大於19歲的學生的差集。 select Sno from student where Sdept='CS' minus select Sno from student where Sage>19;