一、PostgreSQL简介
(1)什么是PostgreSQL
PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS)。 用于安全地存储数据; 支持最佳做法,并允许在处理请求时检索它们.postgresql工具
命令行工具:psql
Web管理工具:phpPgAdmin
日志分析器:pgFouine
(2)、特点
PostgreSQL可在所有主要操作系统
PostgreSQL支持文本,图像,声音和视频,并包括用于C/C++,Java,Perl,Python,Ruby,Tcl和开放数据库连接(ODBC)的编程接口
PostgreSQL支持SQL的许多功能,例如复杂SQL查询,SQL子选择,外键,触发器,视图,事务,多进程并发控制(MVCC),流式复制(9.0),热备(9.0))
在PostgreSQL中,表可以设置为从“父”表继承其特征
可以安装多个扩展以向PostgreSQL添加附加功能
(3)、应用场景
(4)、理解postgresql 库,模式,表空间
- schema:为数据库对象的集合,shcema里包含了各种对象如tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links。一个用户一般对应一个schema,该用户的schema名等于用户名,并作为该用户缺省schema。这也就是我们在企业管理器的方案下看到schema名都为数据库用户名的原因--ORACLE。可以简单理解为一个数据库就是一个schema,包含了这个数据库的所有对象(表,视图,索引等等)
- 模式:模式就是schema
- 表空间:表空间是实际的数据存储的地方。
postgresql 角色与用户的关系:在postgresql中这是2个不同的对象。创建完一个角色(create role)后是没有登录权限的,创建完一个用户(create user)后是有
postgresql数据库与模式的关系:模式(schema)是对数据库(database)逻辑分割,在数据库创建的同时,就已经默认为数据库创建了一个模式--public,这也是该数据库的默认模式。所有为此数据库创建的对象(表、函数、试图、索引、序列等)都是常见在这个模式中的。postgresql创建数据库后默认创建了public模式,也默认属于该模式。可以在同一个库下面创建多个模式,当有多个模式时,进行操作是要带模式名称。如 create table shcema_name.test(id int not null );
表空间与数据库的关系:数据库创建语句CREATE DATABASE dbname 默认的数据库所有者是当前创建数据库的角色,默认的表空间是系统的默认表空间--pg_default。由于CREATE DATABASE dbname并没有指明数据库模板,所以系统将默认克隆template1数据库,得到新的数据库dbname。相对完整的语法应该是这样的:CREATE DATABASE dbname OWNER freeoa TEMPLATE template1 TABLESPACE tablespacename;在PostgreSQL中,表空间是一个目录,里面存储的是它所包含的数据库的各种物理文件。
表空间用于定义数据库对象在物理存储设备上的位置,不特定于某个单独的数据库。数据库是数据库对象的物理集合,而schema则是数据库内部用于组织管理数据库对象的逻辑集合,schema名字空间之下则是各种应用程序会接触到的对象,比如表、索引、数据类型、函数、操作符等
二、PostgreoSQL应用
1、语法
待整理https://www.yiibai.com/postgresql/postgresql-syntax.html#article-start
【abort语句】
ABORT [ WORK | TRANSACTION ]
【alter aggregate】
# 说明
# 语法
ALTER AGGREGATE name ( type ) RENAME TO new_name
ALTER AGGREGATE name ( type ) OWNER TO new_owners
# 示例
【alter conversion】
# 说明
# 语法
ALTER CONVERSION name RENAME TO new_name
ALTER CONVERSION name OWNER TO new_owner
【alter database】
# 说明
# 语法
ALTER DATABASE name SET parameter { TO | = } { value | DEFAULT }
ALTER DATABASE name RESET parameter
ALTER DATABASE name RENAME TO new_name
ALTER DATABASE name OWNER TO new_owner
ALTER DOMAIN语句:
# 说明
# 语法
ALTER DOMAIN name { SET DEFAULT expression | DROP DEFAULT }
ALTER DOMAIN name { SET | DROP } NOT NULL
ALTER DOMAIN name ADD domain_constraint
ALTER DOMAIN name DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
ALTER DOMAIN name OWNER TO new_owner
2、数据类型
数值,字符串,日期/时间,布尔类型,货币类型,几何类型
- 数值
名称 | 描述 | 存储大小 | 范围 |
---|---|---|---|
smallint | 存储整数,小范围 | 2字节 | -32768 至 +32767 |
integer | 存储整数。使用这个类型可存储典型的整数 | 4字节 | -2147483648 至 +2147483647 |
bigint | 存储整数,大范围。 | 8字节 | -9223372036854775808 至 9223372036854775807 |
decimal | 用户指定的精度,精确 | 变量 | 小数点前最多为131072个数字; 小数点后最多为16383个数字。 |
numeric | 用户指定的精度,精确 | 变量 | 小数点前最多为131072个数字; 小数点后最多为16383个数字。 |
real | 可变精度,不精确 | 4字节 | 6位数字精度 |
double | 可变精度,不精确 | 8字节 | 15位数字精度 |
serial | 自动递增整数 | 4字节 | 1 至 2147483647 |
bigserial | 大的自动递增整数 | 8字节 | 1 至 9223372036854775807 |
- 字符串
数据类型 | 描述 |
---|---|
char(size) | 这里size是要存储的字符数。固定长度字符串,右边的空格填充到相等大小的字符。 |
character(size) | 这里size是要存储的字符数。 固定长度字符串。 右边的空格填充到相等大小的字符。 |
varchar(size) | 这里size是要存储的字符数。 可变长度字符串。 |
character varying(size) | 这里size是要存储的字符数。 可变长度字符串。 |
text | 可变长度字符串。 |
- 日期/时间
日期/时间数据类型用于表示使用日期和时间值的列。
名称 | 描述 | 存储大小 | 最小值 | 最大值 | 解析度 |
---|---|---|---|---|---|
timestamp [ (p) ] [不带时区 ] | 日期和时间(无时区) | 8字节 | 4713 bc | 294276 ad | 1微秒/14位数 |
timestamp [ (p) ]带时区 | 包括日期和时间,带时区 | 8字节 | 4713 bc | 294276 ad | |
date | 日期(没有时间) | 4字节 | 4713 bc | 5874897 ad | 1微秒/14位数 |
time [ (p) ] [ 不带时区 ] | 时间(无日期) | 8字节 | 00:00:00 | 24:00:00 | 1微秒/14位数 |
time [ (p) ] 带时区 | 仅限时间,带时区 | 12字节 | 00:00:00+1459 | 24:00:00-1459 | 1微秒/14位数 |
interval [ fields ] [ (p) ] | 时间间隔 | 12字节 | -178000000年 | 178000000年 | 1微秒/14位数 |
- 货币类型
名称 | 描述 | 存储大小 | 范围 |
---|---|---|---|
money | 货币金额 | 8字节 | -92233720368547758.08 至 +92233720368547758.07 |
- 几何类型
几何数据类型表示二维空间对象。最根本的类型:点 - 形成所有其他类型的基础。
名称 | 存储大小 | 表示 | 描述 |
---|---|---|---|
point | 16字节 | 在一个平面上的点 | (x,y) |
line | 32字节 | 无限线(未完全实现) | ((x1,y1),(x2,y2)) |
lseg | 32字节 | 有限线段 | ((x1,y1),(x2,y2)) |
box | 32字节 | 矩形框 | ((x1,y1),(x2,y2)) |
path | 16+16n字节 | 封闭路径(类似于多边形) | ((x1,y1),…) |
polygon | 40+16n字节 | 多边形(类似于封闭路径) | ((x1,y1),…) |
circle | 24字节 | 圆 |
<(x,y),r> (中心点和半径) |
3、数据库操作
1、库操作
- 创建数据库:create database db_name
- 删除数据库:drop database db_name
- 创建模式(在制定库下操作):create schema shcema_name
2、表操作
- 创建表: create table tb_name(..)
- 删除表: drop table tb_name
3、增,删,改,查数据
- 插入:insert into tb_name() value()
- 查询:select column from tb_name
- where : select col1,... from table_name where 行的限定条件
- group by: select col1,... from table_name group by col 1,col2...
- having: select col1,...,列的运算 as new_col_name from table_name having new_col_name的限定条件 ;
- order by: select select col1,... from table_name order by col1,....; asc升序,desc降序
- limit: select select col1,... from table_name limit n,m (n为起始位置,m为截取的条数)
- 更新:update tb_name set column1 = value1, ... where
- 删除: delete from tb_name where ..; truncate -清空表
- 条件判断
- and: select col from tb_name where 条件and 条件
- or:SELECT column1, column2, ..... columnN FROM table_name WHERE [search_condition] OR [search_condition];
- and or:SELECT column1, column2, ..... columnN FROM table_name WHERE [search_condition] AND [search_condition] OR [search_condition];
- not:SELECT column1, column2, ..... columnN FROM table_name WHERE [search_condition] NOT [condition];
- like:SELECT column1, column2, ..... columnN FROM table_name WHERE [search_condition] LIKE [condition];
- in:SELECT column1, column2, ..... columnN FROM table_name WHERE [search_condition] IN [condition];
- not in:SELECT column1, column2, ..... columnN FROM table_name WHERE [search_condition] NOT IN [condition];
- between:SELECT column1, column2, ..... columnN FROM table_name WHERE [search_condition] BETWEEN [condition];
4、PostgreSQL 连接查询
-
内连接(inner join on)
SELECT table1.columns, table2.columns FROM table1 INNER JOIN table2 ON table1.common_filed = table2.common_field;
内连接 -
左外连接(LEFT OUTER JOIN on)
SELECT table1.columns, table2.columns FROM table1 LEFT OUTER JOIN table2 ON table1.common_filed = table2.common_field;
注:mysql sql语句左连接与右连接没有 outer
左连接 -
右外连接(RIGHT OUTER JOIN)
SELECT table1.columns, table2.columns FROM table1 RIGHT OUTER JOIN table2 ON table1.common_filed = table2.common_field;
右连接 -
全连接(FULL OUTER JOIN on)
SELECT table1.columns, table2.columns FROM table1 FULL OUTER JOIN table2 ON table1.common_filed = table2.common_field;
image.png 跨连接(CROSS JOIN ):将第一个表中的每一行与第二个表的每一行相匹配,它也被称为笛卡尔积。 如果table1具有“x”行,而table2具有“y”行,则所得到的表将具有(x * y)行。
SELECT coloums FROM table1 CROSS JOIN table2;