【PostgreSQL】一些常见细节问题

一、字段名大小写

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计

条件表达式

  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
  1. COALESCE
COALESCE(value [, ...])
COALESCE函数返回它的第一个非空参数的值。当且仅当所有参数都为空时才会返回空。它常用于在为显示目的检索数据时用缺省值替换空值。
  1. NULLIF
NULLIF(value1, value2)
当value1和value2相等时,NULLIF返回一个空值。 否则它返回value1。
  1. ROW_NUMBER
函数				返回类型		描述
row_number() 	bigint 		当前行在其分区中的行号,从1-- 员工的薪水在本部门的排名
SELECT depname, empno, salary, row_number() OVER (PARTITION BY depname ORDER BY salary DESC) 
FROM empsalary;

六、特殊语法

  1. ::
操作符/元素	结合性	描述
::			左		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
  1. LIKE
关键字ILIKE可以用于替换LIKE, 它令该匹配根据活动区域成为大小写无关。这个不属于SQL标准而是一个PostgreSQL扩展。
操作符~~等效于LIKE, 而~~*对应ILIKE。 
还有 !~~!~~*操作符分别代表NOT LIKENOT ILIKE。
所有这些操作符都是PostgreSQL特有的。 
  1. 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),抛弃重复行以及那些与之前结果行重复的行。将剩下的所有行包括在递归查询的结果中,并且也把它们放在一个临时的中间表中。
        用中间表的内容替换工作表的内容,然后清空中间表。 

  1. 标识符和关键词 ↩︎

你可能感兴趣的:(数据库,postgresql,后端,数据库)