服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - PostgreSQL - PostgreSQL基础知识之SQL操作符实践指南

PostgreSQL基础知识之SQL操作符实践指南

2020-08-21 15:45晟数学院 PostgreSQL

这篇文章主要给大家介绍了关于PostgreSQL基础知识之SQL操作符实践的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PostgreSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

操作符是数据库具有的运算特性,对文本字符和一些标签字符的处理,使用操作符可以简化SQL代码,同时也可以节省开发时间和提高开发效率。

比较操作符

PostgreSQL中,所有的数据类型都可以使用比较操作符,比较操作符运算结果返回一个布尔值。即 TRUE 或者 FALSE。比较操作符为双目操作符,因此被比较的两个值的数据类型必须是相同的数据类型或者在彼此之间可以进行隐式类型转换。在PostgreSQL中,提供的比较操作符有 > 、< 、<= 、>= 、= 、<> 或者 != 。在 PostgreSQL中,类似 a > b > c的操作是非法的,因为布尔值和数值之间无法做比较。

示例:

?
1
2
3
4
5
6
7
8
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中,除了比较的操作符以外,还有比较的谓词。有如下。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
hrdb=> --BETWEEN AND谓词,表示范围。用法为某个指定的字符是否在此之间
hrdb=> SELECT 5 BETWEEN 1 AND 6 AS result;
 result
--------
 t
(1 row)
 
hrdb=> --上述等价于
hrdb=> SELECT 5 > 1 AND 5 < 6 AS result;
 result
--------
 t
(1 row)
 
hrdb=> --NOT BETWEEN AND ,表示不在某个范围
hrdb=> SELECT 5 NOT BETWEEN 7 AND 10 AS result;
 result
--------
 t
(1 row)
 
hrdb=> --BETWEEN SYMMETRIC AND,表示排序后比较
hrdb=> --该谓词的用法通常发生在BETWEEN AND之间出现倒序的情况
hrdb=> --如使用 SELECT 5 BETWEEN 10 AND 10; 将会返回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 判断为空 (非标准语法)
hrdb=> --NOTNULL 判断不为空(非标准语法)
hrdb=> SELECT 'a' ISNULL as result;
 result
--------
 f
(1 row)
 
hrdb=> SELECT '' NOTNULL AS result;
 result
--------
 t
(1 row)
 
hrdb=> --IS TRUE 判断是否为TRUE
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值比较大小。同时,UNKNOWN 和 NOT UNKNOWN 通常和IS NULL 和IS NOT NULL类似。在PostgreSQL中,还有比较函数, num_nonnulls(VARIADIC "any"),表示返回一个非空输入字符的总个数。num_nulls(VARIADIC "any"),表示返回一个null值的总个数。如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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,逻辑操作符返回的结果通常为一个布尔值或者NULL,即 TRUE、FALSE或者NULL。其中NULL表示运算结果未知。同时对于逻辑操作符都有优先级顺序,AND 、OR 和 NOT的优先级顺序为: NOT > AND >OR。

对于逻辑操作符的之间的运算结果参考下表:

PostgreSQL基础知识之SQL操作符实践指南

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
hrdb=> --2 > 1 为 TRUE, 'a' < 'b' 为TRUE,那么 AND 返回TRUE
hrdb=> SELECT 2 > 1 AND 'a' < 'b' AS result;
 result
--------
 t
(1 row)
 
hrdb=> --1 < 2 为 TRUE, 2 > 1为FALSE,那么 AND 的结果为 FALSE
hrdb=> SELECT 1 < 2 AND 2 > 1 AS result;
 result
--------
 t
(1 row)
 
hrdb=> -- NULL 和 2 > 1 为TRUE做比较,那么 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 的结果为 NULL
hrdb=> SELECT NULL AND NULL AS result;
 result
--------
 
(1 row)
hrdb=> --2 > 1 为 TRUE, 'a' < 'b' 为TRUE,那么 OR 返回TRUE
hrdb=> SELECT 2 > 1 AND 'a' < 'b' AS result;
 result
--------
 t
(1 row)
 
hrdb=> --1 < 2 为 TRUE, 2 > 1为FALSE,那么 OR 的结果为 TRUE
hrdb=> SELECT 1 < 2 AND 2 > 1 AS result;
 result
--------
 t
(1 row)
 
hrdb=>
hrdb=> -- NULL 和 2 > 1 为TRUE做比较,那么 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 的结果为 NULL
hrdb=> SELECT NULL AND NULL AS result;
 result
--------

关于 NOT 结果,在这里不做示例,有兴趣的可以下去自行验证。

算数操作符

PostgreSQL中的算数操作符号有 +(加法) 、-(减法) 、* (乘法)、/(除法) 、%(取余)、^(幂运算符)、|/(平方根)、||/(立方根)、!(阶乘[后缀])、!!(阶乘[前缀])、@(绝对值)、&(按位与)、|(按位或)、#(按位异或)、~(按位取反)、<<(左移)、>>(右移)操作符,这些操作符简化了数学运算方式。

示例:

加减乘除示例在此略。此示例重点介绍一下后面的操作符号。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
hrdb=> --%取余操作符,5 除以 3 ,返回余数 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=> --@绝对值,-1的绝对值为 1
hrdb=> SELECT @ -1 AS result;
 result
--------
  1
(1 row)
 
