热度

MySQL

MySQL

基本语法

常见用法
集群
缓存
主从复制
双主热备
分库分表
分布式架构

创建表:
create table tb [if not exists] _name(
id int(10) auto_incrementl,
name varchar(20) not null default ‘’,
user_id int(10) default 1,
salary float unique,
create_at time,
primary key(id,user_id),
contraint fk_name foreign key (field) references other_tb(id)
);

主键约束: primary key
外键约束: foreign key
非空约束: not null
唯一性约束:unique
默认约束:default value
自动增加: auto__increment

查看表:
describe
describe tb_name / desc tb_name;

查看表结构:
show create table tb_name \G

查看警告信息:
show warnings;

修改数据表:

修改表名:
alter table tb_oldName rename tb_newName;

修改自增ID值
alter table tb_name auto_increment = 1

修改字段的数据类型:
alter table tb_name modify id int(11);

修改字段名:
alter table tb_name change tb_old_field tb_new_field int(10);

添加字段:
alter table tb_7 add name varchar(100) [first|after id];

删除字段:
alter table tb_7 drop fieldName;

修改字段的排列位置:
alter table tb_7 modify name varchar(30) [first|after] id;

修改表的存储引擎:
alter table tb_7 engine = myisam;

删除表的外键约束:
alter table tb_7 drop foreign key FK_Name;

删除数据表:
drop table [if exists] tb_name;

删除没有被关联的表:
drop table tb_name;
删除被其他表关联的表的主表:
全部删除:删除会破坏表的参照完整性,先删除与之关联的子表,再删除父表,这样会删除两个表中的数据。
单独删除:如果保存子表,只需将关联表的外键约束条件取消,然后删除父表

alter table tb_name drop foreign key FK_Name;

数据类型:
整数类型:
tinyint smallint mediumint int(integer) bigint

浮点类型:
浮点类型:float double
定点类型:decimal

字符串类型:
char varchar binary varbinary blob text enum set

二进制类型:
bit binary varbinary tinyblob blob mediumblob longblob

运算符:
算数运算:
+ - * /
比较运算:结果为 0,1 或者 null
= <=> <> (!=) <= >= > is null it not null
least greatest between and isnull in not in
like regexp
逻辑运算:
false null
not null
and &&
or ||
xor
位操作运算:
| & 异或:^ << >> 取反:~

函数:

数学函数:
绝对值函数: abc()
平方根函数|求余函数: mod(x,y)
获取整数函数: ceil(x), ceiling(x) , floor(x)
随机整数函数: rand() rand(x)
四舍五入函数: round(x), round(x,y), truncate(x,y)
符号函数: sign(x)
幂运算函数: pow(x,y), power(x,y), exp(x)
对数运算函数: log(x) , log10(x)
角度与弧度相互转换的函数: radians(x), degrees(x)
正弦函数: sin(x), 反弦函数: asin(x)
余弦函数: cos(x), 反余弦函数: acos(x)
正切函数、反正切函数、余切函数

字符串函数:
计算长度的函数: length(), char_length()
合并字符串的函数: concat(str,str1…), concat_ws(str,str1…)
替换字符串的函数: insert(str1, x ,len,str2)
大小写转换函数: lower(), upper()
获取指定长度的字符串的函数: left(s,n), right(s,n)
填充字符串的函数: lpad(str1,len,str2), rpad(str1,len,str2)
删除空格的函数: ltrim(s), rtrim(s), trim(s)
删除指定字符串的函数: trim(str1 from s)
重复生成字符串的函数: repeat(s,n)
比较字符串大小的函数: strcmp(str,str1)
获取字串的函数: substring(s,n,len), mid(s,n,len)
匹配字串开始位置的函数: locate(‘s’,’str’); position(‘s’ in ‘str’); instr(‘str’,’s’);
字符串逆序的函数: reverse(s)
返回指定位置的字符串的函数:
返回指定字符串位置的函数: field(s,s1,s2)
返回字串位置的函数: find_in_set(s1,s2)
选取字符串的函数: make_set(x,s1,s2…)

日期和时间函数:
当前日期和时间的函数:curdate(), current_date(), curdate()
时间函数获取系统当前时间:curtime(), current_time(), curtime()
获取当前系统日期和时间: current_timestamp(), localtime(), now(), sysdate()
Unix时间戳函数:unix_timestamp()
将UNIX时间戳转为普通格式时间: from_unixtime(‘1232131’)
返回UTC日期的函数和返回UTC时间的函数:utc_date(), utc_time(),
返回月份的函数: month(date), monthname(date)
获取日期的函数: dayname(d), dayofweek(d), weekday(d)
获取天数的函数: dayofyear(d), dayofmonth(d)
获取年份、季度、小时、分钟、秒钟的函数:year(), quarter(), minute(), second()
获取日期的指定值的函数: extract(type from d)
时间和秒钟转换的函数:time_to_sec(), sec_to_time(),
计算日期和时间的函数:date_add(), adddate(), date_sub(), subdate(), addtime(), datediff(),subtime(),
将日期和时间格式化的函数:date_format(), time_format(), get_format(),

条件判断函数:
if(expr,v,v1)
ifnull(v1,v2)
case, case value when, case when

系统信息函数:
获取版本号、连接数、数据库名的函数:select version(), connect_id(), show processlist() select database(), select schema()
获取用户名的函数:select user() | current_user() | system_user()
获取字符串的字符集和排序方式的函数:charset(‘abc’), charset(convert(‘abc’ using latin1), charset(version))
获取最后一个自动生成的ID值的函数:select last_insert_id()

加密函数:
password(str)
md5(str)
加密函数:encode(str,pswd_str)
解密函数:decode(crypt_str,pswd_str)

其他函数:
格式化函数:format()
不同进制的数字进行转换的函数:conv()
IP地址与数字相互转换的函数:inet_aton(), inet_ntoa()
加锁函数和解锁函数:select get_lock(), is_used_lock(), is_free_lock(), release_lock()
重复执行指定操作的函数:denchmark()
改变字符集的函数:convert()
改变数据类型的函数:cast(), convert()

查询语句:
基本查询:
select { * | } [from table_name [ where <>] [group by <>] [ having <> ] [ order by <> ] [ limit [<>,] ] ]
select filed,field1…fieldN from [table | view] where []
单表查询:
查询所有字段:select * from table;
查询指定字段:select filed,field1… from table;
查询指定记录:select filed,filed1… from table where condition;
带 IN 关键字的查询:select filed,filed1… from table where filed in (a,z) order by field;
带 Between and 的范围查询:select filed from table where filed between a and z;
带 Like 的字符匹配查询:select filed from table where filed like ‘%’
% 匹配任意长度的字符, _ 下划线只能匹配任意一个字符
查询空值:select filed from table where filed is null | is not null
带 And 的多条件查询:select field, field1 from table where filed > condition and filed > condition;
带 Or 的多条件查询:select field, filed1 from table where field = condition or filed1 = condition;
查询结果不重复:select distinct field from table;
对查询结果排序:select field,filed1 from table order by field | desc | asc
分组查询:
gourp by field having condition
创建分组,使用having过滤分组, 在group by 字句中使用with rollup, 多字段分组 group by 和order by 一起使用
select filed,filed1 from table gourp by filed having count(filed1) > condition;
select filed,field1 from table gourp by filed with rollup;
用Limit 限制查询结果的数量:select * from table limit n | n,m;

集合函数查询:
    count(),    sum()    avg()    max()    min()    
连接查询:
    内连接:inner join 
        select tb_1.field from table where tb_2.filed = tb_1.id;
    外连接:left join, right join
    复合条件连接查询:
    子查询:
子查询:
合并查询:
为表和字段取别名:
正则表达式查询:
1
2
3
@Author : Hale Lv
@Created Time : 2019-09-02 12:43:57
@Description :

数据库

存储方式
    计算机数据Data 的存储一般以 硬盘 为数据存储空间资源,从而保证计算机内的数据能够保持保存,对于数据的处理,一般采用数据库相关的技术进行处理,从而保证数据处理的高效性
数据库
    是数据管理的有效技术,是由一批数据构成的有序集合,这些数据存放在结构化的数据表里,数据表之间相互关联,反映客观事物的本质联系,有效帮助组织或企业科学管理各类信息资源
数据
    是数据库中存储的基本对象,是按一定顺序排列组合的物理符号,数据有多种表现形式,可是数字、文字、图像、音频、视频等,可经过数字化存入计算机
数据库 是 数据 的集合,具有同一的结构形式存放于统一的存储介质内,是多种应用数据的继承,并可悲各个应用程序共享

数据库的存储结构

是指数据库中的物理数据和逻辑数据的表示形式、物理和逻辑数据关系映射方式的描述。可使用两种形式描述客观现实的数据。物理数据和逻辑数据之间的转换通过数据库管理系统实现。
物理数据描述
    是指数据在存储设备上的存储方式,实际存放在存储设备上的数据。根据物理记录存储位置,可分为有序存储和无需存储

物理数据包括:

1. 位 bit : 二进制的一个单位称为位 ,位只能取 1 或 0
2. 字节 byte : 8个位称为一个字节,可存放对应的ASCII码的一个字符
3. 字 word : 若干个字节组成一个字,一个字所含的二进制的位数称为字长,计算计算机的字长是不同的,可是0、16、24、32位等
4. 块 block : 内存储器和外存储器交换信息的最小单位,称为物理块或物理记录,每块大小为 256字节、512字节、1024字节等
5. 卷 volume : 一台输入输出设备所能装载的全部有用信息,如;磁带机的一盘磁带即为一卷,磁盘设备的一个盘组也是一卷。
6. 无序存储 unordered : 数据记录按照插入的顺序进行存储

逻辑数据描述

