當(dāng)前位置:首頁(yè) >  站長(zhǎng) >  數(shù)據(jù)庫(kù) >  正文

PostgreSQL操作符實(shí)踐技巧分享

 2020-10-15 15:47  來(lái)源: 腳本之家   我來(lái)投稿 撤稿糾錯(cuò)

  域名預(yù)訂/競(jìng)價(jià),好“米”不錯(cuò)過(guò)

這篇文章主要給大家介紹了關(guān)于PostgreSQL基礎(chǔ)知識(shí)之SQL操作符實(shí)踐的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PostgreSQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

操作符是數(shù)據(jù)庫(kù)具有的運(yùn)算特性,對(duì)文本字符和一些標(biāo)簽字符的處理,使用操作符可以簡(jiǎn)化SQL代碼,同時(shí)也可以節(jié)省開(kāi)發(fā)時(shí)間和提高開(kāi)發(fā)效率。

比較操作符

在PostgreSQL中,所有的數(shù)據(jù)類(lèi)型都可以使用比較操作符,比較操作符運(yùn)算結(jié)果返回一個(gè)布爾值。即 TRUE 或者 FALSE。比較操作符為雙目操作符,因此被比較的兩個(gè)值的數(shù)據(jù)類(lèi)型必須是相同的數(shù)據(jù)類(lèi)型或者在彼此之間可以進(jìn)行隱式類(lèi)型轉(zhuǎn)換。在PostgreSQL中,提供的比較操作符有 > 、< 、<= 、>= 、= 、<> 或者 != 。在 PostgreSQL中,類(lèi)似 a > b > c的操作是非法的,因?yàn)椴紶栔岛蛿?shù)值之間無(wú)法做比較。

示例:

hrdb=\# SELECT 2 > 1 AS result; result \-------- t(1 row)
hrdb=\# SELECT 'a' = 'a' AS result; result \-------- t(1 row)
hrdb=\# SELECT 'a' <> 'b' AS result; result \-------- t(1 row)
hrdb=\# SELECT 'a' != 'b' AS result; result \-------- t(1 row)
hrdb=\# SELECT '@' > '!' AS result; result \-------- t(1 row)
hrdb=\# SELECT ascii('@'),ascii('!'); ascii | ascii \-------+------- 64 | 33(1 row)
hrdb=\# SELECT '@' > 'a' AS result; result \-------- f(1 row)
hrdb=\# SELECT ascii('@'),ascii('a'); ascii | ascii \-------+------- 64 | 97

在PostgreSQL中,除了比較的操作符以外,還有比較的謂詞。有如下。

hrdb=> --BETWEEN AND謂詞,表示范圍。用法為某個(gè)指定的字符是否在此之間
hrdb=> SELECT 5 BETWEEN 1 AND 6 AS result;
 result
--------
 t
(1 row)

hrdb=> --上述等價(jià)于
hrdb=> SELECT 5 > 1 AND 5 < 6 AS result;
 result
--------
 t
(1 row)

hrdb=> --NOT BETWEEN AND ,表示不在某個(gè)范圍
hrdb=> SELECT 5 NOT BETWEEN 7 AND 10 AS result;
 result
--------
 t
(1 row)

hrdb=> --BETWEEN SYMMETRIC AND,表示排序后比較
hrdb=> --該謂詞的用法通常發(fā)生在BETWEEN AND之間出現(xiàn)倒序的情況
hrdb=> --如使用 SELECT 5 BETWEEN 10 AND 10; 將會(huì)返回FALSE
hrdb=> --因此要想返回TRUE需要按照如下使用
hrdb=> SELECT 5 BETWEEN SYMMETRIC 10 AND 1 AS result;
 result
--------
 t
(1 row)

hrdb=> --NOT BETWEEN SYMMETRIC AND與上述 BETWEEN SYMMETRIC AND 相反
hrdb=> --IS DISTINCT FROM 不等于,null 返回TRUE
hrdb=> SELECT 'a' IS DISTINCT FROM 'b' AS result;
 result
--------
 t
(1 row)

hrdb=> SELECT null IS DISTINCT FROM 'b' AS result;
 result
--------
 t
(1 row)

hrdb=> --IS NOT DISTINCT FROM 等于,null返回FALSE
hrdb=> SELECT 'a' IS NOT DISTINCT FROM 'b' AS result;
 result
--------
 f
(1 row)

hrdb=> SELECT null IS NOT DISTINCT FROM 'b' AS result;
 result
--------
 f
(1 row)

