我是Java两年开发的农民工、今天总结了MySQL数据库,助你提高SQL的CURD增删改查的水平

我是Java两年开发的农民工、今天总结了MySQL数据库,助你提高SQL的CURD增删改查的水平

文章目录

MySQL数据库

MySQL基础和SQL入门

数据库的基本概念

什么是数据库?

  • 数据库(Database)就是存储和管理数据的仓库
  • 其本质是一个文件系统,还是以文件的方式将数据保存在电脑上

为什么使用数据库?

存储方式比较

存储方式 优点 缺点
内存 速度快 不能够永久保存,数据是临时状态的
文件 数据是可以永久保存的 使用IO流操作文件,不方便
数据库 数据可以永久保存,方便存储和管理数据,使用统一的方式操作数据库(SQL) 占用资源,有些数据库需要付费

通过比较,我们可以发现,使用数据库存储数据,用户可以非常方便对数据库中的数据进行增删改查操作

开发中常见的数据库软件

数据库名 介绍
MySQL 开源免费的数据库,运作简单,常作为中小型的项目的数据库首选
Oracle 收费的大型数据库,安全性高
DB2 IBM公司的数据库,收费的超大型数据库,常见于银行系统
SQL Server 微软公司收费的中型数据库,C#、.net等语言常用,该数据库只能运行在Windows操作系统上,扩展性、稳定性、安全性、性能都表现平平
为什么选择MySQL?
  1. 功能强大,足以应付web开发
  2. 开源、免费

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管理的数据库文件所在的目录

    数据库相当于目录,数据表相当于文件,数据就是文件中的记录

数据库管理系统

  1. 什么是数据库管理系统?

    数据库管理系统(DataBase Management System,DBMS):指一种操作和管理维护数据库的大型软件

    MySQL就是一个数据库管理系统软件,安装了MySQL的电脑可以称之为数据库服务器

  2. 数据库管理系统的使用

    用于建立、使用和维护数据库,对数据库进行统一的管理

  3. 数据库管理系统、数据库和表之间的关系

    MySQL中管理着多个数据库,在实际开发中一个数据库对应了一个的应用,数据库中存放多个表,每一张表对应着不同的业务,表中保存着业务的数据

数据库表

  • 数据库中以表为组织单位存储数据

  • 表类似于Java的类,每个字段都有对应的数据类型

    表->类

    类中属性->表中字段

    对象->数据记录

SQL

SQL的概念

  1. 什么是SQL?

    结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统

  2. 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常见的数据类型
  1. 常用的数据类型

    类型 描述
    int 整型
    double 浮点型
    varchar 字符串型
    date 日期类型,格式:yyyy-MM-dd
  2. 详细的数据类型

    字段类型 中文说明 字段说明 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 条件表达式;
运算符
  1. 比较运算符

    运算符 说明
    > < <= >= = != 大于、小于、小于等于、大于等于、等于、不等于
    between … and … 在…区间
    in 集合表示多个值,使用逗号分开
    like ‘%条件%’ 模糊查询
    is null 查询某一列为NULL的值,不能写 = NULL
  2. 逻辑运算符

    运算符 说明
    and && 多个条件同时成立
    or || 多个条件任一成立
    not 不成立,取反
  3. 模糊查询,通配符

    通配符 说明
    % 表示匹配任意多个字符串
    _ 表示匹配一个字符

MySQL单表、约束和事务

DQL操作单表

排序

通过ORDER BY子句,可以将查询出的结果进行排序(排序只是显示效果,不会影响真实数据)

SELECT 字段名 FROM 表名 WHERE 字段 = 值 ORDER BY 字段名 ASC / DESC;

ASC表示升序排序(默认),DESC表示降序排序

排序方式
  1. 单列排序
    • 只按照某一个字段进行排序,就是单列排序
  2. 组合排序
    • 同时对多个字段进行排序,如果第一个字段相同,就按照第二个字段进行排序,以此类推
聚合函数

