【學習數據庫】SQL語句之查詢


舉例用到的三個表

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常和庫函數結合做統計

舉幾個例子理解一下單表查詢

  1. 統計男生中年齡大於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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章