PostgreSql中ALL與ANY區(qū)別小結(jié)
PostgreSQL 中 ALL 和 ANY(以及其同義詞 SOME)操作符的區(qū)別。這是兩個(gè)非常強(qiáng)大但容易混淆的子查詢(xún)表達(dá)式。
核心概念
這兩個(gè)操作符都用于將一個(gè)標(biāo)量值(一個(gè)單一的值)與一個(gè)子查詢(xún)返回的一組值(單列)進(jìn)行比較。它們通常用在 WHERE 或 HAVING 子句中。
1.ANY(或SOME) 操作符
- 含義: 如果標(biāo)量值與子查詢(xún)返回的任意一個(gè)值滿(mǎn)足比較條件,則整個(gè)表達(dá)式為真。
- 邏輯: 它像一個(gè) “存在” 或 “或” 的邏輯。只要有一個(gè)匹配,結(jié)果就是
TRUE。 - 同義詞:
SOME是ANY的完全同義詞,功能完全相同,可以互換使用(SOME可能更易讀,但ANY更常用)。
語(yǔ)法:
scalar_expression operator ANY (subquery)
這里的 operator 可以是: =, !=, <>, <, <=, >, >= 等。
工作方式:
對(duì)于子查詢(xún)返回的集合中的每一個(gè)值,檢查 scalar_expression operator value 是否為真。只要有一個(gè)為真,ANY 就返回 TRUE。
示例:
找出比任何一家意大利餐廳評(píng)分都高的餐廳。
SELECT name, rating
FROM restaurants
WHERE rating > ANY (
SELECT rating
FROM restaurants
WHERE cuisine = 'Italian'
);這條查詢(xún)的邏輯是:只要我的評(píng)分比意大利餐廳列表中的任意一家(哪怕是最低分的那家) 高,我就會(huì)出現(xiàn)在結(jié)果里。它等價(jià)于:rating > (SELECT MIN(rating) FROM restaurants WHERE cuisine = 'Italian')。
2.ALL操作符
- 含義: 如果標(biāo)量值與子查詢(xún)返回的每一個(gè)值都滿(mǎn)足比較條件,則整個(gè)表達(dá)式為真。
- 邏輯: 它像一個(gè) “所有” 或 “且” 的邏輯。要求所有比較都必須為真,結(jié)果才是
TRUE。
語(yǔ)法:
scalar_expression operator ALL (subquery)
工作方式:
對(duì)于子查詢(xún)返回的集合中的每一個(gè)值,檢查 scalar_expression operator value 是否為真。必須所有比較都為真,ALL 才返回 TRUE。
示例:
找出比所有意大利餐廳評(píng)分都高的餐廳。
SELECT name, rating
FROM restaurants
WHERE rating > ALL (
SELECT rating
FROM restaurants
WHERE cuisine = 'Italian'
);這條查詢(xún)的邏輯是:我的評(píng)分必須比意大利餐廳列表中的每一家(包括最高分的那家) 都要高,我才會(huì)出現(xiàn)在結(jié)果里。它等價(jià)于:rating > (SELECT MAX(rating) FROM restaurants WHERE cuisine = 'Italian')。
關(guān)鍵區(qū)別總結(jié)
| 特性 | ANY / SOME | ALL |
|---|---|---|
| 核心邏輯 | 存在即滿(mǎn)足 (OR) | 全部須滿(mǎn)足 (AND) |
| 與 = 連用 | = ANY(...) 相當(dāng)于 IN (...) | = ALL(...) 極少用,要求等于所有值 |
| 與 != 連用 | != ANY(...) 不等于任何一個(gè)即可 | != ALL(...) 相當(dāng)于 NOT IN (...) |
| 等價(jià)聚合函數(shù) | > ANY ≈ > (SELECT MIN(...)) | > ALL ≈ > (SELECT MAX(...)) |
| < ANY ≈ < (SELECT MAX(...)) | < ALL ≈ < (SELECT MIN(...)) |
重要注意事項(xiàng)和陷阱
空子查詢(xún)的情況:
ALL+ 空子查詢(xún): 如果子查詢(xún)沒(méi)有返回任何行,ALL會(huì)返回TRUE。因?yàn)檫壿嬍?ldquo;對(duì)于所有行,比較都成立”,而既然沒(méi)有行需要比較,這個(gè)條件就被視為“空真”。ANY+ 空子查詢(xún): 如果子查詢(xún)沒(méi)有返回任何行,ANY會(huì)返回FALSE。因?yàn)?ldquo;存在一個(gè)行滿(mǎn)足條件”的要求失敗了。
NULL 值的影響:
如果子查詢(xún)的結(jié)果集中包含 NULL 值,ALL 和 ANY 的行為可能會(huì)變得反直覺(jué)。例如:
5 > ALL (1, 2, NULL)會(huì)返回NULL(未知),而不是TRUE或FALSE,因?yàn)闊o(wú)法確定 5 是否大于NULL。5 > ANY (10, NULL)也會(huì)返回NULL,因?yàn)?nbsp;5 > 10是FALSE,而5 > NULL是NULL。FALSE或NULL的組合結(jié)果就是NULL。
最佳實(shí)踐: 在子查詢(xún)中使用 WHERE 條件過(guò)濾掉 NULL 值,除非你明確需要處理 NULL 的情況。
何時(shí)使用?
使用 ANY: 當(dāng)你關(guān)心的是“至少有一個(gè)”匹配時(shí)。
= ANY(...)是IN (...)的另一種寫(xiě)法。> ANY(...)尋找比最低標(biāo)準(zhǔn)更高的。
使用 ALL: 當(dāng)你關(guān)心的是“超越所有”或“絕對(duì)最高/最低標(biāo)準(zhǔn)”時(shí)。
> ALL(...)尋找比最高標(biāo)準(zhǔn)還高的。< ALL(...)尋找比最低標(biāo)準(zhǔn)還低的。
到此這篇關(guān)于PostgreSql中ALL與ANY區(qū)別的文章就介紹到這了,更多相關(guān)PostgreSql ALL ANY內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PostgreSQL的generate_series()函數(shù)的用法說(shuō)明
這篇文章主要介紹了PostgreSQL的generate_series()函數(shù)的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
postgresql 實(shí)現(xiàn)取出分組中最大的幾條數(shù)據(jù)
這篇文章主要介紹了postgresql 實(shí)現(xiàn)取出分組中最大的幾條數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
PostgreSQL數(shù)據(jù)庫(kù)視圖及子查詢(xún)使用操作
這篇文章主要為大家介紹了PostgreSQL數(shù)據(jù)庫(kù)視圖及子查詢(xún)的使用操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
postgresql數(shù)據(jù)庫(kù)根據(jù)年月查詢(xún)出本月的所有數(shù)據(jù)操作
這篇文章主要介紹了postgresql數(shù)據(jù)庫(kù)根據(jù)年月查詢(xún)出本月的所有數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
postgresql 實(shí)現(xiàn)查詢(xún)某時(shí)間區(qū)間的所有日期案例
這篇文章主要介紹了postgresql 實(shí)現(xiàn)查詢(xún)某時(shí)間區(qū)間的所有日期案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
PostgreSQL數(shù)據(jù)庫(kù)時(shí)間類(lèi)型相加減操作
PostgreSQL提供了許多函數(shù),這些函數(shù)返回與當(dāng)前日期和時(shí)間相關(guān)的值,下面這篇文章主要給大家介紹了關(guān)于PostgreSQL數(shù)據(jù)庫(kù)時(shí)間類(lèi)型相加減操作的相關(guān)資料,需要的朋友可以參考下2023-10-10
如何查看PostgreSQL數(shù)據(jù)庫(kù)的版本(3種方法)
這篇文章主要給大家介紹了關(guān)于如何查看PostgreSQL數(shù)據(jù)庫(kù)的版本,查看PostgreSQL 數(shù)據(jù)庫(kù)的版本號(hào),可用方法很多,文中介紹了三種方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-06-06
postgresql高級(jí)應(yīng)用之行轉(zhuǎn)列&匯總求和的實(shí)現(xiàn)思路
這篇文章主要介紹了postgresql高級(jí)應(yīng)用之行轉(zhuǎn)列&匯總求和的實(shí)現(xiàn)思路,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05

