舉例用到的三個表
Student表
學生表,信息有學號,姓名,性別,年齡,系部
SC表
選課表,信息有學號,課程號,成績
Course表
課程表,信息有課程號,課程名字,先行課,學分
符號說明
【N】自定義的名字
【C】目標列名
【T】目標表名
【B】對列名使用的表達式
表達式 | 含義 |
---|---|
2020-Age | 2020減age的值 |
UPPER(name) | 將name的值大寫輸出 |
LOWER(dep) | 將dep的值小寫輸出 |
【F】對列名使用的條件
條件 | 含義 |
---|---|
grade between 65 and 75 | grade列中值在65至75之間(包括65,75) |
sex!=‘女’ | sex列中值不爲女 |
age=‘20’ or age=‘21’ | age列中值爲20或21 |
Cno in (‘001’,‘002’) | Cno列中值在集合{001,002}中 |
Sdep not in (‘5’,‘6’) | Sdep列中值不在集合{5,6}中 |
Grade is null | Grade列的值是空 |
Grade is not null | Grade列的值不空 |
【M】模糊查詢
表達式 | 含義 |
---|---|
梁% | 值的開頭第一字必須是梁 |
梁_ | 值必須是兩個字,第一個字是梁 |
%梁% | 值裏有梁字 |
_梁_ | 值必須是三個字,第二個字是梁 |
_梁% | 值的第二個字是梁 |
%梁_ | 值的倒數第二個字是梁 |
【H】庫函數查詢
函數名 | 功能 |
---|---|
SUM(《all/distinct》【C】/【B】) | 返回列C或表達式B的值的總和,distinct代表消除重複組 |
AVG(《all/distinct》【C】/【B】) | 返回列C或表達式B的值的平均值 |
MIN(【C】/【B】) | 返回列C或表達式B的值的最小值 |
MAX(【C】/【B】) | 返回列C或表達式B的值的最大值 |
COUNT(*) | 返回行數 |
COUNT(《all/distinct》【C】) | 返回列C的記錄數 |
單表查詢
語句 | 作用 |
---|---|
select【C】,【C1】…from【T】 | 在表T中展示列C,C1的信息 |
select * from【T】 | 在表T中展示所有列的信息 |
select【B】《as/空格》【N】from【T】 | 在表T中展示對列使用表達式B之後的信息,得到新列的名字爲N |
select《distinct》【C】from【T】 | 在表T中展示列C的信息,並消除重複行 |
select【C】from【T】where【F】 | 查詢表T中滿足條件F的行,並展示對應列C的信息 |
select【C】from【T】where【C1】《like/not like》【M】 | 在表T中模糊查詢列C1的值《滿足/不滿足》M的行,並展示對應列C的信息 |
select【C】from【T】where【F】order by【C1】《asc/desc》 | 在表T中查詢滿足條件F的行,並將結果按列C1值的《升序/降序》排列,最後展示對應列C的信息 |
select【H】from【T】where【F】 | 在表T中查詢滿足條件F的行,使用函數H處理對應的列得到新列。 |
select【C】from【T】group by【C】having【F】 | 將表T中列C的值相同的行進行分組,從所有組中查詢符合條件F的組(F中必須有H),並展示列C的信息 |
技巧
- 所有的名字不得衝突,即名字唯一,不能使用關鍵字
- 名字與大小寫無關,名字以字母開頭
- 一表中最多有254個列
- 一表最多有249個索引
- group by常和庫函數結合做統計
舉幾個例子理解一下單表查詢
- 統計男生中年齡大於18歲的人的個數?
select COUNT(Sno) as "大於18歲的男生人數" from Student where Sage>18
2. 將學生按年齡升序排列,得到對應的姓名學號?
select Sno,Sname from Student order by Sage asc
3.查詢所有不姓李的同學學號和系部,要求系部小寫輸出?
select Sno, LOWER(Sdep) 小寫系部 from Student where Sname not like '李%'
4.查詢每個系人數大於1人的平均年齡?
select Sdep,AVG(Sage) as "平均年齡" from Student group by Sdep having COUNT(Sno)>1
多表查詢
語句 | 作用 |
---|---|
select【C1,C2】from【T1】cross join【T2】 | 在表T1和T2的笛卡爾積的結果中展示列C1,C2的信息 |
select【C1,C2】from【T1】inner join【T2】on【F】 | 在表T1和T2的連接的結果中查詢滿足條件F的行,並展示列C1,C2的信息 |
select【C1,C2】from【T1,T2】where【F】 | 在表T1和T2的連接的結果中查詢滿足條件F的行,並展示列C1,C2的信息 |
select【C1,C2】from【T1】inner join【T2】on【T1.C】=【T2.C】 | 在表T1和T2的等值連接的結果中展示列C1,C2的信息【技巧】 |
select【C1,C2】from【T1,T2】where【T1.C】=【T2.C】 | 在表T1和T2的等值連接的結果中展示列C1,C2的信息【技巧】 |
select【C1,C2】from【T1】left outer join【T2】on【T1.C】=【T2.C】 | 在表T1和T2的左外連接的結果中展示列C1,C2的信息 |
select【C1,C2】from【T1】right outer join【T2】on【T1.C】=【T2.C】 | 在表T1和T2的右外連接的結果中展示列C1,C2的信息 |
select【C1,C2】from【T1】full outer join【T2】on【T1.C】=【T2.C】 | 在表T1和T2的外連接的結果中展示列C1,C2的信息 |
select【N1.C1,N2.C2】from【T N1,T N2】where【N1.C2=N2.C1】 | 在表T自身和自身做連接的結果中展示列C1,C2的信息【技巧】 |
select【C1】from【T1】where【F1】union select【C2】from【T2】where【F2】 | 將兩次查詢結果並運算 |
select【C1】from【T1】where【F1】intersect select【C2】from【T2】where【F2】 | 將兩次查詢結果交運算 |
select【C1】from【T1】where【F1】except select【C2】from【T2】where【F2】 | 將兩次查詢結果差運算 |
嵌套查詢
設【Q】= select【C】from【T】where【Q/F】或 【Q】= select【C】from【T】group by【C】having【Q/F】,則
select【C】from【T】where【Q】或 select【C】from【T】group by【C】having【Q】 是嵌套查詢
可進行多層嵌套,個人感覺像遞歸。以下舉例比較容易理解嵌套查詢
any,all
名稱 | 說明 |
---|---|
>any | 大於某個值(大於最小值) |
<any | 小於某個值(小於最大值) |
>=any | 大於等於某個值(大於等於最小值) |
<=any | 小於等於某個值(小於等於最大值) |
!=any | 不等於某個值 |
>all | 大於所有值(大於最大值) |
<all | 小於所有值(小於最小值) |
>=all | 大於等於所有值(大於等於最大值) |
<=all | 小於等於所有值(小於等於最小值) |
!=all | 不等於所有值 |
查詢分數最高的學生的姓名
語句
select Sname from Student where Sno in (select Sno from SC where Grade >=all (select Grade from SC))
運行結果
in,not in
A in B 表示集合A在B中;A not in B 表示集合A不在B中
查詢選修了數學的學生姓名?
語句
select Sname from Student where Sno in (select Sno from SC where Cno in (select Cno from Course where Cname='數學'))
運行結果
exists,not exists
exists 查詢結果爲空返回false;查詢結果不空返回true
not exists 查詢結果爲空返回true;查詢結果不空返回false
查詢沒選課程號是1號的學生姓名
語句
select Sname from Student where not exists (select * from SC where Cno='1' and SC.Sno=Student.Sno)
運行結果
關聯單詞解釋
英文 | 漢語 | 說明 |
---|---|---|
select | 選擇 | 查詢時使用 |
group by | 分組 | 分組查詢時使用 |
distinct | 確定的,清楚的 | 希望數據不重複時使用 |
between A and B | 介於A和B之間 | 可用對應的<=,>=替換 |
upper | 上面的;靠上部的 | 字母大寫輸出時使用 |
lower | 下方的;在底部的;把…放低 | 字母小寫輸出時使用 |
sum | 歸納;總計;總結 | 求和時用 |
avg | 平均爲;計算出…的平均數 | average的簡寫 |
min | 最小值;最少量; | minimum的簡寫 |
max | 最大量;最大限度 | maximum的簡寫 |
count | (按順序)數數;計算(或清點)總數 | 計數用 |
asc | 上升;升高;登高 | ascend簡寫 |
desc | 下去;下降 | descend簡寫 |
cross join | 交叉連接 | |
inner join | 內連接 | |
left outer join | 左外連接 | |
right outer join | 右外連接 | |
full outer join | 完全外連接 | |
union | 同盟;聯盟 | 並 |
intersect | 相交;交叉 | 交 |
except | 不包括;不計;把…除外 | 差 |
exists | 存在;實際上有 | 使用時只返回true或false |