数据储存体系梳理
2023-02-03 16:38:25 0 举报
AI智能生成
登录查看完整内容
为你推荐
查看更多
1.存储工具发展历程. 2.针对关系型数据库SQL知识,做一个系统思维导图
作者其他创作
大纲/内容
MariaDB开源免费 轻量级数据库
Mysql
闭源收费 /偏重/大型数据库
Orcal
PostgreSQL
RDBMS
文档类型数据库 bson结构. 最像关系型数据库的NoSql
Mongo
Redis
Kafka
Hive
Elastic Search / ClickHouse /Doris
Hbase/Cassandra
NoSQL
除了要兼顾存储海量数据,也要具备 RDBMS 的 ACID 特性以及对于 SQL 的支持能力
Doris
TiDB
NewSQL
主要支持 Upserts、Deletes 和 Incremental 数据处理
Hudi
解决hive的ACID以及upsert角度出发来解决数据高效更新的问题
Iceberg
Lakehouse
存储工具
一组相关的数据
行
相同类型的数据
列
主键也是一个索引字段
一个表只能有一个主键
基本原则:不使用任何业务相关的字段作为主键
普通自增主键ID
通用唯一识别码 (Universally Unique Identifier)
UUID
常用主键
主键
表的外键就是另一表的主键,外键将两表联系起来
外键
概念
CREATE INDEX <索引的名字> ON tablename (列的列表);
建表指定索引
创建索引
通过UNIQUE关键字我们就添加了一个唯一索引。
ALTER TABLE studentsADD UNIQUE INDEX uni_name (name);
只添加一个唯一约束而不创建唯一索引
ALTER TABLE studentsADD CONSTRAINT uni_name UNIQUE (name);
索引列的所有值都只能出现一次,即必须唯一
唯一索引
前缀索引
索引
定长字符
char
varchar
varchar2
nvarchar
text
整型
int
占8 个字节,用64 位二进制描述
双精度小数
double
占4 个字节,用32 位二进制描述
单精度小数
float
Binary Large Object)表示二进制类型的大对象
blob
日期类型
DATE
YYYY-MM-DD hh:mm:ss 混合日期和时间值,时间戳
TIMESTAMP
数据类型
表
InnoDB 支持外键
mysql8默认索引
innodb
myisam
mysql存储引擎
数据库事务可以确保该事务范围内的所有操作都可以全部成功或者全部失败
多条语句作为一个整体进行操作的功能叫做事务
一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
原子性(Atomicity)
一致性(Consistency)
指一个事务读取到另一个事务未提交的数据。
Read uncommitted
指一个事务对同一行数据重复读取两次,但得到的结果不同。
Oracle默认隔离级别. 可能出现不可重复读
Read committed
幻读就是没有读到的记录,以为不存在,但其实是可以更新成功的,并且,更新成功后,再次读取,就出现了。
MySQL默认隔离级别. 事务可能会遇到幻读(Phantom Read)的问题
Repeatable read
由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用Serializable隔离级别。
脏读、不可重复读、幻读都不会出现。
Serializable
隔离性(Isolation)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
持久性(Durability)
满足条件
事务(transaction)
数据库认识
按照表字段顺序依次增加
根据列出的字段按顺序增加
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
INSERT IGNORE INTO ...
增
DELETE FROM table_nameWHERE some_column=some_value;
删
改
SELECT * FROM table_name;
SELECT 想要的字段 FROM table_name;
强制使用指定索引
SELECT * FROM students FORCE INDEX (idx_class_id) WHERE class_id = 1 ORDER BY id DESC;
查
SQL语句基础
SELECT * FROM WebsitesWHERE name LIKE 'G%';
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
like
between
SELECT * FROM WebsitesORDER BY alexa; 默认升序
ORDER BY field DESC 降序
order by
limit
having分组条件过滤
group by
inner join
实例
左外连接
left join
首先返回右表中所有的数据;对于左表,返回满足连接条件的数据,如果没有相应的数据就返回空值。
右外连接
right join
展示两表所有数据. 相当于左右连接结果的并集
full join
交叉连接可能会导致查询结果的数量急剧增长,从而引起性能问题;通常应该使用连接条件进行过滤,避免产生交叉连接。
cross join
join
SELECT emp_id FROM excellent_emp WHERE year = 2018 UNIONSELECT emp_id FROM excellent_emp WHERE year = 2019;
union
UNION ALL 不需要进行重复值的排除,性能比 UNION 更好;尤其是数据量比较大的情况下。
代替or优化执行效率
使用场景
union all
别名
as
聚合函数一般配合group by使用
sum
max
min
avg
count
当前时间
now/sysdate
trim()----去重空格
转大写
upper
转小写
lower
条件过滤,用来筛选前面GROUP BY的结果
having
NVL()
decode相当于:case when then else end语句
decode()
常用函数
不可能用比较运算符,如=、<或<>,来测试NULL值。我们将不得不使用 \"IS NULL \"和 \"IS NOT NULL \"操作符来代替。
实例:查询address列不为空的数据
is null/ not null
SELECT * FROM CustomersWHERE Country='Germany' OR Country='Spain' LIMIT 5;
国家为 \"Germany\"或 \"Spain\"的 \"Customers\"中选择所有字段:
SELECT * FROM CustomersWHERE NOT Country='Germany' LIMIT 5;
从国家不是 \"Germany\"的 \"Customers\"中选择所有字段:
and/ or / not
SQL实用函数
SELECT emp_name FROM employee WHERE job_id IN (SELECT job_id FROM employee WHERE dept_id = 3);
子查询返回了研发部所有员工的入职日期;“> ALL”表示比结果中的所有值都大,也就是大于结果中的最大值。
结合比较运算符(=、!=、<、<=、>、>=)使用
ALL、ANY/SOME 运算符
表子查询
EXISTS 运算符用于判断查询子句是否有记录,如果有一条记录存在就返回 True,否则返回 False。
EXISTS 之后是一个关联子查询,先执行外查询找到 d.dept_id;然后依次将 d.dept_id 传递给子查询,判断该部门是否存在女性员工;子查询一旦找到任何数据立即返回结果。EXISTS 只判断结果的存在性,因此子查询的 SELECT 列表中的内容无所谓,通常使用一个常量值。该查询的结果表明“研发部”和“财务部”存在女性员工。
SELECT d.dept_name FROM department d WHERE EXISTS ( SELECT 1 FROM employee e WHERE e.sex = '女' AND e.dept_id = d.dept_id) ORDER BY dept_name;
EXISTS
子查询
CREATE VIEW view_name ASSELECT column_name(s)FROM table_nameWHERE condition
视图
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...
SQL关键字顺序
FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORDER BY > LIMIT
执行顺序
SQL查询执行原理
SQL高级
SQL
0 条评论
回复 删除
下一页