SQL的幾種連接查詢方式(內連接、外連接、全連接、聯合查詢)

準備表

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;

準備數據

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');

 

一、內連接(inner join)

典型的聯接運算,使用像 =  或 <> 之類的比較運算符)。包括相等聯接和自然聯接。     
內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。

查出的是兩張表的交集,兩張表都有的才查出來 

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;

結果:

 

二、外連接

1、左外連接(left join)

以左表爲主表(查詢全部), 右表爲輔表(沒有的顯示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;

 結果:

2、右外連接(right join)

以右表爲主表(查詢全部), 左表爲輔表(沒有的顯示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;

結果:

三、全連接(full join)

兩個表的所有數據都展示出來 

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;

結果:

 

四、聯合(合併)查詢(union)

MySQL 不識別 FULL join,所以可以通過 union 來實現

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;

結果:

 

五、區別分析

外連接:外連不但返回符合連接和查詢條件的數據行,還返回不符合條件的一些行。外連接分三類:左外連接(LEFT OUTER JOIN)、右外連接(RIGHT OUTER JOIN)和全外連接(FULL OUTER JOIN)

三者的共同點是都返回符合連接條件和查詢條件(即:內連接)的數據行。不同點如下:
左外連接:還返回左表中不符合連接條件單符合查詢條件的數據行。
右外連接:還返回右表中不符合連接條件單符合查詢條件的數據行。
全外連接:還返回左表中不符合連接條件單符合查詢條件的數據行,並且還返回右表中不符合連接條件單符合查詢條件的數據行。全外連接實際是上左外連接和右外連接的數學合集(去掉重複),即“外 = 左外 UNION 右外”。

說明:左表就是在“(LEFT OUTER JOIN)”關鍵字左邊的表。右表當然就是右邊的了。在三種類型的外連接中,OUTER 關鍵字是可省略的。

 

六、SQL查詢的基本原理

  1. 單表查詢:根據WHERE條件過濾表中的記錄,形成中間表(這個中間表對用戶是不可見的);然後根據SELECT的選擇列選擇相應的列進行返回最終結果。
  2. 兩表連接查詢:對兩表求積(笛卡爾積)並用ON條件和連接連接類型進行過濾形成中間表;然後根據WHERE條件過濾中間表的記錄,並根據SELECT指定的列返回查詢結果。
  3. 多表連接查詢:先對第一個和第二個表按照兩表連接做查詢,然後用查詢結果和第三個表做連接查詢,以此類推,直到所有的表都連接上爲止,最終形成一箇中間的結果表,然後根據WHERE條件過濾中間表的記錄,並根據SELECT指定的列返回查詢結果。

理解SQL查詢的過程是進行SQL優化的理論依據。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章