数据库中的多表查询总结
數(shù)據(jù)庫在單個(gè)表里操作其實(shí)很簡(jiǎn)答,但是涉及在多張表里尋找數(shù)據(jù)的時(shí)候,難度會(huì)大大增加,這里解釋一些多表聯(lián)合查詢常用的操作。
一、join操作
在數(shù)據(jù)庫的查詢中,多表連接查詢是一大難點(diǎn),也是多表查詢里的重點(diǎn)。連接主要有以下四種情況:
- INNER JOIN(內(nèi)連接):如果表中有至少一個(gè)匹配,則返回行 【在語法中可以省略INNER關(guān)鍵字】
- LEFT JOIN(左連接):從左表返回所有的行,如果右表中沒有匹配,對(duì)應(yīng)的列返回Null
- RIGHT JOIN(右連接):從右表返回所有的行 ,如果左表中沒有匹配,對(duì)應(yīng)的列返回Null
- FULL JOIN(全連接):只要其中一個(gè)表中存在匹配,則返回行(即結(jié)合左連接和右連接的結(jié)果)
這里主要要理清兩個(gè)問題:1)以哪個(gè)表為基礎(chǔ)(從哪個(gè)表返回);2)遇到?jīng)]有匹配的怎么處理。
以下是各個(gè)連接方式的關(guān)系圖:
對(duì)于學(xué)生表,課程表兩張表來說,分別進(jìn)行四種連接方式,結(jié)果如下:
注:
二、union操作
UNION 操作符用于合并兩個(gè)或多個(gè) SELECT 語句的結(jié)果集。
請(qǐng)注意,UNION 內(nèi)部的每個(gè) SELECT 語句必須擁有相同數(shù)量的列。列也必須擁有相似的數(shù)據(jù)類型。同時(shí),每個(gè) SELECT 語句中的列的順序必須相同。
這是在展示結(jié)果的時(shí)候使用。
比如,還是上邊的兩張表,可以這樣操作:
SELECT 學(xué)號(hào) FROM 學(xué)生表 UNION SELECT 學(xué)號(hào) FROM 課程表
返回結(jié)果:
100 200 300
SELECT 學(xué)號(hào) FROM 學(xué)生表 UNION ALL SELECT 學(xué)號(hào) FROM 課程表
這樣會(huì)允許重復(fù)值,返回結(jié)果:
100 200 300 100 100 200
三、關(guān)于多表查詢我的一些小技巧:
先附上一個(gè)挺全的數(shù)據(jù)庫題,再以這個(gè)題為例說明一些多表查詢的技巧:SQL數(shù)據(jù)庫查詢練習(xí)題及答案(四十五道題)。
1、順藤摸瓜法
以23題為例:
第二十三題 查詢“張旭“教師任課的學(xué)生成績(jī)。
通過給出的數(shù)據(jù)表,我完全可以寫出這樣一個(gè)關(guān)系式:
因?yàn)榻o出的條件是張旭老師的名字,那么我就要從Teacher表中查找Tno,然后再通過Tno在Course表中找Cno,最后在通過Cno在Score表中找到條件符合的成績(jī)。
那么,關(guān)系就是這樣的。知道了這條線,就可以從后往前寫出查詢語句:
select Sno,Cno,Degree from Score where Cno in (select Cno from Course where Tno in (select Tno from Teacher where Tname=‘張旭’))
#### 2、合起來搞事情法
根據(jù)上邊的分析,我可以看到要想完成題目要求,需要用到三個(gè)表:Score,Course,Teachet。
那么我把三個(gè)表按照對(duì)應(yīng)的聯(lián)系聯(lián)合起來即可,格式如下。
select Degree from Score,Teacher,Course where Teacher.Tname=‘張旭’ and Teacher.Tno=Course.Tno and Course.Cno=Score.Cno
總之,多表查詢最重要的是對(duì)著給定的數(shù)據(jù)庫表查一遍,只要能根據(jù)已知數(shù)據(jù)倒推回去,那么就可以倒著寫出其查詢語句。
當(dāng)然,會(huì)和一些統(tǒng)計(jì)語句進(jìn)行結(jié)合,但是思路不變:
第二十四題 查詢選修某課程的同學(xué)人數(shù)多于5人的教師姓名。
同樣可以屢出這樣一條線:(【】代表在箭頭上邊)
count(cno)>5 →【Score】→Cno→【Course】→Tno→【Teacher】→Tname。
最后可以寫出查詢語句:
select Tname from Teacher where Tno in (select Tno from Course where
Cno in (select Cno from Score group by Cno having COUNT(*)>5) )
附:關(guān)于統(tǒng)計(jì)類函數(shù)的使用:
1、group by函數(shù)
GROUP BY 語句用于結(jié)合聚合函數(shù),根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。
其實(shí)只要分組處理,一般就會(huì)求出這個(gè)組里的一些統(tǒng)計(jì)值,下邊列出一些常用的統(tǒng)計(jì)函數(shù):
- AVG() :求平均數(shù)
- MAX() :返回指定列的最大值。
- MIN() :返回指定列的最小值。
- SUM() :返回?cái)?shù)值列的總和
- COUNT():返回行數(shù)
- SQL MID() :從文本字段中提取字符
- SQL LEN() :返回文本字段的長(zhǎng)度
- SQL ROUND() :用于把數(shù)值字段舍入為指定的小數(shù)位數(shù)。
- SQL NOW() :返回系統(tǒng)當(dāng)前時(shí)間
2、having函數(shù)
這個(gè)函數(shù)其實(shí)用一句話就可以說清楚:它是聚合函數(shù)中的 where 函數(shù)。也就是說只是因?yàn)間roup by和where兩個(gè)函數(shù)“一山不容二虎”,所以才出現(xiàn)的having函數(shù)進(jìn)行補(bǔ)充。具體的使用方法和where函數(shù)沒有什么區(qū)別。
例如:
第三十六題 查詢至少有2名男生的班號(hào)。
select Class FROM student where Ssex=‘男’ group by Class having
COUNT(*)>1
我們意圖選擇count(*)>1的班級(jí),本來可以用group by class where (數(shù)量條件)即可,只是因?yàn)閣here不能用在這里,所以使用having就行。
【待:補(bǔ)充一些全連接,左右連接的應(yīng)用實(shí)例】
參考資料:
總結(jié)
以上是生活随笔為你收集整理的数据库中的多表查询总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python闯关_Day012
- 下一篇: 某互联网公司数据分析岗 SQL 笔试题