資料查詢
一、單表查詢
二、連接配接查詢
三、嵌套查詢
四、集合查詢
五、基于派生表的查詢
一、單表查詢
1.列查詢
注:預設情況下select allselect [all|distinct] <表達式> [别名] [,<表達式> [别名]]... from <表名|視圖名> [,<表名|視圖名>]...|(<select語句>) [as] <别名> [where <條件表達式>] [group by <列名1> [having <條件表達式>]] [order by <列名2> [asc|desc]];
2.元組查詢
- 限定all或distinct
- 增加where限定條件
where子句常用字元
查詢條件 謂詞 比較 =,>,<,>=,<=,!= 确定範圍 between and,not between and 确定集合 in,not in 字元比對 like,not like 空值 is null,is not null 邏輯運算 and,or,not
1.比大小
2.确定範圍
between and包括兩端的值
3.确定集合
4.字元比對
格式:
%代表任意長度字元串,_代表任意單個字元[not] like '<比對串>' [escape '<換碼字元>']
- 聚集函數
聚集函數
count(*) 元組個數 count([all|distict] <列名>) 該列值個數 sum([all|distict] <列名>) 該列值綜合 avg([all|distict] <列名>) 該列平均值 max([all|distict] <列名>) 該列最大值 min([all|distict] <列名>) 該列最小值
注:聚集函數隻能用于select子句和group by的having子句中,預設為all
作用:細化聚集函數的作用範圍
- group by子句
3.order by
2.連接配接查詢
- 等值連接配接與非等值連接配接
等值連接配接:連接配接運算符為=
非等值連接配接:連接配接運算符不為=
連接配接查詢的兩種形式:
[<表1>.]<列名1> <比較運算符> [<表2>.]<列名2>
[<表1>.]<列1> between [<表2>.]<列2> and [<表2>.]<列3>
注:連接配接字段必須可比
Ex:查詢選修2号課程且成績在90分上所有學生的學号和姓名
注:先輸入其他條件再輸入連接配接條件執行效率更高
- 自身連接配接
EX:查詢每一門課的先修課的先修課
- 外連接配接
EX:查詢每個學生的選課資訊時,預設情況下要是有學生沒選課,那麼這個學生的資訊就不顯示了,現在要求把沒選課的學生也顯示出來
- 多表連接配接
3.嵌套查詢
查詢塊:一個select-from-where語句塊
嵌套查詢:查詢塊嵌入到另一個查詢塊的where或having子句中的查詢
相關查詢:子查詢的查詢條件依賴于父查詢
不相關查詢:子查詢的查詢條件不依賴于父查詢
EX:查詢和劉晨在同一個系中學習的學生
- 使用in來完成嵌套查詢
select Sno,Sname,Sdept from Student where Sdept in ( select Sdept from Student where Sname='劉晨' );
- 使用比較運算符來完成嵌套查詢(得确切知道内層查詢隻有一個值了)
EX:找出每個學生超過他自己選修課程平均成績的課程号select Sno,Sname,Sdept from Student where Sdept= ( select Sdept from Student where Sname='劉晨' );
注:這裡為了區分子查詢和父查詢中的SC,分别對SC取不同的别名來訓示。select Sno,Cno from SC x where Grade>= ( select avg(Grade) from SC y where y.Sno=x.Sno );
注:用聚集函數實作子查詢比直接用any或all查詢效率要高。
- 帶有any(some)或all謂詞的子查詢
- 帶有exists謂詞的子查詢
注:
1.由exists引出的子查詢,其目标清單達式通常用*,因為帶exists的子查詢隻傳回真或假值,給出列名無實際意義。
2.SQL中沒有全稱量詞,隻能用exists/not exists來代替。
EX:查詢選修了全部課程的學生姓名
注:按照SQL沒有全稱量詞的尿性,隻能用沒有一門課程是他不選修的來代替。select Sname from Student where not exists ( select * from Course where not exists ( select * from SC where Sno=Student.Sno and Cno=Course.Cno ) )
4.集合查詢
集合操作:并(union)、交(intersect)、差(except)
5.基于派生表的查詢
子查詢不僅可以在where和having子句,也插入在from子句中,以此生成一個派生表并成為主查詢的查詢對象
EX:查詢所有選修了1号課程的學生姓名
注:這裡的as可以省略,SC1就是個派生表,現在SC1就可以當個普通的表來查詢了select Sname from Student, (select Sno from SC where Cno='1') as SC1 where Student.Sno=SC1.Sno;