序言
整理下~整理下~PostgreSQL
心情不顺就学习,就整理文献cuiyaonan2000@163.com
整体看了下api总的来说就是多了一个schema,其它的差不了多少~~~
参考资料:
- PostgreSQL 教程 | 菜鸟教程
数据库种类
- RDBMS: 关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
- ORDBMS:对象关系数据库系统,是面向对象技术与传统的关系数据库相结合的产物,查询处理是 ORDBMS 的重要组成部分,它的性能优劣将直接影响到DBMS 的性能。ORDBMS在原来关系数据库的基础上,增加了一些新的特性。
- OODBMS:面向对象数据库管理系统,将所有实体都看着对象,并将这些对象类进行封装,对象之间的通信通过消息 OODBMS 对象关系数据库在实质上还是关系数据库 。
ORDBMS 术语
- 数据库: 数据库是一些关联表的集合。
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
- 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
PostgreSQL 特征
PostgreSQL 是ORDBMS类型的数据库
-
函数:通过函数,可以在数据库服务器端执行指令程序。
-
索引:用户可以自定义索引方法,或使用内置的 B 树,哈希表与 GiST 索引。
-
触发器:触发器是由SQL语句查询所触发的事件。如:一个INSERT语句可能触发一个检查数据完整性的触发器。触发器通常由INSERT或UPDATE语句触发。 多版本并发控制:PostgreSQL使用多版本并发控制(MVCC,Multiversion concurrency control)系统进行并发控制,该系统向每个用户提供了一个数据库的"快照",用户在事务内所作的每个修改,对于其他的用户都不可见,直到该事务成功提交。
-
规则:规则(RULE)允许一个查询能被重写,通常用来实现对视图(VIEW)的操作,如插入(INSERT)、更新(UPDATE)、删除(DELETE)。
-
数据类型:包括文本、任意精度的数值数组、JSON 数据、枚举类型、XML 数据
等。 -
全文检索:通过 Tsearch2 或 OpenFTS,8.3版本中内嵌 Tsearch2。
-
NoSQL:JSON,JSONB,XML,HStore 原生支持,至 NoSQL 数据库的外部数据包装器。
-
数据仓库:能平滑迁移至同属 PostgreSQL 生态的 GreenPlum,DeepGreen,HAWK 等,使用 FDW 进行 ETL。
PostgreSQL 语法
介绍文档一般都是总分总的介绍,这就是PG的总cuiyaonan2000@163.com:
官网地址:PostgreSQL 语法 | 菜鸟教程
创建数据库
PostgreSQL 创建数据库可以用以下三种方式:
- 使用 CREATE DATABASE SQL 语句来创建。
- 使用 createdb 命令来创建。
- 使用 pgAdmin 工具。
CREATE DATABASE 创建数据库
CREATE DATABASE dbname;
createdb 命令创建数据库
createdb 是一个 SQL 命令 CREATE DATABASE 的封装。
createdb 命令位于 PostgreSQL安装目录/bin 下
createdb 命令语法格式如下:
createdb [option...] [dbname [description]]
参数说明:
- dbname:要创建的数据库名。
- description:关于新创建的数据库相关的说明。
- options:参数可选项,可以是以下值:
序号 | 选项 & 描述 |
---|---|
1 | -D tablespace 指定数据库默认表空间。 |
2 | -e 将 createdb 生成的命令发送到服务端。 |
3 | -E encoding 指定数据库的编码。 |
4 | -l locale 指定数据库的语言环境。 |
5 | -T template 指定创建此数据库的模板。 |
6 | --help 显示 createdb 命令的帮助信息。 |
7 | -h host 指定服务器的主机名。 |
8 | -p port 指定服务器监听的端口,或者 socket 文件。 |
9 | -U username 连接数据库的用户名。 |
10 | -w 忽略输入密码。 |
11 | -W 连接时强制要求输入密码。 |
选择目标数据库
数据库的命令窗口
- 使用 \l 用于查看已经存在的数据库
- \c + 数据库名 来进入数据库
系统命令行窗口(命令连接数据库时)
在系统的命令行查看,我么可以在连接数据库后面添加数据库名来选择数据库:
$ psql -h localhost -p 5432 -U postgres runoobdb
PostgreSQL 删除数据库
PostgreSQL 删除数据库可以用以下三种方式:
- 1、使用 DROP DATABASE SQL 语句来删除。
- 2、使用 dropdb 命令来删除。
- 3、使用 pgAdmin 工具。
DROP DATABASE 删除数据库
- DROP DATABASE 会删除数据库的系统目录项并且删除包含数据的文件目录。
- DROP DATABASE 只能由超级管理员或数据库拥有者执行。
- DROP DATABASE 命令需要在 PostgreSQL 命令窗口来执行
语法格式如下:
DROP DATABASE [ IF EXISTS ] name
参数说明:
- IF EXISTS:如果数据库不存在则发出提示信息,而不是错误信息。
- name:要删除的数据库的名称。
dropdb 命令删除数据库
- dropdb 是 DROP DATABASE 的包装器。
- dropdb 用于删除 PostgreSQL 数据库。
- dropdb 命令只能由超级管理员或数据库拥有者执行。
dropdb 命令语法格式如下:
dropdb [connection-option...] [option...] dbname
参数说明:
dbname:要删除的数据库名。
options:参数可选项,可以是以下值:
序号 | 选项 & 描述 |
---|---|
1 | -e 显示 dropdb 生成的命令并发送到数据库服务器。 |
2 | -i 在做删除的工作之前发出一个验证提示。 |
3 | -V 打印 dropdb 版本并退出。 |
4 | --if-exists 如果数据库不存在则发出提示信息,而不是错误信息。 |
5 | --help 显示有关 dropdb 命令的帮助信息。 |
6 | -h host 指定运行服务器的主机名。 |
7 | -p port 指定服务器监听的端口,或者 socket 文件。 |
8 | -U username 连接数据库的用户名。 |
9 | -w 连接时忽略输入密码。 |
10 | -W 连接时强制要求输入密码。 |
11 | --maintenance-db=dbname 删除数据库时指定连接的数据库,默认为 postgres,如果它不存在则使用 template1。 |
PostgreSQL 创建表格
- CREATE TABLE 是一个关键词,用于告诉数据库系统将创建一个数据表。表名字必需在同一模式中的其它表、 序列、索引、视图或外部表名字中唯一。
- CREATE TABLE 在当前数据库创建一个新的空白表,该表将由发出此命令的用户所拥有。
CREATE TABLE 语法格式如下:
CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY( 一个或多个列 )
);
-
\d 命令来查看当前数据库下的所有表格列表
- \d tablename 查看表格信息:
PostgreSQL 删除表格
PostgreSQL 使用 DROP TABLE 语句来删除表格,包含表格数据、规则、触发器等,所以删除表格要慎重,删除后所有信息就消失了。
DROP TABLE 语法格式如下:
DROP TABLE table_name;
PostgreSQL 模式(SCHEMA--重点)
PostgreSQL 模式(SCHEMA)可以看着是一个表的集合。----这里就是不同的用户可以创建一个模式,该模式可以看成一个表的Group,里面包含了很多表.cuiyaonan2000@163.com
-
允许多个用户使用一个数据库并且不会互相干扰。---不同模式内的表,不会相互影响
-
将数据库对象组织成逻辑组以便更容易管理。---跟Elasticsearch中的 type有点类似cuiyaonan2000@163.com
-
第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。---因为不同模式下的表,不会相互影响
语法如下(注意mytable 是在该模式下创建表的时候才出现,创建模式不需要mytable,注意cuiyaonan2000@163.com):
CREATE SCHEMA myschema.mytable (
...
);
删除模式
#删除一个为空的模式(其中的所有对象已经被删除):
DROP SCHEMA myschema;
#删除一个模式以及其中包含的所有对象:
DROP SCHEMA myschema CASCADE;
PostgreSQL INSERT INTO 语句
INSERT INTO 语句语法格式如下(可以插入多行,以逗号分隔cuiyaonan2000@163.com):
INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
VALUES (value1, value2, value3,...valueN);
返回信息
序号 | 输出信息 & 描述 |
---|---|
1 | INSERT oid 1 只插入一行并且目标表具有 OID的返回信息, 那么 oid 是分配给被插入行的 OID。因为只插入一行所以后面的固定为1, |
2 | INSERT 0 # 插入多行返回的信息, # 为插入的总行数,是个数字。 |
PostgreSQL SELECT 语句
跟Mysql一样
PostgreSQL 运算符
算术运算符
假设变量 a 为 2,变量 b 为 3,则:
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 | a + b 结果为 5 |
- | 减 | a - b 结果为 -1 |
* | 乘 | a * b 结果为 6 |
/ | 除 | b / a 结果为 1 |
% | 模(取余) | b % a 结果为 1 |
^ | 指数 | a ^ b 结果为 8 |
|/ | 平方根 | |/ 25.0 结果为 5 |
||/ | 立方根 | ||/ 27.0 结果为 3 |
! | 阶乘 | 5 ! 结果为 120 |
!! | 阶乘(前缀操作符) | !! 5 结果为 120 |
比较运算符
假设变量 a 为 10,变量 b 为 20,则:
运算符 | 描述 | 实例 |
---|---|---|
= | 等于 | (a = b) 为 false。 |
!= | 不等于 | (a != b) 为 true。 |
<> | 不等于 | (a <> b) 为 true。 |
> | 大于 | (a > b) 为 false。 |
< | 小于 | (a < b) 为 true。 |
>= | 大于等于 | (a >= b) 为 false。 |
<= | 小于等于 | (a <= b) 为 true。 |
逻辑运算符
序号 | 运算符 & 描述 |
---|---|
1 | AND 逻辑与运算符。如果两个操作数都非零,则条件为真。 PostgresSQL 中的 WHERE 语句可以用 AND 包含多个过滤条件。 |
2 | NOT 逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 PostgresSQL 有 NOT EXISTS, NOT BETWEEN, NOT IN 等运算符。 |
3 | OR 逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 PostgresSQL 中的 WHERE 语句可以用 OR 包含多个过滤条件。 |
位运算符
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与操作,按二进制位进行"与"运算。运算规则: 0&0=0; 0&1=0; 1&0=0; 1&1=1; | (A & B) 将得到 12,即为 0000 1100 |
| | 按位或运算符,按二进制位进行"或"运算。运算规则: 0|0=0; 0|1=1; 1|0=1; 1|1=1; | (A | B) 将得到 61,即为 0011 1101 |
# | 异或运算符,按二进制位进行"异或"运算。运算规则: 0#0=0; 0#1=1; 1#0=1; 1#1=0; | (A # B) 将得到 49,即为 0011 0001 |
~ | 取反运算符,按二进制位进行"取反"运算。运算规则: ~1=0; ~0=1; | (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 |
<< | 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 | A << 2 将得到 240,即为 1111 0000 |
>> | 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 | A >> 2 将得到 15,即为 0000 1111 |
PostgreSQL 表达式
PostgreSQL 还内置了一些数学函数,如:
- avg() : 返回一个表达式的平均值
- sum() : 返回指定字段的总和
- count() : 返回查询的记录总数
- CURRENT_TIMESTAMP: 当前系统的时间戳
PostgreSQL WHERE
后面可以用到的过滤信息
- AND
- OR
- NOT NULL
- LIKE
- IN
- NOT IN
- BETWEEN
- EXISTS
- 子查询
PostgreSQL UPDATE 语句
语法:
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
PostgreSQL DELETE 语句
语法:
DELETE FROM table_name WHERE [condition];
PostgreSQL LIKE 子句
在 PostgreSQL 中,主要有以下两种通配符:
- 百分号 % ----匹配不限个数的字符
- 下划线 _ ------只能匹配一个字符
PostgreSQL LIMIT 子句
语法:
SELECT column1, column2, columnN
FROM table_name
LIMIT [no of rows] OFFSET [row num]
PostgreSQL ORDER BY 语句
语法:
SELECT column-list
FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];
PostgreSQL GROUP BY 语句
GROUP BY 在一个 SELECT 语句中,放在 WHRER 子句的后面,ORDER BY 子句的前面。
语法:
SELECT column-list
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2....columnN
ORDER BY column1, column2....columnN
PostgreSQL WITH 子句(重点知识)
WITH 子句有助于将复杂的大型查询分解为更简单的表单,便于阅读。
这些语句通常称为通用表表达式(Common Table Express, CTE),也可以当做一个为查询而存在的临时表。
WITH 子句是在多次执行子查询时特别有用,允许我们在查询中通过它的名称(可能是多次)引用它。
WITH 查询的基础语法如下:
WITH
name_for_summary_data AS (
SELECT Statement)
SELECT columns
FROM name_for_summary_data
WHERE conditions <=> (
SELECT column
FROM name_for_summary_data)
[ORDER BY columns]
name_for_summary_data 是 WITH 子句的名称,name_for_summary_data 可以与现有的表名相同,并且具有优先级。
可以在 WITH 中使用数据 INSERT, UPDATE 或 DELETE 语句,允许您在同一个查询中执行多个不同的操作。---------------这个是存储过程么cuiyaonan2000@163.com
公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE。递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。
实例
With CTE AS
(Select
ID
, NAME
, AGE
, ADDRESS
, SALARY
FROM COMPANY )
Select * From CTE;
#接下来让我们使用 RECURSIVE 关键字和 WITH 子句编写一个查询,查找 SALARY(工资) 字段小于 20000 的数据并计算它们的和:
WITH RECURSIVE t(n) AS (
VALUES (0)
UNION ALL
SELECT SALARY FROM COMPANY WHERE SALARY < 20000
)
SELECT sum(n) FROM t;
#下面我们建立一张和 COMPANY 表相似的 COMPANY1 表,使用 DELETE 语句和 WITH 子句删除 COMPANY 表中 SALARY(工资) 字段大于等于 30000 的数据,并将删除的数据插入 COMPANY1 表,实现将 COMPANY 表数据转移到 COMPANY1 表中:
WITH moved_rows AS (
DELETE FROM COMPANY
WHERE
SALARY >= 30000
RETURNING *
)
INSERT INTO COMPANY1 (SELECT * FROM moved_rows);
PostgreSQL HAVING 子句
HAVING 子句必须放置于 GROUP BY 子句后面,ORDER BY 子句前面,下面是 HAVING 子句在 SELECT 语句中基础语法:
SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2
PostgreSQL DISTINCT 关键字
SELECT DISTINCT column1, column2,.....columnN
FROM table_name
WHERE [condition]