聚合函数查询是纵向查询,它是对某一列的值进行计算,然后返回一个单一的值(聚合函数会自动忽略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
    
    

    主键与唯一约束的区别

    1. 主键约束:唯一且不能为空
    2. 唯一约束:唯一但可以为空
    3. 一个表中只能有一个主键,但是可以有多个唯一约束

外键约束

  • FOREIGN KEY

默认值

  • 默认值约束:用来指定某列的默认值

    字段名 字段类型(长度) DEFAULT 默认值
    
    

数据库事务

什么是事务?

  • 事务是一个整体,由一条或多条SQL语句组成,这些SQL语句要么都执行成功,要么都执行失败,只要有一条SQL出现异常,整个操作就会回滚,整个业务执行失败
  • 回滚:即在事务运行的过程中出现在某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,滚回到事务开始的状态(在提交之前执行)

MySQL事务操作

  • MySQL中可以有两种方式进行事务的操作
    1. 手动提交事务
    2. 自动提交事务
手动提交事务
功能 语句
开启事务 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 主表(主键字段名);


外键约束的注意事项
  1. 从表外键类型必须与主表主键类型一致,否则创建失败
  2. 添加数据时,应该先添加主表中的数据
  3. 删除数据时,应该先删除从表中的数据

级联删除操作

如果想实现删除主表数据的同时,也删除掉从表数据,可以使用级联删除操作

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可省略


外连接查询
左外连接

左外连接的特点

  1. 以左表为基准,匹配右边表中的数据,如果匹配得上,就展示匹配到的数据
  2. 如果匹配不到,左表中的数据正常展示,右边的展示为null
SELECT 字段名 FROM 左表 LEFT OUTER JOIN 右表 ON 条件; -- OUTER可省略


右外连接

右外连接的特点

  1. 以右表为基准,匹配左边表中的数据,如果能匹配到,展示匹配到的数据
  2. 如果匹配不到,右表中的数据正常展示,左边展示为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 (子查询);
    
    

子查询总结

  1. 子查询如果查出的是一个字段(单列),那就在WHERE后面作为条件使用
  2. 子查询如果查出的是多个字段(多列),就当作一张表使用(要起别名)

数据库设计

数据库三范式

  • 概念:三范式就是设计数据库的规则
    • 为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式
    • 满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以此类推。一般说来,数据库只需满足第三范式(3NF)就行了

第一范式1NF

  • 概念
    • 原子性,做到列不可拆分
    • 第一范式是最基本的范式。数据库表里面字段都是单一属性的,不可再分,如果数据表中每个字段都是不可再分的最小数据单元,则满足第一范式

第二范式2NF

  • 概念
    • 在第一范式的基础上更进一步,目标是确保表中的每列都和主键相关
    • 一张表只能描述一件事

第三范式3NF

  • 概念
    • 消除传递依赖
    • 表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放

数据库反三范式

概念
  • 反范式化指的是通过增加冗余或重复的数据来提高数据库的读性能
  • 浪费存储空间,节省查询时间(以空间换时间)
什么是冗余字段
  • 设计数据库时,某一个字段属于一张表,但它同时出现在另一个或多个表,且完全等同于它在其本来所属表的意义表示,那么这个字段就是一个冗余字段
总结

创建一个关系型数据库设计,我们有两种选择

  1. 尽量遵循范式理论的规约,尽可能少的冗余字段,让数据库设计看起来精致、优雅、让人心醉
  2. 合理的加入冗余字段这个润滑剂,减少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涉及的列上建立索引
  • 索引的优点
    1. 大大的提高查询速度
    2. 可以显著的减少查询中分组和排序的时间
  • 索引的缺点
    1. 创建索引和维护索引需要时间,而且数据量越大时间越长
    2. 当对表中的数据进行增加、修改、删除操作的时候,索引也要同时进行维护,降低了数据的维护速度

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语句

触发器创建的四个要素

  1. 监视地点(table)
  2. 监视事件(insert delete update)
  3. 触发时间(before after)
  4. 触发事件(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表

数据库备份&还原

备份的应用场景:在服务器进行数据传输、数据存储和数据交换,就有可能产生数据故障。比如发生意外停机或存储介质损坏。这时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,造成的损失是无法弥补和估量的。

猜你喜欢

转载自blog.csdn.net/weixin_54707168/article/details/113309035
今日推荐