hrdb=> --IS NULL 判斷為空
hrdb=> SELECT 'a' IS NULL AS result;
 result
--------
 f
(1 row)

hrdb=> SELECT '' IS NULL AS result;
 result
--------
 f
(1 row)

hrdb=> --IS NOT NULL 判斷不為空
hrdb=> SELECT 'a' IS NOT NULL AS result;
 result
--------
 t
(1 row)

hrdb=> SELECT '' IS NOT NULL AS result;
 result
--------
 t
(1 row)

hrdb=> --ISNULL 判斷為空 (非標(biāo)準(zhǔn)語(yǔ)法)
hrdb=> --NOTNULL 判斷不為空(非標(biāo)準(zhǔn)語(yǔ)法)
hrdb=> SELECT 'a' ISNULL as result;
 result
--------
 f
(1 row)

hrdb=> SELECT '' NOTNULL AS result;
 result
--------
 t
(1 row)

hrdb=> --IS TRUE 判斷是否為T(mén)RUE
hrdb=> SELECT 'A' > 'B' IS TRUE AS result;
 result
--------
 f
(1 row)

hrdb=> --IS NOT TRUE 判斷是否為FALSE
hrdb=> SELECT 'A' > 'B' IS NOT TRUE AS result;
 result
--------
 t
(1 row)

hrdb=> --IS FALSE 判斷是否為 FALSE
hrdb=> SELECT 'A' > 'B' IS FALSE AS result;
 result
--------
 t
(1 row)

hrdb=> --IS NOT FALSE 判斷是否不為FALSE
hrdb=> SELECT 'A' > 'B' IS NOT FALSE AS result;
 result
--------
 f
(1 row)
--IS UNKNOWN 未知
hrdb=> SELECT NULL IS UNKNOWN AS result;
 result
--------
 t
--IS NOT UNKNOWN
SELECT 'a' > 'b' IS NOT UNKNOWN AS result;

溫馨提示

字符之間的比較通常使用ascii值比較大小。同時(shí),UNKNOWN 和 NOT UNKNOWN 通常和IS NULL 和IS NOT NULL類(lèi)似。在PostgreSQL中,還有比較函數(shù), num_nonnulls(VARIADIC "any"),表示返回一個(gè)非空輸入字符的總個(gè)數(shù)。num_nulls(VARIADIC "any"),表示返回一個(gè)null值的總個(gè)數(shù)。如下:

hrdb=> SELECT num_nonnulls(1,null,2) AS total_nonnulls;
 total_nonnulls
----------------
    2
(1 row)

hrdb=> SELECT num_nonnulls('PostgreSQL','MySQL','','null',null) AS total_nonnulls;
 total_nonnulls
----------------
    4
(1 row)

hrdb=> SELECT num_nulls(1,null,2) AS total_nulls;
 total_nulls
-------------
   1
(1 row)

hrdb=> SELECT num_nulls('PostgreSQL','MySQL','','null',null) AS total_nulls;
 total_nulls
-------------
   1

邏輯操作符

在PostgreSQL中,邏輯操作符有 AND、 OR 和 NOT,邏輯操作符返回的結(jié)果通常為一個(gè)布爾值或者NULL,即 TRUE、FALSE或者NULL。其中NULL表示運(yùn)算結(jié)果未知。同時(shí)對(duì)于邏輯操作符都有優(yōu)先級(jí)順序,AND 、OR 和 NOT的優(yōu)先級(jí)順序?yàn)? NOT > AND >OR。

對(duì)于邏輯操作符的之間的運(yùn)算結(jié)果參考下表:

示例:

hrdb=> --2 > 1 為 TRUE, 'a' < 'b' 為T(mén)RUE,那么 AND 返回TRUE
hrdb=> SELECT 2 > 1 AND 'a' < 'b' AS result;
 result
--------
 t
(1 row)

hrdb=> --1 < 2 為 TRUE, 2 > 1為FALSE,那么 AND 的結(jié)果為 FALSE
hrdb=> SELECT 1 < 2 AND 2 > 1 AS result;
 result
--------
 t
(1 row)

hrdb=> -- NULL 和 2 > 1 為T(mén)RUE做比較,那么 AND 返回NULL
hrdb=> SELECT NULL AND 2 > 1 AS result;
 result
--------
 
(1 row)

hrdb=> --2 < 1 為 FALSE,'b' < 'a' 為FALSE,那么 AND 返回 FALSE
hrdb=> SELECT 2 < 1 AND 'b' < 'a' AS result;
 result
--------
 f
(1 row)

