天天看點

PostgreSQL連接配接(JOIN)

PostgreSQL JOIN子句用于把兩個或多個表的行結合起來,基于這些表之間的共同變量。

在PostgreSQL中,JOIN有五種連接配接類型:

CROSS JOIN:交叉連接配接

内連接配接:内連接配接

LEFT OUTER JOIN:左外連接配接

右外連接配接:右外連接配接

FULL OUTER JOIN:全外連接配接

接下來讓我們建立兩張表COMPANY和DEPARTMENT。

執行個體

建立COMPANY表(下載下傳COMPANY SQL檔案),資料内容如下:

runoobdb#select * from COMPANY;

id 名稱 年齡 位址 薪水
1 保羅 32 加利福尼亞 20000
2 艾倫 25 德州 15000
3 泰迪 23 挪威
4 馬克 富蒙德 65000
5 大衛 27 85000
6 22 南廳 45000
7 詹姆斯 24 休斯頓 10000

(7列)

我們往表裡添加幾條資料:

插入公司價值(8,'Paul',24,'Houston',20000.00);

插入公司值(9,“詹姆斯”,44,“挪威”,5000.00);

插入公司值(10,“詹姆斯”,45,“德州”,5000.00);

此時,COMPANY表的記錄如下:

8
9 44 5000
10 45

(10列)

建立一張DEPARTMENT表,添加三個區段:

建立表格部門(

ID INT PRIMARY KEY NOT NULL,

DEPT CHAR(50)NOT NULL,

EMP_ID INT非空

););

向DEPARTMENT表插入三條記錄:

插入部門(ID,DEPT,EMP_ID)值(1,'IT Billing',1);(ID ,DEPT ,EMP_ID )VALUES (1 ,'IT Billing' ,1 );

插入部門(ID,DEPT,EMP_ID)值(2,'工程',2);(ID ,DEPT ,EMP_ID )VALUES (2 ,'Engineering' ,2 );

插入部門(ID,DEPT,EMP_ID)值(3,'Finance',7);(ID ,DEPT ,EMP_ID )VALUES (3 ,'Finance' ,7 );

此時,DEPARTMENT表的記錄如下:

部門 emp_id
IT帳單 1個1 IT 帳單 1個
工程
财務 73

交叉連接配接

交叉連接配接(CROSS JOIN)把第一個表的每一行與第二個表的每一行進行比對。如果兩個輸入表分别有x和y行,則結果表有x * y行。

由于交叉連接配接(CROSS JOIN)有可能産生非常大的表,使用時必須謹慎,隻在适當的時候使用它們。

下面是CROSS JOIN的基礎文法:

SELECT ... FROM table1交叉聯接table2 ...... 來自表1交叉聯接表2 ...

基于上面的表,我們可以寫一個交叉連接配接(CROSS JOIN),如下所示:

runoobdb =#從公司交叉聯接部門選擇EMP_ID,名稱,名稱;=#從公司交叉聯接部門選擇EMP_ID ,名稱,部門;

得到結果如下:

1 | 保羅| IT賬單1 | 保羅| IT 賬單    
  1 | 艾倫| IT賬單1 | 艾倫| IT 賬單   
  1 | 泰迪 IT賬單1 | 泰迪| IT 賬單   
  1 | 馬克| IT賬單1 | 馬克| IT 賬單    
  1 | 大衛| IT賬單1 | 大衛| IT 賬單   
  1 | 金| IT賬單1 | 金| IT 賬單     
  1 | 詹姆斯| IT賬單1 | 詹姆斯| IT 賬單   
  1 | 保羅| IT賬單1 | 保羅| IT 賬單    
  1 | 詹姆斯| IT賬單1 | 詹姆斯| IT 賬單   
  1 | 詹姆斯| IT賬單1 | 詹姆斯| IT 賬單   
  2 | 保羅| 工程2 | 保羅| 工程     
  2 | 艾倫| 工程2 | 艾倫| 工程    
  2 | 泰迪 工程2 | 泰迪| 工程    
  2 | 馬克| 工程2 | 馬克| 工程     
  2 | 大衛| 工程2 | 大衛| 工程    
  2 | 金| 工程2 | 金| 工程      
  2 | 詹姆斯| 工程2 | 詹姆斯| 工程    
  2 | 保羅| 工程2 | 保羅| 工程     
  2 | 詹姆斯| 工程2 | 詹姆斯| 工程    
  2 | 詹姆斯| 工程2 | 詹姆斯| 工程    
  7 | 保羅| 金融7 | 保羅| 金融                

内連接配接

