我是Java两年开发的农民工、今天总结了MySQL数据库,助你提高SQL的CURD增删改查的水平
MySQL数据库
MySQL基础和SQL入门
数据库的基本概念
什么是数据库?
- 数据库(Database)就是存储和管理数据的仓库
- 其本质是一个文件系统,还是以文件的方式将数据保存在电脑上
为什么使用数据库?
存储方式比较
存储方式 | 优点 | 缺点 |
---|---|---|
内存 | 速度快 | 不能够永久保存,数据是临时状态的 |
文件 | 数据是可以永久保存的 | 使用IO流操作文件,不方便 |
数据库 | 数据可以永久保存,方便存储和管理数据,使用统一的方式操作数据库(SQL) | 占用资源,有些数据库需要付费 |
通过比较,我们可以发现,使用数据库存储数据,用户可以非常方便对数据库中的数据进行增删改查操作
开发中常见的数据库软件
数据库名 | 介绍 |
---|---|
MySQL | 开源免费的数据库,运作简单,常作为中小型的项目的数据库首选 |
Oracle | 收费的大型数据库,安全性高 |
DB2 | IBM公司的数据库,收费的超大型数据库,常见于银行系统 |
SQL Server | 微软公司收费的中型数据库,C#、.net等语言常用,该数据库只能运行在Windows操作系统上,扩展性、稳定性、安全性、性能都表现平平 |
为什么选择MySQL?
- 功能强大,足以应付web开发
- 开源、免费
MySQL的使用
MySQL的命令
// 启动MySQL
net start mysql57
// 关闭MySQL
net stop mysql57
// 命令行登录本地数据库
mysql -u 用户名 -p 密码
// 指定IP登录数据库
mysql -h 主机IP -u 用户名 -p 密码
MySQL的目录结构
目录 | 目录内容 |
---|---|
bin | 放置一些可执行文件 |
docs | 文档 |
include | 包含(头)文件 |
lib | 依赖库 |
share | 用于存放字符集、语言等信息 |
MySQL配置文件与数据库及数据表所在目录
-
my.ini文件:是MySQL的配置文件
-
data<目录>:MySQL管理的数据库文件所在的目录
数据库相当于目录,数据表相当于文件,数据就是文件中的记录
数据库管理系统
-
什么是数据库管理系统?
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理维护数据库的大型软件
MySQL就是一个数据库管理系统软件,安装了MySQL的电脑可以称之为数据库服务器
-
数据库管理系统的使用
用于建立、使用和维护数据库,对数据库进行统一的管理
-
数据库管理系统、数据库和表之间的关系
MySQL中管理着多个数据库,在实际开发中一个数据库对应了一个的应用,数据库中存放多个表,每一张表对应着不同的业务,表中保存着业务的数据
数据库表
-
数据库中以表为组织单位存储数据
-
表类似于Java的类,每个字段都有对应的数据类型
表->类
类中属性->表中字段
对象->数据记录
SQL
SQL的概念
-
什么是SQL?
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统
-
SQL的作用
- 是所有关系型数据库的统一查询规范,不同的关系型数据库都支持SQL
- 所有的关系型数据库都可以使用SQL
- 不同数据库之间的SQL有一些区别
SQL的通用语法
-
SQL语句可以单行或多行,以分号结尾
-
可以使用空格和缩进来增加语句的可读性
-
MySQL中使用SQL不区分大小写,一般关键字大写,数据库表名列名小写
-
注释方式
— 单行注释(两个减号加空格)
/**/ 多行注释
# MySQL特有的单行注释
SQL的分类
分类 | 说明 |
---|---|
数据定义语言 | 简称DDL(Data Definition Language),用来定义数据库对象:数据库、表、列等 |
数据操作语言 | 简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新 |
数据查询语言 | 简称DQL(Data Query Language),用来查询数据库中表的记录 |
数据控制语言 | 简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户 |
DDL操作数据库
创建数据库
命令 | 说明 |
---|---|
create database 库名; | 创建指定名称的数据库 |
create database 库名 character set 字符集; | 创建指定字符集的数据库 |
查看/选择数据库
命令 | 说明 |
---|---|
use 库名; | 切换数据库 |
select database(); | 查看当前正在使用的数据库 |
show databases; | 查看MySQL中有哪些数据库 |
show create database 库名; | 查看一个数据库的定义信息 |
默认存在的数据库名称 | 说明 |
---|---|
information_schema | 信息数据库,保存的是其他数据库的信息 |
mysql | MySQL核心数据库,保存的是用户和权限 |
performance_schema | 保存性能相关的数据,监控MySQL的性能 |
sys | 记录了DBA所需要的一些信息,更加方便DBA快速了解数据库的运行情况 |
修改数据库
命令 | 说明 |
---|---|
alter database 库名 character set 字符集; | 数据库的字符集修改操作 |
删除数据库
命令 | 说明 |
---|---|
drop database 库名; | 从MySQL中永久的删除指定数据库 |
DDL操作数据表
MySQL常见的数据类型
-
常用的数据类型
类型 描述 int 整型 double 浮点型 varchar 字符串型 date 日期类型,格式:yyyy-MM-dd -
详细的数据类型
字段类型 中文说明 字段说明 Java类型 char 固定长度,字符串数据类型 最多255个字符 java.lang.String varchar 可变长度,字符串数据类型 最多65535个字符 java.lang.String tinytext 可变长度,字符串数据类型 最多255个字符 java.lang.String text 可变长度,字符串数据类型 最多65535个字符 java.lang.String mediumtext 可变长度,字符串数据类型 最多(2的24次方-1)个字符 java.lang.String longtext 可变长度,字符串数据类型 最多(2的32次方-1)个字符 java.lang.String date 3字节,日期 格式:XXXX-XX-XX java.sql.Date time 3字节,时间 格式:XX:XX:XX java.sql.Time datetime 8字节,日期时间 格式:XXXX-XX-XX XX:XX:XX java.sql.Timestamp timestamp 4字节,自动存储记录修改的时间 java.sql.Timestamp year 1字节,年份 java.sql.Date
MySQL中的char类型与varchar类型,都对应了Java中的字符串类型,区别在于:
- char类型是固定长度的:根据定义的字符串长度分配足够的空间
- varchar类型是可变长度的:只使用字符串长度所需的空间
char类型适合存储固定长度的字符串,比如密码之类的,varchar类型适合存储在一定范围内,有长度变化的字符串
创建表
CREATE TABLE 表名(
字段名称1 字段类型 (长度),
字段名称2 字段类型 (长度)
);
-- 快速创建一个表结构相同的表
CREATE TABLE 新表名 LIKE 旧表名;
查看表
命令 | 说明 |
---|---|
show tables; | 查看当前数据库中的所有表名 |
desc 表名; | 查看指定数据表的结构 |
show create table 表名; | 查看创建表的SQL语句 |
删除表
命令 | 说明 |
---|---|
drop table 表名; | 删除指定表 |
drop table if exists 表名; | 判断表是否存在,若存在则删除 |
修改表
命令 | 说明 |
---|---|
rename table 表名1 to 表名2; | 修改表名 |
alter table 表名 character set 字符集; | 修改表的字符集 |
alert table 表名 add 字段名称 字段类型(长度); | 向指定表中添加列 |
alter table 表名 modify 字段名称 字段类型(长度); | 修改表中列的数据类型或长度 |
alter table 表名 change 旧列名 新列名 类型(长度); | 修改列名 |
alter table 表名 drop 列名; | 删除列 |
DML操作表中数据
SQL中的DML用于对表中的数据进行增删改操作
插入数据
insert into 表名 (字段名1, 字段名2...) values(字段值1, 字段值2...);
值与字段必须要对应,个数相同且数据类型相同;值的数据大小,必须在字段指定的长度范围内;varchar、char、date类型的值必须使用单引号或双引号包裹;如果要插入空值,可以忽略不写,或者插入null;如果插入指定字段的值,必须要写上列名
更改数据
# 不带条件的修改
update 表名 set 列名 = 值;
# 带条件的修改
update 表名 set 列名 = 值 where 条件表达式;
删除数据
# 删除所有数据
delete from 表名;
truncate table 表名;
# 不推荐第一种,删除效率低下,需要执行记录数目的删除操作
# 第二种直接删除表,然后重新创建一张结构相同的表,效率很高
# 指定条件删除数据
delete from 表名 where 字段值 = 值;
DQL查询表中数据
准备数据
需要表中存在数据
简单查询
- 查询不会对数据库中的数据进行修改,只是一种显示数据的方式SELECT
select 列名 from 表名;
# 别名查询
select 列名 as 别名 from 表名;
# 去重查询
select distinct 列名 from 表名;
# 运算查询,例:显示加1000后的结果
select 列名 + 1000 from 表名;
条件查询
如果查询语句中没有设置条件,就会查询所有的行信息,在实际应用中,一定要指定查询条件,对记录进行过滤
select 列名 from 表名 where 条件表达式;
运算符
-
比较运算符
运算符 说明 > < <= >= = != 大于、小于、小于等于、大于等于、等于、不等于 between … and … 在…区间 in 集合表示多个值,使用逗号分开 like ‘%条件%’ 模糊查询 is null 查询某一列为NULL的值,不能写 = NULL -
逻辑运算符
运算符 说明 and && 多个条件同时成立 or || 多个条件任一成立 not 不成立,取反 -
模糊查询,通配符
通配符 说明 % 表示匹配任意多个字符串 _ 表示匹配一个字符
MySQL单表、约束和事务
DQL操作单表
排序
通过ORDER BY子句,可以将查询出的结果进行排序(排序只是显示效果,不会影响真实数据)
SELECT 字段名 FROM 表名 WHERE 字段 = 值 ORDER BY 字段名 ASC / DESC;
ASC表示升序排序(默认),DESC表示降序排序
排序方式
- 单列排序
- 只按照某一个字段进行排序,就是单列排序
- 组合排序
- 同时对多个字段进行排序,如果第一个字段相同,就按照第二个字段进行排序,以此类推
聚合函数
聚合函数查询是纵向查询,它是对某一列的值进行计算,然后返回一个单一的值(聚合函数会自动忽略null值)
SELECT 聚合函数(字段名) FROM 表名;
聚合函数 | 作用 |
---|---|
count(字段) | 统计指定列不为null的记录行数 |
sum(字段) | 计算指定列的数值和 |
max(字段) | 计算指定列的最大值 |
min(字段) | 计算指定列的最小值 |
avg(字段) | 计算指定列的平均值 |
分组
-
分组查询指的是使用GROUP BY语句,对查询的信息进行分组,相同数据作为一组
SELECT 分组字段/聚合函数 FROM 表名 GROUP BY 分组字段 HAVING 条件;
-
where与having的区别
过滤方式 特点 where 进行分组前的过滤,后面不能写聚合函数 having 进行分组后的过滤,后面可以写聚合函数
limit关键字
limit关键字的作用
- limit是限制的意思,用于限制返回的查询结果的行数(可以通过limit指定查询多少行数据)
- limit语法是MySQL的方言,用来完成分页
SQL约束
-
约束的作用
对表中的数据进行进一步的限制,从而保证数据的正确性、有效性、完整性,违反约束的不正确数据,将无法插入列表中
-
常见的约束
约束名 约束关键字 主键 primary key 唯一 unique 非空 not null 外键 foreign key
主键约束
- 特点:不可重复,唯一且非空
- 作用:用来表示数据库中的每一条记录
添加主键约束
字段名 字段类型(长度) primary key
哪些字段可以作为主键?
- 通常针对业务去设计主键,每张表都设计一个主键id
- 主键就是给数据库和程序使用的,跟最终的客户无关,所以主键没有意义,只要能够保证不重复就好
删除主键约束
- 删除表中的主键约束
主键的自增
-
主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新纪录时,数据库自动生成主键字段的值
AUTO_INCREMENT # 表示自动增长,字段类型必须是整数类型
修改主键自增的起始值
-
默认的AUTO_INCREMENT的开始值是1,如果希望修改起始值,请使用以下方式
CREATE TABLE 表名( 表中列的定义 )AUTO_INCREMENT=修改的起始值;
DELETE和TRUNCATE对自增长的影响
-
删除表中所有数据有两种方式
清空表数据的方式 特点 DELETE 只是删除表中所有数据,对自增没有影响 TRUNCATE 将整个表删掉,然后创建一个新的表,自增的主键从1开始
非空约束
-
特点:某一列不允许为空
字段名 字段类型(长度) NOT NULL
唯一约束
-
特点:表中的某一列的值不能重复(对null不做唯一的判断)
字段名 字段类型(长度) UNIQUE
主键与唯一约束的区别
- 主键约束:唯一且不能为空
- 唯一约束:唯一但可以为空
- 一个表中只能有一个主键,但是可以有多个唯一约束
外键约束
- FOREIGN KEY
默认值
-
默认值约束:用来指定某列的默认值
字段名 字段类型(长度) DEFAULT 默认值
数据库事务
什么是事务?
- 事务是一个整体,由一条或多条SQL语句组成,这些SQL语句要么都执行成功,要么都执行失败,只要有一条SQL出现异常,整个操作就会回滚,整个业务执行失败
- 回滚:即在事务运行的过程中出现在某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,滚回到事务开始的状态(在提交之前执行)
MySQL事务操作
- MySQL中可以有两种方式进行事务的操作
- 手动提交事务
- 自动提交事务
手动提交事务
功能 | 语句 |
---|---|
开启事务 | start transaction 或 begin |
提交事务 | commit |
回滚事务 | rollback |
- start transaction:显式的标记一个事务的起始点
- commit:提交事务的所有操作,将事务中所有对数据库的更新都写到磁盘上的物理数据库中,事务正常结束
- rollback:表示撤销事务,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事物开始时的状态
手动提交事务流程
- 执行成功的情况:开启事务->执行多条SQL语句->成功提交事务
- 执行失败的情况:开启事务->执行多条SQL语句->事务的回滚
自动提交事务
- MySQL默认每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,语句执行完毕自动提交事务,MySQL默认开启自动提交事务
取消自动提交事务
-
MySQL默认是自动提交事务,需要设置为手动提交
SHOW VARIABLES LIKE 'autocommit'; -- on是开启,off是关闭 # 将on改为off即可
事务的四大特性ACID
特性 | 含义 |
---|---|
原子性 | 每个事务都是一个整体,不可再拆分,事务中所有的SQL语句要么都执行成功,要么都执行失败 |
一致性 | 事务在执行前数据库的状态与执行后数据库的状态保持一致 |
隔离性 | 事务与事务之间不应该相互影响,执行保持隔离的状态 |
持久性 | 一旦事务执行成功,对数据库的修改是持久的。就算关机,数据也是要保存下来的 |
MySQL的事务隔离级别
数据并发访问
一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库,数据库的相同数据可能被多个事务同时访问,如果不采取隔离措施,就会导致各种问题,破坏数据的完整性
并发访问会产生的问题
事务在操作时的理想状态:所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题如下表
并发访问的问题 | 说明 |
---|---|
脏读 | 一个事务读取到了另一个事务中尚未提交的数据 |
不可重复读 | 一个事务中两次读取的数据内容不一致,要求的是在一个事务中多次读取时数据是一致的。这是进行update操作时引发的问题 |
幻读 | 一个事务中,某一次的select操作得到的结果所表征的数据状态,无法支撑后续的业务操作,查询得到的数据状态不准确,导致幻读 |
四种隔离级别
通过设置隔离级别,可以防止上面的三种并发问题
MySQL数据库有四种隔离级别,级别强度从低到高依次为
- 会出现的问题 Y
- 不会出现问题 N
级别 | 名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 数据库的默认隔离级别 |
---|---|---|---|---|---|---|
1 | 读未提交 | read uncommited | Y | Y | Y | |
2 | 读已提交 | read commited | N | Y | Y | Oracle和SQLServer |
3 | 可重复读 | repeatable read | N | N | Y | MySQL |
4 | 串行化 | serializable | N | N | N |
隔离级别相关命令
# 查看隔离级别
select @@tx_isolation;
# 设置事务隔离级别,需要退出MySQL再重新登录才能看到隔离级别的变化
set global transaction isolation level 级别名称;
read uncommitted; -- 读未提交
read committed; -- 读已提交
repeatable read; -- 可重复读
serializable; -- 串行化
MySQL多表、外键和数据库设计
多表
多表简述
实际开发中,一个项目通常需要很多张表才能完成
单表的缺点
- 冗余,同一个字段中出现大量的重复数据
解决方案:设计为多张表
外键约束
什么是外键?
- 外键指的是在从表和主表的主键对应的那个字段
- 使用外键约束可以让多张表之间产生一个对应关系,从而保证主从表的引用的完整性
创建外键约束
# 新建表时添加外键
CONSTRAINT 外键约束名称 FOREIGN KEY REFERENCES 主表名(主键字段名); -- CONTRAINT 外键约束名称都可以省略
# 已有表添加外键
ALTER TABLE 从表 ADD CONSTRAINT 外键约束名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主键字段名);
# 添加外键约束,就会产生强制性的外键数据检查,从而保证了数据的完整性和一致性
删除外键约束
ALTER TABLE 从表 DROP FOREIGN KEY 外键约束名称;
# 添加外键约束
ALTER TABLE 从表 ADD CONSTRAINT FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);
外键约束的注意事项
- 从表外键类型必须与主表主键类型一致,否则创建失败
- 添加数据时,应该先添加主表中的数据
- 删除数据时,应该先删除从表中的数据
级联删除操作
如果想实现删除主表数据的同时,也删除掉从表数据,可以使用级联删除操作
ON DELETE CASCADE;
多表关系设计
实际开发中,一个项目通常要多张表才能完成。且这些表的数据之间存在一定的关系。
表与表之间的三种关系 |
---|
一对多关系:最常见的关系 |
多对多关系 |
一对一关系:使用较少,因为一对一关系可以合成为一张表 |
一对多关系
-
一对多关系(1:n)
-
一对多建表原则
在从表创建一个字段,该字段作为外键指向主表的主键
多对多关系
-
多对多(m:n)
-
多对多关系建表原则
需要创建第三张表,中间表至少两个字段,这两个字段分别作为外键指向各自一方的主键
一对一关系
-
一对一(1:1)
-
一对一建表原则
外键唯一:主表的主键和从表的外键,形成主外键关系,外键唯一UNIQUE
多表查询
什么是多表查询
- DQL:查询多张表,获取到需要的数据
笛卡尔积
交叉连接查询,因为会产生笛卡尔积,基本不会使用
SELECT 字段名 FROM 表1, 表2;
多表查询的分类
内连接查询
内连接的特点:通过指定的条件去匹配两张表中的数据,匹配上就显示,不匹配就不显示
隐式内连接
FROM 子句 后面直接写多个表名,使用WHERE指定连接条件我的,这种连接方式是隐式内连接,使用WHERE条件过滤无用的数据
SELECT 字段名 FROM 左表, 右表 WHERE 连接条件;
显式内连接
SELECT 字段名 FROM 左表 INNER JOIN 右表 ON 条件; -- INNER可省略
外连接查询
左外连接
左外连接的特点
- 以左表为基准,匹配右边表中的数据,如果匹配得上,就展示匹配到的数据
- 如果匹配不到,左表中的数据正常展示,右边的展示为null
SELECT 字段名 FROM 左表 LEFT OUTER JOIN 右表 ON 条件; -- OUTER可省略
右外连接
右外连接的特点
- 以右表为基准,匹配左边表中的数据,如果能匹配到,展示匹配到的数据
- 如果匹配不到,右表中的数据正常展示,左边展示为null
SELECT 字段名 FROM 左表 RIGHT OUTER JOIN 右表 ON 条件; -- OUTER可省略
各种连接方式的总结
- 内连接:只获取两张表中交集部分的数据
- 左外连接:以左表为基准,查询左表的所有数据,以及与右表有交集的部分
- 右外连接:以右表为基准,查询右表的所有数据,以及与左表有交集的部分
子查询
什么是子查询
-
一条select查询语句的结果作为另一条select语句的一部分
-
子查询的特点
- 子查询必须放在小括号中
- 子查询一般作为父查询的查询条件使用
-
子查询常见分类
- WHERE型子查询:将子查询的结果,作为父查询的比较条件
- FROM型子查询:将子查询的结果,作为一张表,提供给父层查询使用
- EXISTS型子查询:子查询的结果是单列多行,类似一个数组,父层查询使用IN函数,包含子查询的结果
子查询的结果作为查询条件
SELECT 查询字段 FROM 表 WHERE 字段 = (子查询);
子查询的结果作为一张表
SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;
当子查询作为一张表的时候,需要给表起别名,否则无法访问表中的字段
子查询结果是单行多列
-
子查询的结果类似一个数组,父层查询使用IN函数,包含子查询的结果
SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
子查询总结
- 子查询如果查出的是一个字段(单列),那就在WHERE后面作为条件使用
- 子查询如果查出的是多个字段(多列),就当作一张表使用(要起别名)
数据库设计
数据库三范式
- 概念:三范式就是设计数据库的规则
- 为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式
- 满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以此类推。一般说来,数据库只需满足第三范式(3NF)就行了
第一范式1NF
- 概念
- 原子性,做到列不可拆分
- 第一范式是最基本的范式。数据库表里面字段都是单一属性的,不可再分,如果数据表中每个字段都是不可再分的最小数据单元,则满足第一范式
第二范式2NF
- 概念
- 在第一范式的基础上更进一步,目标是确保表中的每列都和主键相关
- 一张表只能描述一件事
第三范式3NF
- 概念
- 消除传递依赖
- 表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放
数据库反三范式
概念
- 反范式化指的是通过增加冗余或重复的数据来提高数据库的读性能
- 浪费存储空间,节省查询时间(以空间换时间)
什么是冗余字段
- 设计数据库时,某一个字段属于一张表,但它同时出现在另一个或多个表,且完全等同于它在其本来所属表的意义表示,那么这个字段就是一个冗余字段
总结
创建一个关系型数据库设计,我们有两种选择
- 尽量遵循范式理论的规约,尽可能少的冗余字段,让数据库设计看起来精致、优雅、让人心醉
- 合理的加入冗余字段这个润滑剂,减少JOIN,让数据库执行性能更高更快
MySQL索引、存储过程和触发器
MySQL索引
什么是索引
在数据库表中,对字段建立索引可以大大提高查询速度。通过善用这些索引,可以令MySQL的查询和运行更加高效
常见索引分类
索引名称 | 说明 |
---|---|
主键索引(primary key) | 主键是一种唯一性索引,每个表只能有一个主键,用于标识数据库表中的每一条记录 |
唯一索引(unique) | 唯一索引指的是索引列的所有值都只能出现一次,必须是唯一 |
普通索引(index) | 最常见的索引作用就是加快对数据的访问速度 |
MySQL将一个表的索引都保存在同一个索引文件中,如果对表中数据进行增删改操作,MySQL都会自动的更新索引
主键索引(primary key)
特点:主键是一种唯一性索引,每个表只能有一个主键,用于标识数据表中的某一条记录
一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含null
唯一索引(unique)
特点:索引列的所有值都只能出现一次,必须唯一
唯一索引可以保证数据记录的唯一性。事实上,在许多场合人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复
普通索引(index)
普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = )或排序条件(ORDER BY column)中的数据列创建索引
删除索引
由于索引会占用一定的磁盘空间,因此,为了避免影响数据库的性能,应该及时删除不再使用的索引
索引的优缺点总结
- 添加索引首先考虑在WHERE及ORDER BY涉及的列上建立索引
- 索引的优点
- 大大的提高查询速度
- 可以显著的减少查询中分组和排序的时间
- 索引的缺点
- 创建索引和维护索引需要时间,而且数据量越大时间越长
- 当对表中的数据进行增加、修改、删除操作的时候,索引也要同时进行维护,降低了数据的维护速度
MySQL视图
什么是视图
- 视图是一种虚拟表
- 视图建立在已有表的基础上,视图赖以建立的这些表称为基表
- 向视图提供数据内容的语句为SELECT语句,可以将视图理解为存储起来的SELECT语句
- 视图向用户提供基表数据的另一种表现形式
视图的作用
- 权限控制时可以使用
- 比如,某几个列可以运行用户查询,其他列不允许,可以开通视图查询特定的列,起到权限控制的作用
- 简化复杂的多表查询
- 视图本身就是一条查询SQL,我们可以将一次复杂的查询构成一张视图,用户只要查询视图就可以获取想要得到的信息(不需要再编写复杂的SQL)
- 视图主要就是为了简化多表的查询
视图的使用
CREATE VIEW 视图名 [column_list] AS SELECT 语句;
VIEW:表示视图
column_list:可选参数,表示属性清单,指定视图中各个属性的名称,默认情况下,与SELECT语句中查询的属性相同
AS:表示视图要执行的操作
SELECT语句:想视图提供数据内容
视图与表的区别
- 视图是建立在表的基础上,表存储数据库中的数据,而视图只是做一个数据的展示
- 通过视图不能改变表中数据(一般情况下视图中的数据都是表中的列经过计算得到的结果,不允许更新)
- 删除视图,表不受影响,而删除表,视图不再起作用
MySQL存储过程
什么是存储过程
- MySQL5.0版本开始支持存储过程
- 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行
- 简单理解:存储过程其实就是一堆SQL语句的合并,中间加入了一些逻辑控制
存储过程的优缺点
- 优点
- 存储过程一旦调试完成后,就可以稳定运行(前提是业务需求要相对稳定,没有变化)
- 存储过程减少业务系统与数据库的交互,降低耦合,数据库交互更加快捷(应用服务器,与数据库服务器不在同一个地区)
- 缺点
- 在互联网行业中,大量使用MySQL,MySQL的存储过程与Oracle的相比较弱,所以较少使用,并且互联网行业需求变化较快也是原因之一
- 尽量在简单的逻辑中使用,存储过程移植十分困难,数据库集群环境,保证各个库之间存储过程变更一致也十分困难
- 阿里的代码规范里也提出了禁止使用存储过程,存储过程维护起来的确麻烦
MySQL触发器
什么是触发器
触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一张表进行增删改操作时就会激活它执行
简单理解:当我们执行一条SQL语句时,这条SQL语句的执行会自动去触发执行其他的SQL语句
触发器创建的四个要素
- 监视地点(table)
- 监视事件(insert delete update)
- 触发时间(before after)
- 触发事件(insert delete update)
创建触发器
delimiter $ -- 将MySQL的结束符号由;改为$ 避免执行出现错误
CREATE TRIGGER 触发器名称 -- 在一个数据库中触发器的名称唯一
BEFORE / AFTER (监视事件) -- 触发的时机和监视的事件
ON table_Name -- 触发器所在的表
FOR EACH ROW -- 固定写法,行触发器,每一行受影响,触发事件都执行
BEGIN
-- 写触发事件
END
$ -- 结束标志
DCL(数据控制语言)
MySQL默认使用的都是root用户超级管理员,拥有全部的权限。除了root用户以外,我们还可以通过DCL语句来定义一些权限较小的用户,分配不同的权限来管理和维护数据库
创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
用户名:创建的新用户的登录名称
主机名:指定该用户在哪个主机上可以登录,本地用户可以使用localhost。如果想让该用户可以从任意远程主机登录,可以使用通配符%
密码:登录密码
用户授权
GRANT 权限1, 权限2... ON 数据库名.表名 TO '用户名'@'主机名';
权限:授予用户的权限。如果要授予所有的权限则使用ALL
ON:用来指定权限针对哪些库和表
TO:表示将权限赋予某个用户
查看权限
SHOW GRANTS FOR '用户名'@'主机名';
删除用户
DROP USER '用户名'@'主机名';
查询用户
SELECT * FROM USER; -- 选择名为mysql的数据库,直接查询USER表
数据库备份&还原
备份的应用场景:在服务器进行数据传输、数据存储和数据交换,就有可能产生数据故障。比如发生意外停机或存储介质损坏。这时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,造成的损失是无法弥补和估量的。