指用户或程序员用于操作的数据形式,是一种抽象的概念,是对客观现实世界的反映和记录,也可称为 逻辑记录
逻辑数据包含两个层次,一个层次是对客观现实信息世界的描述,另一个层次是对数据库管理系统中数据的描述
对客观信息世界的描述包括:
    1. 实体 entity : 客观现实存在的东西用实体来描述,可是具体的、有型的,也可是抽象的、无形的对象,如: 一本书是一个有形对象,另一个是无形对象
    2. 实体集 entities : 特征完全相同的同类实体的集合称为实体集,如一个图书馆所有书籍是一个实体集。
    3. 属性 attribute : 实体的特性称为属性,每个属性都有一个值域。可以是整数类型、浮点数类型、字符类型、日期类型等
    4. 标识符 identifier : 能够唯一地标识每个实体的属性或属性集,如 书的书号属性是实体书的标识符。
    关系型数据库管理系统介绍;
        1. 数据项 data item : 也称字段field ,标记实体属性的命名的最小信息单位,命名采用属性的描述性名称
        2. 元组 tuple : 也称 记录 record ,数据项的集合称为 元组,一个元组表示一个具体的实体
        3. 关系 relation : 同一类元组所在的集合称为关系,适用于描述实体集,包括一个实体集的所有元组
        4. 键码 key : 能够唯一标识关系中每个元组的数据项或数据项的组合称为关系的键码

数据库涉及的技术

数据库系统
    Database Management System ,DBMS 是位于操作系统与用户之间的额一种操纵和管理数据库的软件,按照一定的数据模型科学地组织和存储数据,同时可提供数据高效地获取和维护
    DBMS 主要功能概括:
        1. 数据定义功能:    
            数据定义语言 Data Definition Language, DDL:用户通过它可方便对数据库中的数据对象进行定义
            数据操纵功能 Data Manipulation Language ,DML: 实现对数据库的基本操作,如:查询、插入、删除和修改等
            数据库的运行管理: 数据库在建立、运用和维护时由数据库管理系统统一管理、统一控制、保证数据的安全性、完整性、多用户对数据的并发使用及发生故障后的系统恢复,如;
                1. 数据的完整性检查功能保证用户输入的数据应该满足相应的约束条件
                2. 安全保护功能保证只有赋予权限的用户才能访问数据库中的数据
                3. 并发控制能力使多个用户可在同一时刻并发地访问数据库的数据
                4. 故障恢复功能使数据库运行出现故障时可进行数据恢复,保证数据库可靠运行
            提供方便、有效地存储数据库信息的接口和工具
                编程语言与数据库之间的接口进行数据库应用程序的开发。 数据库管理员Database Administrator, DBA 通过提供的工具对数据进行管理
            数据库的建立和维护功能
                数据库输出话数据的输入、转换功能,数据库的转储、恢复功能,数据库的重组织功能和性能监控、分析功能等
                数据库系统是指计算机系统中引入数据库后的系统,一个完整的数据库系统Database System ,DBS 一般由数据库、数据库管理系统、应用开发工具、应用系统、数据库管理员和用户组成。

SQL语言

通过结构化查询语言 Structed Query Language, SQL来实现,是各种数据库交互方式的基础
SQL是一种数据库查询和程序设计语言,用户存取数据以及查询、更新和管理关系数据库系统    
优点:
    1. 一体化 : SQL 集数据定义、数据操作和数据控制一体,可完成数据库中的全部工作
    2. 使用方式灵活: 两种使用方式,直接命令交互方式使用;也可嵌入使用,嵌入C、C++等
    3. 非过程化: 只提操作要求,不必描述操作步骤
    4. 语言简洁: 语法简单、好学好用。包含94个单词、6个核心功能动词

数据库访问技术
    包括: ODBC、DAO、OLE DB 和ADO
        ODBC : Open Database Connectivity,开放数据库互连,建立了一组规范,提供了一组对数据库访问的标准API(应用程序编程接口)
        DAO : Data Access Object , 数据访问对象,是基于一个数据库对象集合的访问技术,独立于DBMS进行数据库的访问
        OLE DB : Object Linking and Embedding Database,对象连接与嵌入。开放数据库连接通性 ODBC 的结构化查询语言SQL的能力,具有面向其他非SQL数据类型的通路,是一组读写数据的方法,对象主要包括数据源对象、阶段对象、命令对象和行组对象
        ADO : ActiveX Data Objects,是一个用于存取数据源的COM组件,提供编程语言和统一数据访问方式OLE DB 的一个中间层,允许编写访问数据的代码而不用关心数据库是如何实现过得,只关心到数据库的连接

数据库的优势

具有以下系统特性:
    1. 使用C和C++编写,可移植性
    2. 支持Linux 、Mac OS、Windows 等多种操作系统
    3. 多种编程语言:C、C++、Python、PHP、Java、等
    4. 支持多线程,充分利用CPU资源
    5. 优化的SQL查询算法,有效提高查询速度
    6. 作为一个单独的应用程序在客户端服务器网络环境中,也可作为一个库嵌入其他的软件中
    7. 提供多语言支,编码: GB2312、BIG5等
    8. 提供TCP/IP、ODBC 和 JDBC 等多种数据库连接途径
    9. 提供用于管理、检查、优化数据库操作的管理工具
    10. 支持大型的数据库,可处理拥有上千万条记录的大型数据库
    11. 支持多种存储引擎

MySQL 版本及版本号
    如 mysql-5.7.20
        5 :是主版本号
        7 : 是发行级别
        20: 在此发行系列的版本号
新特性:
    1. 随机root密码
    2. 自定义test 数据库
    3. 默认SSL加密
    4. 密码过期策略
    5. 用户锁
    6. 全面支持JSON
    7. 支持两类生成列 generated column
    8. 引入系统库 sys schema
    具体看官网新版本的更新内容

MySQL 客户端和服务器端工具集

    MySQL 服务器端:
        1. mysqld :SQL后台程序。必须运行,客户端才能连接服务器来访问数据库
        2. mysqld_safe : 服务器启动脚本,mysqld_safe 来启动 mysqld 服务器,mysqld_safe 增加了安全性,如出现错误,重启服务器向错误日志写入运行时间信息
        3. mysql.server : 服务器启动脚本,用于使用包含特定级别的、运行启动服务器脚本的、运行目录的系统,调用mysqld_safe 启动mysql服务器
        4. mysqld_multi :服务器启动脚本,可启动或停止系统安装的多个服务器
        5. mysamchk : 用来描述、检查、优化和维护MyISAM表的使用工具
        6. mysql.server : 服务器启动脚本
        7. mysqlbug : MySQL 缺陷报告脚本,可用来向MySQL邮件系统发送缺陷报告
        8. mysql_install_db : 使用默认权限创建 MySQL授予权表,首次安装mysql时执行一次
    MySQL 客户端:
        1. myisampack :压缩MyISAM 表产生更小的制度表的一个工具
        2. mysql :交互输入SQL语句或从文件批处理模式执行他们的命令行工具
        3. mysqlaccess : 检查访问主机名、用户名和额数据库组合的权限的脚本
        4. mysqladmin : 执行管理操作的客户程序,如创建、删除、重载授权表、将表刷新到硬盘以及重新打开日志文件。 还可用来检查索引版本、进程及服务器的版本信息
        5. mysqlbinlog : 从二进制日志读取语句的工具,在二进制日志文件中包含执行过的语句,可帮助系统从奔溃中恢复
        6. mysqlcheck : 检查、修复、分析、优化表的表维护客户程序
        7. mysqldump : 将MySQL数据库转储到一个文件
        8. mysqlhotcopy : 当服务器在运行时,快速备份 MyISAM 或ISAM表的工具
        9. mysql import : 使用LOAD DATA INFILE 将文本文件导入相应的额客户程序
        10. mysqlshow : 显示数据库、表、列及索引相关信息的客户程序
        11. perror : 显示系统或MySQL错误代码含义的工具

MySQL 免安装版配置
    [免安装版](http://c.biancheng.net/view/2412.html)
1
2
3
@Author : Hale Lv
@Created Time : 2019-09-02 14:29:19
@Description :

创建数据库

数据库可看作是一个专门存储数据对象的容器,这里的数据对象包括表、视图、触发器、存储过程等,表是最基本的数据对象,在创建数据对象前,先要创建数据库
创建数据库: CREATE DATABASE 
    CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARSET SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];
    [] 是可选的,语法说明:
        - <数据库名> : 创建数据库的名称,不区分大小写
        - IF NOT EXISTS : 在创建数据库之前进行判断,该数据库不存在时执行此操作
        - [DEFAULT] CHARSET SET : 指定数据库的默认字符集
        - [DEFAULT] COLLATE : 指定字符集的默认校对规则
    MYSQL 的字符集 CHARSET 和校对规则 COLLATION 两个不同概念: 字符集用来定义MYSQL存储字符串的方式,校对规则定义了比较字符串的方式,解决排序和字符分组的问题
    创建MYSQL数据库的语句:
        CREATE DATABASE test_db;
        MYSQL 不允许在同一系统创建两个相同名称的数据库
        CREATE DATABASE IF NOT EXISTS test_db; // 避免出现已存在错误提示
    创建MySQL数据库时指定字符集和校对规则
        创建test_db_char ,指定默认字符集为utf8, 默认校对规则为 utf8_chinese_ci
        CREATE DATABASE IF NOT EXISTS test_db_char
            DEFAULT CHARACTER SET utf8
            DEFAULT COLLATE utf8_chinese_ci;
    使用SHOW CREATE DATABASE查看 test_db_char 数据库的定义声明

MySQL查看或显示数据库(SHOW DATABASES语句)

SHOW DATABASES [LIKE '数据库名'];
    1. LIKE 从句,可选,用于匹配数据库名
    2. 数据库名由 '' 包围
1. 查看所有数据库
    SHOW DATABASES
2. 创建并查看数据库
    CREATE DATABASE test_db;
    SHOW DATABASE;
