学习 postgresql 的笔记
常用命令行
- ?[commands]显示反斜杠命令的帮助;变量显示对特殊变量的帮助;选项显示关于 PSQL 命令行选项的帮助
- \h [NAME] SQL 命令语法帮助,*表示所有命令
- \q 退出 psql
- \d[S+]列出表、视图和序列、NAME 描述表、视图、序列或索引
- \l[+] [PATTERN] list 数据库
- \c[连接]{[DBNAME|-用户|-主机|-端口|-]|连接} 连接新数据库(当前为“postgres”);显示当前连接的信息
常用数据类型
数值类型
- smallint,2 字节,更节省磁盘空间
- integer,4 字节,应该成为数字类型的首选,例如存储金额,可以以分为单位存储
- bigint,8 字节,能够存储的数字范围更大
任意精度类型
- numeric(precision, scale),任意精度,存储任意大小的数字,但是需要占用更多的空间
- precision,总精度,可以存储的总位数
- scale,小数点后的位数
浮点数类型
浮点数,精确度低于 NUMERIC,浮点数的精确性问题普遍存在于各类编程语言中
- float4,单精度,4 字节
- float8,双精度,8 字节
序列类型
- smallserial,2 字节
- serial,4 字节
- bigserial,8 字节
金额类型
- money,8 字节,存储货币金额 精确度同 NUMERIC,默认有 2 位小数
字符类型
- varchar(n),有长度限制的字符串
- char(n),定长字符串,长度不足则向后填充空白字符
- text,不限长度
- todo
二进制数据类型
日期/时间类型
- timestamp with time zone 简写为 timestamptz,存储时以 UTC 时间存储,展示时转换为当前系统时区或指定时区
- timestamp without time zone 间歇威威 timestamp,没有时区,展示时需要指定时区
- time with time zone 有些尴尬,它只记录的当天的时间点而不包含当天的日期,当做时区转换时,时间点可能会跨到昨天或明天,这样看起来是容易混淆的,不建议使用
- time without time zone
- date 日期类型,不能指定 time zone
- interval,时间间隔,可以按年月日时分秒计算
布尔类型
- boolean,用于表示 true 或 false
枚举类型
枚举类型在 PostgreSQL 中属于自定义类型,包含一组静态且有序的值。
- CREATE TYPE mood AS ENUM ('sad'', 'ok', 'happy')
几何类型
- point 二维平面上的点,用(x, y)表示,x、y 分别表示 x 轴、y 轴的坐标值
- line 线,在坐标系上用 Ax + By + C = 0 表示,也就是一个二元一次方程,A、B 表示斜率,C 表示偏移量。
文本搜索类型
- tsvector 顾名思义,该数据类型存储的是一个 vector(向量),包含了文本中的所有词元,vector 中的元素是经过排序的。
JSON 类型(JSON types)
- json,输入被存储为文本,不做任何处理,输出和输入完全相同。
- jsonb:输入经过预处理,忽略一些不重要的因素,如空白字符。输出可能和输入不同
数组类型
- 一维数组 integer[]、text[]
- 二维数组 integer[][]、text[][]
- 指定数组大小 text[10] 可以指定数组大小,但数据库不会对输入做任何限制,跟不设置大小没有区别
组合类型
组合类型,将简单类型组合在一起,形成自定义类型。数据表的列可以定义为组合类型。 创建组合类型,声明类型包含的字段和字段类型
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
);
范围类型(range types)
范围类型,用于表示基本类型的范围,如
- int4range - 4 字节类型范围
- int8range - 8 字节类型范围
- numrange - numeric 类型范围
- tsrange - 不带 timezone 的时间戳范围
- tstzrange - 带 timezone 的时间戳范围
- daterange - 日期范围
领域类型(domain types)
领域类型,基于已经存在的类型,通常用于给类型增加约束,使已存在的类型适用于特定“领域”。
数据库
创建数据库
create database 数据库名;
选择数据库
\c 数据库名
删除数据库
drop database 数据库名;
表格
创建表格
create table 表格名(
column1 datatype,
column2 datatype
primary key (一个或多个列)
);
删除表格
drop table 表格名;
模式
PostgreSQL 模式(SCHEMA)可以看着是一个表的集合。
创建模式
create schema 模式名;
添加数据
create table 模式名.表格名 (
id serial primary key not null,
content text
);
删除模式
删除一个为空的模式(其中的所有对象已经被删除):
drop schema 模式名;
删除一个模式以及其中包含的所有对象:
drop schema 模式名 cascade;
INSERT INTO
PostgreSQL INSERT INTO 语句用于向表中插入新记录。
我们可以插入一行也可以同时插入多行。
插入一行
insert into 表名 (column1, column2)
values (value1, value2);
插入多行
insert into 表名 (column1, column2)
values (value1, value2), (value1, value2), (value1, value2);
SELECT
select column1, column2 FROM 表名;
WHERE
select * from table where id = 1;
- AND 与
- OR 或
- NOT NULL 非空
- LIKE 模糊查询 %通配符 _占位符
- IN 含有
- NOT IN 不含有
- BETWEEN 范围
LIMIT OFFSET
SELECT * FROM COMPANY LIMIT 3 OFFSET 2;
ORDER BY
在 PostgreSQL 中,ORDER BY 用于对一列或者多列数据进行升序(ASC)或者降序(DESC)排列。
GROUP BY
在 PostgreSQL 中,GROUP BY 语句和 SELECT 语句一起使用,用来对相同的数据进行分组。
GROUP BY 在一个 SELECT 语句中,放在 WHRER 子句的后面,ORDER BY 子句的前面。
SELECT column-list
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2....columnN
ORDER BY column1, column2....columnN
HAVING
HAVING 子句可以让我们筛选分组后的各组数据。
WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件。
SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) < 2;
DISTINCT
在 PostgreSQL 中,DISTINCT 关键字与 SELECT 语句一起使用,用于去除重复记录,只获取唯一的记录。
SELECT DISTINCT column1, column2,.....columnN
FROM table_name
WHERE [condition]
UPDATE
update table
set column1 = value1, column2 = value2
where id = 1;
DELETE
delete from table where id = 1;
WITH
With CTE AS
(Select
ID
, NAME
, AGE
, ADDRESS
, SALARY
FROM COMPANY )
Select * From CTE;
约束
- NOT NULL 非空
- UNIQUE 唯一
- PRIMARY KEY 主键
- FOREIGN KEY 外键
- CHECK 检查
- EXCLUSION 排他约束
删除约束
ALTER TABLE table_name DROP CONSTRAINT some_name;
JOIN
- CROSS JOIN :交叉连接
- INNER JOIN:内连接
- LEFT OUTER JOIN:左外连接
- RIGHT OUTER JOIN:右外连接
- FULL OUTER JOIN:全外连接
Comments | 0条评论