1、架构
PostgreSQL是一个关系数据库,采用c/s架构。一个PostgreSQL会话包括:
服务端进程——postgres:用于管理数据库文件,并接受来自客户端的数据库连接, 同时代替客户端执行数据库操作。
客户端
2、命令
(1)创建数据库
createdb -U postgres mydb
(2)连接数据库
psql -U postgres mydb
(3)元命令(内部命令)
\h 可以查看SQL命令语法上的说明,后面不加SQL命令,会列出所有SQL命令
\? 可以查看所有的元命令
\l 查看所有数据库
\d 可以查看数据库的所有表
\c 连接到其他数据库
\q 退出psql
3、常用数据类型
3.1 数值类型
名称 | 别名 | 描述 | 取值范围 |
smallint | int2 | 有符号位2字节整数 | -32768 到 +32767 |
integer | int, int4 | 有符号位4字节整数 | -2147483648 到 +2147483647 |
bigint | int8 | 有符号位8字节整数 | -9223372036854775808 到 +9223372036854775807 |
smallserial | serial2 | 自增长2字节整数 | 1 到 +32767 |
serial | searial4 | 自增长4字节整数 | 1 到 +2147483647 |
bigserial | int2 | 自增长八字节整数 | 1 到 9223372036854775807 |
real | float4 | 4字节单精度浮点数 | |
double precision | float8 | 8字节双精度浮点数 | |
numeric [(p, s)] | decimal [(p, s)] | 自定义精度浮点数 |
注:smallserial, serial, bigserial并不是真正的数据类型,它们只是便于快速创建自增长列的符号(类似于MySQL的AUTO_INCREMENT)。
CREATE TABLE test_table (
id SERIAL
);
与下面的SQL等价
CREATE SEQUENCE test_table_id_seq;
CREATE TABLE test_table (
id integer NOT NULL DEFAULT nextval('test_table_id_seq')
);
ALTER SEQUENCE test_table_id_seq OWNED BY test_table.id;
3.2 字符类型
名称 | 别名 | 描述 |
character [(n)] | char [(n)] | 定长字符串 |
character varying [(n)] | varchar [(n)] | 变长字符串 |
text | 变长字符串 |
3.3 日期类型
名称 | 别名 | 描述 |
date | 日期,包含年月日 | |
time [()] [without time zone] | 时间(不包含时区)(不包括日期) | |
time [()] with time zone | timetz | 时间,包含时区(不包括日期) |
timestamp [()] [without time zone] | 日期及时间(不包含时区) | |
timestamp [()] with time zone | 日期及时间(包含时区) | |
interval [fields] [()] | 时间间隔 |
3.4 金钱类型
名称 | 别名 | 描述 |
money | 金额 |
3.5 布尔类型
名称 | 别名 | 描述 |
bool | 布尔可以用"t, T, true, TRUE, y, yes, on, f, F, false, FALSE, n, no, off, 1, 0.....""表示 |
3.6 二进制字符串
名称 | 别名 | 描述 |
bytea | 变长的二进制字符串 |
3.7 网络地址
名称 | 别名 | 描述 |
cidr | IPv4/IPv6网络地址 | |
inet | IPv4/IPv6主机和网络 | |
macaddr | mac地址,‘08:00:2b:02:03’,‘08-00-2b-01-02-03’… |
注:IPv4形式均为adress/y, inet不写y默认为32, cidr不写y按照IP地址分类来添加默认掩码。
3.8 bit串类型
名称 | 别名 | 描述 |
bit [(n)] | 定长bit串 | |
bit varying [(n)] | varbit [(n)] | 变长bit串 |
3.9 文字搜索类型
tsvector有序的无重复的语义集合。
tsquery存储用来搜索的语义字段,会处理逻辑运算。
3.10 其他字段
名称 | 别名 | 描述 |
json | json 数据 | |
uuid | uuid | |
xml | xml | |
数组 | 数组 |
4、系统保留列
PostgreSQL的每张表都有系统保留列,都是系统隐式定义的。用户自定义的字段名不能与它们冲突。
名称 | 描述 |
oid | |
tableoid | |
xmin | |
cmin | |
xmax | |
cmax | |
ctid |
5、 MySQL与PostgreSQL一些差异
(1) 注释符号不同:MySQL使用#进行注释,PG使用— —。
(2) 引用值的符号不同:MySQL使用单引号或者双引号引用值(如,WHERE name = "john");PG只使用单引号引用值(WHERE name = 'john'),双引号用来引用系统标识符,字段名,表名等等。
(3) MySQL使用反引号来引用系统标识。
(4) PG针对字符串比较是大小写敏感的,"Smith"和"smith"不一样。合理使用转换函数,如lower();大小写不敏感的操作符,如like。
(5) PG中的数据库,表,字段和列名称与大小写无关,默认都会转化成小写的,除非使用双引号创建它们,在这种情况下会区分大小写;在MySQL中,表名称可以区分大小写,也可以不区分大小写,具体取决于使用的操作系统。
(6) MySQL使用C语言运算符进行逻辑运算(即'foo'||'bar'表示'foo'或'bar','foo'&&'bar'表示'foo'和'bar');PG使用|| 用于字符串连接('foo'||'bar'='foobar')。
都是相互学习得过程,希望大家能够共同交流,共同进步,谢谢。