内連接配接(INNER JOIN)根據連接配接謂詞結合兩個表(table1和table2)的列值來建立一個新的結果表。查詢會把table1中的每一行與table2中的每一行進行比較,找到所有滿足連接配接

手遊交易

謂詞的行的比對對。

當滿足連接配接謂詞時,A和B行的每個比對對的列值會合并成一個結果行。

内連接配接(INNER JOIN)是最常見的連接配接類型,是另一種的連接配接類型。

INNER關鍵字是任選的。

下面是内連接配接(INNER JOIN)的文法:

選擇table1.column1,table2.column2 ...。column1 ,表2 。第2列...

從表1

内聯接表2

開啟table1.common_filed = table2.common_field;。common_filed = table2 。common_field ;

基于上面的表,我們可以寫一個内連接配接,如下所示:

runoobdb =#從COMPANY.ID = DEPARTMENT.EMP_ID上的公司内部聯接部門選擇EMP_ID,名稱,名稱;=#從公司的内部連接配接部門選擇EMP_ID ,名稱,部門。ID = 部門。EMP_ID ;

1 | 保羅| IT賬單1 | 保羅| IT 賬單    
  2 | 艾倫| 工程2 | 艾倫| 工程    
  7 | 詹姆斯| 金融7 | 詹姆斯| 金融               

(3列)(3 行)

左外連接配接

SQL标準定義了三種類型的外部連接配接:LEFT,RIGHT和FULL,PostgreSQL支援所有這些。

對于左外連接配接,首先執行一個内部連接配接。然後,對于表T1中不滿足表T2中連接配接條件的每一行,其中T2的列中有空值也會添加一個連接配接行。是以,連接配接的表在T1中每一行至少有一行。

下面是左外連接配接(LEFT OUTER JOIN)的基礎文法:

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...... FROM table1左外部聯接table2 ON conditional_expression ...

基于上面兩張表,我們可以寫個左外連接配接,如下:

runoobdb =#從COMPANY.ID = DEPARTMENT.EMP_ID上的公司左外加入部門選擇EMP_ID,名稱,名稱;=#從公司的左外連接配接部門選擇EMP_ID ,名稱,部門。ID = 部門。EMP_ID ;

1 | 保羅| IT賬單1 | 保羅| IT 賬單    
  2 | 艾倫| 工程2 | 艾倫| 工程    
  7 | 詹姆斯| 金融7 | 詹姆斯| 金融    
    | 詹姆斯|| 詹姆斯|   
    | 大衛|| 大衛|   
    | 保羅|| 保羅|    
    | 金|| 金|     
    | 馬克|| 馬克|    
    | 泰迪| 泰迪|   
    | 詹姆斯|| 詹姆斯|              

(10列)(10 行)

右外連接配接

首先,執行内部連接配接。然後,對于表T2中不滿足表T1中連接配接條件的每一行,其中T1列中的變量空也會添加一個連接配接行。這與左聯接相反;對于T2中的每一行,結果表總是有一行。

下面是右外連接配接(RIGHT OUT JOIN)的基本文法:

SELECT ... FROM table1右外連接配接table2 ON conditional_expression ...... FROM table1右OUTER JOIN table2 ON conditional_expression ...

基于上面兩張表,我們建立一個右外連接配接:

runoobdb =#選擇EMP_ID,名稱,從COMPANY.ID上的公司右外加入部門中提取; = DEPARTMENT.EMP_ID;=#選擇公司的外部聯接部門的EMP_ID ,名稱,部門。ID = 部門。EMP_ID ;

1 | 保羅| IT賬單1 | 保羅| IT 賬單    
  2 | 艾倫| 工程2 | 艾倫| 工程    
  7 | 詹姆斯| 金融7 | 詹姆斯| 金融               

外連接配接

首先,執行内部連接配接。然後,對于表T1中不滿足表T2中任何行連接配接條件的每一行,如果T2的列中有null值也會添加一個到結果中。中的任何行連接配接條件的每一行,将會添加T1列中包含null值的到結果中。

下面是外連接配接的基本文法:

SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...

基于上面兩張表,可以建立一個外連接配接:

runoobdb =#從COMPANY.ID = DEPARTMENT.EMP_ID上的公司完整外聯部門選擇EMP_ID,名稱,名稱。=#從公司的外部聯接部門選擇EMP_ID ,名稱,部門。ID = 部門。EMP_ID ;

1 | 保羅| IT賬單1 | 保羅| IT 賬單    
  2 | 艾倫| 工程2 | 艾倫| 工程    
  7 | 詹姆斯| 金融7 | 詹姆斯| 金融    
    | 詹姆斯|
    | 大衛|
    | 保羅|
    | 金|
    | 馬克|
    | 泰迪
    | 詹姆斯|