PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES
PostgreSQL和MySQL一样,都是关系型数据库,本篇文章能教你如何在会MySQL的基础上快速使用PostgreSQL
笔者的数据库选择装在了Linux下的Centos虚拟机上,下载流程为,点击PostgreSQL数据库下载官网,看以看到官网也是非常的友好,直接将步骤已经帮我们列举出来了
小伙伴么也可以点击下官网的流程进行下载。接下来数据库下载好了,我们看看如何登陆到数据库中
我们使用su命令将用户切换为PostGreSQL为我们创建的用户,这里su命令加“-”是表示完全切换用户,可以将用户的环境变量等也一同切换
[root@izbp11mk7q75g5zdtxist0z pgsql]# su - postgres
Last login: Tue Apr 21 11:43:19 CST 2020 on pts/0
-bash-4.2$
我们进入PostgreSQL为我们创建的用户之后,现在我们需要登陆数据库,但是在登陆数据库之前,我们需要看看我们当前有哪些数据库。
这里我们直接执行psql -l命令,看以看到有三个默认的数据库
-bash-4.2$ psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)
-bash-4.2$
我们使用psql -U postgres postgres进入第一个数据库,这时我们就进入了类似于登陆MySQL客户端之后的界面
-bash-4.2$ psql -U postgres postgres
psql (10.12)
Type "help" for help.
postgres=#
postgres=#
postgres=#
接下来的建表的操作就与MySQL基本没有什么不同了,接下来我们要讨论的东西就是PostgreSQL在操作上与MySQL有哪些不同
我们进入PostGreSQL的用户,现在有俩种方式可以创建数据库
[root@izbp11mk7q75g5zdtxist0z pgsql]# su - postgres
Last login: Tue Apr 21 11:43:19 CST 2020 on pts/0
-bash-4.2$
方法1我们直接使用pgsql(数据库简称)终端命令来创建
-bash-4.2$ createdb -U postgres student
-bash-4.2$ psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
student | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
-bash-4.2$
方法二是登录到默认的postgres数据库中,使用MySQL那样的方式创建
postgres=# create database person;
CREATE DATABASE
postgres=# \q
-bash-4.2$
-bash-4.2$
-bash-4.2$ psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
person | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
student | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
-bash-4.2$
现在我们就完成了建立数据库的操作,删除操作也相同,然后说到这里总结并且提几个操作PostgreSQL的重要命令
PostgreSQL用户终端,这里其实指的是我们的bash
psql -l #列出当前用户下的所有数据
createdb [数据库名字] #创建数据库
dropdb [数据库名字] #删除数据库
psql [数据库名字] #登录某个数据库
PostgreSQL客户端,类似于MySQL客户端
\q #退出到终端
\dt #列出当前数据库中的所有表
\d [表名字] #查看当前表结构
\i [文件名字] #导入sql语句
\l #列出当前用户下拥有的用户
\c [数据库名字] #切换到指定数据库
\timing # 打开sql执行时间
\d+ # 列出更详细的表、索引、视图信息
\dn # 列出所有的模式
\dg # 列出所有的角色和用户
\echo # 向屏幕打印消息
\set ECHO_HIDDEN on\off # 是否开启打印各个命令实际的sql
这里值得说的是,\i选项其实就是把我们已经写好的sql存在文件中,然后直接导入到我们的数据库中。
到现在为止,我们已经会切换到psql的用户,会创建数据库、登录到数据库、删除数据库、查看表,接下来我们着重列出PostgreSQL和MySQL在使用上的不同吧
直接使用简单易懂的话告诉大家PostgreSQL常用的数据类型
名字 | 描述 |
---|---|
serial | 自增整数,就是MySQL中的AUTO INCREMENT,PostgreSQL使用serial作为自增序列 |
real | PostgreSQL中的float类型 |
numeric | 指定精度的小数,numeric(几位小数,保留几位) |
integer/int | 整数 |
varchar | 变长字符串 |
char | 普通字符串,可以设置长度,长度不够会补空字符 |
bytea | 可以存储0字符串或者哪些不可见的字符 |
timestamp | 日期和时间,有时区 |
date | 日期 |
time | 时间 |
boolean | true/false |
枚举 | CREATE TYPE mood AS ENUM (‘sad’, ‘ok’, ‘happy’); |
inet | IPv4 或 IPv6 主机和网络 |
text | 文本类型 |
ARRAY | 数组类型 |
这里单独说一下PostgreSQL中的数组类型,先建表
create table test(
id int,
coll int[]
);
# 还可以这样
create table test1(
id int,
coll int ARRAY
);
插入数据, 数组的输入使用单引号‘’加大括号{}表示,各个元素简用逗号分隔
insert into test values(1,'{1,2,3}');
insert into test values(2,'{4,5,6}');
# 或者构造器方式
insert into test values(3,array[7,8,9]);
insert into test values(4,array[4,5,6]);
访问数组
student=# select * from test;
id | coll
----+---------
1 | {1,2,3}
2 | {4,5,6}
(2 rows)
student=#
或者直接访问数组的下标,PostGreSQL数组的下标从1开始访问
student=# select id, coll[1] from test;
id | coll
----+------
1 | 1
2 | 4
(2 rows)
student=#
还可以对数组进行切片
student=# select id, coll[2:3] from test;
id | coll
----+-------
1 | {2,3}
2 | {5,6}
(2 rows)
student=#
对数组进行修改
update test set coll='{1,1,1}' where id=1;
update test set coll[1] = 0 where id =1;
可以看出,除了real、serial、数组类型,PostgreSQL和MySQL基本没有什么特别大的区别,不过PostgreSQL中还有json和xml类型,不过大多数情况会直接选择text类型直接存储
PostgreSQL 模式(SCHEMA)可以看着是一个表的集合。为什么需要有模式,假设俩个用户希望在一个库中起俩个名字相同的表名,这时候就需要模式。
其实说白了,模式就是命名空间,那么如何在PostgreSQL下创建模式
student=# create schema myschema;
CREATE SCHEMA
删除模式
DROP SCHEMA myschema; # 删除一个为空的模式
DROP SCHEMA myschema CASCADE; # 删除一个模式以及其中包含的所有对象
刚才我们说了,模式其实上就是一个命名空间,那么我们直接使用一个例子来看看
student=# create schema myschema; # 创建一个模式
CREATE SCHEMA
student=# create table test2(id int); # 直接创建一个表,名字为test2
CREATE TABLE
student=# create table myschema.test2(id int, age int); # 使用模式创建test2
CREATE TABLE
student=# \d test2; # 直接查看test2
Table "public.test2"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | |
student=# \d myschema.test2; # 查看模式下的test2
Table "myschema.test2"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer | | |
age | integer | | |
WITH 子句有助于将复杂的大型查询分解为更简单的表单。笔者个人的理解就是WITH让子查询更方便
WITH
[子句名字] AS (
SELECT Statement)
SELECT columns
FROM [子句名字]
WHERE conditions <=> (
SELECT column
FROM [子句名字])
[ORDER BY columns]
举个例子,下面有test表,我们希望使用with构建子句,并进行查询
student=# select * from test;
id | coll
----+---------
1 | {1,2,3}
2 | {4,5,6}
(2 rows)
可以看出我们创建了一个名字为t的子句,然后在后半部分进行子句查询
student=# with t as (select * from test) select * from t where id = 1;
id | coll
----+---------
1 | {1,2,3}
(1 row)
student=#
对表加锁的语法
LOCK [ TABLE ]
name
IN
lock_mode
语法很简单,来看看lock_mode有哪些吧
ACCESS SHARE,ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE,ACCESS EXCLUSIVE
翻译成中文
访问共享,行共享,行独占,共享更新独占,共享,共享行独占,独占,访问独占
现在举个例子来说明锁的使用
student=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
上面操作将得到下面结果:
LOCK TABLE
上面的消息指示表被锁定,直到事务结束,并且要完成事务,您必须回滚或提交事务
由于笔者还不是非常了解触发器,小伙伴可以自己先看看菜鸟教程的教学
https://www.runoob.com/postgresql/postgresql-trigger.html
到这里,基本上从使用上来说,已经介绍完了MySQL和PostgreSQL的使用区别,如果你已经使用过很久的MySQL,那么恭喜你,现在你可以顺利的使用PostgreSQL。
有的小伙伴可能不是很相信,那么笔者建议小伙伴们去菜鸟教程搜索PostgreSQL,你就会发现我没有骗你,当然了,这只是使用层面上来说。真的要深入了解PostgreSQL,还有很长的路要走!