日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL的几种连接查询方式(内连接、外连接、全连接、联合查询)

發(fā)布時間:2023/12/31 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL的几种连接查询方式(内连接、外连接、全连接、联合查询) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

準(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 判斷條件;
?

select a.*, ad.* from test_a as a inner join test_a_description as ad on a.id=ad.parent_id;select a.*, ad.* from test_a as a, test_a_description as ad where a.id=ad.parent_id;

結(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。