MySQL
一、数据库
1.数据库:DataBase(DB),是存储和管理数据的仓库。
2.数据库管理系统:DataBase Management System (DBMS),操纵和管理数据库的大型软件。
3.SQL:Structed Query Language,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。
二、MySQL数据模型
1.关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库
特点:
(1)使用表格存储数据,格式统一,便于维护;
(2)使用SQL语言操作,标准统一,使用方便,可用于复杂查询。
2.SQL通用语法:
(1)SQL语句可以单行或多行书写,以分号结尾;
(2)SQL语句可以使用空格/缩进来增强语句的可读性;
(3)MySQL数据库的SQL语句不区分大小写;
(4)注释:
- 单行注释:--注释内容 或#注释内容(MySQL特有)
- 多行注释:/注释内容/
3.SQL分类
(1)DDL(Data Definition Language):数据定义语言,用来定义数据库对象(数据库,表,字段);
(2)DML(Data Manipulation Language):数据操作语言,用来对数据库表中的数据进行增删改;
(3)DQL(Data Query Language):数据查询语言,用来维护数据库中表的记录;
(4)DCL(Data Control Language):数据控制语言,用来创建数据库用户、控制数据库的访问权限。
三、DDL
1.数据库操作
(1)查询
-
查询所有数据库:show databases;
-
查询当前数据库:select database();
(2)使用数据库:use 数据库名;
(3)创建数据库:create databases [if not exists] 数据库名;
(4)删除数据库:drop database [if exists] 数据库名;
(5)注意事项:上述语法中的database,也可以替换成schema。如:create schema 数据库名;
2.表操作
(1)创建表
(2)约束
- 概念:约束时作用于表中字段上的规则,用于限制存储在表中的数据。
- 目的:保证数据库中数据的正确性、有效性和完整性。
(3)数据类型
-
数值类型
-
字符串类型
-
日期类型
(4)表查询
- 查询当前数据库所有表:show tables;
- 查询表结构: desc 表名;
- 查询建表语句:show create table 表名;
(5)表修改
- 添加字段:alter table 表名 add 字段名 类型(长度) [comment 注释] [约束];
- 修改字段类型:alter table 表名 modify 字段名 新数据类型(长度);
- 修改字段名和字段类型:alter table 表名 change 就字段名 新字段名 类型(长度) [comment 注释] [约束];
- 删除字段:alter table 表名 drop column 字段名;
- 修改表名:rename table 表名 to 新表名;
(6)表删除
drop table [if exists] 表名;
三、DML
Data Manipulation Language(数据库操作语言),用来对数据库中表的数据记录进行增删改操作。
1.添加数据
(1)指定字段添加数据:insert into 表名 (字段名1,字段名2) values(值1,值2);
(2)全部字段添加数据:insert into 表名 values (值1,值2);
(3)批量添加数据(指定字段):insert into 表名 (字段名1,字段名2) values(值1,值2),(值1,值2);
(4)批量添加数据(全部字段):insert into 表名 values (值1,值2),(值1,值2);
(5)注意事项;
- 插入数据时,指定的字段的顺序需要与值的顺序一一对应;
- 字符串和日期型数据应该包含在引号中;
- 插入的数据大小,应该在字段的规定范围内。
2.更新数据
(1)update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , ...[where 条件];
(2)修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
3.删除数据
(1)delete from 表名 [where 条件];
(2)注意事项:
- delete语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据;
- delete语句不能删除某一个字段的值(如果要操作,可以使用update,将该字段的值置为null)。
四、DQL
1.基本查询
(1)查询多个字段:select 字段1,字段2,字段3 from 表名;
(2)查询所有字段(通配符):select * from 表名;
(3)设置别名:select 字段1 [as 别名1],字段2 [as 别名2] from 表名;
(4)去除重复记录:select distanct 字段列表 from 表名;
(5)函数:
- if(表达式,tvalue,fvalue):当表达式为true时,取值tvalue;当表达式为false时,取值fvalue。
- case expr when value1 then result1 [when value2 then result2] [else result] end
(6)注意事项:*号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。
2.条件查询(where)
select 字段列表 from 表名 where 条件列表;
3.聚合函数
(1)介绍:将一列数据作为一个整体,进行纵向计算;
(2)语法:select 聚合函数(字段列表) from 表名。
(3)注意事项:
- null之不参与所有聚合函数的运算;
- 统计数量可以用:count(*)、count(字段)、count(常量),推荐使用count(*)。
4.分组查询(group by)
(1)语法:select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
(2)where和having区别
- 执行时机不同:where是分组前进行过滤,不满足where条件,不参与分组;二having是分组之后对结果进行过滤;
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
(3)注意事项:
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
- 执行顺序:where>聚合函数>having
5.排序查询(order by)
(1)语法:select 字段列表 from 表名 [where 条件] [group by 分组字段] order by 字段1 排序方式1,字段2 排序方式2...;
(2)排序方法:
- asc:升序(默认值)
- desc:降序
(3)注意事项:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
6.分页查询(limit)
(1)语法:select 字段列表 from 表名 limit 起始索引,查询记录数;
(2)注意事项:
- 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数;
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是limit;
- 如果擦汗寻的是第一页数据,起始索引可以忽略,直接简写为limit 10。
四、多表设计
1.一对多
(1)案例:部门与员工的关系。
(2)关系:一个部门有多个员工,一个员工只属于一个部门。
(3)实现:在数据库表中多的一方,添加字段,来关联一的一方的主键。
2.外键约束
(1)物理外键:使用frrign key定义外键关联另一张表。
缺点:
- 影响增删改的效率(需要检查外键关系);
- 仅用于单节点数据库,不适用于分布式、集群场景;
- 容易引发数据库的死锁问题,消耗性能。
(2)逻辑外键:
- 在业务逻辑层中,解决外键关联;
- 通过逻辑外键,就可以很方便地解决上述问题。
3.一对一
(1)案例:用户与身份证信息的关系。
(2)关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率。
(3)实现:在任意一方加入主键,来关联另外一方的主键,并且设置外键为唯一的(unique)。
4.多对多
(1)案例:学生与课程的关系。
(2)关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择。
(3)实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。
五、多表查询
1.内连接
(1)隐式内连接:select 字段列表 from 表1,表2 where 条件 ...;
(2)显式内连接:select 字段列表 from 表1[inner] join 表2 on 连接条件 ...;
2.外连接
(1)左外连接:select 字段列表 from 表1 left [outer] join 表2 on 连接条件 ...;
(2)右外连接:select 字段列表 from 表1 right [outer] join 表2 on 连接条件 ...;
3.子查询
(1)介绍:SQL语句中嵌套select语句,成为嵌套查询,又称子查询。
(2)形式:select * from t1 where column1 = ( select column1 from t2 ...);
(3)子查询外部的语句可以是insert / update / delete / select 的任何一个,最常见的是select。
(4)分类:
-
标量子查询:子查询返回的结果为单个值(数字、字符串、日期等),最简单的形式。
常用的操作符:= <> > >= < <=
-
列子查询:子查询返回的结果为一列(可以是多行)。
常用的操作符:in 、not in 等
-
行子查询:子查询返回的结果为一行(可以是多列)。
常用的操作符:= 、<> 、in 、not in
-
表子查询:子查询返回的结果为多行多列,常作为临时表。
常用的操作符:in
六、事务
1.概念
事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或者撤销操作请求,及这些操作要么同时成功,要么同时失败。
2.注意事项
默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
3.事务控制
(1)开启事务:start transaction; / begin;
(2)提交事务:commit;
(3)回滚事务:rollback;
4.四大特性(ACID)
(1)原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败。
(2)一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
(3)隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
(4)持久性(Durability):事务一旦提交或者回滚,他对数据库中的数据的改变就是永久的。
七、索引
1.概念
索引(index)是帮助数据库高效获取数据的数据结构。
2.优缺点
(1)优点 :
- 提高数据查询的效率,降低数据库的IO成本;
- 通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗。
(2)缺点:
- 索引会占用存储空间;
- 索引大大提高了查询效率,同时也降低了insert、update、delete的效率。
3.结构
(1)MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。如果没有特别指明,都是默认的B+Tree结构组织的索引。
(2)B+Tree(多路平衡搜索树)
特点:
- 每一个节点,可以存储多个key(有k个key,就有n个指针);
- 所有的数据都存储在叶子节点,非叶子节点仅用于索引数据;
- 叶子节点形成了一颗双向链表,便于数据的排序及区间范围查询。
4.操作语法
(1)创建索引:create [unique] index 索引名 on 表名(字段名 , ...);
(2)查看索引:show index from 表名;
(3)删除索引:drop index 索引名 on 表名;
(4)注意事项:
- 主键字段,在建表时,会自动创建主键索引;
- 添加唯一约束时,数据库实际上会添加唯一索引。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具