1、概述
1.1、什么是数据库?
数据库:DataBase ( DB),是存储和管理数据的仓库。
数据库管理系统:DataBase Management System (DBMS),操纵和管理数据库的大型软件。
SQL:Structured Query Language,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。
1.2、SQL分类
SQL语句通常被分为四大类:
2、DDL
2.1、数据库操作
- 创建数据库:create database [ if not exists ] 数据库名;
- 查询所有数据库:show databases;
- 查询当前数据库:select database();
- 使用数据库:use 数据库名;
- 删除数据库:drop database [ if exists ] 数据库名;
以上 "[...]" 内容表示可以省略, database 可以替换成 schema
2.2、表操作
2.2.1、语法
创建表
sql
create table 表名(
字段1 字段类型 [约束] [comment '字段1注释'],
...
字段2 字段类型 [约束] [comment '字段2注释']
) [comment '注释信息'];
查询表
- 查询当前数据库所有表:show tables;
- 查询表结构:desc 表名;
- 查询建表语句:show create table 表名;
修改表
- 添加字段: alter table 表名 add 字段名类型(长度) [ comment 注释 ] [ 约束 ];
- 修改字段类型:alter table 表名 modify 字段名 新数据类型(长度);
- 修改字段名和字段类型:alter table 表名 change 旧字段名 新字段名 类型(长度) [ comment注释 ] [ 约束 ];
- 删除字段:alter table 表名 drop column 字段名;
- 修改表名:rename table 表名 to 新表名;
删除表:drop table [ if exists ] 表名;
删除表时,表中的全部数据也被删除。
2.2.2、约束
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确性、有效性和完整性。
以下是创建表对字段的约束:
2.2.2、数据类型
无符号数据类型要在数据类型后面加上 unsigned
varchar 和 char 的区别:
3、DML
添加数据(INSERT)
- 指定字段添加数据:insert into 表名 (字段名1,字段名2, ...) values (值1,值2, ...);
- 全部字段添加数据:insert into 表名 values (值1,值2,.....);
- 批量添加数据(指定字段):insert into 表名 (字段名1,字段名2) values (值1,值2), (值1,值2);
- 批量添加数据(全部字段):insert into 表名 values (值1, 值2,...), (值1, 值2, ...);
注意事项:
- 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
- 字符串和日期型数据应该包含在引号中。
- 插入的数据大小,l应该在字段的规定范围内。
修改数据(UPDATE):update 表名 set 字段名1=值1,字段名2=值2, ...[ where条件];
删除数据(DELETE):delete from 表名 [ where条件];
注意事项:
- DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
- DELETE 语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL。
4、DQL
sql
select
字段列表
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
order by
排序字段列表
limit
分页参数
4.1、基本查询
- 查询多个字段:select 字段1, 字段2, 字段3 from 表名;
- 查询所有字段(通配符):select * from 表名;
- 设置别名:select字段1 [ as 别名1 ], 字段2 [ as 别名2 ] from 表名;
- 去除重复记录:select distinct 字段列表 from 表名;
4.2、条件查询(where)
条件查询:select 字段列表 from 表名 where 条件列表;
条件列表中的运算符:
4.3、分组查询(group by)
分组查询: select 字段列表 from 表名 [ where 条件 ] group by 分组字段名 [ having 分组后过滤条件 ];
where与having区别:
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
判断条件不同:where不能对聚合函数进行判断,而having可以。
注意事项:分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
执行顺序: where >聚合函数>having 。
使用聚合函数查询:
语法:select 聚合函数(字段列表) from 表名;
聚合函数:
- 统计数量:count()
- 最大值:max()
- 最小值:min()
- 平均值:avg()
- 求和:sum()
提示:
- null 值不参与所有聚合函数运算。
- 统计数量可以使用: count( * )、count(字段)、count(常量),推荐使用count( * )。
4.4、排序查询(order by)
条件查询: select 字段列表 from 表名 [ where 条件列表 ] [ group by 分组字段 ] order by 字段1 排序方式1, 字段2 排序方式2, ... ;
排序方式:
- 升序(默认):ASC
- 降序:DESC
如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
4.5、分页查询(limit)
分页查询:select 字段列表 from 表名 limit 起始索引, 查询记录数;
注意事项:起始索引从O开始,起始索引=(查询页码--1)*每页显示记录数。
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
5、多表
5.1、多表设计
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
5.1.1、一对多(多对一)
案例:员工与部门的关系
关系:每个员工归属于其中一个部门,一个部门有多个员工
实现:在数据库表中多的一方,添加字段,来关联一的一方的主键
外键约束:
5.1.2、一对一
案例:用户与身份证信息的关系
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
5.1.3、多对多
案例:学生与课程的关系
关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
5.2、多表查询
多表查询是指从多张数据表中查询数据。
5.2.1、分类
多表查询分类:
- 连接查询
- 内连接:相当于查询A、B交集部分数据
- 外连接
- 左外连接:查询左表所有数据(包括两张表交集部分数据)
- 右外连接:查询右表所有数据(包括两张表交集部分数据)
- 子查询
5.2.2、内连接
隐式内连接:select 字段列表 from 表1,表2 where条件 ... ;
显式内连接:select 字段列表 from 表1 [ inner ] join 表2 on 连接条件 ... ;
5.2.3、外连接
左外连接:select 字段列表 from 表1 left [ outer ] join 表2 on 连接条件 ... ;
右外连接:select 字段列表 from 表1 right [ outer ] join 表2 on 连接条件 ... ;
5.2.4、子查询
介绍:SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
形式:select * from 表1 where 字段1 = ( select 字段2 from 表2 ...);
子查询外部的语句可以是insert / update / delete / select 的任何一个,最常见的是select。
分类:
- 标量子查询:子查询返回的结果为单个值。常用的操作符:=、<>、>、>=、<、<=
- 列子查询:子查询返回的结果为一列。常用的操作符:in、not in 等
- 行子查询:子查询返回的结果为一行。常用的操作符:=、<>、in、not in 等
- 表子查询:子查询返回的结果为多行多列。常用的操作符:in
6、事务
事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
事务控制操作:
- 开启事务:start transaction; / begin ;
- 提交事务:commit;
- 回滚事务:rollback;
事务的四大特性(ACID):
- 原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
- 隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
7、索引(Index)
7.1、什么是索引?
索引(index)是帮助数据库高效获取数据的数据结构。
优缺点
优:
提高数据查询的效率,降低数据库的 lO 成本。
通过索引列对数据进行排序,降低数据排序的成本,降低 CPU 消耗。
缺:
索引会占用存储空间。
索引大大提高了查询效率,同时却也降低了 insert、update、delete 的效率。
7.2、索引结构
MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的 B+Tree (多路平衡搜索树)结构组织的索引。
7.3、索引语法
创建索引:create [ unique ] index 索引名 on 表名(字段名,...);
查看索引:show index from 表名;
删除索引:drop index 索引名 on 表名;
注意事项:
- 主键字段,在建表时,会自动创建主键索引。
- 添加唯一约束时,数据库实际上会添加唯一索引。