PostgreSQL学习记录——第一天
昨天已经完成了PostgreSQL(后续和其他平台一样把这个简称为PG)的安装,今天就来逐步学吧。至于为什么从MySQL转移到PG,主要是因为以下几点:
- PG支持更多的数据类型
- PG在所有配置上均支持ACID,而MySQL只能在部分情况下支持
- PostgreSQL使用了多版本并发控制(MVCC)减少了出现死锁的概率
- PostgreSQL支持更多的索引类型
说完上面的就不得不提到简历上写了会MySQL然后被面试官无数次拷打的经历了(MongoDB我也写了,没人问,我还准备了蛮多的嘞)。
首先就是ACID是哪四个,莫名感觉是所有面试官都会想问。
其次是锁相关,S锁、X锁、IS锁、IX锁、未提交读、提交读、可重复读、串行化,呕。
然后就说索引B树B+树,前段时间面试才被问到过这个。
然后正式进入学习记录。
在开启SQL Shell(psql)之前记得在cmd里打开PG服务。
数据类型
这部分内容太多太杂,就把比MySQL支持的更多的数据类型大概记一下吧(我自己按照资料写的,如果有缺少或者多了麻烦各位补充啊)
| PostgreSQL数据类型 | 描述 |
|---|---|
| SERIAL | 自增整数 |
| BIGSERIAL | 大范围自增整数 |
| MONEY | 货币金额 |
| UUID | 通用唯一标识符 |
| CIDR | IPv4或IPv6网络地址 |
| INET | IPv4或IPv6主机地址 |
| MACADDR | MAC地址 |
| BIT | 定长位串 |
| BIT VARYING | 变长位串 |
| BOX | 平面中的矩形框 |
| LINE | 无限长的线 |
| LSEG | 线段 |
| PATH | 闭合路径 |
| POINT | 平面中的点 |
| POLYGON | 闭合的平面多边形 |
| CIRCLE | 平面中的圆 |
| INTERVAL | 时间间隔 |
| TSVECTOR | 文本搜索文档 |
| TSQUERY | 文本搜索查询 |
| XML | XML数据 |
| JSON | JSON数据 |
| JSONB | 二进制JSON数据,可索引 |
| HSTORE | 键值对存储 |
数据库
创建数据库
CREATE DATABASE dbname;
选择数据库
\l 查看数据库(莫名想到了Linux的ls -l)
\c + dbname 进入数据库
删除数据库
DROP DATABASE [IF EXISTS] name;
删除需要root权限,普通用户无法删除
表格
创建表格
1 | |
例子
\d是查看当前已经存在的表格
\d tablename是查看表格详情
删除表格
DROP TABLE table_name;
PG模式(SCHEMA)
第一眼看感觉有点像事务,但是事务是遵循ACID原则的并且通过MVCC来建立隔离,两者的逻辑不一样。
模式中可以包括视图、索引、数据类型、函数和操作等。
相同的名称可以运用于不同的模式而不报错,for example schema1和myschema都包含mytable的表。
模式的优势:
- 允许多个用户操作数据库而不相互干扰
- 将数据库对象组织成逻辑便于管理(我的理解是我在做某个东西的时候我将一张表三个视图组织在一起,这个组织就可以一起被操作同时还可以单独操作,然后也可以对整个模式里的对象进行批量操作)
- 第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。
创建模式
语法如下
1 | |
创建表的语法如下:
1 | |
上述语法是在一个叫myschema的模式下创建了一个叫mytable的表
例子
这里我们建立了一个模式和一个表,中间由于手误少了一个’,’。
删除模式
删除一个空的模式(里面的对象已经全部被删除了)
DROP SCHEMA myschema;
删除一个模式及其下面的对象
DROP SCHEMA myschema CASSADE;
INSERT INTO 语句
语法如下
INSERT INTO TABLE_NAME (column1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN);
需要注意的是column和value需要数量一样,一一对应
对所有字段均添加值的语法如下
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
| 序号 | 输出信息&描述 |
|---|---|
| 1 | INSERT oid 1 直插入一行且表中具备OID的返回信息,那么oid就分配给被插入行 |
| 2 | INSERT 0 # 插入多行,#为插入行数 |
例子
这里先创建一个表
这里我们从上到下分别来看
- 给表里插入数据
- 给表里插入忽略SALARY的数据
- 插入语句 JOIN_DATE 字段使用 DEFAULT 子句来设置默认值,而不是指定值
- 插入多行
- 查询数据
SELECT语句
这里就不多说了,不会的拖出去乱棍打死。和MySQL之类的一摸一样。
运算符
PG的运算符一般用在WHERE中
有四个
- 算术运算符
- 比较运算符
- 逻辑运算符
- 按位运算符
算术运算符
比较运算符
| 运算符 | 描述 | 实例 |
|---|---|---|
| = | 等于 | (a = b) 为 false。 |
| != | 不等于 | (a != b) 为 true。 |
| <> | 不等于 | (a <> b) 为 true。 |
| > | 大于 | (a > b) 为 false。 |
| < | 小于 | (a < b) 为 true。 |
| >= | 大于等于 | (a >= b) 为 false。 |
| <= | 小于等于 | (a <= b) 为 true。 |
逻辑运算符
| 序号 | 运算符 & 描述 |
|---|---|
| 1 | AND |
| 逻辑与运算符。如果两个操作数都非零,则条件为真。 | |
| PostgresSQL 中的 WHERE 语句可以用 AND 包含多个过滤条件。 | |
| 2 | NOT |
| 逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | |
| PostgresSQL 有 NOT EXISTS, NOT BETWEEN, NOT IN 等运算符。 | |
| 3 | OR |
| 逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | |
| PostgresSQL 中的 WHERE 语句可以用 OR 包含多个过滤条件。 |
三值逻辑系统
| a | b | a AND b | a OR b |
|---|---|---|---|
| TRUE | TRUE | TRUE | TRUE |
| TRUE | FALSE | FALSE | TRUE |
| TRUE | NULL | NULL | TRUE |
| FALSE | FALSE | FALSE | FALSE |
| FALSE | NULL | FALSE | NULL |
| NULL | NULL | NULL | NULL |
| a | NOT a |
|---|---|
| TRUE | FALSE |
| FALSE | TRUE |
| NULL | NULL |
位运算符
按位运算符
表达式
基本语法如下
1 | |
布尔表达式
根据一个指定条件来读取数据
1 | |
数学表达式
1 | |
PG还有内置计算函数(这个好像都有吧sum、avg这些)
日期表达式
1 | |
返回当前日期
WHERE子句
这部分内容和MySQL差不多
WHERE的语法如下:
1 | |
还可以使用比较运算符或逻辑运算符
AND, OR, NOT NULL, LIKE, NOT IN, BETWEEN, 子查询
UPDATE
基本语法如下:
1 | |
DELETE
基本语法如下:
1 | |
LIKE
和MySQL一样,都是进行匹配
基本语法如下:
1 | |
LIMIT
作用就是限制查询条数
基本语法如下:
1 | |
和OFFSET一起用的语法如下:
1 | |
ORDER BY
ORDER BY是用来对一列或多列进行排序的(升序或降序)
基本语法如下:
1 | |
ASC 表示升序,DESC 表示降序。
GROUP BY
GROUP BY用来和SELECT语句一起使用,对数据进行分组。
GROUP BY 在一个 SELECT 语句中,放在 WHERE 子句的后面,ORDER BY 子句的前面。
基本语法如下:
1 | |
WITH
WITH主要用来辅助将复杂的查询拆分成简单的表单,便于阅读,也可以当作为查询存在的临时表。
基本语法如下:
1 | |
name_for_summary_data 是 WITH 子句的名称,name_for_summary_data 可以与现有的表名相同,并且具有优先级。
可以在 WITH 中使用数据 INSERT, UPDATE 或 DELETE 语句,允许您在同一个查询中执行多个不同的操作。
WITH 递归
在 WITH 子句中可以使用自身输出的数据。
公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE。递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。
HAVING
HAVING子句用来筛选分组后的各组数据。
WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件。
HAVING在SELECT语句中的位置
1 | |
基本语法如下:
1 | |
DISTINCT
和SELECT一起用,用于去重
基本语法如下:
1 | |
好了,基本的操作到这里也就结束了,完结撒花~