2.6. PostgreSQL表之间连接

到目前为止,我们的查询一次只访问了一个表。查询可以一次访问多个表,或者用某种方式访问一个表,而同时处理该表的多个行。一个同时访问同一个或者不同表的多个行的查询叫连接查询。举例来说,比如你想列出所有天气记录以及这些记录相关的城市。要实现这个目标,我们需要拿 weather 表每行的 city 字段和 cities 表所有行的 name 字段进行比较,并选取那些这些数值相匹配的行。

【注意】这里只是一个概念上的模型。连接通常以比实际比较每个可能的配对行更高效的方式执行,但这些是用户看不到的。

这个任务可以用下面的查询来实现:

SELECT *FROM weather, citiesWHERE 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 rows)

观察结果集的两个方面:

  • 没有城市 Hayward 的结果行。这是因为在 cities 表里面没有与 Hayward 匹配的行,所以连接忽略了 weather 表里的不匹配行。我们稍后将看到如何修补这个问题。

  • 有两个字段包含城市名。这是正确的,因为 weathercities 表的字段是接在一起的。不过,实际上我们不想要这些,因此你将可能希望明确列出输出字段而不是使用 *

    SELECT city, temp_lo, temp_hi, prcp, date, locationFROM weather, citiesWHERE city = name;

【练习】看看省略 WHERE 子句的含义是什么。

因为这些字段的名字都不一样,所以分析器自动找出它们属于哪个表,但是如果两个表中有重复的字段名,你就必须使用字段全称限定你想要的字段:

SELECT weather.city, weather.temp_lo, weather.temp_hi,weather.prcp, weather.date, cities.locationFROM weather, citiesWHERE cities.name = weather.city;

一般认为在连接查询里使用字段全称是很好的风格,这样,即使在将来向其中一个表里添加了同名字段也不会引起混淆。

到目前为止,这种类型的连接查询也可以用下面这样的形式写出来:

SELECT *FROM weather INNER JOIN cities ON (weather.city = cities.name);

这个语法并非像上面那个那么常用,我们在这里写出来是为了让你更容易了解后面的主题。

现在我们将看看如何能把 Hayward 记录找回来。我们想让查询干的事是扫描 weather 表,并且对每一行都找出匹配的 cities 表里面的行。如果没有找到匹配的行,那么需要一些"空值"代替 cities 表的字段。这种类型的查询叫 外连接(我们在此之前看到的连接都是内连接)。这样的命令看起来像这样:

SELECT *FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);city      | temp_lo | temp_hi | prcp |    date    |     name      | location
---------------+---------+---------+------+------------+---------------+-----------Hayward       |      37 |      54 |      | 1994-11-29 |               |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)
(3 rows)

这个查询是一个左外连接,因为连接操作符(LEFT OUTER JOIN)左边的表中的行在输出中至少出现一次,而右边的表中的行只输出那些与左边的表有匹配的行。如果输出的左表中的行没有右表中的行与其对应,那么右表中的字段将填充为 NULL 。

-- 更多信息参考http://www.infocool.net/PostgreSQL/index.htm

【练习】还有右连接和全连接。试着找出来它们能干什么。

我们也可以把一个表和自己连接起来。这叫自连接。比如,假设我们想找出那些在其它天气记录的温度范围之外的天气记录。这样我们就需要拿 weather 表里每行的 temp_lotemp_hi 字段与 weather 表里其它行的 temp_lotemp_hi 字段进行比较。我们可以用下面的查询实现这个目标:

SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high,W2.city, W2.temp_lo AS low, W2.temp_hi AS highFROM weather W1, weather W2WHERE W1.temp_lo < W2.temp_loAND W1.temp_hi > W2.temp_hi;city      | low | high |     city      | low | high
---------------+-----+------+---------------+-----+------San Francisco |  43 |   57 | San Francisco |  46 |   50Hayward       |  37 |   54 | San Francisco |  46 |   50
(2 rows)

在这里我们把 weather 表重新标记为 W1W2 以区分连接的左边和右边。你还可以用这样的别名在其它查询里节约一些敲键,比如:

SELECT *FROM weather w, cities cWHERE w.city = c.name;

以后会经常碰到这样的缩写。

转载于:https://www.cnblogs.com/wolaiye320/p/5564209.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之Caused by: java.lang.IllegalArgumentException: Failed to find configured root that contains

1 问题 用takePhoto去照相的时候特么的一打开就报这个错误 2020-04-09 21:33:49.124 19016-19016/com.appsinnova.android.keepshare E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.appsinnova.android.keepshare, PID: 19016java.lang.RuntimeException: Unable to …

Linux下c/c++项目代码覆盖率的产生方法

最近做了一系列的单元测试相关的工作&#xff0c;除了各种规范及测试框架以外&#xff0c;讨论比较多的就是关于代码覆盖率的产生&#xff0c;c/c与其他的一些高级语言或者脚本语言相比较而言&#xff0c;例如 Java、.Net和php/python/perl/shell等&#xff0c;由于没有这些高级…

C# WPF从后台代码生成行列可变的表格

z概述WPF常用的表格控件是DataGrid&#xff0c;这个控件在前台XAML编写的话&#xff0c;一般列已经固定&#xff0c;然后给每个列去绑定数据&#xff0c;但是如果我的列不固定&#xff0c;随着运算结果变动呢&#xff1f;这时候DataGrid&#xff0c;就比较难实现这个需求&#…

软件架构实践文章链接

2019独角兽企业重金招聘Python工程师标准>>> 架构 InfoQ: 又拍网架构中的分库设计 SNS网站数据库技术分析 - 51CTO.COM 数据库水平切分的实现原理解析 - iBATIS - Java - JavaEye论坛 基于amoeba的mysql分布式数据库学习&#xff08;一&#xff09; - Java - JavaEy…

