1. 程式人生 > >內連線 外連線 交叉連線總結

內連線 外連線 交叉連線總結

本篇文章總結了一下SQL中的五種連線-內連線、左外連線、右外連線、全連線、交叉連線

一、內連線 (full join/full outer join)

內連線查詢操作列出與連線條件匹配的資料行,它使用比較運算子比較被連線列的列值。內連線分三種:

1、等值連線:在連線條件中使用等於號(=)運算子比較被連線列的列值,其查詢結果中列出被連線表中的所有列,包括其中的重複列。

2、不等連線: 在連線條件使用除等於運算子以外的其它比較運算子比較被連線的列的列值。這些運算子包括>、>=、<=、<、!>、!<和<>。

3、自然連線:在連線條件中使用等於(=)運算子比較被連線列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連線表中的重複列。

二、外連線(full join/full outer join)

返回到查詢結果集合中的不僅包含符合連線條件的行,而且還包括左表(左外連線時)、右表(右外連線時)或兩個邊接表(全外連線)中的所有資料行。其中: 

1、左連線:左向外連線的結果集包括LEFT  OUTER子句中指定的左表的所有行,而不僅僅是連線列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。

2、右連線:右向外連線是左向外連線的反向連線。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。

3、全連線:完整外部連線返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的資料值。   注:Mysql不支援全連線,Oracle、DB2、MSSQL都支援全連線


三、交叉連線(full join/full outer join)
交叉連線不帶WHERE 子句,它返回被連線的兩個表所有資料行的笛卡爾積,返回到結果集合中的資料行數等於第一個表中符合查詢條件的資料行數乘以第二個表中符合查詢條件的資料行數。例,teacher表中有5位老師,而student表中有9個學生,則下列交叉連線檢索到的記錄數將等於5*9=45行。

下面舉例說明:
建立表:
create table teacher(
t_id int,
t_Name varchar(30)
)character set 'utf8';

create table student(
s_id int,
s_Name varchar(30)
)character set 'utf8';

create table tea_stu_mapping(
t_id int,
s_id int

);

向表中插入相應資料
insert into teacher values(1,'張夢男');
insert into teacher values(2,'王欣');
insert into teacher values(3,'葉凡');
insert into teacher values(4,'許敏');
insert into teacher values(5,'張子良');

insert into student values(1,'張丹');
insert into student values(2,'李娜');
insert into student values(3,'林金');
insert into student values(4,'張欣然');
insert into student values(5,'謝鑫');
insert into student values(6,'董鑫');
insert into student values(7,'李強');
insert into student values(8,'張自在');
insert into student values(9,'石磊');

insert into tea_stu_mapping values(1,1);
insert into tea_stu_mapping values(1,2);
insert into tea_stu_mapping values(2,3);
insert into tea_stu_mapping values(2,4);
insert into tea_stu_mapping values(3,5);
insert into tea_stu_mapping values(3,6);
insert into tea_stu_mapping values(4,7);
insert into tea_stu_mapping values(4,8);

--內連線 inner join
select t.t_id, t.t_Name, s.s_id, s.s_Name from teacher t inner join tea_stu_mapping map on t.t_id = map.t_id inner join student s on s.s_id = map.s_id order by t.t_id, s.s_id;


--左連線(左外連線) left join(left outer join)
select t.t_id, t.t_Name, s.s_id, s.s_Name from teacher t left join tea_stu_mapping map on t.t_id = map.t_id left join student s on s.s_id = map.s_id order by t.t_id, s.s_id;


--右連線(右外連線) right join(right outer join)
select t.t_id, t.t_Name, s.s_id, s.s_Name from teacher t right join tea_stu_mapping map on t.t_id = map.t_id right join student s on s.s_id = map.s_id order by t.t_id, s.s_id;


