pgsql常见的一些操作命令
1.基本操作
-
创建数据库
-
createdb [option...] [dbname [description]]
-
参数说明
-
dbname:要创建的数据库名。
description:关于新创建的数据库相关的说明
options:参数可选项,可以是以下值:-D tablespace 指定数据库默认表空间;-e 将 createdb 生成的命令发送到服务端;-U username 连接数据库的用户名;--help 显示 createdb 命令的帮助信息;-E encoding 指定数据库的编码;-l locale 指定数据库的语言环境;
-
-
-
CREATE DATABASE dbname
-
使用 pgAdmin 工具
-
-
查看数据库
-
查看已经存在的数据库
-
\l
-
-
进入某个数据库
-
\c + 数据库的名字
-
-
-
删除数据库
-
drop database [if exists]+ 数据库的名称
-
-
创建表
-
CREATE TABLE DEPARTMENT(
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
); -
查看表的基本信息
-
\d +表名
-
-
-
删除表
-
drop table +表名
-
2.pgsql的模式
可以看成一个表的集合,包含视图、索引、据类型、函数和操作符等。相同的对象名称可以被用于不同的模式中而不会出现冲突.模式不能嵌套
-
优势
-
允许多个用户使用一个数据库并且不会互相干扰。
-
将数据库对象组织成逻辑组以便更容易管理。
-
第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。
-
-
创建模式
-
create table myschema.company(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
-
-
删除模式
-
drop schema + 模式名
-
3.数据操作
-
insert into
-
INSERT INTO + 表名(字段名1,字段名2,字段名3....) VALUES (字段值1,字段值2,字段值3.....)
-
INSERT INTO + 表名(字段名1,字段名2,字段名3....) VALUES (字段值1,字段值2,字段值3.....),(字段值1,字段值2,字段值3.....),(字段值1,字段值2,字段值3.....),.....
-
-
运算符
-
算术运算符
-
select 2+ 3;
-
-
比较运算符
-
!= 不等于, <> 不等于,还有常见的比较运算符等
-
-
逻辑运算符
-
and,not,or
-
-
位运算符
-
&与,|或,#异或,~取反,<<左移,>>右移
-
-
-
表达式
-
布尔表达式
-
数字表达式
-
日期表达式
-
-
limit用法
-
从第三位开始提取 2 个记录
-
SELECT * FROM COMPANY LIMIT 3 OFFSET 2;
-
-
-
order by 用法
-
ORDER BY 中使用一列或者多列,但是必须保证要排序的列必须存在
-
SELECT * FROM COMPANY ORDER BY AGE ASC;
-
-
-
group by用法
-
GROUP BY 子句必须放在 WHERE 子句中的条件之后,必须放在 ORDER BY 子句之前。在 GROUP BY 子句中,你可以对一列或者多列进行分组,但是被分组的列必须存在于列清单中。
-
根据 NAME 字段值进行分组,找出每个人的工资总额
-
SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME;
-
-
-
having的用法
-
HAVING 子句必须放置于 GROUP BY 子句后面,ORDER BY 子句前面
-
根据 NAME 字段值进行分组,并且 name(名称)字段的计数少于 2 数据
-
SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) < 2;
-
-
-
distinct用法
-
DISTINCT 关键字与 SELECT 语句一起使用,用于去除重复记录,只获取唯一的记录
-
SELECT DISTINCT name FROM COMPANY;
-
-
更新数据
-
UPDATE COMPANY SET SALARY = 15000 WHERE ID = 3;
-
-
删除数据
-
DELETE FROM COMPANY WHERE ID = 2;
-
4.like操作
-
百分号%和下划线_
-
WHERE SALARY::text LIKE '200%' 找出 SALARY 字段中以 200 开头的数据。 WHERE SALARY::text LIKE '%200%' 找出 SALARY 字段中含有 200 字符的数据。 WHERE SALARY::text LIKE '_00%' 找出 SALARY 字段中在第二和第三个位置上有 00 的数据。 WHERE SALARY::text LIKE '2 % %' 找出 SALARY 字段中以 2 开头的字符长度大于 3 的数据。 WHERE SALARY::text LIKE '%2' 找出 SALARY 字段中以 2 结尾的数据 WHERE SALARY::text LIKE '_2%3' 找出 SALARY 字段中 2 在第二个位置上并且以 3 结尾的数据 WHERE SALARY::text LIKE '2___3' 找出 SALARY 字段中以 2 开头,3 结尾并且是 5 位数的数据
-
5.约束
PostgreSQL 约束用于规定表中的数据规则。如果存在违反约束的数据行为,行为会被约束终止。约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。约束确保了数据库中数据的准确性和可靠性。约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表.
常见的约束如下:
-
NOT NULL
-
指示某列不能存储 NULL 值。
-
默认情况下,列可以保存为 NULL 值。如果您不想某列有 NULL 值,那么需要在该列上定义此约束,指定在该列上不允许 NULL 值。NULL 与没有数据是不一样的,它代表着未知的数据。
-
-
UNIQUE
-
确保某列的值都是唯一的。
-
-
PRIMARY Key
-
NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
-
在设计数据库时,PRIMARY KEY 非常重要。PRIMARY KEY 称为主键,是数据表中每一条记录的唯一标识。设置 UNIQUE 的列可能有多个,但是一张表只有一列可以设置 PRIMARY KEY。我们可以使用主键来引用表中的行,也可以通过把主键设置为其他表的外键,来创建表之间的关系。主键是非空约束和唯一约束的组合。一个表只能有一个主键,它可以由一个或多个字段组成,当多个字段作为主键,它们被称为复合键。如果一个表在任何字段上定义了一个主键,那么在这些字段上不能有两个记录具有相同的值。
-
-
FOREIGN Key
-
保证一个表中的数据匹配另一个表中的值的参照完整性。
-
FOREIGN KEY 即外键约束,指定列(或一组列)中的值必须匹配另一个表的某一行中出现的值。通常一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键),即维护了两个相关表之间的引用完整性。
-
-
CHECK
-
保证列中的值符合指定的条件。
-
CHECK 约束保证列中的所有值满足某一条件,即对输入一条记录要进行检查。如果条件值为 false,则记录违反了约束,且不能输入到表。
-
-
EXCLUSION
-
排他约束,保证如果将任何两行的指定列或表达式使用指定操作符进行比较,至少其中一个操作符比较将会返回 false 或空值。
-
EXCLUSION 约束确保如果使用指定的运算符在指定列或表达式上比较任意两行,至少其中一个运算符比较将返回 false 或 null。
-
-
删除约束
-
删除约束必须知道约束名称,已经知道名称来删除约束很简单,如果不知道名称,则需要找到系统生成的名称,使用 \d 表名 可以找到这些信息。
-
ALTER TABLE table_name DROP CONSTRAINT some_name;
-
6.连接
-
CROSS JOIN :交叉连接
-
把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 行,则结果表有 x*y 行。由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。
-
-
INNER JOIN:内连接
-
根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。查询会把 table1 中的每一行与 table2 中的每一行进行比较,找到所有满足连接谓词的行的匹配对。当满足连接谓词时,A 和 B 行的每个匹配对的列值会合并成一个结果行。内连接(INNER JOIN)是最常见的连接类型,是默认的连接类型。INNER 关键字是可选的。
-
-
LEFT OUTER JOIN:左外连接
-
首先执行一个内连接。然后,对于表 T1 中不满足表 T2 中连接条件的每一行,其中 T2 的列中有 null 值也会添加一个连接行。因此,连接的表在 T1 中每一行至少有一行。
-
-
RIGHT OUTER JOIN:右外连接
-
执行内部连接。然后,对于表T2中不满足表T1中连接条件的每一行,其中T1列中的值为空也会添加一个连接行。这与左联接相反;对于T2中的每一行,结果表总是有一行。
-
-
FULL OUTER JOIN:全外连接
-
执行内部连接。然后,对于表 T1 中不满足表 T2 中任何行连接条件的每一行,如果 T2 的列中有 null 值也会添加一个到结果中。此外,对于 T2 中不满足与 T1 中的任何行连接条件的每一行,将会添加 T1 列中包含 null 值的到结果中。
-
-
UNION
-
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
-
SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID
UNION
SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
ON COMPANY.ID = DEPARTMENT.EMP_ID;
-
-
union all 子句
-
NION ALL 操作符可以连接两个有重复行的 SELECT 语句,默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
-
7.其它知识点
-
别名
-
们可以用 SQL 重命名一张表或者一个字段的名称,这个名称就叫着该表或该字段的别名。创建别名是为了让表名或列名的可读性更强。SQL 中 使用 AS 来创建别名。
-
-
触发器
-
触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。
-
在执行操作之前(在检查约束并尝试插入、更新或删除之前)。在执行操作之后(在检查约束并插入、更新或删除完成之后)。更新操作(在对一个视图进行插入、更新、删除时)。
-
-
触发器的 FOR EACH ROW 属性是可选的,如果选中,当操作修改时每行调用一次;相反,选中 FOR EACH STATEMENT,不管修改了多少行,每个语句标记的触发器执行一次。
-
WHEN 子句和触发器操作在引用 NEW.column-name 和 OLD.column-name 表单插入、删除或更新时可以访问每一行元素。其中 column-name 是与触发器关联的表中的列的名称。
-
如果存在 WHEN 子句,PostgreSQL 语句只会执行 WHEN 子句成立的那一行,如果没有 WHEN 子句,PostgreSQL 语句会在每一行执行。
-
BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。
-
要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是 database.tablename。
-
当创建约束触发器时会指定约束选项。这与常规触发器相同,只是可以使用这种约束来调整触发器触发的时间。当约束触发器实现的约束被违反时,它将抛出异常。
-
创建触发器
-
定义auditlogfunc()
CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
RETURN NEW;
END;
$example_table$ LANGUAGE plpgsql; -
CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
-
列举所有触发器
-
SELECT * FROM pg_trigger;
-
-
删除触发器
-
drop trigger example_trigger on company;
-
-
-
-
索引
索引是加速搜索引擎检索数据的一种特殊表查询。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。索引有助于加快 SELECT 查询和 WHERE 子句,但它会减慢使用 UPDATE 和 INSERT 语句时的数据输入。索引可以创建或删除,但不会影响数据。使用 CREATE INDEX 语句创建索引,它允许命名索引,指定表及要索引的一列或多列,并指示索引是升序排列还是降序排列。索引也可以是唯一的,与 UNIQUE 约束类似,在列上或列组合上防止重复条目。
-
索引类型
-
单列索引是一个只基于表的一个列上创建的索引
-
CREATE INDEX index_name
ON table_name (column_name);
-
-
组合索引是基于表的多列上创建的索引
-
CREATE INDEX index_name
ON table_name (column1_name, column2_name);
-
-
唯一索引不仅是为了性能,同时也为了数据的完整性。唯一索引不允许任何重复的值插入到表中。
-
CREATE UNIQUE INDEX index_name
on table_name (column_name);
-
-
局部索引 是在表的子集上构建的索引;子集由一个条件表达式上定义。索引只包含满足条件的行。
-
CREATE INDEX index_name
on table_name (conditional_expression);
-
-
隐式索引是在创建对象时,由数据库服务器自动创建的索引。索引自动创建为主键约束和唯一约束。
-
-
查看所有索引
-
使用 \di 命令列出数据库中所有索引
-
-
删除索引
-
DROP INDEX index_name;
-
-
索引使用准则
-
索引不应该使用在较小的表上。
-
索引不应该使用在有频繁的大批量的更新或插入操作的表上。
-
索引不应该使用在含有大量的 NULL 值的列上。
-
索引不应该使用在频繁操作的列上。
-
-
-
ALTER TABLE命令
ALTER TABLE命令用于添加,修改,删除一张已经存在表的列。另外你也可以用 ALTER TABLE命令添加和删除约束。
-
ALTER TABLE 在一张已存在的表上添加列
-
ALTER TABLE table_name ADD column_name datatype;
-
-
在一张表上删除列
-
ALTER TABLE table_name DROP COLUMN column_name;
-
-
修改表中某列的 DATA TYPE(数据类型)
-
ALTER TABLE table_name ALTER COLUMN column_name TYPE datatype;
-
-
给表中某列添加 NOT NULL 约束
-
ALTER TABLE table_name MODIFY column_name datatype NOT NULL;
-
-
给表中某列 ADD UNIQUE CONSTRAINT( 添加 UNIQUE 约束),语法如下:
ALTER TABLE table_name
ADD CONSTRAINT MyUniqueConstraint UNIQUE(column1, column2...);给表中 ADD CHECK CONSTRAINT(添加 CHECK 约束),语法如下:
ALTER TABLE table_name
ADD CONSTRAINT MyUniqueConstraint CHECK (CONDITION);给表 ADD PRIMARY KEY(添加主键),语法如下:
ALTER TABLE table_name
ADD CONSTRAINT MyPrimaryKey PRIMARY KEY (column1, column2...);DROP CONSTRAINT (删除约束),语法如下:
ALTER TABLE table_name
DROP CONSTRAINT MyUniqueConstraint;如果是 MYSQL ,代码是这样:
ALTER TABLE table_name
DROP INDEX MyUniqueConstraint;DROP PRIMARY KEY (删除主键),语法如下:
ALTER TABLE table_name
DROP CONSTRAINT MyPrimaryKey;
-
-
TRUNCATE TABLE
-
TRUNCATE TABLE 用于删除表的数据,但不删除表结构。
-
TRUNCATE TABLE table_name;
-
-
view
-
View(视图)是一张假表,只不过是通过相关的名称存储在数据库中的一个 PostgreSQL 语句。
View(视图)实际上是一个以预定义的 PostgreSQL 查询形式存在的表的组合。
View(视图)可以包含一个表的所有行或从一个或多个表选定行。
View(视图)可以从一个或多个表创建,这取决于要创建视图的 PostgreSQL 查询。
View(视图)是一种虚拟表,允许用户实现以下几点:
-
用户或用户组认为更自然或直观查找结构数据的方式。
-
限制数据访问,用户只能看到有限的数据,而不是完整的表。
-
汇总各种表中的数据,用于生成报告。
-
-
创建视图
-
CREATE VIEW COMPANY_VIEW AS
SELECT ID, NAME, AGE
FROM COMPANY;
-
-
删除视图
-
DROP VIEW view_name;
-
-
-
TRANSACTION(事务)
-
是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的:
-
为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
-
当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
当事务被提交给了数据库管理系统(DBMS),则 DBMS 需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。
-
-
属性
-
原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
-
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
-
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
-
持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。
-
-
事务开启
-
事务可以使用 BEGIN TRANSACTION 命令或简单的 BEGIN 命令来启动。此类事务通常会持续执行下去,直到遇到下一个 COMMIT 或 ROLLBACK 命令。不过在数据库关闭或发生错误时,事务处理也会回滚
-
BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
ROLLBACK;
-
-
-
lock
-
锁主要是为了保持数据库数据的一致性,可以阻止用户修改一行或整个表,一般用在并发较高的数据库中。在多个用户访问数据库的时候若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。数据库中有两种基本的锁:排它锁(Exclusive Locks)和共享锁(Share Locks)。如果数据对象加上排它锁,则其他的事务不能对它读取和修改。如果加上共享锁,则该数据库对象可以被其他事务读取,但不能修改。
-
死锁
-
当两个事务彼此等待对方完成其操作时,可能会发生死锁。尽管 PostgreSQL 可以检测它们并以回滚结束它们,但死锁仍然很不方便。为了防止应用程序遇到这个问题,请确保将应用程序设计为以相同的顺序锁定对象。
-
-
咨询锁
-
PostgreSQL 提供了创建具有应用程序定义含义的锁的方法。这些被称为咨询锁。由于系统不强制使用它们,所以正确使用它们取决于应用程序。咨询锁对于不适合 MVCC 模型的锁定策略非常有用。例如,咨询锁的一个常见用途是模拟所谓"平面文件"数据管理系统中典型的悲观锁定策略。虽然存储在表中的标志可以用于相同的目的,但是通知锁更快,避免了表膨胀,并且在会话结束时由服务器自动清理。
-
BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
-
-
-
子查询
-
查询或称为内部查询、嵌套查询,指的是在 PostgreSQL 查询中的 WHERE 子句中嵌入查询语句。一个 SELECT 语句的查询结果能够作为另一个语句的输入值。子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,并可使用运算符如 =、<、>、>=、<=、IN、BETWEEN 等。以下是子查询必须遵循的几个规则:
-
子查询必须用括号括起来。
-
子查询在 SELECT 子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较。
-
ORDER BY 不能用在子查询中,虽然主查询可以使用 ORDER BY。可以在子查询中使用 GROUP BY,功能与 ORDER BY 相同。
-
子查询返回多于一行,只能与多值运算符一起使用,如 IN 运算符。
-
BETWEEN 运算符不能与子查询一起使用,但是,BETWEEN 可在子查询内使用。
-
-
INSERT 在子查询中的使用
-
子查询也可以与 INSERT 语句一起使用。INSERT 语句使用子查询返回的数据插入到另一个表中。在子查询中所选择的数据可以用任何字符、日期或数字函数修改。
-
INSERT INTO COMPANY_BKP SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY) ;
-
-
UPDATE 语句结合子查询使用
-
PDATE COMPANY SET SALARY = SALARY * 0.50 WHERE AGE IN (SELECT AGE FROM COMPANY_BKP WHERE AGE >= 27 );
-
-
-
AUTO INCREMENT(自增长)
-
会在新记录插入表中时生成一个唯一的数字。PostgreSQL 使用序列来标识字段的自增长,数据类型有 smallserial、serial 和 bigserial 。这些属性类似于 MySQL 数据库支持的 AUTO_INCREMENT 属性。
-
CREATE TABLE runoob
(
id serial NOT NULL,
alttext text,
imgurl text
)
-
-
privilege(权限)
-
无论何时创建数据库对象,都会为其分配一个所有者,所有者通常是执行 create 语句的人。对于大多数类型的对象,初始状态是只有所有者(或超级用户)才能修改或删除对象。要允许其他角色或用户使用它,必须为该用户设置权限。在 PostgreSQL 中,权限分为以下几种:
-
SELECT
-
INSERT
-
UPDATE
-
DELETE
-
TRUNCATE
-
REFERENCES
-
TRIGGER
-
CREATE
-
CONNECT
-
TEMPORARY
-
EXECUTE
-
USAGE
根据对象的类型(表、函数等),将指定权限应用于该对象。要向用户分配权限,可以使用 GRANT 命令。
-
-
GRANT 语法
GRANT 命令的基本语法如下:
GRANT privilege [, ...]
ON object [, ...]
TO { PUBLIC | GROUP group | username }-
privilege − 值可以为:SELECT,INSERT,UPDATE,DELETE, RULE,ALL。
-
object − 要授予访问权限的对象名称。可能的对象有: table, view,sequence。
-
PUBLIC − 表示所有用户。
-
GROUP group − 为用户组授予权限。
-
username − 要授予权限的用户名。PUBLIC 是代表所有用户的简短形式。
另外,我们可以使用 REVOKE 命令取消权限,REVOKE 语法:
REVOKE privilege [, ...]
ON object [, ...]
FROM { PUBLIC | GROUP groupname | username } -
-
-
日期/时间
-
日期/时间操作符
+
date '2001-09-28' + integer '7'
date '2001-10-05'
+
date '2001-09-28' + interval '1 hour'
timestamp '2001-09-28 01:00:00'
+
date '2001-09-28' + time '03:00'
timestamp '2001-09-28 03:00:00'
+
interval '1 day' + interval '1 hour'
interval '1 day 01:00:00'
+
timestamp '2001-09-28 01:00' + interval '23 hours'
timestamp '2001-09-29 00:00:00'
+
time '01:00' + interval '3 hours'
time '04:00:00'
-
- interval '23 hours'
interval '-23:00:00'
-
date '2001-10-01' - date '2001-09-28'
integer '3'
(days)-
date '2001-10-01' - integer '7'
date '2001-09-24'
-
date '2001-09-28' - interval '1 hour'
timestamp '2001-09-27 23:00:00'
-
time '05:00' - time '03:00'
interval '02:00:00'
-
time '05:00' - interval '2 hours'
time '03:00:00'
-
timestamp '2001-09-28 23:00' - interval '23 hours'
timestamp '2001-09-28 00:00:00'
-
interval '1 day' - interval '1 hour'
interval '1 day -01:00:00'
-
timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00'
interval '1 day 15:00:00'
*
900 * interval '1 second'
interval '00:15:00'
*
21 * interval '1 day'
interval '21 days'
*
double precision '3.5' * interval '1 hour'
interval '03:30:00'
/
interval '1 hour' / double precision '1.5'
interval '00:40:00'
-
日期/时间函数
-
age(timestamp, timestamp) | interval | 减去参数后的"符号化"结果,使用年和月,不只是使用天 | age(timestamp '2001-04-10', timestamp '1957-06-13') | 43 years 9 mons 27 days |
---|---|---|---|---|
age(timestamp) |
interval |
从current_date 减去参数后的结果(在午夜) |
age(timestamp '1957-06-13') |
43 years 8 mons 3 days |
clock_timestamp() |
timestamp with time zone |
实时时钟的当前时间戳(在语句执行时变化) | ||
current_date |
date |
当前的日期; | ||
current_time |
time with time zone |
当日时间; | ||
current_timestamp |
timestamp with time zone |
当前事务开始时的时间戳; | ||
date_part(text, timestamp) |
double precision |
获取子域(等效于extract ); |
date_part('hour', timestamp '2001-02-16 20:38:40') |
20 |
date_part(text, interval) |
double precision |
获取子域(等效于extract ); |
date_part('month', interval '2 years 3 months') |
3 |
date_trunc(text, timestamp) |
timestamp |
截断成指定的精度; | date_trunc('hour', timestamp '2001-02-16 20:38:40') |
2001-02-16 20:00:00 |
date_trunc(text, interval) |
interval |
截取指定的精度, | date_trunc('hour', interval '2 days 3 hours 40 minutes') |
2 days 03:00:00 |
extract(field from timestamp) |
double precision |
获取子域; | extract(hour from timestamp '2001-02-16 20:38:40') |
20 |
extract(field from interval) |
double precision |
获取子域; | extract(month from interval '2 years 3 months') |
3 |
isfinite(date) |
boolean |
测试是否为有穷日期(不是 +/-无穷) | isfinite(date '2001-02-16') |
true |
isfinite(timestamp) |
boolean |
测试是否为有穷时间戳(不是 +/-无穷) | isfinite(timestamp '2001-02-16 21:28:30') |
true |
isfinite(interval) |
boolean |
测试是否为有穷时间间隔 | isfinite(interval '4 hours') |
true |
justify_days(interval) |
interval |
按照每月 30 天调整时间间隔 | justify_days(interval '35 days') |
1 mon 5 days |
justify_hours(interval) |
interval |
按照每天 24 小时调整时间间隔 | justify_hours(interval '27 hours') |
1 day 03:00:00 |
justify_interval(interval) |
interval |
使用justify_days 和justify_hours 调整时间间隔的同时进行正负号调整 |
justify_interval(interval '1 mon -1 hour') |
29 days 23:00:00 |
localtime |
time |
当日时间; | ||
localtimestamp |
timestamp |
当前事务开始时的时间戳; | ||
make_date(year int, month int, day int) |
date |
为年、月和日字段创建日期 | make_date(2013, 7, 15) |
2013-07-15 |
make_interval(years int DEFAULT 0, monthsint DEFAULT 0, weeks int DEFAULT 0, daysint DEFAULT 0, hours int DEFAULT 0, minsint DEFAULT 0, secs double precisionDEFAULT 0.0) |
interval |
从年、月、周、天、小时、分钟和秒字段中创建间隔 | make_interval(days := 10) |
10 days |
make_time(hour int, min int, sec double precision) |
time |
从小时、分钟和秒字段中创建时间 | make_time(8, 15, 23.5) |
08:15:23.5 |
make_timestamp(year int, month int, dayint, hour int, min int, sec double precision) |
timestamp |
从年、月、日、小时、分钟和秒字段中创建时间戳 | make_timestamp(2013, 7, 15, 8, 15, 23.5) |
2013-07-15 08:15:23.5 |
make_timestamptz(year int, month int, dayint, hour int, min int, sec double precision, [ timezone text ]) |
timestamp with time zone |
从年、月、日、小时、分钟和秒字段中创建带有时区的时间戳。 没有指定timezone 时,使用当前的时区。 |
make_timestamptz(2013, 7, 15, 8, 15, 23.5) |
2013-07-15 08:15:23.5+01 |
now() |
timestamp with time zone |
当前事务开始时的时间戳; | ||
statement_timestamp() |
timestamp with time zone |
实时时钟的当前时间戳; | ||
timeofday() |
text |
与clock_timestamp 相同,但结果是一个text 字符串; |
||
transaction_timestamp() |
timestamp with time zone |
当前事务开始时的时间戳; |
-
常用函数
-
内置函数也称为聚合函数,用于对字符串或数字数据执行处理。
下面是所有通用 PostgreSQL 内置函数的列表:
-
COUNT 函数:用于计算数据库表中的行数。
-
MAX 函数:用于查询某一特定列中最大值。
-
MIN 函数:用于查询某一特定列中最小值。
-
AVG 函数:用于计算某一特定列中平均值。
-
SUM 函数:用于计算数字列所有值的总和。
-
ARRAY 函数:用于输入值(包括null)添加到数组中。
-
Numeric 函数:完整列出一个 SQL 中所需的操作数的函数。
-
String 函数:完整列出一个 SQL 中所需的操作字符的函数。
-
-
数学函数
-
abs(x) 绝对值 abs(-17.4) 17.4 cbrt(double) 立方根 cbrt(27.0) 3 ceil(double/numeric) 不小于参数的最小的整数 ceil(-42.8) -42 degrees(double) 把弧度转为角度 degrees(0.5) 28.6478897565412 exp(double/numeric) 自然指数 exp(1.0) 2.71828182845905 floor(double/numeric) 不大于参数的最大整数 floor(-42.8) -43 ln(double/numeric) 自然对数 ln(2.0) 0.693147180559945 log(double/numeric) 10为底的对数 log(100.0) 2 log(b numeric,x numeric) numeric 指定底数的对数 log(2.0, 64.0) 6.0000000000 mod(y, x) 取余数 mod(9,4) 1 pi() double "π"常量 pi() 3.14159265358979 power(a double, b double) double 求a的b次幂 power(9.0, 3.0) 729 power(a numeric, b numeric) numeric 求a的b次幂 power(9.0, 3.0) 729 radians(double) double 把角度转为弧度 radians(45.0) 0.785398163397448 random() double 0.0到1.0之间的随机数值 random() round(double/numeric) 圆整为最接近的整数 round(42.4) 42 round(v numeric, s int) numeric 圆整为s位小数数字 round(42.438,2) 42.44 sign(double/numeric) 参数的符号(-1,0,+1) sign(-8.4) -1 sqrt(double/numeric) 平方根 sqrt(2.0) 1.4142135623731 trunc(double/numeric) 截断(向零靠近) trunc(42.8) 42 trunc(v numeric, s int) numeric 截断为s小数位置的数字 trunc(42.438,2) 42.43
acos(x) 反余弦 asin(x) 反正弦 atan(x) 反正切 atan2(x, y) 正切 y/x 的反函数 cos(x) 余弦 cot(x) 余切 sin(x) 正弦 tan(x) 正切 -
字符串函数和操作符
string 丨丨 string text 字串连接 'Post' 丨丨 'greSQL' PostgreSQL bit_length(string) int 字串里二进制位的个数 bit_length('jose') 32 char_length(string) int 字串中的字符个数 char_length('jose') 4 convert(string using conversion_name) text 使用指定的转换名字改变编码。 convert('PostgreSQL' using iso_8859_1_to_utf8) 'PostgreSQL' lower(string) text 把字串转化为小写 lower('TOM') tom octet_length(string) int 字串中的字节数 octet_length('jose') 4 overlay(string placing string from int [for int]) text 替换子字串 overlay('Txxxxas' placing 'hom' from 2 for 4) Thomas position(substring in string) int 指定的子字串的位置 position('om' in 'Thomas') 3 substring(string [from int] [for int]) text 抽取子字串 substring('Thomas' from 2 for 3) hom substring(string from pattern) text 抽取匹配 POSIX 正则表达式的子字串 substring('Thomas' from '…$') mas substring(string from pattern for escape) text 抽取匹配SQL正则表达式的子字串 substring('Thomas' from '%#"o_a#"_' for '#') oma trim([leading丨trailing 丨 both] [characters] from string) text 从字串string的开头/结尾/两边/ 删除只包含characters(默认是一个空白)的最长的字串 trim(both 'x' from 'xTomxx') Tom upper(string) text 把字串转化为大写。 upper('tom') TOM ascii(text) int 参数第一个字符的ASCII码 ascii('x') 120 btrim(string text [, characters text]) text 从string开头和结尾删除只包含在characters里(默认是空白)的字符的最长字串 btrim('xyxtrimyyx','xy') trim chr(int) text 给出ASCII码的字符 chr(65) A convert(string text, [src_encoding name,] dest_encoding name) text 把字串转换为dest_encoding convert( 'text_in_utf8', 'UTF8', 'LATIN1') 以ISO 8859-1编码表示的text_in_utf8 initcap(text) text 把每个单词的第一个子母转为大写,其它的保留小写。单词是一系列字母数字组成的字符,用非字母数字分隔。 initcap('hi thomas') Hi Thomas length(string text) int string中字符的数目 length('jose') 4 lpad(string text, length int [, fill text]) text 通过填充字符fill(默认为空白),把string填充为长度length。 如果string已经比length长则将其截断(在右边)。 lpad('hi', 5, 'xy') xyxhi ltrim(string text [, characters text]) text 从字串string的开头删除只包含characters(默认是一个空白)的最长的字串。 ltrim('zzzytrim','xyz') trim md5(string text) text 计算给出string的MD5散列,以十六进制返回结果。 md5('abc') repeat(string text, number int) text 重复string number次。 repeat('Pg', 4) PgPgPgPg replace(string text, from text, to text) text 把字串string里出现地所有子字串from替换成子字串to。 replace('abcdefabcdef', 'cd', 'XX') abXXefabXXef rpad(string text, length int [, fill text]) text 通过填充字符fill(默认为空白),把string填充为长度length。如果string已经比length长则将其截断。 rpad('hi', 5, 'xy') hixyx rtrim(string text [, character text]) text 从字串string的结尾删除只包含character(默认是个空白)的最长的字 rtrim('trimxxxx','x') trim split_part(string text, delimiter text, field int) text 根据delimiter分隔string返回生成的第field个子字串(1 Base)。 split_part('abc~@~def~@~ghi', '~@~', 2) def strpos(string, substring) text 声明的子字串的位置。 strpos('high','ig') 2 substr(string, from [, count]) text 抽取子字串。 substr('alphabet', 3, 2) ph to_ascii(text [, encoding]) text 把text从其它编码转换为ASCII。 to_ascii('Karel') Karel to_hex(number int/bigint) text 把number转换成其对应地十六进制表现形式。 to_hex(9223372036854775807) 7fffffffffffffff translate(string text, from text, to text) text 把在string中包含的任何匹配from中的字符的字符转化为对应的在to中的字符。 translate('12345', '14', 'ax') a23x5 -
类型转换相关函数
-
to_char(timestamp, text) | text | 将时间戳转换为字符串 | to_char(current_timestamp, 'HH12:MI:SS') |
---|---|---|---|
to_char(interval, text) | text | 将时间间隔转换为字符串 | to_char(interval '15h 2m 12s', 'HH24:MI:SS') |
to_char(int, text) | text | 整型转换为字符串 | to_char(125, '999') |
to_char(double precision, text) | text | 双精度转换为字符串 | to_char(125.8::real, '999D9') |
to_char(numeric, text) | text | 数字转换为字符串 | to_char(-125.8, '999D99S') |
to_date(text, text) | date | 字符串转换为日期 | to_date('05 Dec 2000', 'DD Mon YYYY') |
to_number(text, text) | numeric | 转换字符串为数字 | to_number('12,454.8-', '99G999D9S') |
to_timestamp(text, text) | timestamp | 转换为指定的时间格式 time zone convert string to time stamp | to_timestamp('05 Dec 2000', 'DD Mon YYYY') |
to_timestamp(double precision) | timestamp | 把UNIX纪元转换成时间戳 | to_timestamp(1284352323) |