sql 多表多行模糊查询_从零开始学习SQL(五)多表查询
經(jīng)過之前的學(xué)習(xí),現(xiàn)在我們已經(jīng)對(duì)查詢有了一定的了解,但是我們目前的所有查詢都只能找到在一張表中的數(shù)據(jù),但如果我們需要尋找分布在多張表格中的數(shù)據(jù)時(shí),這種之前的查詢就做不到了,這時(shí)就需要引入一種新的查詢方法,多表查詢。
一、聯(lián)結(jié)的介紹
還記得我們最開始數(shù)據(jù)庫(kù)結(jié)構(gòu)中提到的聯(lián)結(jié)(JOIN)嗎?它就是我們用來連接多個(gè)表格的工具,當(dāng)需要提取的數(shù)據(jù)分布在不同表格時(shí)。我們可以使用JOIN鏈接,多個(gè)數(shù)據(jù)庫(kù)關(guān)聯(lián)起來,
圖片來自猴子老師LIVE課程如圖所示這四張表格使用了JOIN相互連接,學(xué)生表學(xué)號(hào)與成績(jī)表學(xué)號(hào)連接,成績(jī)表課程號(hào)與課程表課程號(hào)連接,課程表教師號(hào)與教師表教師號(hào)連接,表之間的連接可以這樣寫
SELECT FROM 學(xué)生表 as a1 JOIN 成績(jī)表 as a2 ON a1.學(xué)號(hào) = a2.學(xué)號(hào) JOIN 課程表 as a3 /*如果需要關(guān)聯(lián)第三個(gè)表*/ ON a2.課程表 = a3.課程表在表和表之間使用 JOIN 來進(jìn)行聯(lián)接,用來關(guān)聯(lián)的字段則寫在 ON 后面
二、聯(lián)結(jié)的種類
連接又分類幾個(gè)種類
1.交叉連接,交叉連接會(huì)將表中的每一行和另外一張表中的每一行合并在一起,結(jié)果的行數(shù)是兩張表行數(shù)的乘積(一共6行)。
2.內(nèi)連接,內(nèi)連接將兩張表中共有的數(shù)據(jù)相聯(lián),如圖所示,我們可以看到通過學(xué)號(hào)相聯(lián)結(jié)的時(shí)學(xué)號(hào)0001為兩張表中共有的行,因此將學(xué)號(hào)為0001的列與成績(jī)表中0001的列相聯(lián)結(jié)。
3.左聯(lián)結(jié)/右聯(lián)結(jié),左聯(lián)結(jié)會(huì)將左側(cè)表中的全部數(shù)據(jù)與右側(cè)表中的數(shù)據(jù)相聯(lián)結(jié)。右邊沒有的數(shù)據(jù)則用空值表示。右聯(lián)結(jié)則會(huì)將右側(cè)表中的全部數(shù)據(jù)與左側(cè)表中的數(shù)據(jù)相聯(lián)結(jié),左邊表沒有的數(shù)據(jù)則為空值。
4.全聯(lián)結(jié),全連接會(huì)將左右兩邊的值都進(jìn)行合并,沒有值的行則會(huì)用空值表示
三、CASE表達(dá)式
CASE表達(dá)式可以用來解決復(fù)雜的問題
CASE WHEN<判斷表達(dá)式> THEN <表達(dá)式>WHEN<判斷表達(dá)式> THEN <表達(dá)式>WHEN<判斷表達(dá)式> THEN <表達(dá)式>.......ELSE ENDCASE表達(dá)式可以用來進(jìn)行復(fù)雜的判斷,每一句CASE表達(dá)式都能進(jìn)行一個(gè)判斷,當(dāng)滿足這個(gè)條件時(shí)就會(huì)結(jié)束,如果不滿足這個(gè)條件則會(huì)繼續(xù)運(yùn)行后面的WHEN語(yǔ)句,最后的語(yǔ)句都沒有找到符合條件的語(yǔ)句則會(huì)運(yùn)行ELSE子句。
每一個(gè)CASE表達(dá)式都必須含有END
四、練習(xí)題
將分?jǐn)?shù)分段并統(tǒng)計(jì)各分段的人數(shù)
SELECT c1.課程號(hào),c2.課程名稱, SUM(CASE WHEN 成績(jī) BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS '[85-70]', SUM(CASE WHEN 成績(jī) BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS '[70-60]', SUM(CASE WHEN 成績(jī) <60 THEN 1 ELSE 0 END) AS '[<60]' FROM score as c1 JOIN courser as c2 ON c1.課程號(hào) = c2.課程號(hào) GROUP BY c1.課程號(hào)The JOIN operation/zh?sqlzoo.net4.列出球員名字叫Mario (player LIKE 'Mario%')有入球的 隊(duì)伍1 team1, 隊(duì)伍2 team2 和 球員名 player
SELECT team1,team2,player FROM goal as c1 JOIN game as c2 ON id =matchid WHERE player LIKE 'Mario%'6.列出'Fernando Santos'作為隊(duì)伍1 team1 的教練的賽事日期,和隊(duì)伍名。
SELECT mdate,teamname FROM game as c1 JOIN eteam as c2 ON c1.team1 = c2.id WHERE coach = 'Fernando Santos'8.列出全部賽事,射入德國(guó)龍門的球員名字
SELECT DISTINCT(player) FROM game JOIN goal ON matchid = id WHERE (team1='GER' or team2='GER') AND teamid <> ('GER')12.每一場(chǎng)德國(guó)'GER'有參與的賽事中,列出賽事編號(hào) matchid, 日期date 和德國(guó)的入球數(shù)字。
SELECT matchid,mdate,count(team1) FROM game AS c1 JOIN goal as c2 ON c2.matchid = c1.id WHERE (team1 = 'GER' OR team2 = 'GER') AND c2.teamid = 'GER' GROUP BY c2.matchid,mdatexietq:從零開始學(xué)習(xí)SQL(六)練習(xí)題目?zhuanlan.zhihu.com總結(jié)
以上是生活随笔為你收集整理的sql 多表多行模糊查询_从零开始学习SQL(五)多表查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的缩进机制是其缺点之一_Py
- 下一篇: 多个查询语句能否一次把结果导出_mysq