SQL語句多表聯(lián)查的實(shí)現(xiàn)方法示例
前言
最近面試實(shí)習(xí)生,發(fā)現(xiàn)一般來說,公司喜歡通過一些 SQL 語句來考察你對(duì)數(shù)據(jù)庫的使用熟不熟悉。所以我來總結(jié)一下我在面試中遇到多表聯(lián)查是怎么聯(lián)查的。
三表聯(lián)查
首先來說多表聯(lián)查的一些知識(shí)點(diǎn)。
多表是指等于或者多余三個(gè)表以上的數(shù)據(jù)庫查詢。多表聯(lián)查的類型有:
- 內(nèi)連接:join,inner join
- 外連接:left join,left outer join,right join,right outer join,union
- 交叉連接:cross join
解釋一下,外連接是指將兩個(gè)表進(jìn)行合并,如果有不相同的列,那么另外一個(gè)表將顯示 null。而內(nèi)連接是指內(nèi)連接查詢操作列出與連接條件匹配的數(shù)據(jù)行,它使用比較運(yùn)算符比較被連接列的列值。也就是說,運(yùn)算符可以是 =,也可以是 >、>=、<=、<、!>、!<和<>。
內(nèi)連接
假如我們有兩個(gè)表
student.table id name clsId 1 ?tjc ? ?1 2 ?zhangsan ? ?2 3 李四 ? ?3 4 ?劉五 ? ?4 5 ?黃六 ? ?5
class.table clsId clsName 1 ? ? ? ?軟件1班 2 ? ? ? ?軟件2班 3 ? ? ? ?軟件3班 4 ? ? ? ?軟件4班
為了查詢上面兩個(gè)表,我們可以使用兩種查詢語句:
select * from student as s,class as as c where s.clsId = class.clsId select * from student as s inner join class as c on s.clsId = class.clsId
兩種結(jié)果都是:
id name clsId clsId clsName
1 tjc 1 1 軟件1班
2 zhangsan 2 2 軟件2班
3 李四 3 3 軟件3班
4 劉五 4 4 軟件4班
外連接
外連接跟內(nèi)連接不同之處,如果查詢的表中,如果通過關(guān)聯(lián)標(biāo)示符中,一個(gè)表的數(shù)據(jù)而另外一個(gè)表沒有響應(yīng)的數(shù)據(jù)項(xiàng),那么就顯示 null。
左連接
查詢 SQL 語句為:
select * from student as s left join class as c on s.clsId = c.clsId
以左表為基準(zhǔn),如果右表沒有相應(yīng)的數(shù)據(jù)項(xiàng),那么右表顯示為 null。
右連接
select * from student as s right join class as c on s.clsId = c.clsId
以右表為基準(zhǔn),如果左表沒有相應(yīng)的數(shù)據(jù)項(xiàng),那么左表顯示為 null。
全連接
select * from student as s full outer join class c on s.clsId = c.clsId
完整外部聯(lián)接返回左表和右表中的所有行。當(dāng)某行在另一個(gè)表中沒有匹配行時(shí),則另一個(gè)表的選擇列表列包含空值。如果表之間有匹配行,則整個(gè)結(jié)果集行包含基表的數(shù)據(jù)值。
交叉連接
交叉聯(lián)接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯(lián)接也稱作笛卡爾積。
select * from student as s cross join class as c order by s.id
附:多表聯(lián)合查詢訓(xùn)練
示例:求既學(xué)過“001”號(hào)課又學(xué)過 “002”號(hào)課的所有學(xué)生的學(xué)號(hào)
Select S1.S# From SC S1, SC S2 Where S1.S# = S2.S# and S1.C#=‘001' and S2.C#=‘002 ;
示例:求“001”號(hào)課成績(jī)比“002”號(hào)課成績(jī)高的所有學(xué)生的學(xué)號(hào)
Select S1.S# From SC S1, SC S2 Where S1.S# = S2.S# and S1.C#=‘001' and S2.C#=‘002' and S1.Score > S2.Score;
總結(jié)
到此這篇關(guān)于SQL語句多表聯(lián)查實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SQL語句多表聯(lián)查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MYSQL數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)時(shí)出現(xiàn)亂碼的解決辦法
我是用的最后一種方法,前面三種解決MYSQL導(dǎo)入數(shù)據(jù)亂碼的方法沒試過,東莞SEO推薦大家直接使用第四種方法處理MYSQL導(dǎo)入中文數(shù)據(jù)時(shí)的亂碼問題。2011-01-01wamp中mysql安裝時(shí)能啟動(dòng)重啟后無法啟動(dòng)的解決辦法
這篇文章主要介紹了wamp中mysql安裝時(shí)能啟動(dòng)重啟后無法啟動(dòng)的解決辦法 ,需要的朋友可以參考下2018-08-08mysql?窗口函數(shù)?ROW_NUMBER、NTILE詳解
這篇文章主要介紹了mysql?窗口函數(shù)?ROW_NUMBER、NTILE,本文通過sql語句給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07MySQL 發(fā)生同步延遲時(shí)Seconds_Behind_Master還為0的原因
騰訊云數(shù)據(jù)庫 MySQL 的只讀實(shí)例出現(xiàn)了同步延遲,但是監(jiān)控的延遲時(shí)間顯示為 0,而且延遲的 binlog 距離非 0,且數(shù)值越來越大。臨時(shí)解決之后,仔細(xì)想了一想,Seconds_Behind_Master 雖然計(jì)算方式有點(diǎn)坑,但是出現(xiàn)這么“巨大”的誤差還是挺奇怪的,本文就來分析下這個(gè)問題2021-06-06MySQL實(shí)現(xiàn)兩張表數(shù)據(jù)的同步
本文將介紹mysql 觸發(fā)器實(shí)現(xiàn)兩個(gè)表的數(shù)據(jù)同步,需要學(xué)習(xí)MySQL的童鞋可以參考。2016-10-10mysql中用于數(shù)據(jù)遷移存儲(chǔ)過程分享
mysql 數(shù)據(jù)遷移用的一個(gè)存儲(chǔ)過程,需要的朋友可以收藏下。2011-05-05MySQL中通過EXPLAIN如何分析SQL的執(zhí)行計(jì)劃詳解
這篇文章主要給大家介紹了關(guān)于MySQL中通過EXPLAIN如何分析SQL的執(zhí)行計(jì)劃的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的安康學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08