- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PostgreSQL基础知识之SQL操作符实践指南由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
操作符是数据库具有的运算特性,对文本字符和一些标签字符的处理,使用操作符可以简化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.
对于逻辑操作符的之间的运算结果参考下表:
示例:
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 。
最后此篇关于PostgreSQL基础知识之SQL操作符实践指南的文章就讲到这里了,如果你想了解更多关于PostgreSQL基础知识之SQL操作符实践指南的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的 postgresql 有问题,我复制了所有文件,然后将其删除。然后,我安装了新的,问题就解决了。现在可以将旧文件和文件导入新文件吗? 最佳答案 如果它们是相同的主要版本(即 9.0 到 9.0.
我想使用 Postgresql 9.2.2 来存储我的应用程序的数据。我不得不构建一个应该基于数据库级别的触发器(当数据库启动时,这个触发器将被触发并执行。),当 postgresql 服务器启动时是
我已经使用下面的查询从 Postgresql 目录表中获取 Sequence 对象的完整信息 select s.sequence_name, s.start_value, s.minimum_valu
Postgres 版本:9.3.4 我需要执行驻留在远程数据库中的函数。该函数根据给定的参数返回一个统计数据表。 我实际上只是在我的本地数据库中镜像该函数,以使用我的数据库角色和授权来锁定对该函数的访
我在 CentOS 7 上,我正在尝试解决“PG::ConnectionBad: FATAL: Peer authentication failed for user”错误。 所以我已经想出我应该更改
我写了一个触发器函数,在触发器表列名上循环,我从具有不同列的不同表调用该函数。该函数将列名插入到数组中并在它们上循环,以便将值插入到另一个模式和表中。 函数和触发器创建脚本: DROP TRIGGER
PostgreSQL 的默认空闲连接超时是多少,我运行了 show idle_in_transaction_session_timeout 查询并返回了 0,但是值 0 表示此选项被禁用,但我想知道默
我需要将十六进制值存储到数据库表中,谁能推荐我需要用于属性的数据类型? 提前致谢 最佳答案 您可以使用bytea 来存储十六进制格式。更多信息 can be found in the postgres
我有一个具有复合主键的(大)表,由 5 列(a、b、c、d、e)组成。 我想高效地选择具有其中两列 (a + e) 的所有行到给定值。 在 PostgreSQL 中,我需要索引吗?或者数据库会使用主键
在阅读 PostreSQL (13) 文档时,我遇到了 this页面,其中列出了不同日期时间类型的存储大小。 除其他外,它指出: Name Storag
我有两个大整数的巨大表(500 000 000 行)。两列都被单独索引。我正在使用语法批量插入此表: INSERT into table (col1, col2) VALUES(x0, y0), (x
有一台 CentOS7 Linux 机器正在运行(不是由我管理;拥有有限的权限)。 请求在其中设置 PostgreSQL。 刚刚从 CentOS 存储库安装了 PostgreSQL: sudo yum
我在 Ubuntu 18.04 上安装了 Postgresql 10,但不知何故坏了,不会重新启动。我可以重新安装它而不破坏它的数据库,以便我可以再次访问数据库吗? pg_dump 不起作用。 最佳答
我想在 UNIX 中使用 crontab 自动备份 PostgreSQL 数据库。我已经尝试过,但它会创建 0 字节备份。 我的 crontab 条目是: 24 * * * * /home/desk
我已经完成了PG服务器的安装。我希望能够使用 pgAdmin 远程连接到它,但不断收到服务器不听错误。 could not connect to server: Connection refused
Oracle 支持波斯历但需要知道 PostgreSQL 是否支持波斯历? 如果是,那么我们如何在 PostgreSQL 中将默认日历类型设置为 Persian 而不是 Gregorian(在 Ora
假设我们有一个带有表的 SQL 数据库 Person以及访问它的几个应用程序。出于某种原因,我们想修改 Person表以向后不兼容的方式。 保持兼容性的一种潜在解决方案是将表重命名为 User并创建一
我使用 PostgreSQL 中的模式来组织我庞大的会计数据库。每年年底,我都会通过为下一年创建一个新模式来进行协调过程。 新模式的文件是否与旧模式物理分离?或者所有模式一起存储在硬盘上? 这对我来说
我正在尝试使用配置文件中的以下配置参数调整 PostgreSQL 服务器: autovacuum_freeze_max_age = 500000000 autovacuum_max_workers =
我的数据包含数据库列中的表情符号,即 message_text ------- 🙂 😀 Hi 😀 我只想查询包含表情符号的数据的行。在 postgres 中是否有一种简单的方法可以做到这一点?
我是一名优秀的程序员,十分优秀!