hrdb=> -- NULL 和 1 > 2 為FALSE做比較,那么 AND 返回FALSE
hrdb=> SELECT NULL AND 1 > 2 AS result;
 result
--------
 f
(1 row)

hrdb=> --NULL 和 NULL AND 的結(jié)果為 NULL
hrdb=> SELECT NULL AND NULL AS result;
 result
--------
 
(1 row)
hrdb=> --2 > 1 為 TRUE, 'a' < 'b' 為T(mén)RUE,那么 OR 返回TRUE
hrdb=> SELECT 2 > 1 AND 'a' < 'b' AS result;
 result
--------
 t
(1 row)

hrdb=> --1 < 2 為 TRUE, 2 > 1為FALSE,那么 OR 的結(jié)果為 TRUE
hrdb=> SELECT 1 < 2 AND 2 > 1 AS result;
 result
--------
 t
(1 row)

hrdb=>
hrdb=> -- NULL 和 2 > 1 為T(mén)RUE做比較,那么 OR 返回 TRUE
hrdb=> SELECT NULL AND 2 > 1 AS result;
 result
--------
 
(1 row)

hrdb=> --2 < 1 為 FALSE,'b' < 'a' 為FALSE,那么 OR 返回 FALSE
hrdb=> SELECT 2 < 1 AND 'b' < 'a' AS result;
 result
--------
 f
(1 row)

hrdb=> -- NULL 和 1 > 2 為FALSE做比較,那么 OR 返回 NULL
hrdb=> SELECT NULL AND 1 > 2 AS result;
 result
--------
 f
(1 row)

hrdb=> --NULL 和 NULL 那么 OR 的結(jié)果為 NULL
hrdb=> SELECT NULL AND NULL AS result;
 result
--------

關(guān)于 NOT 結(jié)果,在這里不做示例,有興趣的可以下去自行驗(yàn)證。

算數(shù)操作符

PostgreSQL中的算數(shù)操作符號(hào)有 +(加法) 、-(減法) 、* (乘法)、/(除法) 、%(取余)、^(冪運(yùn)算符)、|/(平方根)、||/(立方根)、!(階乘[后綴])、!!(階乘[前綴])、@(絕對(duì)值)、&(按位與)、|(按位或)、#(按位異或)、~(按位取反)、<<(左移)、>>(右移)操作符,這些操作符簡(jiǎn)化了數(shù)學(xué)運(yùn)算方式。

示例:

加減乘除示例在此略。此示例重點(diǎn)介紹一下后面的操作符號(hào)。

hrdb=> --%取余操作符,5 除以 3 ,返回余數(shù) 2
hrdb=> SELECT 5 % 3 AS result;
 result
--------
  2
(1 row)

hrdb=> --^求冪操作,3 的 4次方為81
hrdb=> SELECT 3^4 AS result;
 result
--------
  81
(1 row)

hrdb=> --|/平方根,25的平方根為 5
hrdb=> SELECT |/ 25 AS result;
 result
--------
  5
(1 row)

hrdb=> --||/立方根,27 的立方根為 3
hrdb=> SELECT ||/ 27 AS result;
  result 
--------------------
 3.0000000000000004
(1 row)

hrdb=> --!階乘后綴,5的階乘為 120
hrdb=> SELECT 5 ! AS result;
 result
--------
 120
(1 row)

hrdb=> --!!階乘前綴,5的階乘為 120
hrdb=> SELECT !! 5 AS result;
 result
--------
 120
(1 row)

hrdb=> --@絕對(duì)值,-1的絕對(duì)值為 1
hrdb=> SELECT @ -1 AS result;
 result
--------
  1
(1 row)

hrdb=> --& 按位與,5 & 3的值為 1
hrdb=> --計(jì)算過(guò)程
hrdb=> --5 用二進(jìn)制表示 0000 0101
hrdb=> --3 用二進(jìn)制表示 0000 0011
hrdb=> --按位與操作,同時(shí)為1則為1,否則為0
hrdb=> --按位與操作,同時(shí)為1則為1,否則為0
hrdb=> -- 5 & 3   0000 0001 再轉(zhuǎn)換為10進(jìn)制為 1
hrdb=> SELECT 5 & 3 AS result;
 result
--------
  1
(1 row)

hrdb=> --| 按位或,6 | 3 的值為 7
hrdb=> --計(jì)算過(guò)程
hrdb=> --6 用二進(jìn)制表示 0000 0110
hrdb=> --3 用二進(jìn)制表示 0000 0011
hrdb=> --按位或操作,只要有一個(gè)為1則為1
hrdb=> --6 | 3   0000 0111 轉(zhuǎn)換為10進(jìn)制為7
hrdb=> SELECT 6 | 3 AS result;
 result
