SQL的几种连接查询方式(内连接、外连接、全连接、联合查询)
準(zhǔn)備表
drop table if exists test_a; CREATE TABLE `test_a` (`id` varchar(10) NOT NULL,`username` varchar(10) NOT NULL,`password` varchar(10) NOT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;drop table if exists test_a_description; CREATE TABLE `test_a_description` (`id` varchar(10) NOT NULL,`age` varchar(10) ,`address` varchar(50) ,`parent_id` varchar(10) NOT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;準(zhǔn)備數(shù)據(jù)
insert into test_a values('1','小明','11'); insert into test_a values('2','寧寧','22'); insert into test_a values('3','敏敏','33'); insert into test_a values('6','生生','66');insert into test_a_description values('1','10','aaa','1'); insert into test_a_description values('2','20','bbb','2'); insert into test_a_description values('3','30','ccc','3'); insert into test_a_description values('4','40','ddd','4');一、內(nèi)連接(inner join)
典型的聯(lián)接運算,使用像 = ?或 <> 之類的比較運算符)。包括相等聯(lián)接和自然聯(lián)接。 ? ??
內(nèi)聯(lián)接使用比較運算符根據(jù)每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學(xué)生標(biāo)識號相同的所有行。
?
查出的是兩張表的交集,兩張表都有的才查出來?
SQL:
select * from 表A inner join 表B on 判斷條件;
select * from 表A, 表B where 判斷條件;
?
結(jié)果:
?
二、外連接
1、左外連接(left join)
?
以左表為主表(查詢?nèi)?#xff09;, 右表為輔表(沒有的顯示null)
SQL:
select * from 表A left join 表B on 判斷條件;?
select a.*, ad.* from test_a as a left join test_a_description as ad on a.id=ad.parent_id;結(jié)果:
2、右外連接(right join)
以右表為主表(查詢?nèi)?#xff09;, 左表為輔表(沒有的顯示null)?
SQL:
select * from 表A right join 表B on 判斷條件;?
select a.*, ad.* from test_a as a right join test_a_description as ad on a.id=ad.parent_id;?
結(jié)果:
三、全連接(full join)
?
兩個表的所有數(shù)據(jù)都展示出來?
SQL:
select * from 表A full join 表B on 判斷條件;??
select a.*, ad.* from test_a as a full join test_a_description as ad on a.id=ad.parent_id;?
結(jié)果:
四、聯(lián)合(合并)查詢(union)
MySQL 不識別 FULL join,所以可以通過 union 來實現(xiàn)
SQL:
select a.*, ad.* from test_a as a left join test_a_description as ad on a.id=ad.parent_id union select a.*, ad.* from test_a as a right join test_a_description as ad on a.id=ad.parent_id;?
結(jié)果:
?
五?交差集
??還需要注冊的是我們還有一個是“交差集”?cross?join,?這種Join沒有辦法用文式圖表示,因為其就是把表A和表B的數(shù)據(jù)進(jìn)行一個N*M的組合,即笛卡爾積。表達(dá)式如下:
? ? ?SELECT?*?FROM?TableA?CROSS?JOIN?TableB
? ? ?這個笛卡爾乘積會產(chǎn)生?4?x?4?=?16?條記錄,一般來說,我們很少用到這個語法。但是我們得小心,如果不是使用嵌套的select語句,一般系統(tǒng)都會產(chǎn)生笛卡爾乘積然再做過濾。這是對于性能來說是非常危險的,尤其是表很大的時候。
六、區(qū)別分析
外連接:外連不但返回符合連接和查詢條件的數(shù)據(jù)行,還返回不符合條件的一些行。外連接分三類:左外連接(LEFT OUTER JOIN)、右外連接(RIGHT OUTER JOIN)和全外連接(FULL OUTER JOIN)
三者的共同點是都返回符合連接條件和查詢條件(即:內(nèi)連接)的數(shù)據(jù)行。不同點如下:
左外連接:還返回左表中不符合連接條件單符合查詢條件的數(shù)據(jù)行。
右外連接:還返回右表中不符合連接條件單符合查詢條件的數(shù)據(jù)行。
全外連接:還返回左表中不符合連接條件單符合查詢條件的數(shù)據(jù)行,并且還返回右表中不符合連接條件單符合查詢條件的數(shù)據(jù)行。全外連接實際是上左外連接和右外連接的數(shù)學(xué)合集(去掉重復(fù)),即“全外 = 左外 UNION 右外”。
說明:左表就是在“(LEFT OUTER JOIN)”關(guān)鍵字左邊的表。右表當(dāng)然就是右邊的了。在三種類型的外連接中,OUTER 關(guān)鍵字是可省略的。
七 、SQL查詢的基本原理
單表查詢:根據(jù)WHERE條件過濾表中的記錄,形成中間表(這個中間表對用戶是不可見的);然后根據(jù)SELECT的選擇列選擇相應(yīng)的列進(jìn)行返回最終結(jié)果。
兩表連接查詢:對兩表求積(笛卡爾積)并用ON條件和連接連接類型進(jìn)行過濾形成中間表;然后根據(jù)WHERE條件過濾中間表的記錄,并根據(jù)SELECT指定的列返回查詢結(jié)果。
多表連接查詢:先對第一個和第二個表按照兩表連接做查詢,然后用查詢結(jié)果和第三個表做連接查詢,以此類推,直到所有的表都連接上為止,最終形成一個中間的結(jié)果表,然后根據(jù)WHERE條件過濾中間表的記錄,并根據(jù)SELECT指定的列返回查詢結(jié)果。
理解SQL查詢的過程是進(jìn)行SQL優(yōu)化的理論依據(jù)。?
?
總結(jié)
以上是生活随笔為你收集整理的SQL的几种连接查询方式(内连接、外连接、全连接、联合查询)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下载安装NodeJS
- 下一篇: PL/SQL 连接mysql步骤