一、字段名大小写
pg对表名、字段名区分大小写。
pg在SQL查询时,会默认把大写转为小写,如果字段加上了双引号,则不转换。
单双引号问题
单引号(') | 双引号(") | 反单引号(`) | |
---|---|---|---|
mysql | 标识实际的值 | 标识实际的值 | 标识表名或列名等 |
pg | 标识实际的值 | 标识表名或列名等 | 不使用 |
关键词和不被引号修饰的标识符是大小写不敏感的 1
UPDATE MY_TABLE SET A = 5;
--等价于
uPDaTE my_TabLE SeT a = 5;
受限标识符或被引号修饰的标识符
它是由双引号(")包围的一个任意字符序列。一个受限标识符总是一个标识符而不会是一个关键字。因此"select"可以用于引用一个名为“select”的列或者表,而一个没有引号修饰的select则会被当作一个关键词,从而在本应使用表或列名的地方引起解析错误。
UPDATE "my_table" SET "a" = 5;
二、数据类型
数据类型 | 大小 | 细节问题 |
---|---|---|
char | char(n),定长字符串,长度不足则向后填充空白字符 | 保存的是字符,char不指定长度,默认则为1 |
varchar | varchar(n), 有长度限制的字符串 | 保存的是字符,varchar不指定长度,可以存储最大长度(1GB)的字符串 |
text | 变长,无长度限制 | text和varchar几乎无性能差别,区别仅在于存储结构的不同。 |
三、常用命令
\?
\help 命令
1、连接数据库
psql -h 地址 -U 用户名 -d 数据库名 -p 端口
2、基本命令
列出数据、表:\l
连接指定数据库:\c db名
查看表结构:\d 表名
3、查看事务隔离级别(pg默认为 read committed)
SELECT name, setting
FROM pg_settings
WHERE name ='default_transaction_isolation';
或者
SELECT current_setting('default_transaction_isolation');
4、查询结果,竖着显示
\x [on|off|auto] 切换扩展输出模式
例如:
-x;
select * from test;
5、查询当前数据名
select current_database();
四、常见系统表、视图
pg版本:select version();
PostgreSQL 12.10, compiled by Visual C++ build 1914, 64-bit
查看数据库系统表命令:\dt pg_*
架构模式 | 名称 | 类型 | 拥有者 | 作用 |
---|---|---|---|---|
pg_catalog | pg_aggregate | 数据表 | postgres | 聚集函数 |
pg_catalog | pg_cast | 数据表 | postgres | 转换(数据类型转换) |
pg_catalog | pg_class | 数据表 | postgres | 表、索引、序列、视图(“关系”) |
pg_catalog | pg_constraint | 数据表 | postgres | 检查约束、唯一约束、主键约束、外键约束 |
pg_catalog | pg_conversion | 数据表 | postgres | 编码转换信息 |
pg_catalog | pg_database | 数据表 | postgres | 本集群内的数据库 |
pg_catalog | pg_depend | 数据表 | postgres | 数据库对象之间的依赖性 |
pg_catalog | pg_description | 数据表 | postgres | 数据库对象的描述或注释 |
pg_catalog | pg_index | 数据表 | postgres | 附加的索引信息 |
pg_catalog | pg_language | 数据表 | postgres | 用于写函数的语言 |
pg_catalog | pg_largeobject | 数据表 | postgres | 大对象 |
pg_catalog | pg_namespace | 数据表 | postgres | 模式 |
pg_catalog | pg_proc | 数据表 | postgres | 函数和过程 |
pg_catalog | pg_rewrite | 数据表 | postgres | 查询重写规则 |
pg_catalog | pg_statistic | 数据表 | postgres | 优化器统计 |
pg_catalog | pg_tablespace | 数据表 | postgres | 这个数据库集群里面的表空间 |
pg_catalog | pg_trigger | 数据表 | postgres | 触发器 |
pg_catalog | pg_type | 数据表 | postgres | 数据类型 |
列出所有pg开头的系统视图:\dv pg_*
架构模式 | 名称 | 类型 | 拥有者 | 作用 |
---|---|---|---|---|
pg_catalog | pg_group | 视图 | postgres | 数据库用户的组 |
pg_catalog | pg_indexes | 视图 | postgres | 索引 |
pg_catalog | pg_locks | 视图 | postgres | 当前持有的锁 |
pg_catalog | pg_prepared_statements | 视图 | postgres | 预备语句 |
pg_catalog | pg_prepared_xacts | 视图 | postgres | 预备事务 |
pg_catalog | pg_roles | 视图 | postgres | 数据库角色 |
pg_catalog | pg_rules | 视图 | postgres | 规则 |
pg_catalog | pg_settings | 视图 | postgres | 参数设置 |
pg_catalog | pg_shadow | 视图 | postgres | 数据库用户 |
pg_catalog | pg_stats | 视图 | postgres | 规划器统计 |
pg_catalog | pg_tables | 视图 | postgres | 表 |
pg_catalog | pg_timezone_abbrevs | 视图 | postgres | 时区缩写 |
pg_catalog | pg_timezone_names | 视图 | postgres | 时区名 |
pg_catalog | pg_user | 视图 | postgres | 数据库用户 |
pg_catalog | pg_views | 视图 | postgres | 视图 |
五、常见函数
普通函数
函数 | 返回类型 | 描述 | 例子 | 结果 |
---|---|---|---|---|
concat(str “any” [, str “any” [, …] ]) | text | 串接所有参数的文本表示。NULL 参数被忽略。 | concat(‘abcde’, 2, NULL, 22) | abcde222 |
concat_ws(sep text, str “any” [, str “any” [, …] ]) | text | 将除了第一个参数外的其他参数用分隔符串接在一起。第一个参数被用作分隔符字符串。NULL 参数被忽略。 | concat_ws(‘,’, ‘abcde’, 2, NULL, 22) | abcde,2,22 |
md5(string) | text | 计算string的 MD5 哈希,返回十六进制的结果 | md5(‘abc’) | 900150983cd24fb0 d6963f7d28e17f72 |
split_part(string text, delimiter text, field int) | text | 按delimiter划分string并返回给定域(从1开始计算) | split_part(‘abc@def@ghi’, ‘@’, 2) | def |
position(substring in string) | int | 定位指定子串 | position(‘om’ in ‘Thomas’) | 3 |
strpos(string, substring) | int | 指定子串的位置(和position(substring in string)相同,但是注意相反的参数顺序) | strpos(‘high’, ‘ig’) | 2 |
substring(string [from int] [for int]) | text | 提取子串 | substring(‘Thomas’ from 2 for 3) | hom |
substr(string, from [, count]) | text | 提取子串(与substring(string from from for count)相同) | substr(‘alphabet’, 3, 2) | ph |
starts_with(string, prefix) | bool | 如果string以prefix开始则返回真。 | starts_with(‘alphabet’, ‘alph’) | t |
regexp_split_to_array(string text, pattern text [, flags text ]) | text[] | 使用一个POSIX正则表达式作为分隔符划分string | regexp_split_to_array(‘hello world’, ‘\s+’) | {hello,world} |
regexp_split_to_table(string text, pattern text [, flags text]) | set of text | 使用一个POSIX正则表达式作为分隔符划分string。 | regexp_split_to_table(‘hello world’, ‘\s+’) | hello world (2 rows) |
array_to_string(anyarray, text [, text]) | text | 使用提供的定界符和可选的空串连接数组元素 | array_to_string(ARRAY[1, 2, 3, NULL, 5], ‘,’, ‘*’) | 1,2,3,*,5 |
string_to_array(text, text [, text]) | text[] | 使用提供的定界符和可选的空串将字符串划分成数组元素 | string_to_array(‘xx^yy^zz’, ‘^’, ‘yy’) | {xx,NULL,zz} |
unnest(anyarray) | setof anyelement | 将一个数组扩展成一组行 | unnest(ARRAY[1,2]) | 1 2 (2 rows) |
聚集函数
函数 | 参数类型 | 返回类型 | 部分模式 | 描述 |
---|---|---|---|---|
string_agg(expression, delimiter) | (text, text) 或 (bytea, bytea) | 与参数数据类型相同 | No | 输入值连接成一个串,用定界符分隔 |
窗口函数
注意必须使用窗口函数的语法调用这些函数; 一个OVER子句是必需的。
函数 | 返回类型 | 描述 |
---|---|---|
row_number() | bigint | 当前行在其分区中的行号,从1计 |
条件表达式
- CASE表达式
-- 类似if-else语句,condition每次都会被计算,每一个condition是一个返回boolean结果的表达式
CASE WHEN condition THEN result
[WHEN ...]
[ELSE result]
END
-- 类似switch语句, expression被计算一次,再与每个value比较,注意此处 null 值得比较
CASE expression
WHEN value THEN result
[WHEN ...]
[ELSE result]
END
- COALESCE
COALESCE(value [, ...])
COALESCE函数返回它的第一个非空参数的值。当且仅当所有参数都为空时才会返回空。它常用于在为显示目的检索数据时用缺省值替换空值。
- NULLIF
NULLIF(value1, value2)
当value1和value2相等时,NULLIF返回一个空值。 否则它返回value1。
- ROW_NUMBER
函数 返回类型 描述
row_number() bigint 当前行在其分区中的行号,从1计
-- 员工的薪水在本部门的排名
SELECT depname, empno, salary, row_number() OVER (PARTITION BY depname ORDER BY salary DESC)
FROM empsalary;
六、特殊语法
- ::
操作符/元素 结合性 描述
:: 左 PostgreSQL-风格的类型转换
--一个类型造型指定从一种数据类型到另一种数据类型的转换。PostgreSQL接受两种等价的类型造型语法:
CAST ( expression AS type )
expression::type
--CAST语法遵从 SQL,而用::的语法是PostgreSQL的历史用法。
--一种任意类型的一个常量可以使用下列记号中的任意一种输入:
type 'string'
'string'::type
CAST ( 'string' AS type )
--
REAL '1.23' -- string style
1.23::REAL -- PostgreSQL (historical) style
- LIKE
关键字ILIKE可以用于替换LIKE, 它令该匹配根据活动区域成为大小写无关。这个不属于SQL标准而是一个PostgreSQL扩展。
操作符~~等效于LIKE, 而~~*对应ILIKE。
还有 !~~和!~~*操作符分别代表NOT LIKE和NOT ILIKE。
所有这些操作符都是PostgreSQL特有的。
- WITH RECURSIVE
-- 一个递归WITH查询的通常形式总是一个非递归项,然后是UNION(或者UNION ALL),再然后是一个递归项,
-- 其中只有递归项能够包含对于查询自身输出的引用
WITH RECURSIVE t(n) AS (
VALUES (1) -- 非递归项
UNION ALL
SELECT n+1 FROM t WHERE n < 100 -- 递归项
)
SELECT sum(n) FROM t;
递归查询求值
计算非递归项。对UNION(但不对UNION ALL),抛弃重复行。把所有剩余的行包括在递归查询的结果中,并且也把它们放在一个临时的工作表中。
只要工作表不为空,重复下列步骤:
计算递归项,用当前工作表的内容替换递归自引用。对UNION(不是UNION ALL),抛弃重复行以及那些与之前结果行重复的行。将剩下的所有行包括在递归查询的结果中,并且也把它们放在一个临时的中间表中。
用中间表的内容替换工作表的内容,然后清空中间表。