【PostgreSQL】一些常见细节问题

本文详细介绍了PostgreSQL数据库的大小写规则,包括默认的大小写转换以及如何通过双引号保持大小写。同时,讲解了数据类型如char、varchar、text的区别和使用。此外,列举了常用数据库命令,如连接数据库、查询表结构、事务隔离级别等。还提到了一些重要的系统表和视图,以及常用的函数,如字符串操作函数、聚集函数和窗口函数。最后,讨论了特殊语法,如类型转换和LIKE操作符。
摘要由CSDN通过智能技术生成

一、字段名大小写

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;

二、数据类型

数据类型大小细节问题
charchar(n),定长字符串,长度不足则向后填充空白字符保存的是字符,char不指定长度,默认则为1
varcharvarchar(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_catalogpg_aggregate数据表postgres聚集函数
pg_catalogpg_cast数据表postgres转换(数据类型转换)
pg_catalogpg_class数据表postgres表、索引、序列、视图(“关系”)
pg_catalogpg_constraint数据表postgres检查约束、唯一约束、主键约束、外键约束
pg_catalogpg_conversion数据表postgres编码转换信息
pg_catalogpg_database数据表postgres本集群内的数据库
pg_catalogpg_depend数据表postgres数据库对象之间的依赖性
pg_catalogpg_description数据表postgres数据库对象的描述或注释
pg_catalogpg_index数据表postgres附加的索引信息
pg_catalogpg_language数据表postgres用于写函数的语言
pg_catalogpg_largeobject数据表postgres大对象
pg_catalogpg_namespace数据表postgres模式
pg_catalogpg_proc数据表postgres函数和过程
pg_catalogpg_rewrite数据表postgres查询重写规则
pg_catalogpg_statistic数据表postgres优化器统计
pg_catalogpg_tablespace数据表postgres这个数据库集群里面的表空间
pg_catalogpg_trigger数据表postgres触发器
pg_catalogpg_type数据表postgres数据类型

列出所有pg开头的系统视图:\dv pg_*

架构模式名称类型拥有者作用
pg_catalogpg_group视图postgres数据库用户的组
pg_catalogpg_indexes视图postgres索引
pg_catalogpg_locks视图postgres当前持有的锁
pg_catalogpg_prepared_statements视图postgres预备语句
pg_catalogpg_prepared_xacts视图postgres预备事务
pg_catalogpg_roles视图postgres数据库角色
pg_catalogpg_rules视图postgres规则
pg_catalogpg_settings视图postgres参数设置
pg_catalogpg_shadow视图postgres数据库用户
pg_catalogpg_stats视图postgres规划器统计
pg_catalogpg_tables视图postgres
pg_catalogpg_timezone_abbrevs视图postgres时区缩写
pg_catalogpg_timezone_names视图postgres时区名
pg_catalogpg_user视图postgres数据库用户
pg_catalogpg_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正则表达式作为分隔符划分stringregexp_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. 标识符和关键词 ↩︎

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值