【看动漫学编程】程序员在异世界生个娃 第2篇:外挂已准备就绪

前言 作者文笔比较水&#xff0c;还请见谅。 以下内容还将使用视频动态漫画表现&#xff0c;剪辑完将会贴出链接。 小说剧情为剧情需要&#xff0c;过渡到知识点&#xff0c;部分篇幅可能没有技术知识点还望谅解。 由于没有经费支持&#xff0c;所以画出来的东西是我自己用代码…

java剪切txt文件_用Java把剪切板的内容实时保存到txt

test类&#xff1a;提示用户程序已启动&#xff0c;提示保存位置&#xff0c;清空剪切板。package com.ariya.service;import com.ariya.service.impl.ClipboardServiceImpl;/*** author Ariya* 程序入口*/public class Test {public static void main(String[] args) {Clipboa…

【三维激光扫描】第一章:三维激光扫描入门基础知识

随着地理空间信息服务产业的快速发展,地理空间数据的要求越来越高。对地理空间数据的要求正朝着大信息量、高精度、可视化和可挖掘方向发展。地面激光雷达技术是一门新兴的测绘技术,已逐渐成为广大科研和工程技术人员全新的解决问题的手段。地面三维激光扫描技术与全站仪测量…

Android之kotlin里面本地图片BitmapFactory.decodeFile转bitmap失败问题

1 问题 我们手机本地有个图片文件比如如下 /storage/emulated/0/Android/data/package_name/cache/1586444511539.png 我们需要png转bitmap&#xff0c;然后设置到ImageView里面显示 var bitmap BitmapFactory.decodeFile(imagePath);if (bitmap null) returnelse mImagevi…

3、面向对象-继承-多态

1、继承子类可以继承父类的一切&#xff0c;一个子类只能有一个父类&#xff0c;一个父类可以有多个子类//父类class Ren{public $name;public $sex;public $yuyan;function Say() {echo $this->name."正在讲话&#xff01;";}}//美国人的子类class America ex…

整理iOS9适配中出现的坑

一、NSAppTransportSecurity iOS9让所有的HTTP默认使用了HTTPS&#xff0c;原来的HTTP协议传输都改成TLS1.2协议进行传输。直接造成的情况就是App发请求的时候弹出网络无法连接。解决办法就是在项目的info.plist 文件里加上如下节点&#xff1a; NSAppTransportSecurity - NSAl…

由c# dynamic是否装箱引发的思考

前言前几天在技术群里看到有同学在讨论关于dynamic是否会存在装箱拆箱的问题,我当时第一想法是"会"。至于为啥会有很多人有这种疑问&#xff0c;主要是因为觉得dynamic可能是因为有点特殊&#xff0c;因为它被称为动态类型,可能是因为这里的动态对大家造成的误解,认为…

【看动漫学编程】程序员在异世界生个娃 第3篇:搞不好我就是个王者

前言 作者文笔比较水&#xff0c;还请见谅。 以下内容还将使用视频动态漫画表现&#xff0c;剪辑完将会贴出链接。 小说剧情为剧情需要&#xff0c;过渡到知识点&#xff0c;部分篇幅可能没有技术知识点还望谅解。 由于没有经费支持&#xff0c;所以画出来的东西是我自己用代码…

PHP会话控制考察点

为什么要使用会话控制技术 HTTP协议是无状态的&#xff0c;也就是说HTTP没有一个内建的机制来维护两个事务之间的状态。当一个用户完成一个请求发起第二个请求的时候&#xff0c;服务器无法知道这次请求是来自于上一次的客户。而用户登录、购物车等&#xff0c;这些是需要服务器…

数据库SQL语句学习笔记(6)-使用函数处理数据

1.SQL也可以用函数来处理数据&#xff0c;函数一般是在数据上执行的&#xff0c;为数据的转换和处理提供了方便。但是每一个数据库管理系统&#xff08;DBMS&#xff09;都有特定的函数&#xff0c;事实上&#xff0c;只有少数几个函数被所有的DBMS等同地支持。例如&#xff0c…

java3n 1_1005 继续(3n+1)猜想(JAVA)

卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里&#xff0c;情况稍微有些复杂。当我们验证卡拉兹猜想的时候&#xff0c;为了避免重复计算&#xff0c;可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候&#xff0c;我们需要计算 3、5、8、4、2、1&…

【遥感物候】Matlab求解一元六次多项式,计算植被生长季始期

一元六次多项式能很好的逼近滤波后的曲线,与二次多项式相比,在拟合植被整个生长季曲线方面有更好的优势,该方法常用来描述北方温带和高纬度地区时序NDVI生长季模式。因此,本文使用一元六次多项式来拟合植被整个生长季曲线,效果很好。那么拟合后,这样解方程呢求生长季参数…

Android之给控件添加水纹波效果

1 问题 给控件添加水纹波效果&#xff0c;点击起来像点中了&#xff0c;不然效果太粗糙了&#xff0c;没反应。 2 实现 给控件添加如下属性 android:background"?android:attr/selectableItemBackground"波纹有边界 android:background"?android:attr/sele…

《看聊天记录都学不会C语言?太菜了吧》(1)我在大佬群里问基础问题没人理?

若是大一学子或者是真心想学习的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手…

个人博客作业_week2

1. 是否需要有代码规范 1.这些规范都是官僚制度下产生的浪费大家的编程时间、影响人们开发效率&#xff0c;浪费时间的东西。 我不同意这个论点。 有句俗语’无规矩不成方圆‘&#xff0c;这亘古传承的至理同样适用于写代码。制定代码撰写规范并不是 迫于压力完成上级的任务&am…

最全面透彻的RabbitMQ指南

概念RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯…