[数据库]——如何参照MySQL学会PostGreSQL

如何参照MySQL学会PostGreSQL

PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES

PostgreSQL和MySQL一样,都是关系型数据库,本篇文章能教你如何在会MySQL的基础上快速使用PostgreSQL

安装PostGreSQL

笔者的数据库选择装在了Linux下的Centos虚拟机上,下载流程为,点击PostgreSQL数据库下载官网,看以看到官网也是非常的友好,直接将步骤已经帮我们列举出来了
[数据库]——如何参照MySQL学会PostGreSQL_第1张图片
小伙伴么也可以点击下官网的流程进行下载。接下来数据库下载好了,我们看看如何登陆到数据库中

进入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创建数据库

我们进入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数据类型

直接使用简单易懂的话告诉大家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模式

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 |           |          | 

PostGreSQL WITH子句

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=#

PostGreSQL LOCK(锁)

对表加锁的语法

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

上面的消息指示表被锁定,直到事务结束,并且要完成事务,您必须回滚或提交事务

PostgreSQL 触发器

由于笔者还不是非常了解触发器,小伙伴可以自己先看看菜鸟教程的教学

https://www.runoob.com/postgresql/postgresql-trigger.html

总结

到这里,基本上从使用上来说,已经介绍完了MySQL和PostgreSQL的使用区别,如果你已经使用过很久的MySQL,那么恭喜你,现在你可以顺利的使用PostgreSQL。

有的小伙伴可能不是很相信,那么笔者建议小伙伴们去菜鸟教程搜索PostgreSQL,你就会发现我没有骗你,当然了,这只是使用层面上来说。真的要深入了解PostgreSQL,还有很长的路要走!

你可能感兴趣的:(数据库)