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 | 詹姆斯| 金融
| 詹姆斯|
| 大衛|
| 保羅|
| 金|
| 馬克|
| 泰迪
| 詹姆斯|