PostgreSQL表連接:內連接,外連接,自連接,交叉連接

版權聲明:轉載請註明作者(獨孤尚良dugushangliang)出處:https://blog.csdn.net/dugushangliang/article/details/103817246

 

搜了搜,基本上都是寫內連接、外連接、交叉連接這三種類型,但我發現PostgreSQL還有自連接。不妨一併寫來做個記錄。

先說概念:

內連接,就是兩個表逐行匹配,匹配上的內容都顯示,沒有匹配的都不顯示。

外連接有三種,左外連接,右外連接,全外連接。

左外連接是以左表爲基礎,左表內容全部顯示,右表有匹配到左表的則顯示,否則不顯示。

右外連接是以右表爲基礎,右表內容全部顯示,左表有匹配到右表的則顯示,否則不顯示。

全外連接是以兩表爲基礎,顯示三部分內容,一部分是內連接的內容,即兩表匹配的內容,一部分是左表有而右表無的,一部分是左表無右表有的。

自連接是逐行,用當前這行數據和這個表中其他行進行匹配。

交叉連接最省事,笛卡爾積,左表m行右表n行,則結果是m*n行。

下面展示具體例子來幫助理解。

下面是兩個表的內容。

mydb=# select * from weather;
     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
 San Francisco |      43 |      57 |    0 | 1994-11-29
 Hayward       |      37 |      54 |      | 1994-11-29
(3 行記錄)

mydb=# select * from cities;
     name      | location
---------------+-----------
 San Francisco | (-194,53)
 London        | (0,51)
(2 行記錄)

內連接有兩種寫法:

mydb=# SELECT *
mydb-#     FROM weather, cities
mydb-#     WHERE city = name;
     city      | temp_lo | temp_hi | prcp |    date    |     name      | location
---------------+---------+---------+------+------------+---------------+-----------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
 San Francisco |      43 |      57 |    0 | 1994-11-29 | San Francisco | (-194,53)
(2 行記錄)


mydb=# SELECT *
mydb-#     FROM weather INNER JOIN cities ON (weather.city = cities.name);
     city      | temp_lo | temp_hi | prcp |    date    |     name      | location
---------------+---------+---------+------+------------+---------------+-----------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
 San Francisco |      43 |      57 |    0 | 1994-11-29 | San Francisco | (-194,53)
(2 行記錄)

外連接有三種:左外連接,右外連接,全外連接。

mydb=# SELECT *
mydb-#     FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);
     city      | temp_lo | temp_hi | prcp |    date    |     name      | location
---------------+---------+---------+------+------------+---------------+-----------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
 San Francisco |      43 |      57 |    0 | 1994-11-29 | San Francisco | (-194,53)
 Hayward       |      37 |      54 |      | 1994-11-29 |               |
(3 行記錄)


mydb=# select * from weather right outer join cities on(weather.city=cities.name);
     city      | temp_lo | temp_hi | prcp |    date    |     name      | location
---------------+---------+---------+------+------------+---------------+-----------
 San Francisco |      43 |      57 |    0 | 1994-11-29 | San Francisco | (-194,53)
 San Francisco |      46 |      50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
               |         |         |      |            | London        | (0,51)
(3 行記錄)


mydb=# select * from weather full outer join cities on(weather.city=cities.name);
     city      | temp_lo | temp_hi | prcp |    date    |     name      | location
---------------+---------+---------+------+------------+---------------+-----------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
 San Francisco |      43 |      57 |    0 | 1994-11-29 | San Francisco | (-194,53)
 Hayward       |      37 |      54 |      | 1994-11-29 |               |
               |         |         |      |            | London        | (0,51)
(4 行記錄)

表交叉連接:

mydb=# SELECT *
mydb-#     FROM weather, cities;
     city      | temp_lo | temp_hi | prcp |    date    |     name      | location
---------------+---------+---------+------+------------+---------------+-----------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
 San Francisco |      46 |      50 | 0.25 | 1994-11-27 | London        | (0,51)
 San Francisco |      43 |      57 |    0 | 1994-11-29 | San Francisco | (-194,53)
 San Francisco |      43 |      57 |    0 | 1994-11-29 | London        | (0,51)
 Hayward       |      37 |      54 |      | 1994-11-29 | San Francisco | (-194,53)
 Hayward       |      37 |      54 |      | 1994-11-29 | London        | (0,51)
(6 行記錄)

表自連接:

mydb=# SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high,
mydb-#     W2.city, W2.temp_lo AS low, W2.temp_hi AS high
mydb-#     FROM weather W1, weather W2
mydb-#     WHERE W1.temp_lo < W2.temp_lo
mydb-#     AND W1.temp_hi > W2.temp_hi;
     city      | low | high |     city      | low | high
---------------+-----+------+---------------+-----+------
 San Francisco |  43 |   57 | San Francisco |  46 |   50
 Hayward       |  37 |   54 | San Francisco |  46 |   50
(2 行記錄)

 

獨孤尚良dugushangliang——著

發佈了143 篇原創文章 · 獲贊 57 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章