postgreSQL数据库基础 之 内连接和外连接实现操作
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;
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 joinfull 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 joinleft 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 );
在重新执行:
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 joinright 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表连接:内连接,外连接,自连接,交叉连接
搜了搜,基本上都是写内连接、外连接、交叉连接这三种类型,但我发现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 行记录)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 postgreSQL数据库基础 之 内连接和外连接实现操作
相关文章
- 详解Oracle数据库url连接最好的orcl代表的什么
- PostgreSQL数据库基础 字符切割 substring 函数的用法举例
- PostgreSQL 数据库基础 如何修改视图的操作
- postgreSQL 数据库基础 row_number() 与distinct用法说明
- postgresql 数据库基础 关于like%xxx% 全模糊匹配 的优化操作
- 在postgresql数据库中判断是否是数字和日期时间格式函数操作
- postgresql 清空数据表 truncate详解数据库
- CentOS7安装并配置PostgreSQL详解数据库
- postgresql—-Gist索引详解数据库
- postgresql – 服务配置详解数据库
- PostgreSQL:实现强大优势的数据库(postgresql优势)
- 数据库使用PostgreSQL实现分布式数据库构建(postgresql分布式)
- TimescaleDB 1.0 正式版发布!基于PostgreSQL的时序数据库
- 能力 PostgreSQL的强大并发能力(postgresql并发)
- 籍深入PostgreSQL:建立高可用性数据库系统(postgresql书)
- 创建PostgreSQL数据库序列的实践(postgresql序列)
- 轻松搞定:postgresql数据库的安装教程(安装postgresql)
- PostgreSQL中文手册详解数据库操作技巧(postgresql中文手册)
- 利用 PostgreSQL 脚本加速数据库操作!(postgresql脚本)
- 简易教程:Linux下如何快速安装PostgreSQL数据库(linux安装postgresql)
- 深入解析PostgreSQL扩展:优化数据库性能与拓展功能(postgresql扩展)
- 深入剖析:PostgreSQL vs. Microsoft SQL Server(pg数据库对比mssql)