--------
  7
(1 row)

hrdb=> --# 按位異或,8 # 5 的值為13
hrdb=> --計(jì)算過(guò)程
hrdb=> --8 用二進(jìn)制表示 0000 1000
hrdb=> --5 用二進(jìn)制表示 0000 0101
hrdb=> --按位異或操作,不同為1,相同為0
hrdb=> --8 # 5   0000 1101 轉(zhuǎn)換為10進(jìn)制為 13
hrdb=> SELECT 8 # 5 AS result;
 result
--------
  13
(1 row)

hrdb=> --~按位取反,7 按位取反的值為 16
hrdb=> --計(jì)算過(guò)程
hrdb=> --7 用二進(jìn)制表示 0000 0111
hrdb=> --按位取反,最高位為0 取 1表示符號(hào),其余按位取反
hrdb=> --~7    1000 1000 轉(zhuǎn)換為10進(jìn)制為-8
hrdb=> SELECT ~7 AS result;
 result
--------
  -8
(1 row)

hrdb=> --<<左移,4 左移 2位的值為:
hrdb=> --計(jì)算過(guò)程
hrdb=> --4用二進(jìn)制表示 0000 0100
hrdb=> --4左移兩位 000001 0000 位數(shù)不足用 0 補(bǔ)位
hrdb=> --轉(zhuǎn)換為10進(jìn)制后為 16。因此左移類(lèi)似于平方操作,但是效率比平方高
hrdb=> SELECT 4 << 2 AS result;
 result
--------
  16
(1 row)

hrdb=> -->>右移,8 右移 3 位的值為1
hrdb=> --8 用二進(jìn)制表示 0000 1000
hrdb=> --8 >> 3 ,   0 0001000 多出的0去掉轉(zhuǎn)換為10進(jìn)制,為1
hrdb=> SELECT 8 >> 3 AS result;
 result
--------
  1
(1 row)

總結(jié)

在PostgreSQL 中,除了以上三種操作符為關(guān)系型數(shù)據(jù)庫(kù)中常用的操作符外,還有其它的操作符為PostgreSQL中獨(dú)有的操作符,比如文本查找操作符,@@(tsvector類(lèi)型與tsquery類(lèi)型字符是否匹配),@>(tsquery類(lèi)型之間是否包含),<@(tsquery類(lèi)型之間是否被包含)操作符。網(wǎng)絡(luò)地址操作符如<<=(表示包含于或者等于),>>=(包含或者等于)。幾何操作符如@-@(表示圖形的周長(zhǎng)或者長(zhǎng)度),@@(表示圓心),<->(表示圓心距),&&(表示圖形是否重疊)等,感興趣的同學(xué)下去自行驗(yàn)證。

本文來(lái)自腳本之家,原文鏈接:https://www.jb51.net/article/187672.htm

申請(qǐng)創(chuàng)業(yè)報(bào)道,分享創(chuàng)業(yè)好點(diǎn)子。點(diǎn)擊此處,共同探討創(chuàng)業(yè)新機(jī)遇!

相關(guān)標(biāo)簽
postgresql技巧

相關(guān)文章

  • postgresql中的ltree類(lèi)型使用技巧

    這篇文章主要給大家介紹了關(guān)于postgresql中l(wèi)tree類(lèi)型使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用postgresql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

    標(biāo)簽:
    postgresql技巧
  • PostgreSQL技巧 如何獲取當(dāng)前日期時(shí)間

    這篇文章主要介紹了PostgreSQL如何獲取當(dāng)前日期時(shí)間及注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

    標(biāo)簽:
    postgresql技巧
  • PostgreSQL技巧分享:圖(graph)的遞歸查詢(xún)實(shí)例

    這篇文章主要給大家介紹了關(guān)于PostgreSQL圖(graph)的遞歸查詢(xún)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PostgreSQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

    標(biāo)簽:
    postgresql技巧
  • Mac系統(tǒng)重置PostgreSQL密碼技巧及代碼展示

    PostgreSQL是一個(gè)免費(fèi)的對(duì)象-關(guān)系數(shù)據(jù)庫(kù)服務(wù)器(ORDBMS),在靈活的BSD許可證下發(fā)行。這篇文章主要介紹了Mac系統(tǒng)重置PostgreSQL密碼的方法示例代碼,需要的朋友可以參考下。

熱門(mén)排行

信息推薦