3. 使用LIKE 语句
    SHOW DATABASES LIKE 'test_db';
    SHOW DATABASES LIKE '%test%'
    SHOW DATABASES LIKE 'db%'
    SHOW DATABASES LIKE '%db'

MYSQL 修改数据库: ALTER DATABASE

修改数据库,使用 ALTER DATABASE 或 ALTER SCHEMA 语句
修改数据库语法:
    ALTER DATABASES [数据库米ing] { [DEFAULT] CHARACTER SET <字符集名> [DEFAULT] COLLATE <校对规则名> }
        1. ALTER DATABASES 更改数据库的全局特性,存储在db.opt 文件中
        2. 需要获取ALTER 权限
        3. 数据库名可忽略, 对应默认数据库
        4. CHARCTER SET 子句用于更改默认的数据库字符集
修改数据库字符集
    SHOW CREATE DATABASE test_db;
    CREATE DATABASE test_db DEFAULT CHARACTER SET gb2312 DEFAULT COLLATE gb2312_chinese_ci;

删除数据库 DROP DATABASES

DROP DATABASE | DROP SCHEMA
DROP DATABASE [IF EXISTS] <数据库名>
    1. 数据库名: 指定要删除的数据库名
    2. IF EXISTS : 防止当前数据库不存在时发生错误
    3. DROP DATABASE : 删除数据库中的所有表哥并同时删除数据库
    不能删除 information_schema 和 mysql的两个系统数据库,否则不能工作
MYSQL删除数据库:
    DROP DATABASE test_db;
    DROP DATABASE IF NOT EXISTS test_db;

选择数据库

USE 用来完成一个数据库到另一个数据库的跳转
USE <数据库名>

存储引擎详解

存储引擎
    是数据库底层软件组件,使用数据引擎进行创建、查询、更新和删除数据操作
    InnoDb 事务型数据库的首选引擎, 支持事物安全表ACID,支持行锁定和外键
    MyISAM 基于ISAM的存储引擎,拥有较高的插入、查询速度,不支持事物
    可对每一个表使用不同的存储引擎
    支持的存储引擎有:
        InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、Blackhole等

使用 SHOW ENGINES,查看系统支持的引擎类型

如何选择MYSQL存储引擎

    功能                MyISAM        MEMORY        INNODB        ARCHIVE
  存储限制                256TB        RAM            64TB        NONE
  支持事物                No            No            Yes            No
支持全文索引            Yes            No            No            No
支持树索引                Yes            Yes            Yes            No
支持哈希索引            No            Yes            No            No
支持数据缓存            No            N/A            Yes            No
支持外键                No            No            Yes            No
选择MYSQL存储引擎的原则:
    1. 如要提交、回滚、恢复的事物安全ACID能力,并要求实现并发控制,选择InnoDB
    2. 插入和查询记录,选择MyISAM
    3. 临时存放数据,数据量不大, 不需要较高的数据安全性,可将数据保存在内存的MEMORY引擎中
    4. 如只有 INSET 和SELECT ,选择 ARCHIVE引擎,支持高并发的插入操作,适合存储归档数据,如记录日志信息可使用Archive
    一个数据库中可使用不同的引擎以满足各种性能和实际需求

MYSQL 默认存储引擎

使用下面语句修改数据库临时的默认存储引擎:
    SET default_storage_engine = <存储引擎名>
        SET default_storage_engine = MyISAM;
    重启MYSQL客户端,默认存储引擎是 InnoDB
1
2
3
@Author : Hale Lv
@Created Time : 2019-09-02 16:12:27
@Description :

常见数据类型

1. 整数类型
    INTYINT、 SMALLINT、 MEDIUMINT、 INT、 BIGINT、 浮点数类型 FLOAT 和 DOUBLE,定点树类型 DECIMAL 
2. 日期/时间类型
    YEAR、 TIME、 DATE、 DATETIME 和 TIMESTAMP
3. 字符串类型
    CHAR、 VARCHAR、 BINARY、 VARBINARY、 BLOG、 TEXT、 ENUM、 SET等
4. 二进制类型
    BIT、 BINARY、 VARBINARY、 TINYBLOB、 BLOB、 MEDIUMBLOB、 LONGBLOB

整数类型

属性字段可以添加AUTO_INCREMENT 自增约束条件
    类型名称            说明            存储需求
    TINYINT            很小的整数            1个字节 | 0~255
    SMALLINT        小的整数            2个字节    | 0~65535 
    MEDIUMINT        中等大小的整数        3个字节    | 0~16777215
    INT|INTEGHR        普通大小的整数        4个字节    | 0~4294967295
    BININT            大整数                8个字节    | 0~18446744074709551615

小数类型 FLOAT、DOUBLE、 DECIMAL

    单精度浮点数 FLOAT, 双精度浮点数 DOUBLE, 定点类型: DECIMAL
    浮点类型和定点类型都可用 M、D表示,M为精度,表示总共的位数, D为标度,表示小数的位数
    类型名称            说明            存储需求
    FLOAT            单精度浮点数        4个字节
    DOUBLE            双精度浮点数        8个字节
    DECIMAL(M,D), DEC  压缩的严格定点数    M+2个字节
定点数以字符串形式存储,对精度要求比较高的时候,使用DECIMAL的类型,避免做浮点数比较

日期和时间类型

