版权声明:转载请注明作者(独孤尚良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——著