存储&数据库&常见SQL语言 | 青训营笔记

91 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第五篇笔记

存储系统

什么是存储系统?

一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统

存储系统的特点

  • 作为后端软件的底座,性能敏感

  • 存储系统代码,既 ”简单“又”复杂“

    • 简单体现在与底层硬件交互的代码要追求简单,但相关错误处理要尽量全面复杂
  • 存储系统软件架构,容易受硬件影响

存储器层级架构

image.png 随着层级越往底部深入,存储空间越来越大,存储速度越来越慢

数据怎么从应用到存储介质

image.png

  • 缓存很重要,贯穿整个存储体系
  • 拷贝很重要,应该尽量减少
  • 硬件设备五花八门,需要有抽象统一的接入层

RAID技术

image.png

单机存储: 单个计算机节点上的存储软件系统,一般不涉及网络交互

  • 本地文件系统:Linux哲学
  • Key-Value存储

分布式存储: 在单机存储的基础上实现了分布式协议,设计大量网络交互

  • 分布式文件系统
  • 分布式对象存储
  • 例子:HDFS、Ceph

数据库概论

数据库管理系统(DBMS):按照某种数据模型来组织、存储和管理数据的仓库

按照数据模型的特点可以将DBMS分为:

  • 网状模型DBMS
  • 层次模型DBMS
  • 关系模型DBMS

image.png

单机数据库=单个计算机节点上的数据库系统

单机数据库——关系型数据库

Edgar.F.Codd于1970年提出【关系模型】

什么是关系

  • 关系=集合=任意元素组成的若干有序偶对 反应了事物间的关系
  • 关系代数=对关系作运算的抽象查询语言 交、并、笛卡儿积
  • SQL=一种D(Domain)S(Specific)L(Language)=方便人类阅读的关系代数表达式

image.png

关系型数据库特点

  • 结构化数据友好

  • 支持事务(ACID)

    • Atomicity:原子性,事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败

      任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成

    • Consistency:一致性,事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。

      ==比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱

    • Isolation:隔离性,事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。

      一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的

    • Durablity:持久性,事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态

    在事务进行过程中,未结束之前,DML语句是不会更改底层数据,只是将历史操作记录一下,在内存中完成记录。只有在事物结束的时候,而且是成功的结束的时候,才会修改底层硬盘文件中的数据

  • 支持复杂查询语言:SQL

代表产品

  • 开源免费代表:Mysql和PostgreSQL
  • 商业代表:Oracle

单机数据库——非关系型数据库

非关系型数据库也是存储系统,但是一般不要求严格的结构化

特点

  • 半结构化数据友好
  • 可能支持事务(ACID)
  • 可能支持复杂查询语言

代表产品

MongoDB、Redis、Elasticsearch

分布式数据库

单机数据库遇到哪些问题&挑战,需要我们引入分布式架构来解决

  1. 容量

    单点容量有限受硬件影响,在分布式数据库中,利用池化技术,将存储节点池化,动态扩缩容

  2. 弹性

    单点数据库在弹性变更时,面临巨大的拷贝消耗

  3. 性价比

SQL-Query

  1. 避免重复记录-distinct

    --查询学生表中的系名(重复的不输出)
    select distinct sdno from student
    
  2. 输出前多少行或前百分之几

    配合order by可以完成最...的前多少行的选择效果

    1.select top 3 * 
            from student
    2.select top 3 percent * 
            from student
    
  3. sql中的条件表达

    • 比较

      • 判断相等与否用=,不是==
      • 不相等!= or <>
      • 任何符号前面可以加not
    • 确定范围

      • between and(包含两边范围) Eg:between 60 and 70 =[60,70]
      • not between and Eg:not between 60 and 70 =(-∞, 60) ∪ (70, ∞)
    • 确定集合

      • in or not in
    • 字符匹配

      • like or not like
      • %表示1个或多个字符匹配,_表示一个字符匹配
      • 多个匹配可以用[]括起来
      --查找姓张或姓李的
      sname like '李%' or '张%'
      sname like '[张李]%'
      
    • 空值

      • IS NULL or IS NOT NULL
    • 逻辑运算

      • andornot
  4. 连接查询

    • WHERE子句类型
    from table1, table2
    where table1.num = table2.num --连接条件
    
    • FROM子句类型
    from table1 [connect_type] table2 on table1.num = table2.num(连接条件)
    

    💡 Connect Type 内连接(inner join):只列出与连接条件相匹配的数据行 外连接(outer join):不只列出与连接条件相匹配的数据行,没有匹配的也会显示,用NULL来表示 —左外连接left outer join返回的是左侧表的所有行,右外连接right outer join返回的是右侧的所有行 交叉连接(cross join):返回连接表中所有数据行的笛卡尔乘积

  5. 嵌套查询

    • 按照嵌套层次

      • 单层嵌套查询:嵌套层次只有一层的,eg双重for循环可以理解为单层嵌套查询
      • 多层嵌套查询:嵌套层次不只一层的,eg三重及以上for循环可以理解为多层嵌套查询
    • 按照子查询的返回结果

      • 单值嵌套查询
      --查询“大学英语”的选课信息
      select * from sc
          where cno = (select cno from course where cname = '大学英语')
      
      • 多值嵌套查询

      返回多值的情况下,不能只使用=,>,<,≥等和具体值做比较的运算符,必须使用条件运算符any(或some)、all、in和exists,有时与>,<,≥,≤等配合使用

      any:满足子查询中的任意一个值
      all:满足子查询中的所有值
      in:字段内容是结果集合或子查询中的内容
      >any:大于子查询中的任意一个值,即大于最小值
      <any:小于子查询中的任意一个值,即小于最大值
      >all:大于子查询的所有值,即大于最大值
      <all:小于子查询的所有值,即小于最小值
      =any:等于in
      exists:判断子查询是否有返回值,exists返回的是逻辑值1or0
      eg:查找还没有选课的学生
      select * from student
          where not exists(select * from sc where sc.sno=student.sno)
      --exists当查询到一个返回记录时就是该学生在sc表中有匹配树即有选课,返回1,
      --前面的not就会把where语句变成0,不在主查询中输出
      --当查询的学生在sc表没有匹配,即没有选课,返回0,前面的not就会把where语句变成1,在主查询中输出
      
  6. 统计和分组查询

    聚合函数

    • count(*) or count( [distinct|all] <列名> )

    • sum( [distinct|all] )

    • avg( [distinct|all] )

    • max/min( [distinct|all] )

    可选参数“distinct|all“,默认的是all,统计所有值

    分组函数

    group by

💡 1. 对于有分组统计使用了group by子句的,在select语句中只能输出分组列和包含聚合函数的计算列,不能输出其他列 2. 可以一次对多列进行分组,形如group by col1, col2,.....coln,先对列1分组,组内数据再依据列2数据分组.....

  1. 查询结果处理

    • 排序输出——order by

      • asc:升序,默认排序方式

      • desc:降序

      因为排序输出是对最后结果做处理,所以不能在子查询中使用

    可以多组排序,例如先对学生学号排序,再对成绩排序

    order by sco,grade desc
    --对学号是asc升序排序,所以小的在最上,而对grade是desc是降序,所以大的在最上