每一个类型都有合法的取值范围,当指定确定不合法的值时,系统将 零 值插入数据表中
类型名称        日期格式            日期范围                存储需求
YEAR            YYYY                1901~2155                1个字节
TIME            HH:MM:SS                                    3个字节
DATE            YYYY-MM-DD                                    3个字节
DATETIME        YYYY-MM-DD HH:MM:SS                            8个字节
TIMESTAMP        YYYY-MM-DD HH:MM:SS                            4个字节
[More](http://c.biancheng.net/view/2425.html)

字符串类型

字符串类型中,括号中的M表示可为其指定长度
类型名称                说明                    存储需求
CHAR(M)
VARCHAR(M)
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
ENUM
SET
[More](http://c.biancheng.net/view/2426.html)

二进制类型

类型名称            说明                存储需求
BIT(M)
BINARY(M)
VARBINARY(M)
BLOB(M)
MEDIUMBLOB(M)
LONGBLOB(M)
[More](http://c.biancheng.net/view/2428.html)
1
2
3
@Author : Hale Lv
@Created Time : 2019-09-02 16:39:36
@Description :

MYSQL 数据表增删改查

创建数据表 CREATE TABLE

在已经创建的数据库中创建新表
    CREATE TABLE  <表名> ([表定义选项][表选项][分区选项]);
    主要由表创建定义 create-definition、 表选项 table-options 和 分区选项 partition-options 组成
        1. CREATE TABLE : 用于创建给定名称的表,必须拥有表CREATE 的权限
        2. 表名: 指定要创建表的名称
        3. 表定义选项: 表创建定义,由列名col_name、列的定义 column_definition 以及空值说明、完整性约束或表索引组成
        4. 默认的情况,表被创建到当前的数据库中

在指定数据库中创建表

使用 USE 数据库名 指定操作的数据库
    USE 数据库名
    CREATE TABLE 数据表名 (
        ...
    )
查看表结构:
    DESC  | DESCRIBE  TABLE 
    SHOW CREATE TABLE
    各个字段的含义:
        1. NULL :表示该列可存储NULL值
        2. Key : 该列是否已编制索引,PRI:该列是表主键的一部分, UNI:UNIQUE索引的一部分, MUL:列中某个定植允许出现多次
        3. Default : 表示该列是否有默认值,如有,值是多少
        4. Extra : 可获取的与给定列有关的附加信息,如 AUTO_INCREMENT等
结合:
    SHOW CREATE TABLE <TABLE_NAME>\G;
    SHOW CREATE TABLE tb_name \G
    CREATE TABLE `tb_name` (
        `id` int(11) DEFAULT NULL,
        `name` varchar(100) DEFAULT NULL,
        `salary` float DEFAULT NULL
    )ENGINE=InnoDB DEFAULT CHARSET=gb2312

MySQl 修改数据表 ALTER TABLE

修改表指修改数据库中已经存在的数据表的结构。使用 ALTER TABLE 修改。修改表的操作有:修改表名、修改字段数据类型或字段名、增加和删除字段、修改字段的排列位置、更改表的存储引擎、删除表的外键约束等
    ALTER TABLE <表名> [修改选项]
        选项:
            {
                ADD COLUMN <列名> <类型>    |
                CHANGE COLUMN <旧列名> <新列名> <新列类型>    |
                ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }    |
                MODIFY COLUMN <列名> <类型>    |
                DROP COLUMN <列名>    |
                RENAME TO <新表名>
            }
添加字段
    ALTER  TABLE  <表名> ADD <新字段名> <数据类型>  [约束调教] [FIRST|AFTER 已存在的字段名];
        新字段名为要添加的字段的名称
修改字段数据类型
    修改字段的数据类型即把字段的数据类型转换成另一种数据类型
    ALTER TABLE <表明> MODIFY <字段名> <数据类型>
删除字段
    ALTER TABLE <表名> DROP <字段名>;
修改字段名称
    ALTER TABLE  <表名>  CHANGE  <旧字段名>  <新字段名> <新数据类型>;
        :CHANGE 可只修改数据类型,实现和MODIFY同样的效果,将SQL中的新字段名 和 旧字段名设置为相同的名称,只改变 数据类型
修改表名
    ALTER TABLE <旧表名> RENAME <TO> <新表名>;
        :TO 为可选参数

删除数据表 DROP TABLE

DROP TABLE [IF EXISTS] <表名> [, <表名1> , <表名2> ] ...
    1. 表名: 被删除的表名,可同时删除多个表
    2. 表被删除时,所有表数据和表定义会被取消
    3. 表被删除时,权限不会自动被删除
    4. IF EXISTS 在删除前判断删除的表是否存在
删除表
    DROP TABLE test_tb;

MYSQL INSERT : 插入数据

有两种语法:
    1. INSERT ... VALUES 语句
        INSERT INTO <表名> [ <列名1> [,...<列名n>]] VALUES (值1) [...,(值n)];
            : 表名 :指定被操作的表名
            : 列名: 指定需要插入数据的列名,如向表中所有列插入数据,可省略列名
            : VALUES 或 VALUE 子句: 要插入的数据清单顺序要和列的顺序相对应
    2. INSERT ... SET 语句
        INSERT INTO <表名> SET <列名> = <值1>, <列名2> = <值2>, ...    
    :INSERT 。。。VALUES 可向表中插入一行或多行数据
    :INSERT。。 VALUES 可指定插入行中每列的值,也可指定部分列的值
    :INSERT。。。SELECT 可向表中插入其他表的数据
    :INSERT 。。。SET可向表中插入部分列的值
    :INSERT。。。VALUES可一次插入多条数据
使用INSERT INTO 。。。FROM 语句复制表数据

MYSQL UPDATE : 修改数据|更新数据

UPDATE <表名> SET 字段1=值 1 [,字段 2 = 值 2.。。] [ WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
    : 表名: 指定要更新的表名称
    : SET 子句: 指定表中要修改的列名以及其值
    : WHERE 子句: 限定表中要修改的行,如不指定,修改所有行
    : ORDER BY: 限定表中的行被修改的次序
    : LIMIT 子句: 限定被修改的行数

MYSQL DELETE : 删除数据

DELETE FORM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
    : 表名; 指定要删除的表名
    : ORDER BY : 按照子句中指定的顺序进行删除
    : WHERE 子句: 为删除操作限定删除条件,如省略,则删除素有行
    : LIMIT 子句: 被删除行的最大值
不使用WHERE条件的时候,将删除所有数据
1
2
3
@Author : Hale Lv
@Created Time : 2019-09-03 09:14:58
@Description :

MYSQL 主键 PRIMARY KEY

主键PRIMARY KEY 完整称呼为: 主键约束。 是一个列或列的组合,其值能唯一地标识表中的每一行, 这样的一列或多列成为表的主键,可强制表的实体完整性
选取设置主键约束的字段
    需遵守的规则:
        1. 每个表只能定义一个主键
        2. 主键值必须是唯一标识表中的每一行,不能为NULL,即表中不能存在两行数据有相同的主键值
        3. 一个列名只能在复合主键列表中出现一次
        4. 复合主键不能包含不必要的多余列。 
在创建表时设置主键约束
    <字段名> <数据类型> PRIMARY KEY [默认值]
    在定义完所有列之后,指定主键的语法格式:
        [CONSTRAINT] <约束名> | PRIMARY KEY [字段名]
在创建表时设置复合主键
    PRIMARY KEY [字段1,字段2,。。。字段n]
在修改表时添加主键约束
    ALTER TABLE <数据表名> ADD PRIMARY KEY(<列名>);

MYSQL 外键约束 FOREIGN KEY

外键约束用来在 两个表之间建立连接,可是一列或多列, 一个表可有一个或多个外键
外键对应的参照完整性,一个表的外键可是空值,如不为空,则每个外键的值必须等于另一个表中主键的某个值
作用:保持数据的一致性、完整性,如部门表 tb_dept 的主键是 id, 员工表 tb_emp中有一个键 deptID 与 这个 id 关联
    主表(父表): 对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表
    从表(子表): 对于两个具有关联关系的表而言,相关联字段中外键所在的表就是从表
选取设置MYSQL外键约束的字段
    定义外键,需遵守的规则:
        1. 父表存在与数据库中,或是当前正在创建的表,父表与子表是同一个表,这样的表称为 自参照表, 结构称为 自参照完整性
        2. 必须为父表定义主键
        3. 主键不能包含空值,允许外键中出现空值
        4. 在父表的表名后指定列名或列名的组合,这个列或列名的组合必须是父表的主键或候选键
        5. 外键中列的树木必须和父表的主键中列的数目相同
        6. 外键中列的数据类型必须和父表主键中对应的数据类型相同
在创建表时设置外键约束
    在数据表中是创建外键使用 FOREIGN KEY 关键字
        [CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,...] REFERENCES <主表名> 主键列1 [, 主键列2,...]
        :外键名 为定义的外键约束的名称,不能有相同名称的外键;字段名表示子表需要添加外键约束的字段列; 主表名即被子表外键所依赖的表的名称;主键列表示主表中定义的主键列或列组合
在修改表时添加外键约束
    ALTER TABLE <数据表名> ADD CONSTRAINT <索引名> FOREIGN KEY(列名) REFERENCES <主键名> (<列名>);
删除外键约束
    删除外键,解除主表和从表间的关联关系
    ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;

MYSQL 唯一约束 UNIQUE KEY

要求该列唯一,允许为空,但只能出现一个空值,唯一约束可确保一列或几列不出现重复值
在创建表时设置唯一约束
    <字段名> <数据类型> UNIQUE
UNIQUE 和 PRIMARY KEY 的区别: 一个表可有多个字段声明为UNIQUE,但只能有一个PRIMARY KEY 声明;声明为PAIMARY KEY的列不允许有空值,UNIQUE的字段允许空值的存在
在修改表时添加唯一约束
    ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>);
删除唯一约束
    ALTER TABLE <表名> DROP INDEX <唯一约束名>;

MYSQL检查约束 CHECK

选取设置检查约束的字段
    CHECK <表达式>
        :表达式指SQL,用于指定需要检查的限定条件
    若将CHECK约束子句置于某个列的定义之后,这种约束称为基于列的CHECK 约束
    在更新表数据的时候,系统检查更新后的数据行是否满足CHECK约束中的限定条件
在创建表时设置检查约束
    CHECK (<检查约束>)
在修改表时添加检查约束
    ALTER TABLE tb_emp ADD CONSTRAINT <检查约束名> CHECK(<检查约束>)
删除检查约束    
    ALTER TABLE <数据表名> DROP CONSTRAINT <检查约束名>;

默认值 DEFAULT

完整称呼为: 默认值约束 DEFAULT Constraint,默认值约束用来指定某列的默认值
在创建表时设置默认值约束
    <字段名> <数据类型> DEFAULT <默认值>;
在修改表时添加默认值约束
    ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <数据类型> DEFAULT <默认值>;
删除默认值约束
    ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <数据类型> DEFAULT NULL;

MYSQL 非空约束 NOT NULL

可通过 CREATE TABLE 或 ALTER TABLE 实现,在表中某个列的定义后加上关键字 NOT NULL 作为限定词,来约束该列的取值不能为空
在创建表时设置非空约束
    <字段名> <数据类型> NOT NULL;
在修改表时添加非空约束
    ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <数据类型> NOT NULL;
删除非空约束
    ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <数据类型> NOT NULL;

MYSQL 查看表中的约束

使用 SHOW  CREATE TABLE 查看表约束
SHOW CREATE TABLE <数据表名>;
1
2
3
@Author : Hale Lv
@Created Time : 2019-09-03 10:50:13
@Description :

MYSQL 查询数据表

指从一张表的数据中查询所需要的数据,主要有查询所有字段、查询指定字段、查询指定记录、查询空值、多条件的查询、对查询结果进行排序等
MySQL SELECT 基本语法
    SELECT { * | <字段列名>}
    [        
        FROM <表1> , <表2> ...
        [
            WHERE <表达式>
            [ GROUP By <group by definition>
                [
                    HAVING <expression> [{<operator> <expression>}...]
                ]
                [
                    ORDER BY <order by definition>
                ]
                [ 
                    LIMIT [<offset>,] <row count>
                ]
            ]
        ]
    ]
        1. { * | <字段列名> } 包含星号通配符的字段列表,表示查询的字段,字段列至少包含一个字段名称,如要查询多个,要用逗号隔开
        2. FROM <表1>,<表2>..., 表1,2表示查询数据的来源,可单个可多个
        3. WHERE 子句是可选项,将限定查询行必须满足的查询条件
        4. GROUP BY <字段> ,该子句告诉MYSQL,如何显示查询出来的数据,并按照指定的字段分组
        5. [ ORDER BY <字段> ], 该子句告诉MYSQL 按顺序显示查询出来的数据,升序ASC 降序DESC
        6. [LIMIT[<offset>,]<row count>] ,每次西芹是查询出来的数据条数
    使用 *  查询表中的全部内容
        使用星号 * 通配符查询所有字段
            SELECT * FROM 表名;
    查询表中指定的字段
        SELECT <列名> FROM <表名>;
        SELECT <字段名1>, <字段名2>, <字段名n> FROM <表名>;

MYSQL DISTINCT : 去重,过滤重复数据

SELECT DISTINCT <字段名> FROM <表名>;

MYSQL AS :设置别名

<表名> [AS] <别名>;
    : 表名: 数据中存储的数据表的名称
    :别名: 查询时指定的表的新名称
    : AS :可选参数
    为表取别名时,保证不能与数据库中的其他表的名称冲突
    显示的列名称很长或名称不直观,可指定列的别名,替换名字或表达式
<列名> [AS] <列别名>
    : 列名 : 为表中字段定义的名称
    : 列别名: 字段新的名称
    : AS : 可选参数

MYSQL LIMIT : 限制查询结果的记录条数

返回第一行或前几行,用 MYSQL LIMIT 子句
<LIMIT> [ <位置偏移量>, ] <行数>
LIMIT接受一个或两个数字参数,参数必须是一个整数常量,如给定两个,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目
第一个参数 位置偏移量 指示 MYSQL 从哪行开始显示,如不指定,从表中的第一条记录开始,第二个参数 行数 指示 返回的记录条数
如指定返回记录的开始位置,则返回结果为从 位置偏移量 参数开始的指定行数, 行数 参数指定返回的记录条数
返回第一行时,位置偏移量为0, 因此, LIMIT 1,1 返回第2行,而不是1行

MYSQL ORDER BY : 对查询结果进行排序

ORDER BY 子句主要将结果集中的数据按照一定的顺序进行排序
ORDER BY { <列名> | <表达式> | <位置> } [ASC | DESC]
    : 列名: 指定用于排序的列, 可指定多个列,列名之间用逗号隔开
    : 表达式 指定用于排序的表达式
    : 位置: 用于排序的列在SELECT 语句结果集中的额位置,通常是一个正整数
    : ASC|DESC : ASC表示 升序 DESC 表示 降序
ORDER BY 注意:
    1. ORDER BY 子句中可以包含子查询
    2. 当排序的值中存在空值时,将该空值作为最小值来对待
    3. 指定多个列进行排序时,按照从左到右依次进行排序
    4. 如没有进行排序,根据插入到数据表中的顺序显示

MYSQL WHERE : 条件查询

使用 WHERE 子句指定查询条件,从FROM子句的中间结果选取适当的数据行,达到过滤的效果
WHERE <查询条件>  { <判定运算1> , <判定运算2>,...}
    判定结果取值为: TRUE 、FALSE、UNKNOWN
    分类:
        1. <表达式1> {=|<|<=|>|>=|<==>|<>|! = } <表达式2>
        2. <表达式2> [NOT] LIKE  <表达式2>
        3. <表达式1> [NOT][REGEXP|RLIKE] <表达式2>
        4. <表达式1> [NOT] BETWEEN <表达式2> AND <表达式3>
        5. <表达式1> IS [NOT] NULL
单一条件的查询语句
    查询一个指定列的具体值
多条件的查询语句
    使用AND操作符限定只有满足所有查询条件的记录才会被返回
使用LIKE的模糊查询
    <表达式1> {NOT} LIKE <表达式2>
        一种模式匹配,使用运算符LIKE设置过滤条件,使用通配符进行匹配运算,而不是判断是否相等进行比较
        匹配运算对象可以是 CHAR、 VARCHAR、TEXT、DATETIME等数据类型,返回结果是TRUE 或FALSE
    MYSQL支持的通配符:
        1. 百分号 % 是一种通配符,可表示任何字符串,字符串可出现任意次
            需注意:
                默认不区分大小写, 如要区分大小写,需更换字符集的校对规则
                百分号不匹配空值
                百分号可代表搜索模式中给定位置的0个、1个或多个字符
                在搜索模式的最后附加一个百分号
        2. 下划线 _    通配符,只匹配单个字符,不是多个,也不是0个字符
日期字段作为条件的查询语句
    以日期字段作为条件,使用比较运算符设置查询条件,也可使用 BETWEEN AND 运算符查询某个范围内的值

MYSQL 常用运算符

MYSQL支持的4种运算符:
    1.  算术运算法: 加、减、乘、除
    2, 比较运算符:大于、小于、等于、不等于等等
    3.  逻辑运算符: 与、或、非、异或等,返回值为布尔值
    4.  位运算符 : 按位与、按位或、按位取反、按位异或、按位左移、按位右移等,位运算必须将数据转换为二进制
[More](http://c.biancheng.net/view/2561.html)

MYSQL INNER JOIN :内连接查询

内连接是通过查询中设置连接条件的方式, 移除查询结果集中某些数据行的交叉连接,利用条件表达式来消除交叉连接的某些数据行
使用 INNER JOIN 连接两张表,使用 ON 子句来设置连接条件,如没有条件, INNER JOIN 和 CROSS JOIN 是等同的,可互换。
SELECT <列名1,列名2,...> FROM <表名1> INNER JOIN <表名2> [ON子句]
    : 列名1,列名2,。。。: 需要检索的列名
    : 表名1 表名2  : 进行内连接的两张表的表名
    内连接是系统默认的表连接,在FROM子句后可省略INNER关键字,使用内连接,FROM子句中的额ON子句可用来设置连接表的条件
    在FROM子句中可在多个表之间连续使用INNER JOIN或JOIN,可同时实现多个表的内连接

MYSQL LEFT / RIGHT JOIN : 外连接查询

内连接是在交叉连接的结果集上返回满足条件的记录; 而外查询先将连接的表分为基表和参考表,再以基表为依据返回满足和不满足条件的记录
外连接注重两张表之间的关系,按照表的顺序,可分为 左外连接 和 右外连接
左外连接称为 左连接,  在 FROM 子句中使用 LEFT OUTER JOIN 或 LEFT JOIN,用于接收该关键字左表即基表的所有行,这些行与该关键字右表即参考表中的行进行匹配,左表中的每一行及右表中的符合条件的行
左外连接的结果集中,除匹配行外,还包活左表中有但右表中不匹配的行,从右表中选择的行的值被设置为NULL, 即左外连接的结果集汇中的NULL值表示右表中没有找到与左表享福的记录
右外连接称为 右连接,在FROM子句中使用RIGHT OUTER JOIN或RIGHT JOIN, 与左外连接相反,右表中有左表中不匹配的行,从左表中选择的值设置为NULL

MYSQL 子查询

子查询是指一个查询语句嵌套另一个查询语句内部的查询,在SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可基于一个表或多个表
子查询中常用的操作符有 ANY(SOME) 、ALL、IN、EXISTS
子查询可添加到 SELECT、UPDATE、DELETE中,可进行多层嵌套,子查询可使用比较运算符,如<,<=,> => ,!=等

子查询中常用的运算符

1. IN 子查询
    判断一个给定值是否存在于子查询的结果集中
        <表达式> [NOT] IN <子查询>
            : 表达式: 用于指定表达式,当表达式与子查询返回的结果集中的某个值相等时,返回TRUE,如使用关键值 NOT, 返回的值正好相反
            : 子查询: 用于指定子查询,只能返回一列数据,可使用SELECT语句实现查询的多层嵌套
2. 比较运算符子查询
    用于对表达式的值和子查询返回的值进行比较运算
        <表达式> { = | < | > | >= | <= | <=> | != }    { ALL | SOME | ANY } <子查询>
3. EXISTS 子查询
    用于判断子查询的结果集是否为空,
        EXISTS <子查询>
[More](http://c.biancheng.net/view/2566.html)

MYSQL GROUP BY : 分组查询

将结果集中的数据行根据选择列的值进行逻辑分组,能汇总表内容的子集,实现对每个组而不是整个结果集进行整合
GROUP BY { <列名> | <表达式> | <位置> } [ ASC | DESC ]
    :列名: 指定用于分组的列,可指定多个列
    : 表达式: 指定用于分组的表达式,通常与聚合函数一起使用
    : 位置: 用于分组的选择列在SELECT 语句结果集中的位置,是一个整数
    : ASC | DESC : 必须位于对应的列名、表达式、列的位置之后
    需注意:
        1. 可包含任意数目的列,可对分组进行嵌套,为数据分组提供更细致的控制
        2. 每个列都必须是检索列或有效的表达式,不能是聚合函数
        3. SELECT语句中的每个列都必须是GROUP BY 子句中给出
        4. 用于分组的列中包含有NULL值,则NULL将作为一个单独的分组返回,如列中存在多个NULL值, 则将这些NULL值所在行分为一组

MYSQL HAVING : 指定过滤条件

在结果集中规定包含哪些分组和排除哪些分组
    HAVING <条件>
    HAVING 和 WHERE 子句相似,HAVING子句支持WHERE子句中素有的操作符和语法,差异:
        1. WHERE 子句主要过滤数据行, HAVING子句用于过滤分组,集HAVING子句基于分组的聚合值而不是特定行的值来过滤数据,主要过滤分组
        2. WHERE子句不可以包含聚合函数,HAVING子句的条件可包含聚合函数
        3. HAVING子句是在数据分组后进行过滤, WHERE子句会在数据分组前进行过滤,WHERE子句排除的行不包含在分组中,会影响HAVING子句基于这些值过滤的分组

MYSQL REGEXP : 正则表达式查询

    用来被检索或替换符合某个模式的文本内容,根据指定的匹配模式匹配文中符合要求的特殊字符串
    REGEXP操作符常用的匹配列表
    ^ : 匹配文本的开始字符 
    $ : 结束字符
    . : 任何单个字符
    * : 0个或者 多个在它前面的字符
    + : 1次个或多次
    <字符串> :匹配包含指定字符的文本 
    [字符集合] : 字符集合中的一个字符
    [^]    : 不在括号中的任何字符
    {n,} : 匹配前面的字符串至少n次
    {n,m} : 至少n次,至多m次
查询以特定字符或字符串开头的记录
    字符 ^ 匹配以特定字符或字符串开头的文本
查询以特定字符或字符串结尾的记录
    字符 $ 
1
2
3
@Author : Hale Lv
@Created Time : 2019-09-03 15:21:40
@Description :

MYSQL 视图

视图是一个虚拟表,内容由查询定义。同真实表一样, 视图包含一系列带有名称的列和行数据,但视图不是数据库真实存储的数据表
视图是一个、多个表或者视图中导出的表, 包含一系列带有名称的数据列和若干条数据行
视图和数据库的区别:
    1. 视图不是数据库中真实的表,而是一张虚拟表,其结构和数据是建立在对数据中真实表的查询基础上的
    2. 存储在数据库中的查询操作SQL语句定义了视图的内容,列数据和行数据来自于视图查询所引用的实际表, 引用视图时动态生成这些数据
    3. 视图没有实际的物理记录,不是以数据集的形式存储在数据库中,对应的数据实际上是存储在视图所引用的真实表中
    4. 视图是数据的窗口,而表是内容。表是实际数据的存放单位, 视图是以不同的显示方式展示数据,数据源是实际表
    5. 视图是查看数据表的一种方法,可查询数据表中某些字段构成的数据
    6. 视图的建立和删除只影响视图本身,不影响对应的基本表
视图的优点:
    1. 定制用户数据,聚集特定的数据
    2. 简化数据操作
    3. 提高基表数据的安全性
    4. 共享所需数据
    5. 更改数据格式
    6. 重用SQL语句
使用视图注意的点:
    1. 创建视图需要足够的权限
    2. 数目没有限制
    3. 可以嵌套,即从其他视图中检索数据的查询来创建视图
    4. 视图可以和表一起使用
    5. 视图不包含数据,必须执行查询中所需的任何一个检索操作。 

创建视图 CREATE VIEW

CREATE VIEW <视图名> AS <SELECT语句>
    :视图名 : 指定视图的名称,必须唯一
    :SELECT语句: 指定创建视图的SELECT语句,可用于查询多个基础表或源视图
存在的限制:
    1. 权限问题,基础表和其他视图的相关权限
    2. SELECT 语句不能引用系统或用户变量
    3. SELECT语句不能包含FROM子句汇中的子查询
    4. SELECT 语句不能引用预处理语句参数
创建基于单表的视图
    在单个数据表上创建视图
创建基于多表的视图
    在两个以上的表中创建视图
查询视图
    应用方面:
        使用视图重新格式化检索出的数据
        使用视图简化复杂的表连接
        使用视图过滤数据            
    DESCRIBE 视图名;

修改视图 ALTER VIEW

ALTER VIEW <视图名> AS <SELECT语句>
    :视图名: 指定视图名称,必须唯一
    : SELECT 语句: 指定创建视图的SELECT语句,可用于查询多个基础比或源视图
修改视图名称
    将视图删除,创建视图,命名为新视图

删除视图 DROP VIEW

DROP VIEW <视图名1> [,<视图名2>,...]
    : 视图名:指定要删除的视图名, DROP VIEW可一次删除多个视图

MYSQL 自定义函数 CREATE FUNCTION

自定义函数于存储过程之间的区别:
    1. 不能拥有输出参数,因为自定义函数自身就是输出参数,存储过程可以拥有输出参数
    2. 必须包含一条RETURN 语句, 不允许包含于存储过程中
    3. 可直接对自定义函数进行调用而不需要使用CALL 语句, 而对存储过程的调用需使用CALL语句
创建并使用自定义函数



    CREATE FUCTION <函数名> ( [ <参数1> <参数1> [, <参数2> <类型2> ]] ...)
        RETURN <类型>
        <函数主体>
            :函数名: 指定自定义函数名称
            :参数 类型: 指定自定义函数参数,参数只有名称和类型,不能指定关键字 IN、OUT和INOUT
            :RETURN 类型: 声明自定义函数返回值的数据类型,类型用于指定返回值的数据类型
            :函数主体: 自定义函数的主题部分,包括局部变量、SET语句、流程控制语句、游标等,必须包括一个RETURN 值语句,值用于指定自定义函数的返回值
            RETURN VALUE 语句中包含SELECT语句时,SELECT返回结果只能是一行且只能有一列值
        查看数据库中存在的自定义函数: SHOW FUNCTION STATUS
        查看数据库中某个具体的自定义函数: SHOW CREATE FUNCTION <函数名>
            :函数名 用于指定自定义函数的名称
            CREATE FUNCTION Say()
            RETURNS VARCHAR(45)
            RETURN
                (SELECT name FROM tb_user
                WHERE id = 1);
        SELECT <自定义函数名> ([<参数> [,...]])
            SELECT Say();
修改自定义函数
    使用 ALTER FUNCTION 修改自定义函数的某些相关特征,如修改自定义函数内容,则先删除该自定义函数,然后重建
删除自定义函数
    删除自定义函数于删除存储过程的基本一样, 使用 DROP FUNCTION
        DROP FUNCTION [IF EXISTS ] <自定义函数名>
自定义函数: 指定要删除自定义函数名
IF EXISTS : 指定关键字,防止因误删除不存在的自定义函数而引发错误
1
2
3
@Author : Hale Lv
@Created Time : 2019-09-04 09:01:15
@Description :

MYSQL 存储过程

为了完成特定功能的SQL语句集合,使用存储过程的目的将常用或复杂的工作预先用SQL语句写好并用一个指定名称存储起来,这个过程经编译和优化后存储在数据库服务器中,因此称为存储过程。需要数据库提供与已定义好的存储过程的功能相同的服务,只需调用CALL 存储过程名字,即可自动完成
存储过程的优点:
    1. 封装性
        被创建后,可被多次调用,不必重新编写
    2. 可增强SQL语句的功能和灵活性
        存储过程可用流程控制语句编写, 有很强的灵活性
    3. 可减少网络流量
        在服务器端运行,执行速度块,网络中传送的只是该调用语句,可降低网络负载
    4. 高性能
        执行一次后, 产生的二进制代码驻留在缓冲区,在调用中,需从缓冲区中执行二进制代码即可
    5. 提高数据库的安全性和数据的完整性
        使用存储过程可完成所有数据库操作,通过编程的方式控制数据库信息访问的权限

MYSQL创建存储过程 CREATE PROCEDURE

    使用CREATE PROCEDURE 创建存储过程
    CREATE PROCEDURE <过程名> ([过程参数[,...]]) <过程体> [过程参数[,...]] 格式 [ IN | OUT | INOUT ] <参数名> <类型>
        1. 过程名:存储过程的名称,默认在当前数据库中创建,如要指定特定数据库中创建存储过程,要在名称前加上数据库的名称
        2. 过程参数:存储过程的参数列表,参数名为参数名,类型为参数类型。 支持三种类型的参数,即输入参数、输出参数、输入/输出参数,分别用IN、OUT、INOUT三个关键字标识。输入参数可是一个存储过程,输出参数用于存储过程返回一个操作结果的情形。
        3. 过程体: 存储过程的主体部分,也称存储过程体,以关键字 BEGIN开始, END结束。 如只有一条SQL语句,则可省略BEGIN-END标志
    修改结束命令符: DELIMITER $$
        $$ : 用户自定义的结束符,可用其他特殊符号,如: ?? | !! | //
    在MYSQL命令行客户端输入SQL语句:
        DELIMITER ??  | DELIMITER //
    如要换回默认的分号: ';' ,则输入: DELIMITER ;
创建不带参数的存储过程
    DELIMITER //
        CREATE PROCEDURE ShowSay()
        BEGIN
        SELECT * FROM say;
        END    //
    创建存储过程 ShowSay 后,通过CALL语句调用该存储过程的SQL语句和执行结果:
        DELIMITER ;
        CALL ShowSay();
创建带参数的存储过程
    DELIMITER //
    CREATE PROCEDURE GetSay
    (IN name VARCHAR(20))
    BEGIN
    SELECT id FROM tb_say
    WHERE tb_name = name;
    END //
调用: 
    DELIMITER ;
    CALL GetSay('Hale');

MYSQL修改存储过程 ALTER PROCEDURE

使用ALTER PROCEDURE 语句修改存储过程的某些特征
    ALTER PROCEDURE <过程名> [ <特征> ...]
        修改存储过程的某些特征,如要修改存储过程内容,可先删除该存储过程,再重新创建
修改存储过程的内容和名称
    可通过删除原存储过程,再以相同的命名创建新的存储过程
    可通过删除原存储过程,再以不同的命名创建新的存储过程

MYSQL删除存储过程 DROP PROCEDURE

DROP { PROCEDURE | FUNCTION | } [IF EXISTS ] <过程名>
    1. 过程名: 指定要删除的存储过程的名称
    2. IF EXISTS : 指定这个关键字,防止因删除不存在的存储过程而引发的错误
删除存储过程
    DROP PROCEDURE GetSay;

MYSQL触发器

触发器是一个特殊的存储过程,执行存储过程要使用CALL语句来调用,而触发器执行不需要使用CALL语句来调用,也不需要手工启动,只要一个预定义的事件发生就会被MYSQL自动调用
引发触发器执行的事件:
    1. 增加一条学生记录时,自动检查年龄是否符合范围要求
    2. 每当删除一条学生信息时,自动删除其成绩表上的对应记录
    3. 每当删除一条数据时,在数据库存档中保留一个备份副本
触发器的优点:
    1. 是自动执行的,相关表的数据作出相应的修改后立即执行
    2. 可通过数据库中相关的表层叠修改另外的表
    3. 触发器可实施比FOREIGN KEY约束,CHECK约束更为复杂的检查和操作
    触发器和表关系密切, 主要保护表中的数据,当有多个表具有一定的相互联系时,触发器让不同的表保持数据的一致性
在MYSQL中,只有执行 INERT、UPDATE、DELETE操作时才能激活触发器
    MYSQL所支持的触发器有三种: INERT 触发器、UPDATE触发器、DELETE触发器
    1. INSERT 触发器
        在INERT 语句执行之前或之后响应的触发器
        需注意:
            1. 在INERT 触发器代码内, 可引发一个名为 NEW 不区分大小写的虚拟表来访问更新的值
            2. 在BEFORE UPDATE触发器中,NEW中的值可能被更新,即允许更改将要用于UPDATE语句汇总的值
            3. 对于AUTO_INCREMENT列,NEW 在INSERT执行前包含的值是0, 在INSERT执行止呕将包含新的自动生成值
    2. UPDATE 触发器
            1. 在UPDATE触发器代码内,可引用一个名为NEW的虚拟表来访问更新的值
            2. 可引用一个名为OLD的虚拟表来访问UPDATE语句执行前的值
            3. 在BEFORE UPDATE触发器中,NEW中的值可被更新,允许更改将要用于UPDATE语句中的值
            4. OLD中的值全部是只读的,不能被更新
    3. DELETE触发器
        在DELETE之前或之后响应的触发器
            1. 引用一个名为OLD的虚拟表来访问被删除的行
            2. OLD中的值全部是只读的,不能是只读的,不能被更新

MYSQL 创建触发器 CREATE TRIGGER

触发器是与MYSQL数据库有关的数据库对象
CREATE <触发器名> <BEFORE | AFTER> <INSERT | UPDATE | DELETE > ON <表名> FOR EACH Row 触发器主体<>    
    1. 触发器名: 触发器名必须唯一
    2. INSERT | UPDATE | DELETE : 触发事件,指定激活触发器语句的种类
        :INSERT : 将新行插入表时激活触发器
        :DELETE : 从表中删除某一行数据时激活触发器
        :UPDATE : 更改表中某一行数据时激活触发器
    3. BEFORE | AFTER :表示在激活之前或之后触发
    4. 表名 : 与触发器相关联的表名,此表必须永久性表,不能将触发器与临时表或视图关联起来,
    5. 触发器主体: 如要执行多个语句,可使用BEGIN...END复合语句结构
    6. FOR EACH ROW :指行级触发器,使用SHOW TRIGGERS 语句
创建 BEFORE 类型触发器
    SELECT * FROM tb_tmp;
创建 AFTER 类型触发器

MYSQL修改和删除触发器

DROP TRIGGER [IF EXISTS] [数据库名] <触发器名>
    1. 触发器名: 要删除的触发器名
    2. 数据库名: 指定触发器所在的数据库的名称
    3. 权限 : 执行DROP TRIGGER 语句需要 SUPER 权限
    4. IF EXISTS 
删除触发器
    DROP TRIGGER xx_xxx;

MYSQL 索引

索引是一个数据库对象,是数据库性能调优技术的基础,用于实现数据的快速检索
两种方式访问数据库表的行数据:
    1. 顺序访问    
        : 是在表中实行全表扫描,从头到尾逐行遍历,直到在无需的行数据中找到符合条件的目标数据。数据量大的时候,效率低下。
    2. 索引访问
        : 通过遍历索引来直接访问表中记录行的方式,前提是对表建立一个索引,在列上创建了索引之后,查找数据时可直接根据该列上的索引找到对应记录行的位置,从而快捷地查找到数据,索引存储列指定列数据值的指针,根据指定的排序顺序对这些指针顺序

索引的分类

索引的类型和存储引擎有关,每种存储引擎所支持的索引类型不一定完全相同,根据存储方式的不同,常用的索引在物理上分为两类:
    1. B-树索引
        B-树索引称为: BTREE 索引,是一个典型的数据结构,包含的组件:
            1. 叶子节点: 包含的条目直接指向表里的数据行,叶子节点之间彼此相连,一个叶子结点有一个指向下一个叶子节点的指针
            2. 父支节点: 包含的条目指向索引其他的分枝节点或叶子节点
            3. 根节点: 一个B-树索引只有一个根节点, 位于树的最顶端的分枝节点
    B-树索引需考虑的约束:
        1. 查询必须从索引的最左边的列开始
        2. 不能跳过某一个索引列,必须按照从左到右的顺序进行匹配
        3. 存储引擎不能使用索引中范围条件右边的列
    2. 哈希索引
        哈希Hash ,就是把任意长度的输入:预映射pre-image 通过散列算法编程固定长度的输出,该输出就是散列值
            哈希所以你也称为散列索引或HASH索引,支持哈希索引的引擎: MEMORY、HEAP存储引擎
    根据索引的具体用途,索引在逻辑上可分为 5 类:
        1. 普通索引:
                最基本的索引类型,加快对数据的访问速度,没有任何限制,创建普通索引使用关键字: INDEX 或 KEY
        2. 唯一性索引:
                不允许索引具有相同索引值的索引,能确定某个数据列只包含彼此各不相同的值,使用关键字 UNIQUE 定义,不是为了提高速度,而是避免数据重复
        3. 主键索引:
                主键索引是唯一索引,不允许重复或者为空,并且每个表只能有一个主键,主键可在创建表的时候指定,也可通过修改表的方式添加, 使用关键字 PRIMARY KEY 
        4. 空间索引:
                主要用于地理空间数据类型 GEOMETRY 
        5. 全文索引:
                只能在 VARCHAR 或 TEXT 类型的列上创建,只能在MyISAM表中创建
                索引在逻辑上分为5类,索引通常被创建成单列索引和组合索引
                    1. 单列索引就是索引只包含原表的一个列
                    2. 组合索引也称为复合索引或多列索引,组合索引是将原表的多个列共同组成一个索引。
            索引策略对应的索引类型有: 聚集索引、次要索引、覆盖索引、复合索引、前缀索引、唯一索引等
    索引使用原则和注意事项
        1. 创建索引和维护索引耗时
        2. 索引占用物理空间
        3. 对表进行增删改,索引也需要动态维护,降低数据的维护速度
        4. 在经常用到的列上建立索引,可加快搜索的速度
        5. 在主键的列上创建索引,强制该列的唯一性,组织表中数据的排列结构
        6. 使用WHERE子句的列上创建索引,加快条件判读速度
        7. 。。
    不适合创建索引的环境:
        1. 查询中很少使用或参考的列不应该创建索引
        2. 只有很少数据值的列不应该创建索引
        3. 定义为TEXT、IMAGE和BIT数据类型的列不应该创建索引
        4. 性能远大于检索性能时,不可创建索引

MYSQL 创建索引 CREATE INDEX

提供三种创建索引的方法:
    1. 使用CREATE INDEX 语句,但不能创建主键
        CREATE <索引名> ON <表名> ( <列名> [ <长度> ] [ ASC | DESC ] )
                :索引名: 指定索引名,
                :表名 : 要创建索引的表名
                :列名: 要创建索引的列名
                :长度 : 使用列前的Length个字符来创建索引
                :ASC | DESC 
    2. 使用CREATE TABLE 
        可在创建表的同时创建,
            CREATE TABLE PRIMARY KEY [索引类型] ( <列名>,... )
            KEY | INDEX [索引名] [索引类型] (<列名>,...)
                在创建新表的同时创建该表的索引
            UNIQUE [ INDEX | KEY ] [ <索引名> ] [ <索引类型> ] ( <列名>,... )
                创建新表的同时创建该表的唯一索引
            FOREIGN KEY <索引名> <列名>
                创建新表的同时创建该表的外键
    3. 使用ALTER TABLE 
        使用ALTER TABLE 修改表的同时,向已有的表添加索引
            ATLER INDEX [<>] [<>] (<>,...)
                修改表的同时为该表添加素音
            ADD PRIMARY KEY [ <索引类型> ] ( <列名>,...)
                为该表添加唯一性索引
            ADD FOREIGN KEY [ <索引名> ] ( <列名>,... )
                为该表添加外键
    创建一般索引
    创建唯一索引
    查看索引    
        SHOW INDEX FROM <表名>  [FROM <数据库名> ]
    [More](http://c.biancheng.net/view/2605.html)

MYSQL 修改和删除索引 DROP INDEX

删除索引: 删除原索引,再创建一个同名索引,实现修改索引的操作
1. 使用 DROP INDEX 
    DROP INDEX <索引名> ON <表名>
2. ALTER TABLE 
    ALTER TABLE tb_name DROP PRIMARY KEY
    ALTER TABLE tb_name DROP INDEX index-Name
    ALTER TABLE tb_name DROP FOREIGN KEY fk_symbol 
1
2
3
@Author : Hale Lv
@Created Time : 2019-09-04 15:46:47
@Description :

MYSQL 用户 与 权限

MYSQL 创建用户 CREATE USEr

CREATE USER <用户名> [ IDENTIFIED ] BY [PASSWORD] <口令>
    1. 用户名:指定创建用户账号 格式: 'user_name'@'host_name' 
    2. PASSWORD :指定散列口令。明文口令忽略PASSWORD关键字,
    3. IDENTIFIED BY 子句 : 指定用户账号对应的口令
    4. 口令 ; 指定用户账号的口令,在PASSWORD 或 IDENTIFIED BY 关键字之后
        CREATE USER 'hale'@'localhost'  IDENTIFIED BY 'pass';
        创建一个用户,用户名: hale ,密码: pass,主机 : localhost

修改用户账号 RENAME USER

RENAME USER <旧用户>  TO <新用户>
    RENAME USER 'hale'@'localhost' TO 'judy'@'localhost'
修改用户口令
    SET PASSWORD [ FOR <用户名> ] = 
    {
        PASSWORD('新明文口令') | OLD PASSWORD('旧明文口令') | '加密口令值'
    }
        :FOR子句: 指定欲修改口令的用户
        :PASSWROD('新明文口令') : 使用函数 PASSWORD 设置新口令
        :加密口令值 : 表示已被函数 PASSWORD 加密的口令值

删除用户 DROP USER

DROP USER <用户名1> [ ,<用户名2> ]...




    DROP USER 'hale'@'localhost';

MySQL 用户授权 GRANT

创建用户后,需为用户分配适当的访问权限
查询用户的权限: SHOW GRANT FOR 
授予用户权限
    GRANT <权限类型> [ (列名) ] [ , <权限类型> [(列名)]] ON <对象> <权限级别> TO <用户>
    <用户>的格式:
        <用户名> [ IDENTIFIED ] BY [ PASSWORD ] <口令> [ WITH GRANT OPTION ] | MAX_QUERIES_PER_HOUR <次数> | MAX_UPDATES_PER_HOUR <次数> | MAX_CONNECTIONS_PER_HOUR <次数> | MAX_USER_CONNECTIONS <次数>
            :列名: 指定权限要授予给表中哪些具体的列
            :ON 子句: 指定权限授予的对象和级别,如在ON关键字后给出要授予权限的数据库名或表名等
            :权限级别: 用于指定权限的级别,可授予的组:
                1. 列权限,和表中的一个具体列相关
                2. 表权限,和一个具体表中的所有数据相关
                3. 数据库权限, 和一个具体的数据库中的所有表相关
                4. 用户权限,和MYSQL中所有的数据库相关
        在GRANT语句中可用于指定权限级别的值有以下格式:
            1. * : 表示当前数据库中的所有表
            2. *.* : 表示所有数据库中的所有表
            3. db_name.* : 表示某个数据库中的所有表
            4. db_name.tbl_name :表示某个数据库中的某个表或视图
            5. tbl_name : 表示某个表或视图
            6. db_name.routine_name : 表示某个数据库中的某个存储过程或函数
            7. TO子句: 设定用户口令,指定被赋予权限的用户USER
        GRANT 权限类型:
            1. 授予数据库权限时,权限类型可以指定为:
                1. SELECT : 表示授予用户SELECT访问特定数据库中所有表和视图的权限
                2. INSERT : 授予用户使用INSERT想特定数据库中所有表添加数据行的权限
                3. DELETE : 授予使用DELETE删除数据库中所有表的数据行
                4. REFERENCES : 授予用户可以创建指向特定的数据库中的表外键的权限
                5. CREAT : 授予CREATE TABLE 创建新表的权限
                6. ALTER : 使用ALTER TABLE 修改特定数据库中所有数据表的权限
                7. SHOW VIEW :授予用户查看特定数据库中已有视图的视图定义的权限
                8. CREATE ROUTINE : 为特定的数据库创建存储过程和存储函数的权限
                9. ALTER ROUTINE : 更新和删除数据库已有的存储过程和存储函数的权限
                10. INDEX : 授予用户在特定数据库中的所有数据表上定义和删除索引的权限
                11. DROP : 删除特定数据库中所有表和视图的权限
                12. CREATE TEMPORARY TABLES : 授予在特定数据库中创建临时表的权限
                13. CREATE VIEW : 创建新的视图的权限
                14. EXECUTE ROUTINE : 调用特定数据库中创建新的视图的权限
                15. LOCK TABLES : 授予用户可锁定特定数据库的已有数据表的权限
                16. ALL 或 ALL PRIVILEGES : 表示以上所有权限
            2. 授予表权限时,权限类型指定的值:
                1. SELECT :授予用户可使用SELECT进行访问特定表的权限
                2. INSERT : 向一个特定表中添加数据行的权限
                3. DELETE : 删除数据行的权限
                4. DROP : 删除数据表的权限
                5. UPDATE : 更新特定数据表的权限
                6. ALTER : 使用ALTER TABLE 修改数据表的权限
                7. REFERENCES : 创建一个外键来参照特定数据表的权限
                8. CREATE : 使用特定的名字创建一个数据表的权限
                9. INDEX : 在表上定义索引的权限
                10. ALL 或 ALL PRIVILEGES : 所有的权限名
            3. 授予列权限时,权限类型的值只能指定为 SELECT、INSERT、UPDATE,权限后需要加列名列表 column-list
            4. 最有效率的权限是用户权限
                权限类型出来可指定为授予数据库权限时的所有值之外, 还可以是以下值:    
                    1. CREATE USER : 表示授予用户可创建和删除新用户的权限
                    2. SHOW DATABASES : 授予用户可使用SHOW DATABASES查看所有已有的数据库的定义的权限
            使用GRANT创建一个新用户,对所有数据有查询、插入权限,并授予GRANT权限
                    GRANT SELECT,INSERT ON *.* TO 'hale'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
            使用SELECT查询用户的权限:
                SELECT Host,User,Select_priv,Grant_priv FROM mysql.user WHERE User='hale';

MYSQL删除用户权限 REVOKE

使用 REVOKE 删除一个用户的权限,此用户不会被删除
有两种形式:
    1. REVOKE <权限类型> [ (<列名>) ] [, <权限类型> [ (<列名>)]]... ON <对象类型> <权限名> FROM <用户1> [,<用户2>]...
    2. REVOKE ALL PRIVILEGES, GRANT OPTION FROM user <用户1> [, <用户2> ]...
        :REVOKE 和 GRANT 语法的语法格式相似,但具有相反的效果
        :第一种语法格式用于回收某些特定的权限
        :第二种语法格式用于回收特定用户的所有权限
        :使用REVOKE 语句,必须用于数据库的全局 CREATE USER 权限或 UPDATE 权限
        REVOKE INSERT ON *.* FROM 'hale'@'localhost';
        SELECT Host,User,Select_priv,Insert_priv,Grant_priv FROM mysql.user WHERE User='hale';
1
2
3
@Author : Hale Lv
@Created Time : 2019-09-05 09:47:32
@Description :

MYSQL事务 TRANSACTION

事务是用户一系列的数据库操作序列,要多全做,要么全不做,是一个不可分割的工作单位

事务的四个特性: 原子性Atomicity、一致性Consistency、隔离型Isolation、持续性Durability ,简称 : ACID
    1. 原子性
            :必须是原子工作单元,事务中的操作要么全做,要么不做,不能只完成部分,原子性在数据库系统中,由恢复机制来实现
    2. 一致性
            :事务开始前,数据库处于一致性的状态,事务结束后,仍处于一致性状态,数据库一致性的定义由用户负责
    3. 隔离性
            :系统必须保证事务不受其他并发执行事务的影响,即当多个事务同时运行时,各事务之间相互隔离,互不干扰。 事务查看数据时所处的状态,要么是另一个并发事务修改它之前的状态,要么是另一个并发事务修改它之后的状态,事务不会查看中间状态的数据,隔离型通过系统的并发控制机制实现
    4. 持久性
            : 一个已完成的事务对数据所做的任何变动在系统中是永久有效的,即使该事务产生的修改不正确,错误也一直保持。持久性通过恢复机制实现,发生故障时,通过日志等手段恢复数据库信息
    事务的ACID原则保证了一个事务或者成功提交,或者失败回滚,二者必居其一。因此,他对事物的修改具有可恢复性,即当事务失败时,它对数据的修改都会恢复到该事务执行前的状态。

开始事务

事务以 BEGIN TRANSACTION 开始
    BEGIN TRANSACTION <事务名称> | @<事务变量名称>
        :@<事务变量名称>: 由用户定义的变量,必须用char、varchar、nchar或 nvarchar数据类型来声明该变量
        :BEGIN TRANSACTION 执行全局变量, @@TRANCOUNT 的值加1

提交事务

COMMIT 表示提交事务,即提交事务的所有操作,即将事务中所有对数据库的更新写回到磁盘的物理数据库中,事务正常结束
提交事务,即将事务开始以来所执行的所有数据修改为数据库的永久部分,也标志着一个事务的结束,一旦执行提交事务,将不能回滚事务
    COMMIT TRANSACTION <事务名称> | @<事务变量名称> 
        COMMIT TRANSACTION 执行使全局变量 @@TRANCOUNT的值减1

撤销事务

ROLLBACK表示撤销事务,即在事务运行的过程中发生故障,事务不能继续执行,系统将事务中对数据库的所有已完成操作全部撤销, 回滚到事务开始的状态,操作指对数据库的更新操作
当事务执行遇到错误,使用ROLLBACK TRANSACTION使事务回滚到起点或指定的保持点处,系统将清除自事务起点或到某个保存所做的所有的数据修改,并且释放由事务控制的资源。标志着事务的结束
ROLLBACK [TRANSACTION] [ <事务名称> | @<事务变量名称> | <存储点名称> | @<含有存储点名称的变量名>] 
    :当条件回滚只影响事务的一部分,事务不需要全部撤销已执行的操作,可让事务回滚到指定位置。需在事务中设定保存点 (SAVEPOINT)。保存点所在位置之前的事务语句不用回滚,即保存点之前的操作被视为有效的,保存点的创建通过 SAVING TRANSACTION <保存点名称> 语句来实现,再执行 ROLLBACK TRANSCATION <保存点名称> 回滚到该保存点
    :如事务回滚到起点,则全局变量 @@TRANCOUNT的值减1;如事务回滚到指定的保存点, 则全局变量@@TRANCOUNT的值不变

MYSQL数据库备份 INTO OUTFILE

数据库备份
    指通过导出数据或复制文件的方式来制作数据库的副本,当数据损坏,将备份的数据库加载到系统
    使用SELECT INTO OUTFILE 语句把表数据导出到一个文本文件中进行备份
        此方法只能导出或导入数据的内容,不包括表的结构,如表的结构损坏,必须先恢复原来的结构
            SELECT * FROM tb_name INTO OUTFILE '/dir/path/file.txt' FIELDS TERMINATED BY '"' LINES TERMINATED BY '?';

MYSQL数据库恢复 LOAD DATA

数据库恢复 
    指以备份为基础,与备份相对应的系统维护和管理操作
    系统进行恢复操作时,先执行一些系统安全性的检查
    数据库恢复机制两个关键问题: 1. 如何建立冗余数据。 2: 如何利用冗余数据实施数据库恢复
    建立冗余数据的技术是数据转储和登录日志文件,通常在一个数据库系统中,这两种方法一起使用
    数据转储是DBA定期将整个数据库复制到磁带或另一个磁盘上保存起来的过程
    使用 LOAD DATA ... INFILE 恢复先前备份的数据
        LOAD DATA INFILE '/dir/path/file.txt' INTO TABLE tb_name FIELDS TERMINATED BY ',' OPTIONALLLY ENCLOSED BY '"' LINES TERMINATED BY '?';

MYSQL Workbench 使用教程

[More](http://c.biancheng.net/view/2625.html)

本文标题:MySQL

文章作者:

Hale Lv

发布时间:2019年08月11日 - 13:08

最后更新:2019年09月05日 - 21:09

原始链接:http://yoursite.com/2019/08/11/MySQL-Note/

许可协议: 转载请保留原文链接及作者。

<center> Hale Lv </center> wechat
扫一扫,公众号!
文能提笔安天下,武能上马定乾坤!
-------------本文结束感谢您的阅读-------------