作者:Gakki
1. 基础
1.1 数据库管理系统(数据库软件)
- 关系型数据库(RDBMS)
- Oracle 数据库
- MySQL 数据库
- SQL server 数据库
- PostgreSQL
- SQLite
- 非关系型数据库(NoSQL)
- Redis(最好的缓存数据库)
- MongoDB(最好的文档型数据库)
- Elasticsearch(最好的搜索服务)
- Cassandra(最好的列式数据库)
- HBase(优秀的分布式、列式数据库)
2. MySQL 的 DDL 操作
2.1 DDL 解释
- DDL(Data Definition Language):数据定义语言,该语言部分包括以下内容:
- 对数据库的常用操作;
- 对表结构的常用操作;
- 修改表的结构。
2.2 对数据库的常用操作
- 查看所有的数据库:
show database; - 创建数据库:
create database [if not exists] 数据库名字 [charset = utf-8]; - 切换数据库:
use 数据库名字; - 删除数据库:
drop database [if exists] 数据库名字;
2.3 对表结构的常用操作 - 其他操作
- 查看当前数据库的所有表名称:
show tables; - 查看指定某个表的创建语句:
show create table 表名; - 查看表结构:
desc 表名; - 删除表:
drop table 表名;
2.4 对表结构的常用操作 - 修改表结构格式
2.4.1 添加列
- 语法格式:
alter table 表名 add 列名 类型(长度) [约束]; - 举例:
- 为 student 表添加一个新的字段为:系别 dept ,类型为 varchar(20);
alter table student add dept varchar(20);
2.4.2 修改列名和类型
- 语法格式:
alter table 表名 change 旧列名 新列名 类型(长度) [约束]; - 举例:
- student 表 dept 字段更换为 department varchar(30);
alter table student change dept department varchar(30);
2.4.3 删除列
- 语法格式:
alter table 表名 drop 列名 - 举例:
- 删除 student 表中 department 这一列;
alter table student drop department;
2.4.4 修改表名
- 语法格式:
rename table 表名 to 新表名 - 举例:
- 将 student 表改为 stu;
rename table student to stu
3. MySQL 的 DML 操作
3.1 概念
- DML(Data Manipulation Language) 是数据操作语言,主要对 Mysql 的数据进行增删改;
- 关键字:
insert(插入)、update(更新)、delete(删除)、truncate(删除)
3.2 操作
3.2.1 数据插入
- 关键字:
insert - 格式:
- 方式1:
insert into 表名(列名1,列名2,……)value (值1,值2,……) - 方式2:
insert into 表名 value (值1,值2,……)
- 方式1:
3.2.2 数据修改
- 关键字:
update - 格式:
- 方式1:
update 表名 set 字段名 = 值,字段名 = 值,…… - 方式2:
update 表名 set 字段名 = 值,字段名 = 值,…… where ……
- 方式1:
3.2.3 数据删除
- 关键字:
delete、truncate - 格式:
- 方式1:
delete from 表名注:这种方式会将整个表的数据全部删除 - 方式2:
delete from 表名 where …… - 方式3:
truncate 表名注:这个是清空整个表,本质上可以理解为删除了表,并创建新表,和 delete 不同。
- 方式1:
4. MySQL 的约束
⭐⭐⭐4 . 1 主键约束
- 关键字:
primary key - 特点:
- 一个表只有一个主键(包含联合主键);
- 添加了主键约束的列不能为空,并且值不能重复;
- 主键可以唯一的标识表中的一行数据,目的是提高查询的效率;
- 使用:
create table emp ( eid int primary key; name varchar(20); deptId int; salary double );
⭐4.2 自增长约束
- 关键字:
auto_increment - 特点:
- 自增长约束和主键一起使用;
- 自增长约束默认是从 1 开始增长;
- 每次添加数据,自增长的值加 1;
- 使用:
create table t_user ( id int primary key auto_increment, name varchar(20) ); - delete 和 truncate 自增长的特点:
- delete 删除数据之后,自增长的值会被保留,从上一个断点持续增长;
- truncate 是将表删除,然后重新创建新表。所以清空数据之后,自增是 1 开始。
⭐4.3 非空约束
- 关键字:
not null - 特点:
- 添加非空约束的列不能为空;
- 真正的空是 NULL,不是 'NULL', 也不是 '';
- 使用:
create table t_user ( id int varchar(20) not null, address varchar(29) not null);
⭐4.4 唯一约束
- 关键字:
unique - 特点:
- 添加唯一约束之后,该列的值不能重复;
- 虽然不能重复,但是添加唯一的约束的列可以为 NULL,因为 NULL 不等于 NULL;
- 使用:
create table t_user ( id int, name varchar (20), phone number varchar(20) unique;
⭐4.5 默认约束
- 关键字:
default - 特点:
- 添加约束的列如果没有指定值,则为默认值;
- 使用:
create table t_user ( id int, name varchar(20), address varchar(20) default '北京' );
4.6 零填充约束
- 关键字:
zerofill - 特点:
- 当给数值类型设置该约束,则左边不够指定的整形长度时,则自动补充0;
- 默认零填充约束的数据 int(10);
- 指定零填充约束的列为 unsigned 类型,即无符号类型;
- 使用:
create table t_user ( id int zerofill, name varchar(20) );
5. MySQL 的 DML 操作
5.1 简单查询
- 查全表:
select * from 表名; - 指定字段查询:
select 列名, 列名 from 表名; - 别名查询:
- 列别名:
select pid as ‘商品id’, pname '商品名字', price from product; - 列别名:
select pname, price +10 as new price from product; - 表别名:
select pid as '商品id'', pname '商品名字', price from product as p;
- 列别名:
- 去重查询:
- 关键字:
distinct - 操作:
- 去除重复行:
select distinct * from 表名; - 去除重复的列:
select distinct 列名 from 表名;
- 去除重复行:
- 关键字:
5.2 运算符操作
- 算数运算符:
+、-、*、/、%; - 比较运算符:
<、>、<=、>=、!=、=、in、not in、like、is null、is not null; - 逻辑运算符:
and(&&)、or(||)、not - 位运算符(了解):
&、|、^、<<、>>、~;
5.3 排序查询
- 关键字:
order by asc | desc; - 注:
asc:升序(默认),desc:降序; - 特点:
- 如果 oder by 后面跟一个字段,则只会按照该字段的值进行排序,该字段必须为数值类型或者英文和数字字符串类型或者'2025-01-03';
- 如果 oder by 后面跟多个字段:order by c1,c2;解释: 先按照 c1 来排序,如果 c1 相同,则按照 c2 排序;
- 操作:
- 使用价格排序(降序)
select * from product order by price desc; - 在价格排序(降序)的基础上,以分类排序(降序)
select * from product order by price desc, category_id desc;
- 使用价格排序(降序)
5.4 聚合查询
- 关键字:
count();如:count(*),count(1)注:如果列有 null 值,则不会进行统计;sum();如:sum(price);注:如果列有 null 值,则不进行计算,当作不存在,列必须为数值列;-
max();如:max(price);注:如果列有 null 值,则不进行计算,当作不存在,列必须为数值列;
4.min();如:min(price);注:如果列有 null 值,则不进行计算,当作不存在,列必须为数值列; avg();如:avg(price);注:如果列有 null 值,则不进行计算,当作不存在,列必须为数值列;
- 注:一般情况下,聚合函数和分组会结合一起使用;
5.5 分组查询
- 关键字:
group by - 特点:
- 分组可以理解为将一张表格拆分成多张表,拆分的依据就是分组字段;
- 分组可以根据一个字段,也可以根据多个字段,如果是一个字段,则该字段相同就会分到同一组,如果是多个字段,则多个字段都相同才能分到同一组。
- 分组之后,select 的后面只可以跟组分字段和聚合操作。
- 注:
- 一般情况下,聚合函数和分组会结合一起使用;
- 分组之后,对分组后的操作进行
条件判断不能使用 where,必须使用 having;
SQL 执行顺序 - 这是我们实际上
SQL 执行顺序:我们先执行from,join来确定表之间的连接关系,得到初步的数据;where对数据进行普通的初步的筛选;group by 分组;各组分别执行having中的普通筛选或者聚合函数筛选。然后把再根据我们要的数据进行select,可以是普通字段查询也可以是获取聚合函数的查询结果,如果是集合函数,select的查询结果会新增一条字段将查询结果去重distinct;最后合并各组的查询结果,按照order by的条件进行排序。
5.6 分页显示
- 关键字:
limit - 操作:
- 查询 product 表的前 5 条记录:
select * from product limit 5; - 从第 4 条开始显示,显示 5 条:
select * from product limit 3,5;
- 查询 product 表的前 5 条记录:
6. MySQL 多表操作
6.1 前言
- 多表关系:1对1关系(很少用);1对多关系(很常见);多对多关系(注意:多对多关系必须有中间表 )
-
外键【foreign key】约束:- 术语:主表、从表、外键列;
- 创建方式:
- 方式一:在创建表的同时创建外键约束;
- 方式二:在创建表之后,通过修改表结构的方式来添加外键约束;
- 特点:
- 主表的数据可以随便添加,从表的外键列数据必须依赖主表;
- 主表的数据如果被从表依赖,则不能删除,而从表的数据可以随便删除;
6.2 多表联合查询
- 交叉连接查询
- 特点:形成一个笛卡尔集;
- 内连接查询:
- 隐式内连接:
select * from A B where 条件; - 显式内连接:
select * from A inner join B on 条件; - 特点:求两张表的交集;
- 隐式内连接:
- 外连接查询:
- 左外连接
- 关键字:
left join - 特点:将左表的数据全部输出,如果右边有对应的数据则输出,没有对应的数据,则输出 null。
- 关键字:
- 右外连接
- 关键字:
right join - 特点:将右表的数据全部输出,如果左边有对应的数据则输出,没有对应的数据,则输出 null。
- 关键字:
- 完全连接
- 关键字:
full join - 特点:返回左表和右表的所有数据,并使用 null 值填充缺失的数据;oracle 支持,mysql 不太支持,可以使用 union 关键字来实现。
- 方式一:
select * from student s full join record r on s.id = r.student_id; - 方式二:
- 关键字:
select * from student left join record on student.id = record.student_id union select * from student right join record on student.id = record.student_id; - 左外连接
- 子查询
- 概念:select 的嵌套
- 查询类型:
- 将子查询结果当作一个值:一行一列;
- 将子查询的结果当成多个值:一列多行;
- 将子查询的结果当做一张表:一行多列或者多行多列;
- 关键字:
ALL:表示全部满足;ANY / SOME:只要有一个满足即可;IN:表示范围内的只要有匹配即可;EXISTS:如果查询有结果,则返回 true;否则返回 false;
- 自关联查询
- 概念:一张表自己和自己关联;
- 特点:表必须起别名。