hrdb=> --& 按位与,5 & 3的值为 1
hrdb=> --计算过程
hrdb=> --5 用二进制表示 0000 0101
hrdb=> --3 用二进制表示 0000 0011
hrdb=> --按位与操作,同时为1则为1,否则为0
hrdb=> --按位与操作,同时为1则为1,否则为0
hrdb=> -- 5 & 3   0000 0001 再转换为10进制为 1
hrdb=> SELECT 5 & 3 AS result;
 result
--------
  1
(1 row)
 
hrdb=> --| 按位或,6 | 3 的值为 7
hrdb=> --计算过程
hrdb=> --6 用二进制表示 0000 0110
hrdb=> --3 用二进制表示 0000 0011
hrdb=> --按位或操作,只要有一个为1则为1
hrdb=> --6 | 3   0000 0111 转换为10进制为7
hrdb=> SELECT 6 | 3 AS result;
 result
--------
  7
(1 row)
 
hrdb=> --# 按位异或,8 # 5 的值为13
hrdb=> --计算过程
hrdb=> --8 用二进制表示 0000 1000
hrdb=> --5 用二进制表示 0000 0101
hrdb=> --按位异或操作,不同为1,相同为0
hrdb=> --8 # 5   0000 1101 转换为10进制为 13
hrdb=> SELECT 8 # 5 AS result;
 result
--------
  13
(1 row)
 
hrdb=> --~按位取反,7 按位取反的值为 16
hrdb=> --计算过程
hrdb=> --7 用二进制表示 0000 0111
hrdb=> --按位取反,最高位为0 取 1表示符号,其余按位取反
hrdb=> --~7    1000 1000 转换为10进制为-8
hrdb=> SELECT ~7 AS result;
 result
--------
  -8
(1 row)
 
hrdb=> --<<左移,4 左移 2位的值为:
hrdb=> --计算过程
hrdb=> --4用二进制表示 0000 0100
hrdb=> --4左移两位 000001 0000 位数不足用 0 补位
hrdb=> --转换为10进制后为 16。因此左移类似于平方操作,但是效率比平方高
hrdb=> SELECT 4 << 2 AS result;
 result
--------
  16
(1 row)
 
hrdb=> -->>右移,8 右移 3 位的值为1
hrdb=> --8 用二进制表示 0000 1000
hrdb=> --8 >> 3 ,   0 0001000 多出的0去掉转换为10进制,为1
hrdb=> SELECT 8 >> 3 AS result;
 result
--------
  1
(1 row)

总结

在PostgreSQL 中,除了以上三种操作符为关系型数据库中常用的操作符外,还有其它的操作符为PostgreSQL中独有的操作符,比如文本查找操作符,@@(tsvector类型与tsquery类型字符是否匹配),@>(tsquery类型之间是否包含),<@(tsquery类型之间是否被包含)操作符。网络地址操作符如<<=(表示包含于或者等于),>>=(包含或者等于)。几何操作符如@-@(表示图形的周长或者长度),@@(表示圆心),<->(表示圆心距),&&(表示图形是否重叠)等,感兴趣的同学下去自行验证。

到此这篇关于PostgreSQL基础知识之SQL操作符实践的文章就介绍到这了,更多相关PostgreSQL之SQL操作符实践内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://segmentfault.com/a/1190000022736650

延伸 · 阅读

精彩推荐
  • PostgreSQLpostgresql 中的to_char()常用操作

    postgresql 中的to_char()常用操作

    这篇文章主要介绍了postgresql 中的to_char()常用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    J符离13432021-04-12
  • PostgreSQL深入理解PostgreSQL的MVCC并发处理方式

    深入理解PostgreSQL的MVCC并发处理方式

    这篇文章主要介绍了深入理解PostgreSQL的MVCC并发处理方式,文中同时介绍了MVCC的缺点,需要的朋友可以参考下 ...

    PostgreSQL教程网3622020-04-25
  • PostgreSQLPostgresql开启远程访问的步骤全纪录

    Postgresql开启远程访问的步骤全纪录

    postgre一般默认为本地连接,不支持远程访问,所以如果要开启远程访问,需要更改安装文件的配置。下面这篇文章主要给大家介绍了关于Postgresql开启远程...

    我勒个去6812020-04-30
  • PostgreSQLPostgreSQL标准建表语句分享

    PostgreSQL标准建表语句分享

    这篇文章主要介绍了PostgreSQL标准建表语句分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    码上得天下7962021-02-27
  • PostgreSQLpostgresql 数据库中的数据转换

    postgresql 数据库中的数据转换

    postgres8.3以后,字段数据之间的默认转换取消了。如果需要进行数据变换的话,在postgresql数据库中,我们可以用"::"来进行字段数据的类型转换。...

    postgresql教程网12482021-10-08
  • PostgreSQLRDS PostgreSQL一键大版本升级技术解密

    RDS PostgreSQL一键大版本升级技术解密

    一、PostgreSQL行业位置 (一)行业位置 在讨论PostgreSQL(下面简称为PG)在整个数据库行业的位置之前,我们先看一下阿里云数据库在全球的数据库行业里的...

    未知1192023-05-07
  • PostgreSQLPostgresql查询效率计算初探

    Postgresql查询效率计算初探

    这篇文章主要给大家介绍了关于Postgresql查询效率计算的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Postgresql具有一定的参考学习价...

    轨迹4622020-05-03
  • PostgreSQL分布式 PostgreSQL之Citus 架构

    分布式 PostgreSQL之Citus 架构

    节点 Citus 是一种 PostgreSQL 扩展,它允许数据库服务器(称为节点)在“无共享(shared nothing)”架构中相互协调。这些节点形成一个集群,允许 PostgreSQL 保存比单...

    未知802023-05-07