概述
关系数据库
关系数据库管理系统(Relational DataBase Management System, RDBMS)是以集合理论为基础的系统,实现为具有行和列的二维表。
与 RDBMS 交互的标准方法,是结构化查询语言(Structured Query Language, SQL)编写查询。
数据值具有类型,可以是数字、字符串、日期、未解释的二进制大对象,或其他类型。系统强制使用类型。
重要的是,表可以联接并转化为新的、更复杂的表,因为它们的数学基础是关系(集合)理论。
键-值数据库
键-值(Key-Value, KV)存储库将键与值配对,类似于所有流行编程语言中的映射(或哈希表)。
因为 KV 存储库对资源的要求非常少,所以这种数据库类型在一些场景中有令人难以置信的高性能,但是当你有复杂的查询和聚合需求时,它一般不会有帮助。
列型数据库
列型(或面向列的数据库)的命名源自于其设计设计的一个重要方面,即来自一个给定的列(在二维表的意义上)的数据存放在一起。
文档型数据库
面向文档的数据库存储的就是文档。简而言之,文档就像是哈希,具有一个独一无二的标识符(ID)字段和值,值可能是任何类型,包括更多的哈希。
文档可以包含嵌套的结构,因此,它们表现出了调试的灵活性,允许有可变域。
图数据库
图数据库善于处理高度互联的数据。图数据库包含节点及节点之间的关系。
节点和关系可以有一些属性(一些键-值对),用来存储数据。
图数据库的真正实力是按照关系遍历节点。
PostgerSQL
简述
PostgreSQL 是一个关系数据库管理系统。
关系数据库流行的原因,不仅在于其庞大的特性集(触发器、存储过程、高级索引)、数据的安全性(符合 ACID),或符合大多数人的思维方式,还在于它们的查询灵活性。
基本使用
如果以管理员用户运行的话,PostgreSQL 的提示符后是#,如果是普通普通用户后面跟的是$。
输入\h,可以列出有关 SQL 命令的信息,\?列出以反斜杠开始的 psql 特有命令的帮助信息。
创建表
1 | -- 新建表 |
基本表操作
1 | -- 重命名表 |
插入数据
1 | insert into countries (country_code, country_name) values |
查询数据
1 | select * from countries; |
删除数据
1 | delete from countries where country_code='ll'; |
外键约束
1 | create table cities( |
更新
1 | update cities set postal_code='97205' where name='Portland'; |
内联接
只有列值匹配,inner join才会返回一行
1 | select cities.*, country_name from cities inner join countries on cities.country_code=countries.country_code; |
复合联接
1 | create table venues ( |
插入后返回
1 | insert into venues (name, postal_code, country_code) values |
外联接
1 | create table events ( |
快速索引
RDBMS数据库的速度源于其高效的数据块管理、尽可能少的磁盘读取、查询优化等技术。
如果没有索引,就必须从磁盘读取每一行,都能知道是否是匹配行。
索引是一个特殊的数据结构,目的是避免执行查询时进行全表扫描。
1 | -- 哈希索引 |
聚合查询
1 | -- 准备数据 |
分组
1 | select venue_id, count(*) from events group by venue_id; |
事务
事务保障了关系数据库的一致性。
事务的准则是,要么全部成功,要么全部失败。
事务确保一组命令中的每一条命令都执行。
如果过程中间发生了任何失败,所有的命令将回滚,就像它们从未发生过一样。
PostgreSQL 的事务遵循 ACID
A:Atomic,原子性
C:Consistent,一致性
I:Isolated,隔离性
D:Durable,持久性
1 | begin transaction; |
存储过程
存储过程可以通过巨大的架构代价取得巨大的性能优势。
使用存储过程可以避免将数千行数据发送到客户端应用程序,但也让应用程序代码与该数据库绑定,因此,不应该轻易决定使用存储过程。
1 | create or replace function |
触发器
当插入或更新这类事件发生时,触发器自动调用存储过程。
1 | -- 日志表 |
视图
使复杂查询的结果用起来像其他任何表一样,是查询的别名。
1 | -- 创建视图 |
联表分析
1 | -- extension |
全文和模糊查询
ilike表示不区分大小写
'%'和_是通配符,_表示匹配一个字符
1 | -- 需要的扩展 |
正则表达式查询
1 | select count(*) from movies where title !~*'^the.*'; |
字符串相似比较算法 levenshtein fuzzystrmatch 扩展模块提供
1 | select levenshtein ('bat', 'fads'); |
三连词(trigram),pg_trgm 扩展
1 | select show_trgm('Avatar'); |
全文检索
1 | -- @@ 全文查询运算 |
多维超立方体(cube)
1 | select name cube_ur_coord('(0,7,0,0,0,0,0,0,0,7,0,0,0,0,10,0,0,0)', street_address) as score from venues v |
MariaDB
管理
1 | # 创建新的用户帐户 |
数据类型
数字
- TINYINT:
-128到127的有符号范围内的小整数或0到255的无符号整数 - BOOLEAN:
0=false,1=true - SMALLINT:
-32768到32768的有符号范围内的整数或0到65535的无符号整数 - MEDIUMINT: 有符号范围
-8388608到8388607中的整数,无符号范围0到16777215中的整数 - INT(或 INTEGER): 默认范围跨越
-2147483648到2147483647,标记为unsigned时范围跨越0到4294967295 - BIGINT: 有符号范围
9223372036854775808到9223372036854775807内的整数,无符号范围0到18446744073709551615内的整数 - DECIMAL(DEC,NUMERIC,FIXED): 精确的定点数,M 指定其数字,D 指定小数后的数字。 M 值不添加“ - ”或小数点。如果 D 设置为 0,则不会出现小数或小数部分,并且该值将舍入为最接近的 DECIMAL INSERT。最大允许位数为 65,小数位数的最大值为 30.默认值 M 的默认值为 10,省略时 D 为 0
- FLOAT:
-3.402823466E + 38至-1.175494351E-38,1.175494351E-38至3.402823466E + 38 - DOUBLE(或 REAL、DOUBLE PRECISION):
-1.7976931348623157E + 308至-2.2250738585072014E-308,2.2250738585072014E-308至1.7976931348623157E + 308 - BIT: 表示位字段,M 指定每个值的位数。省略 M 时,默认值为 1.位值可以通过“b’[value]’”应用,其中值表示 0 和 1 中的位值。零填充从左边自动发生全长;例如,“10”变为“0010”
日期和时间
- DATE: 表示日期范围
1000-01-01”到“9999-12-31,并使用YYYY-MM-DD日期格式 - TIME:
-838:59:59.999999到838:59:59.999999的时间范围 - DATETIME: 表示范围
1000-01-01 00:00:00.000000至9999-12-31 23:59:59.999999,使用YYYY-MM-DD HH:MM:SS格式 - TIMESTAMP: 表示
YYYY-MM-DD HH:MM:DD格式的时间戳 - YEAR: 表示 4 位数格式的年份,四位数格式允许在
1901到2155和0000范围内的值
字符串
- String literals: 表示用引号括起来的字符序列
- CHAR: 表示包含指定长度的空格的右侧带有固定长度的字符串,取值范围为
0〜255,缺省值为1 - VARCHAR: 表示一个可变长度字符串,范围(最大列长度)为
0到65535 - BINARY: 表示二进制字节字符串
- VARBINARY: 表示可变长度的二进制字节字符串
- TINYBLOB: 表示最大长度为
255(28 - 1)个字节的blob列,在存储中,每个都使用一个字节长度的前缀,表示值中的字节数量 - BLOB: 表示最大长度为
65,535(216 - 1)个字节的blob列 - MEDIUMBLOB: 表示最大长度为
16,777,215(224 - 1)个字节的blob列 - LONGBLOB: 表示最大长度为
4,294,967,295(232 - 1)个字节的blob列 - TINYTEXT: 表示最大长度为
255(28 - 1)个字符的文本列 - TEXT: 表示最大长度为
65,535(216 - 1)个字符的文本列 - MEDIUMTEXT: 表示最大长度为
16,777,215(224 - 1)个字符的文本列 - LONGTEXT: 表示最大长度为
4,294,967,295或4GB(232 - 1)个字符的文本列 - ENUM: 表示一个列表中只有一个值的字符串对象
- SET: 表示一个列表中具有零个或多个值的字符串对象,最多包含
64个成员,SET值在内部作为整数值存在
创建索引
1 | -- 创建 |
序列
1 | -- 创建 |
- 本文标题:数据库笔记
- 创建时间:2020-07-09 15:41:03
- 本文链接:2020/07/09/数据库笔记/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!