SQL语言
SQL(Structured Query Language,结构化查询语言)是一种专门用来与关系型数据库通信的编程语言。它被广泛用于创建、操作、查询和管理关系数据库中的数据。SQL 语言的功能包括数据查询、数据操作、数据定义和数据访问控制。
SQL语言一般分为一下几种:
- DQL:数据库查询语言。执行查询操作。
- DML:数据库操作语言。执行增删改操作。
- DDL:数据库定义语言。定义表,数据库或视图等。
- DCL:数据库控制语言。管理用户权限。
- TCL:事务控制语言。事务提交、回滚。
我们主要讨论DML与DDL。也就是数据库的增删改查操作。
MySQL体系结构
MySQL主要由连接池组件、管理服务和工具组件、SQL接口组件、查询分析器组件、优化器组件、缓冲组件、插件式存储引擎、物理文件组成。我们重点了解连接池及缓冲组件。
对于数据库的连接,使用长连接是不明智的选择,因为我们主要进行增删改查操作,操作粒度较小,所以数据库一般使用短连接。MySQL内部使用连接池管理大量连接,也就是用一个主线程接收连接,用多个连接线程处理业务,使用select+阻塞IO。select只监听lisentfd的事件,MySQL的命令也是并发处理的。连接池用于鉴权、线程复用等。
SQL接口将SQL语句解析生成相应对象,如DML、DDL、存储过程、视图等。
解析器负责类似C++的语句分析,将DML或DDL进行分析,生成语法树。
查询优化器则指定语句执行计划,不同的SQL语句有不同的执行方式,制定多个执行计划,根据磁盘状态选择最优计划。
MySQL的缓冲组件就是一块内存区域用来做缓冲池,同计算机系统中的内存原理一样,为了加快访问速度,在读取页操作时会先将磁盘中读到的页放到缓冲池,下一次读到相同的页会先看这个页是不是在缓冲池,如果在就直接读,不在就读磁盘。淘汰机制使用LRU。但是MySQL8.0已经删除了缓存机制。
存储引擎负责数据存储与查询,并且决定写入磁盘还是内存。主流的是InnoDB。
一条select语句的执行流程如下:
三范式与反范式
数据库的三范式是关系型数据库设计中的规范,旨在减少数据冗余和提高数据一致性。三范式的初衷是为了减小空间占用。
- 第一范式:列不可分。确保每列保持原子属性,数据库表中的所有字段都是不可分解的。
- 第二范式:依赖主键。确保表中的每列都和主键相关,而不能只与主键的某一部分相关。
- 第三范式:直接依赖。确保每列都与主键直接相关,而不是简介相关,以减少数据冗余。
虽然三范式给我们规范了表的设计,避免数据冗余,但是在实际业务逻辑中我们如果遇到表的数量越来越多的情况,就会有更多的联表查询,系统整体性能就降低了。这时候我们就需要进行反范式设计来减少联表查询。
CRUD
这里仅介绍基础的CRUD,还有高级查询内容大家可以搜索完整的资料,那里会讲的比较全面。此处就不过多赘述了。否则就偏离本篇博客标题了。(作为一个c++人用得不多,并且我真的讨厌这种语言,我选择用AI,能看懂就行,太无聊了这玩意儿)。
创建数据库
create database `数据库名`;
删除数据库
drop database `数据库名`;
选择数据库
use `数据库名`;
约束
- 非空约束:not null
- 自增约束:auto_increment
- 唯一约束:unique
- 主键约束:primary
- 外键约束:foreign
创建表
create table `表名` (列名 列属性);
刪除表
drop table `表名`;//一般在跑路的时候用。
清空表数据
truncate table `表名`;//删除表数据,其他保留。以页(16k,至少两行数据)为单位删除。
delete table `表名`;//删除部分或全部数据(条件删除),其他保留。逐行删除。
drop与truncate无法进行事务回滚,通常在服务器停机维护时才用。
增删改查
//增
insert into `表名`(`字段1`,`字段2`,...)values(value1,value2,...)()()...;
//删
delete from `表名` [where Clause];
//改
update 表名 set field1=new_value1,field2=new_value2 [,fieldn=new_valuen];
//查
select field1,field2,...fieldN from 表名 [where Clause];
视图
视图就是一张虚拟逻辑表,本身不包含数据,内容由查询定义。
create view 视图名 as <select语句>;