--全連線(全外連線) full join(full outer join)
select t.t_id, t.t_Name, s.s_id, s.s_Name from teacher t full join tea_stu_mapping map on t.t_id = map.t_id full join student s on s.s_id = map.s_id;
因為Mysql不支援全連線full join,所以這裡要在Mysql中實現全連線的效果使用的是"左連線+union+右連線"的方式。
下面就是在Mysql實現全連線的效果sql
select t.t_id, t.t_Name, s.s_id, s.s_Name from teacher t left join tea_stu_mapping map on t.t_id = map.t_id left join student s on s.s_id = map.s_id
union
select t.t_id, t.t_Name, s.s_id, s.s_Name from teacher t right join tea_stu_mapping map on t.t_id = map.t_id right join student s on s.s_id = map.s_id;

與union相關的還有union all,下面在看看union all的與union的差別

select t.t_id, t.t_Name, s.s_id, s.s_Name from teacher t left join tea_stu_mapping map on t.t_id = map.t_id left join student s on s.s_id = map.s_id
union all
select t.t_id, t.t_Name, s.s_id, s.s_Name from teacher t right join tea_stu_mapping map on t.t_id = map.t_id right join student s on s.s_id = map.s_id;


Union因為要進行重複值掃描,所以效率低。如果合併沒有刻意要刪除重複行,那麼就使用Union All,兩個要聯合的SQL語句 欄位個數必須一樣,而且欄位型別要"相容"(一致)。


--交叉連線cross join

select * from teacher cross join student;


這種記錄便為兩個表的記錄的笛卡爾積。

相關推薦

