本章以 CentOS7 为例,进行安装PostgreSQL
官方下载地址:
https://www.postgresql.org/download/linux/redhat/
安装下载
# Install the repository RPM:
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Install PostgreSQL:
yum install postgresql95-server
# Optionally initialize the database and enable automatic start:
/usr/pgsql-9.5/bin/postgresql95-setup initdb
systemctl enable postgresql-9.5
systemctl start postgresql-9.5
初始化并开启
postgresql-setup --initdb
systemctl enable postgresql.service
systemctl start postgresql.service
切换至postgres进行登录 psql
sudo -i -u postgres
psql / psql -d 数据库名
退出 psql
\q
数据类型名 | 描述 |
---|---|
integer | 常用的整数 |
bigint | 大范围整数 |
decimal | 用户指定的精度,精确 |
serial | 自增整数 |
bigserial | 自增的大范围整数 |
数据类型名 | 描述 |
---|---|
money | 货币金额 |
数据类型名 | 描述 |
---|---|
varchar(n) | 变长,有长度限制 |
char(n) | 定长,不足补空白 |
text | 变长,无长度限制 |
数据类型名 | 描述 |
---|---|
date | 只用于日期 |
timestamp | 日期和时间(无时区) |
数据类型名 | 描述 |
---|---|
boolean | true/false |
枚举类型是一个包含静态和值的有序集合的数据类型
PostgtesSQL中的枚举类型类似于 C 语言中的 enum 类型
与其他类型不同的是枚举类型需要使用 CREATE TYPE 命令创建
CREATE TYPE language AS ENUM ('java', 'scala', 'python');
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
就像其他类型一样,一旦创建,枚举类型可以用于表和函数定义
CREATE TYPE language AS ENUM ('java', 'scala', 'python');
CREATE TABLE person (
name text,
like_language language
);
INSERT INTO person VALUES ('zs', 'java');
SELECT * FROM person WHERE like_language = 'java';
name | like_language
------+--------------
zs | java
(1 row)
数据类型名 | 描述 |
---|---|
cidr | IPv4 或 IPv6 网络 |
inet | IPv4 或 IPv6 主机和网络 |
macaddr | MAC 地址 |
以下方式会丢失列名:
SELECT row_to_json(row(name)) FROM person;
以下方式不会丢失列名
SELECT row_to_json(t) FROM (select name,like_language from person) as t;
PostgreSQL 允许将字段定义成变长的多维数组,数组类型可以是任何基本类型或用户定义类型,枚举类型或复合类型
声明数组
创建表的时候,我们可以声明数组,方式如下:
CREATE TABLE tmp (
name text,
likes text[],
seat integer[][]
);
likes为一位字符数组、seat为二维数值类型数组
我们也可以使用 “ARRAY” 关键字
CREATE TABLE tmp (
name text,
likes ARRAY[4],
seat integer[][]
);
PostgreSQL 创建数据库可以用以下三种方式:
1、CREATE DATABASE 命令需要在 PostgreSQL 命令窗口来执行,语法格式如下:
CREATE DATABASE dbname;
2、createdb 是一个 SQL 命令 CREATE DATABASE 的封装,createdb 命令语法格式如下:
createdb [option...] [dbname [description]]
参数说明:
dbname:要创建的数据库名。
description:关于新创建的数据库相关的说明。
options:参数可选项,可以是以下值:
选项 | 描述 |
---|---|
-D | 指定数据库默认表空间 |
-e | 将 createdb 生成的命令发送到服务端 |
-E | 指定数据库的编码 |
-l | 指定数据库的语言环境 |
-T | 指定创建此数据库的模板 |
–help | 显示 createdb 命令的帮助信息 |
-h | 指定服务器的主机名 |
-p | 指定服务器监听的端口,或者 socket 文件 |
-U | 连接数据库的用户名码 |
-w | 忽略输入密码 |
-W | 连接时强制要求输入密码 |
\l
或
SELECT * FROM pg_database;
\c 数据库名
drop database [ IF EXISTS ] 数据库名;
或
dropdb [connection-option...] [option...] dbname 和创建时的参数大同小异
1、创建普通表
create table 表名
(
字段 类型,
字段 类型,
....
);
2、创建有自增、缺省值的表
create table 表名
(
字段 类型 serlar, -- serlar类型的字段表示该字段为自增字段
字段 类型 default 值, -- default是关键字,后面的值代表字段的默认值
....
);
3、创建带有约束的表
3.1、check 约束
create table 表名
(
字段 类型,
字段 类型 check(条件) -- check约束表示 字段必须满足约束里的条件
....
);
3.2、constraint 约束
create table 表名
(
字段 类型,
字段 类型 constraint 新字段名 -- 该字段的检查约束被显示命名为新字段名,这样做好处在于今后维护该约束时,可以根据该名进行直接操作
);
3.3、非空 约束
create table 表名
(
字段 类型 not null,
字段 类型
);
3.4、唯一 约束
create table 表名
(
字段 类型 unique,
字段 类型
);
create table 表名
(
字段 类型,
字段 类型,
unique(字段,字段...)
);
1、主键
create table 表名
(
字段 类型 PRIMARY KEY,
字段 类型
);
create table 表名
(
字段 类型,
字段 类型,
PRIMARY KEY(字段,字段)
);
2、外键
create table 表名
(
字段 类型 PRIMARY KEY,
字段 类型 REFERENCES 关联外键表名(外键字段)
);
create table 表名
(
字段 类型,
字段 类型,
PRIMARY KEY(字段,字段),
FOREIGEN KEY(字段,字段) REFERENCES 关联外键表名(外键字段,外键字段)
);
create table 表名
(
字段 类型 REFERENCES 关联外键表名 ON DELETE RESTRICT, -- 限制选项
字段 类型 REFERENCES 关联外键表名 ON DELETE CASCADE -- 级联删除选项
);
解释:
限制 和 级联删除 是两种最常见的选项
RESTRICT 禁止删除被引用的行
NO ACTION 的意思是如果在检查约束的时候,如果还存在任何引用行,则抛出错误; 如果你不声明任何东西,那么它就是缺省的行为
RESTRICT 和 NO ACTION 的实际区别是,NO ACTION 允许约束检查推迟到事务的晚些时候,而 RESTRICT 不行CASCADE 声明在删除一个被引用的行的时候,引用它的行也会被自动删除掉。
在外键字段上的动作还有两个选项: SET NULL 和 SET DEFAULT; 这样会导致在被引用行删除的时候,引用它们的字段分别设置为 空 或者 缺省值。 ( 请注意这些选项并不能让你逃脱被观察和约束的境地。比如,如果一个动作声明 SET DEFAULT,但是缺省值并不能满足外键,那么动作就会失败。类似ON DELETE,还有ON UPDATE 选项,它是在被引用字段修改(更新)的时候调用的,可用的动作是一样的)
drop table 表名;
\d 表名
1、增加字段
alter table 表名 add column 字段名 类型 [约束条件];
2、删除字段
alter table 表名 drop column 字段名;
如果删除的是外键字段,想要强制删除,则需要使用以下语句
alter table 表名 drop column 字段名 cascade;
3、修改字段名
alter table 表名 rename column 旧字段名 to 新字段名;
4、修改字段类型
alter table 表名 alter column 字段名 type 类型;
5、修改表名
alter table 表名 rename to 新表名;
6、修改字段的缺省值
在为已有字段添加缺省值时,不会影响任何表中现有的数据行,它只是为将来insert命令改变缺省值
alter table 表名 alter column 字段名 set default 值;
删除缺省值
alter table 表名 alter column 字段名 drop default;
7、增加约束
alter table 表名 add check(条件); -- 添加一个表级约束
alter table 表名 add foreign key(字段) references 外键表(外键字段); -- 添加外键约束
alter table 表名 alter column 字段 set not null; -- 添加非空约束
alter table 表名 add constraint 约束名 unique(sid); -- 添加唯一约束
8、删除约束
对于显示命令的约束,可以直接根据其名字进行删除;对于隐式自动命令的约束,可以通过 psql 的 \d 表名
来获取该约束的名字。和删除字段一样,如果你想删除有着被依赖关系地约束,你需要用 cascade
和其他约束不同的是,非空约束没有名字,所以只能通过以下方式进行删除
alter table 表名 alter column 字段 drop not null
\d
INSERT INTO 语句语法格式如下:
INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
VALUES (value1, value2, value3,...valueN);
SELECT 语句语法格式如下:
SELECT column1, column2,...columnN FROM table_name;
查询和Hive大同小异
只有表的所有者才能修改或者删除表的权限
要赋予一个权限,我们使用GRANT命令,要撤销一个权限,使用REVOKE命令
需要指出的是,PUBLIC是特殊"用户"可以用于将权限赋予系统中的每一个用户
在声明权限的位置写ALL则将所有的与该对象类型相关的权限都赋予出去
GRANT UPDATE ON table_name TO user; --将表的更新权限赋予指定的user
GRANT SELECT ON table_name TO GROUP group; --将表的select权限赋予指定的组
REVOKE ALL ON table_name FROM PUBLIC; --将表的所有权限从Public撤销
最初,只有对象所有者(或者超级用户)可以赋予或者撤销对象的权限。但是,我们可以赋予一个"with grant option"
权限,这样就给接受权限的人以授予该权限给其它人的权限。如果授予选项后来被撤销,那么所有那些从这个接受者接受了权限的用户(直接或者通过级连的授权)都将失去该权限
在 PostgreSQL 中,JOIN 有五种连接类型:
CROSS JOIN :交叉连接
INNER JOIN:内连接
LEFT OUTER JOIN:左外连接
RIGHT OUTER JOIN:右外连接
FULL OUTER JOIN:全外连接
PostgreSQL 触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用
PostgreSQL 触发器可以在下面几种情况下触发: