MySql基础
# 1. 数据模型
关系型数据库(RDBMS)
概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库
# 2. SQL简介
# 2.1 通用语法
- SQL语句可以单行或多行书写,以分号结尾;
- SQL语句可以使用空格/缩进来增强语句的可读性;
- MySQL数据库的SQL语句不区分大小写;
- 注释:
- 单行注释:-- 注释内容 或 # 注释内容(MySQL特有)
- 多行注释: /* 注释内容 */
# 2.2 分类
💡SQL语句根据其功能被分为四大类:DDL
、DML
、DQL
、DCL
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
# 3. 数据库设计 - DDL
# 3.1 数据库操作
💡DDL中数据库的常见操作:查询
、创建
、使用
、删除
① 查询:
- 所有数据库:
show databases;
- 当前数据库:
select database();
② 创建:create database [ if not exists ] 数据库名;
③ 使用:use 数据库名;
④ 删除:drop database [ if exists ] 数据库名;
说明:上述语法中的database,也可以替换成 schema
# 3.2 表操作
💡表结构的操作:创建
、查询
、修改
、删除
① 创建:
create table 表名(
字段1 字段1类型 [约束] [comment 字段1注释 ],
字段2 字段2类型 [约束] [comment 字段2注释 ],
......
字段n 字段n类型 [约束] [comment 字段n注释 ]
) [ comment 表注释 ] ;
2
3
4
5
6
[ ] 中的内容为可选参数; 最后一个字段后面没有逗号; 在MySQL数据库当中,提供了以下5种约束:
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 限制该字段值不能为null | not null |
唯一约束 | 保证字段的所有数据都是唯一、不重复的 | unique |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | primary key |
默认约束 | 保存数据时,如果未指定该字段值,则采用默认值 | default |
外键约束 | 让两张表的数据建立连接,保证数据的一致性和完整性 | foreign key |
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。 主键自增:auto_increment(从1开始)
② 查询:
- 查询所有表:
show tables;
- 查看表结构:
desc 表名 ;
- 查询建表语句:
show create table 表名 ;
③ 修改:
- 添加字段:
alter table 表名 add 字段名 类型(长度) [comment 注释] [约束];
- 修改数据类型:
alter table 表名 modify 字段名 新数据类型(长度);
- 删除字段:
alter table 表名 drop 字段名;
- 修改表名:
rename table 表名 to 新表名;
④ 删除:
- 删除表:
drop table [ if exists ] 表名;
# 4. 数据库操作 - DML
# 4.1 增加(INSERT)
- 向指定字段添加数据
insert into 表名 (字段名1, 字段名2) values (值1, 值2);
1 - 全部字段添加数据
insert into 表名 values (值1, 值2, ...);
1 - 批量添加数据(指定字段)
insert into 表名 (字段名1, 字段名2) values (值1, 值2), (值1, 值2);
1 - 批量添加数据(全部字段)
insert into 表名 values (值1, 值2, ...), (值1, 值2, ...);
1
# 4.2 修改(UPDATE)
update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [where 条件] ;
# 4.3 删除(DELETE)
delete from 表名 [where 条件] ;
# 5. 数据库操作 - DQL
# 5.1 单表操作
# 5.1.1 基本查询
查询多个字段
select 字段1, 字段2, 字段3 from 表名;
1查询所有字段(通配符)
select * from 表名;
1设置别名
select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ] from 表名;
1去除重复记录
select distinct 字段列表 from 表名;
1
# 5.1.2 条件查询
select 字段列表 from 表名 where 条件列表 ;
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
between ... and ... | 在某个范围之内(含最小、最大值) |
in(...) | 在in之后的列表中的值,多选一 |
like 占位符 | 模糊匹配(_匹配单个字符, %匹配任意个字符) |
is null | 是null |
逻辑运算符 | 功能 |
---|---|
and 或 && | 并且 (多个条件同时成立) |
or 或 || | 或者 (多个条件任意一个成立) |
not 或 ! | 非 , 不是 |
聚合函数 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
# 5.1.3 分组查询
分组其实就是按列进行分类(指定列下相同的数据归为一类),然后可以对分类完的数据进行合并计算。
分组查询通常会使用聚合函数进行计算。
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];
💡 执行顺序:where > 聚合函数 > having
where与having区别(面试题)
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
# 5.1.4 排序查询
select 字段列表
from 表名
[where 条件列表]
[group by 分组字段 ]
order by 字段1 排序方式1 , 字段2 排序方式2 … ;
2
3
4
5
排序方式:
- ASC :升序(默认值)
- DESC:降序
# 5.1.5 分页查询
select 字段列表 from 表名 limit 起始索引, 查询记录数 ;
- 起始索引从0开始。 计算公式 : 起始索引 = (查询页码 - 1)* 每页显示记录数
- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 条数
# 5.2 多表操作
# 5.2.1 一对多
一对多关系实现:在数据库表中多的一方,添加字段,来关联属于一这方的主键。 外键约束:让两张表的数据建立连接,保证数据的一致性和完整性。
foreign key
外键约束的语法:
-- 创建表时指定
create table 表名(
字段名 数据类型,
...
[constraint] [外键名称] foreign key (外键字段名) references 主表 (主表列名)
);
-- 建完表后,添加外键
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名);
2
3
4
5
6
7
8
物理外键和逻辑外键
物理外键
- 概念:使用foreign key定义外键关联另外一张表。
- 缺点:
- 影响增、删、改的效率(需要检查外键关系)。
- 仅用于单节点数据库,不适用与分布式、集群场景。
- 容易引发数据库的死锁问题,消耗性能。
逻辑外键
- 概念:在业务层逻辑中,解决外键关联。
- 通过逻辑外键,就可以很方便的解决上述问题。
# 5.2.2 一对一
一对一 :在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
# 5.2.3 多对多
多对多的关系在开发中属于也比较常见的。比如:学生和老师的关系,一个学生可以有多个授课老师,一个授课老师也可以有多个学生。在比如:学生和课程的关系,一个学生可以选修多门课程,一个课程也可以供多个学生选修。