多表連線查詢(交叉連線

連線查詢實際上是通過各個表之間共同列的關聯性來查詢資料的,它是關係資料庫查詢最主要的特徵. select 表1.欄位名1,表2.欄位名2,...  from 表1,表2 where 連線條件 SQL-92標準所定義的FROM子句的連線語法格式為:  FROM 表名 join_type 表名 [ON (連線條

連線連結(左連線、右連線、全連線),交叉連線總結

1.什麼是連線查詢呢?     概念:根據兩個表或多個表的列之間的關係,從這些表中查詢資料。     目的:實現多個表查詢操作。 2.分類: 首先劃分一下,連線分為三種:內連線、外連線、交叉連線  內連線(INNER JOIN):     分為三種:等

Mysql之連線查詢(交叉連線連線連線,using關鍵字使用場景)

連線查詢 連線查詢:將多張表連到一起進行查詢(會導致記錄數行和欄位數列發生改變) 連線查詢的意義 在關係型資料庫設計過程中,實體(表)與實體之間是存在很多聯絡的。在關係型資料庫表的設計過程中,遵循著關係來設計:一對一,一對多和多對多,通常在實際操作的過程中,需要利用這層

LINQ使用連線(1、組連線 2、連線 3、左連線 4、交叉連線

首先呢,今天在資料庫中寫好了笛卡爾連線,後面要改寫成LINQ的方式。突然瞬間蒙了,寫多了JOIN卻忘了怎麼去寫交叉連線(笛卡爾連線)。 順便複習一下LINQ的連線操作: static public class SampleData { static

SQL連線查詢語句(交叉和合並查詢)

      接觸Sql語句時間挺長時間了,聽他人說過sql語句的連線查詢,但一直沒有認真研究和使用過!!最近在公司實習,需要用到一些連線的語句,我也從中體會到連線查詢帶來的方便。 下面總結一下SQ

多關係連線查詢(,自身連線

先創兩張表做例子,一張部門表,一張員工表 部門表(dept): 員工表(emp): 1.內連線 一般格式: select[distinct/all]<目標列表達式[別名]清單> from<關係名1[別名1]>inne

連線 連線 交叉連線總結

本篇文章總結了一下SQL中的五種連線-內連線、左外連線、右外連線、全連線、交叉連線 一、內連線 (full join/full outer join) 內連線查詢操作列出與連線條件匹配的資料行,它使用比較運算子比較被連線列的列值。內連線分三種: 1、等值連線:在連線條件中使

總結連線連線 連線 交叉連線

我經常把左連線和右連線混淆,順便總結一下。 SELECT T1.C1 FROM T1,T2 WHERE T1.C1=T2.C1(+) 括號在右邊是左連線 SELECT T1.C1 FROM T1,T2 WHERE T1.C1(+)=T2.C1 括號在左邊是右連線 selec

oracle 連線連線、自然連線交叉連線練習

oracle 內連線、外連線、自然連線、交叉連線練習 --查詢員工資訊 select * from emp; --查詢部門資訊 select * from dept; --需求:查詢員工姓名、薪資和所在部門名稱、部門編號 --1.使用交叉連線(笛卡爾積)14條記錄 select ename,sal,dn

SQL多表聯合查詢(交叉連線連線連線)

連線查詢:                 交叉連線:             &nbs

連線,左連線(左連線),右連線(右連線),全連線交叉連線

有兩個表A和表B。表A結構如下: Aid:int;標識種子,主鍵,自增ID Aname:varchar 資料情況,即用select * from A出來的記錄情況如下圖1所示:   圖1:A表資料 表B結構如下: Bid:int;標識

資料庫中連線連線、左連線、右連線、全連線交叉連線的區別

內連線: 內聯接使用比較運算子根據每個表共有的列的值匹配兩個表中的行。利用內連線可獲取兩表的公共部分的記錄。 又細分為三種: 等值連線: 在連線條件中使用等於號(=)運算子比較被連線列的列值,其查詢結果中列出被連線表中的所有列,包括其中的重複列。 不等值連線: 在

SQL連結,連線交叉連線,聯合連線區別詳解

一、準備工作: 建立資料表並填寫資訊 class表: student表: 二、詳解 1、內連結 INNER JOIN 用於取得兩個表中存在連線匹配關係的記錄(例如:某一列相等)。通常配合比較運算子(=或<>)一起使用。其中

連線、左連線、右連線交叉連線及其區別

首先建立兩張表A、B。 表A: Aid:int型別,無符號遞增,主鍵 name:varchar型別 表B: Bid:int型別,無符號遞增,主鍵 name:varchar型別 age:int型

連線、左連線、右連線、全連線交叉連線(CROSS JOIN)-----小知識解決大資料攻略

       早就聽說了內連線與外連線,以前檢視中使用過、這次自考也學習了,只是簡單理解,現在深入探究學習(由於上篇部落格的出現)與實踐: 概念 關鍵字: 左右連線 資料表的連線有: 1、內連線(

sql多表操作-連線inner join、連線left/right (out) join和交叉連線

1 內連線、外連線和交叉連線的區別 內連線:匹配2個表中的相同欄位,沒有的不加入結果集。 外連線:匹配2個表中共有的欄位。分為3種: 左連線——以左邊的為基準,右表中沒有的(相同欄位值)為null; 右連線——以右邊的為基準,左表中沒有的為null;

SQL中的交叉連線(CROSS JOIN)、連線(INNER JOIN)、連線(OUTER JOIN)

1、交叉連線CROSS JOIN 如果不帶條件子句,交叉連線將會返回被連線的兩個表的笛卡爾積,返回結果的行數等於兩個錶行數的乘積; select  *from 表名 cross join  表名  on  條件表示式  2、內連線 INNER JOIN 內連線僅返回那些滿足連線條件的資料行。在內連線中,

SQL的連線分為三種:連線連線交叉連線

先給出兩張表:一、內連線:    內連線(INNER JOIN):有兩種,顯式的和隱式的,返回連線表中符合連線條件和查詢條件的資料行。(所謂的連結表就是資料庫在做查詢形成的中間表)。1、等值連線     概念:在連線條件中使用等於號(=)運算子,其查詢結果中列出被連線表中的所

連線、左連線、右連線交叉連線區別

http://blog.csdn.net/cnham/archive/2008/06/25/2584936.aspx  在之前,我對MSSQL中的內連線和外連線所得出的資料集不是很清楚。這幾天重新溫習了一下SQL的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對SQL的連線

聯結,聯結,全連線,交叉連線的區別

連線分為:內連線、外連線、交叉連線 一、內連線——最常用 定義:僅將兩個表中滿足連線條件的行組合起來作為結果集。 在內連線中,只有在兩個表中匹配的行才能在結果集中出現 關鍵詞:INNER JOIN 格式:SELECT 列名錶 FROM 表名1 [INNER] JOIN 表