日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

2.6. PostgreSQL表之间连接

發(fā)布時間:2023/12/9 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2.6. PostgreSQL表之间连接 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

到目前為止,我們的查詢一次只訪問了一個表。查詢可以一次訪問多個表,或者用某種方式訪問一個表,而同時處理該表的多個行。一個同時訪問同一個或者不同表的多個行的查詢叫連接查詢。舉例來說,比如你想列出所有天氣記錄以及這些記錄相關(guān)的城市。要實現(xiàn)這個目標(biāo),我們需要拿 weather 表每行的 city 字段和 cities 表所有行的 name 字段進(jìn)行比較,并選取那些這些數(shù)值相匹配的行。

【注意】這里只是一個概念上的模型。連接通常以比實際比較每個可能的配對行更高效的方式執(zhí)行,但這些是用戶看不到的。

這個任務(wù)可以用下面的查詢來實現(xiàn):

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)

觀察結(jié)果集的兩個方面:

  • 沒有城市 Hayward 的結(jié)果行。這是因為在 cities 表里面沒有與 Hayward 匹配的行,所以連接忽略了 weather 表里的不匹配行。我們稍后將看到如何修補這個問題。

  • 有兩個字段包含城市名。這是正確的,因為 weather 和 cities 表的字段是接在一起的。不過,實際上我們不想要這些,因此你將可能希望明確列出輸出字段而不是使用 * :

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

【練習(xí)】看看省略 WHERE 子句的含義是什么。

因為這些字段的名字都不一樣,所以分析器自動找出它們屬于哪個表,但是如果兩個表中有重復(fù)的字段名,你就必須使用字段全稱限定你想要的字段:

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

一般認(rèn)為在連接查詢里使用字段全稱是很好的風(fēng)格,這樣,即使在將來向其中一個表里添加了同名字段也不會引起混淆。

到目前為止,這種類型的連接查詢也可以用下面這樣的形式寫出來:

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

這個語法并非像上面那個那么常用,我們在這里寫出來是為了讓你更容易了解后面的主題。

現(xiàn)在我們將看看如何能把 Hayward 記錄找回來。我們想讓查詢干的事是掃描 weather 表,并且對每一行都找出匹配的 cities 表里面的行。如果沒有找到匹配的行,那么需要一些"空值"代替 cities 表的字段。這種類型的查詢叫 外連接(我們在此之前看到的連接都是內(nèi)連接)。這樣的命令看起來像這樣:

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)左邊的表中的行在輸出中至少出現(xiàn)一次,而右邊的表中的行只輸出那些與左邊的表有匹配的行。如果輸出的左表中的行沒有右表中的行與其對應(yīng),那么右表中的字段將填充為 NULL 。

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

【練習(xí)】還有右連接和全連接。試著找出來它們能干什么。

我們也可以把一個表和自己連接起來。這叫自連接。比如,假設(shè)我們想找出那些在其它天氣記錄的溫度范圍之外的天氣記錄。這樣我們就需要拿 weather 表里每行的 temp_lo 和 temp_hi 字段與 weather 表里其它行的 temp_lo 和 temp_hi 字段進(jìn)行比較。我們可以用下面的查詢實現(xiàn)這個目標(biāo):

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 表重新標(biāo)記為 W1 和 W2 以區(qū)分連接的左邊和右邊。你還可以用這樣的別名在其它查詢里節(jié)約一些敲鍵,比如:

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

以后會經(jīng)常碰到這樣的縮寫。

轉(zhuǎn)載于:https://www.cnblogs.com/wolaiye320/p/5564209.html

總結(jié)

以上是生活随笔為你收集整理的2.6. PostgreSQL表之间连接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。