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.pswp.cn/news/287447.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287447.shtml
英文地址,請注明出處:http://en.pswp.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;而集群和故障轉移是構建在開放電信平臺框架上的。所有主要的編程語言均有與代理接口通訊…