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——著

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PostgreSQL C自动连接是一个功能,它允许在C程序中自动连接PostgreSQL数据库。这种功能对于需要在C程序中进行数据库操作的开发人员来说非常有用。 使用PostgreSQL C自动连接功能可以减少在连接数据库时的代码量,并且简化了连接过程。通常,连接到数据库需要编写一些连接代码,包括指定数据库地址、端口、用户名和密码等信息。而使用PostgreSQL C自动连接功能,开发人员只需要编写少量的连接代码,其余部分由自动连接功能完成。 在使用PostgreSQL C自动连接功能之前,我们需要安装postgresql-client包和libpq-dev库。然后,我们可以在C程序中使用libpq库中提供的函数进行数据库连接。这些函数包括PQconnectdb(),它会根据给定的连接字符串自动连接PostgreSQL数据库,并返回一个连接对象。 在使用PQconnectdb()函数时,我们需要在连接字符串中指定数据库的地址、端口、用户名和密码等信息。例如,连接字符串可以是"host=localhost port=5432 dbname=mydb user=myuser password=mypassword"。当连接成功时,我们可以使用PQexec()函数执行SQL查询,并使用PQgetResult()函数获取查询结果。 除了自动连接功能,libpq库还提供了其他有用的数据库操作函数,例如执行事务、执行预处理语句等。开发人员可以根据自己的需求选择适合的函数进行数据库操作。 总而言之,PostgreSQL C自动连接是一个方便的功能,它可以简化C程序中的数据库连接过程,并减少代码量。开发人员可以使用libpq库中提供的函数进行数据库操作,从而实现对PostgreSQL数据库的各种操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值