postgreSQL中的內連接和外連接實現操作
測試數據:
city表:
create table city(id int,name text); insert into city values(0,'北京'),(1,'西安'),(2,'天津'),(3,'上海'),(4,'哈爾濱'),(5,'西藏')
person表:
create table person(id int,lastname char(20)); insert into person values(0,'Tom'),(2,'Lily'),(3,'Mary'),(5,'Coco'); select * from city;
select * from person;
一:內連接:
1.inner join
inner join(等值連接) 只返回兩個表中聯結字段相等的行
sql語句:
select * from city inner join person on city.id = person.id;
也可以寫成:
select * from city join person on city.id = person.id;
結果如下:
從結果可以看出,表格中顯示出了city.id=person.id的記錄,它顯示出了符合這個條件的記錄。
二:外連接:
1.full outer join
full outer join(全外連接)返回參與連接的兩個數據集合中的全部數據
sql語句:
select * from city full outer join person on city.id = person.id;
也可以寫成:
select * from city full join person on city.id = person.id;
結果如下:
從結果可以看出,全外連接得到了city和person表中的全部數據
2.left outer join
left outer join(左連接) 返回包括左表中的所有記錄和右表中連接字段相等的記錄
sql語句:
select * from city left outer join person on city.id = person.id;
也可以寫成:
select * from city left join person on city.id = person.id;
結果如下:
從結果可以看出,左外連接和全外連接的結果一模一樣?
我們在給person中添加一行數據:
insert into person values(9,'Kiki');
在重新執(zhí)行:
select * from city full join person on city.id = person.id;
結果如下:
select * from city left join person on city.id = person.id;
結果如下:
兩個結果對照著看,left join顯示出了city中的所有記錄和person連接字段相等的記錄
3.right outer join
right outer join(右連接) 返回包括右表中的所有記錄和左表中連接字段相等的記錄
sql語句:
select * from city right outer join person on city.id = person.id;
也可以寫成
select * from city right join person on city.id = person.id;
結果如下:
從結果可以看出,person中的記錄被全部顯示出來,而city中的顯示的數據是根據連接字段相等的記錄
補充:PostgreSQL表連接:內連接,外連接,自連接,交叉連接
搜了搜,基本上都是寫內連接、外連接、交叉連接這三種類型,但我發(fā)現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 行記錄)
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關文章
postgresql 實現replace into功能的代碼
這篇文章主要介紹了postgresql 實現replace into功能的代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01Linux CentOS 7安裝PostgreSQL9.3圖文教程
這篇文章主要為大家詳細介紹了Linux CentOS 7安裝PostgresSQL9.3圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11PostgreSQL如何按照某一字段去重,并顯示其他字段信息
這篇文章主要介紹了PostgreSQL如何按照某一字段去重,并顯示其他字段信息問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05