存储数据确实是处理数据的基石 ,  只有确保数据被准确无误且有条理地存储 ,  我们才能对其进行深入的处理和细致的分析 . 
否则 ,  这些数据就像是一团毫无章法的乱麻 ,  让我们难以捉摸其内在的逻辑和价值 . 那么 ,  如何才能够将用户那些与经营紧密相关 ,  错综复杂的数据 ,  以有序且高效的方式存储起来呢? 
在MySQL中 ,  一个完整的数据存储过程总共有 4 步 ,  分别是 :  
*  1.  创建数据库 :  在MySQL中 ,  数据库是数据的容器 . 创建数据库就像是开辟一个新的存储空间 ,  这个存储空间将用来存放各种数据表 . 数据库名称在整个数据库系统中必须是唯一的 . *  2.  确认字段 :  在创建数据表之前 ,  需要确定表中需要哪些字段 ( 列 ) ,  每个字段的数据类型是什么 ,  以及是否需要对字段进行约束 ( 如唯一性 ,  非空等 ) . *  3.  创建数据表 :  数据表是数据库中实际存储数据的结构 . 它定义了数据的组织方式 ,  包括字段名 ,  数据类型 ,  约束等 . *  4.  插入数据 :  当数据表创建好之后 ,  就可以向表中插入数据了 . 插入数据是向数据表中添加实际记录的过程 . 
 
为什么需要先创建数据库再创建数据表呢? 
*  1.  层次结构 :  数据库是包含数据表的更高层次的容器 . 数据库可以包含多个数据表 ,  每个数据表存储着不同类型的数据 . 这种层次结构使得数据的管理和组织更加清晰和有序 . *  2.  权限管理 :  在MySQL中 ,  权限是基于数据库来设置的 . 可以为不同的数据库设置不同的用户权限 ,  以控制哪些用户可以访问哪些数据库中的数据 . *  3.  数据隔离 :  不同的数据库可以存储不同的数据 ,  它们之间是相互独立的 . 这种隔离性有助于保护数据的完整性和安全性 . *  4.  维护方便 :  当需要备份 ,  恢复或迁移数据时 ,  以数据库为单位进行操作通常更为方便和高效 . 因此 ,  在MySQL中 ,  创建数据库是存储数据的第一步 ,  它为后续的数据表创建和数据插入提供了基础 . 
从系统架构的层次角度来看 ,  MySQL数据库系统的组织结构呈现出一种从大到小 ,  层层递进的排列方式 . 这个层次结构如下 : 
*  1.  数据库服务器 ( Database  Server ) :  数据库服务器是整个系统的核心 . 它负责提供数据库服务 ,  管理数据库文件的存储 ,  读取和写入 ,  以及处理客户端的连接请求和数据查询等 . MySQL数据库服务器就是运行MySQL数据库管理系统的计算机或服务器 ,  它负责执行所有与数据库相关的操作 . *  2.  数据库 ( Database ) :  数据库是存储数据的逻辑容器 ,  它包含了多个数据表 . 在MySQL中 ,  每个数据库都是独立的 ,  拥有自己的数据表 ,  视图 ,  存储过程和函数等对象 . 创建数据库是为了在逻辑上将数据划分为不同的集合 ,  便于管理和访问 . *  3.  数据表 ( Table ) :  数据表是数据库中实际存储数据的对象 ,  它由行和列组成 . 每一列定义了一种数据类型 ,  而每一行则包含了一组具体的数据 . 数据表是数据库中最基本的存储单位 ,  用于存储特定类型的数据记录 . *  4.  行与列 ( Rows  and  Columns ) :  行和列是数据表的基本结构 . 列 ( 也称为字段 ) 定义了数据表中的数据属性 ,  每一列都有一个数据类型 ,  用于限制该列中数据的类型 . 行 ( 也称为记录 ) 则是数据表中实际的数据 ,  每一行包含了多个列的值 ,  表示一个完整的数据记录 . 前面说过 :  从系统架构的层次角度来看 ,  应先创建数据库再创建数据表 . 
这是因为在数据库系统中 ,  数据库作为数据的高级组织单位 ,  充当着存储和管理多个数据表的容器 . 
在逻辑上 ,  数据库是包含数据表的更高级别的结构 ,  而数据表则是实际存储数据的单元 . 创建数据库的过程实际上是在数据库系统中开辟一个新的存储空间 ,  并为这个空间分配一个唯一的名称 . 
这个名称将用于标识和引用该数据库 ,  确保在系统中能够准确找到并操作该数据库中的数据 . 而数据表是具体的数据存储单位 ,  用于存放与特定业务逻辑相关的数据 . 
每个数据表都有其特定的结构和约束 ,  这些结构和约束定义了表中数据的组织方式和操作规则 . 
在创建数据表之前 ,  必须先确定好表的结构和字段 ,  以便在数据库中正确创建和定义表 . 因此 ,  从系统架构的层次角度来看 ,  先创建数据库再创建数据表是符合逻辑和规范的 . 
从数据库服务器到数据表的行与列 ,  每一层都负责处理不同的数据管理和操作任务 ,  从而构建了一个完整 ,  高效的数据存储和处理系统 . 
在MySQL数据库中 ,  为了确保数据的一致性和管理的便利性 ,  需要遵循一定的标识符命名规则 . 
以下是关于数据库名 ,  表名 ,  字段名等对象命名时需要遵守的规则 : 
*  1.  长度限制 :  数据库名 ,  表名的长度不得超过 30 个字符 . 变量名的长度限制为 29 个字符 ( 考虑到某些情境下可能需要为变量名添加前缀或后缀 ) . *  2.  字符集 :  标识符 ( 包括数据库名 ,  表名 ,  字段名等 ) 必须只能包含字母 ( A–Z ,  a–z ) ,  数字 ( 0 – 9 ) 和下划线 ( _ ) ,  共 63 个字符 . 避免使用特殊字符 ,  因为它们可能会在不同的数据库管理系统中引起冲突或解析错误 . *  3.  空格问题 :  数据库名 ,  表名 ,  字段名等对象名中间不得包含空格 ,  空格可能导致解析错误或混淆 . *  4.  唯一性 :  在同一个MySQL软件中 ,  数据库名称必须唯一 ,  不能存在同名的数据库 . 在同一个数据库中 ,  表名必须唯一 ,  不能存在同名的表 . 在同一个表中 ,  字段名必须唯一 ,  不能存在同名的字段 . *  5.  避免保留字 :  必须确保你的字段名没有与MySQL的保留字 ,  数据库系统或常用方法冲突 . 如果由于某种原因确实需要使用保留字作为字段名 ,  那么在SQL语句中必须使用反引号 ( ` ) 将其引起来 . *  6.  字段名和类型的一致性 :  在设计数据库结构时 ,  应保持字段名和类型的一致性 . 如果某个字段在一个表中被定义为整数类型 ,  那么在其它相关的表中 ,  该字段也应该被定义为整数类型 ,  而不是字符型或其它类型 . 遵循这些规则有助于确保数据库结构的清晰性 ,  一致性和可维护性 ,  同时 ,  它们也有助于减少因命名冲突或混淆而导致的错误 . 
阿里巴巴 < < Java开发手册 > > 之MySQL字段命名 : 
*  1.  [ 强制 ] 表名 ,  字段名必须使用小写字母或数字 ,  禁止出现数字开头 ,  禁止两个下划线中间只出现数字 . 数据库字段名的修改代价很大 ,  因为无法进行预发布 ,  所以字段名称需要慎重考虑 . 正例 :  aliyun_admin ,  rdc_config ,  level3_name 反例 :  AliyunAdmin ,  rdcConfig ,  level_3_name 
*  2.  [ 强制 ] 禁用保留字 ,  如 :  desc ,  range ,  match ,  delayed等 ,  请参考MySQL官方保留字 . 
*  3.  [ 强制 ] 表必备三字段id ,  gmt_create ,  gmt_modified . 说明 :  其中id必为主键 ,  类型为BIGINT  UNSIGNED ,  单表时自增 ,  步长为 1. gmt_create ,  gmt_modified的类型均为DATETIME类型 ,  前者现在时表示主动式创建 ,  后者过去分词表示被动式更新 . 
*  4.  [ 推荐 ] 表的命名最好是遵循 '业务名称_表的作用' . 正例 :  alipay_task ,  force_project ,  trade_config . 
*  5.  [ 推荐 ] 库名与应用名称尽量一致 . 
*  6.  [ 参考 ] 合适的字符存储长度 ,  不但节约数据库表空间 ,  节约索引存储 ,  更重要的是提升检索速度 . 正例 :  无符号值可以避免误存负数 ,  且扩大了表示范围 . 
对象 年龄区间 数据类型 字节 表示范围 人0 到 150 岁tinyint unsigned1无符号值: 0 到 255龟不可确定smallint unsigned2无符号值: 0 到 65535恐龙化石数千万年int unsigned4无符号值: 0 到约 43 亿太阳约 50 亿年bigint unsigned8无符号值: 0 到约 10 的 19 次方
 
在实际使用中 ,  根据具体需求选择合适的数据类型是非常重要的 ,  因为它们直接影响到数据的存储 ,  查询效率和准确性 . 
下面是MySQL中提到的各种数据类型的表格概述 . 
在MySQL中 ,  整形数据通常用于存储没有小数部分的数值 . 
整数类型 描述 范围 TINYINT非常小的整数有符号范围: -128 到 127.无符号范围: 0 到 255.SMALLINT小的整数有符号范围: -32,768 到 32,767.无符号范围: 0 到 65,535.MEDIUMINT中等大小的整数有符号范围: -8,388,608 到 8,388,607.无符号范围: 0 到 16,777,215.INT 或 INTEGER标准整数有符号范围: -2,147,483,648 到 2,147,483,647.无符号范围: 0 到 4,294,967,295.BIGINT大整数有符号范围: -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807.无符号范围: 0 到 18,446,744,073,709,551,615.
 
在MySQL中 ,  浮点型数据主要用于存储带有小数部分的数值 . 
浮点型数据 描述 范围 FLOAT单精度浮点数取值范围大约为: -3.4E38 到 3.4E38.有效数字位数大约为6~7位.DOUBLE双精度浮点数取值范围大约为: -1.8E308 到 1.8E308.有效数字位数大约为15位.DECIMAL精确浮点数取值范围由用户定义的精度和小数位数决定.提供精确的数值表示, 适用于需要高精度计算的场景, 如财务计算.
 
科学计数法中 ,  字母 "e" 或 "E" 通常用来表示 10 的幂次 . 
例 :  数字 "-3.4E38" 中 ,  "E38" 表示的是 10 的 38 次方  =  - 3.4  ×  ( 10 ^ 38 )  =  - 3400000000000000000000000000000000000000000000 
需要注意的是 ,  FLOAT和DOUBLE类型的范围是指数的范围 ,  实际的数值范围会受到尾数的影响 . 
另外 ,  由于FLOAT和DOUBLE是近似值表示 ,  它们可能会存在舍入误差 ,  
因此在需要精确计算的场合 ( 如金融计算 ) ,  通常推荐使用DECIMAL类型 . DECIMAL类型允许用户指定数值的精度和小数位数 ,  从而确保数值的精确性 . 
用户可以根据具体需求来定义DECIMAL类型的精度和小数位数 ,  以满足不同的精度要求 . 
在MySQL中 ,  字符型数据用于存储文本和字符串 . 
字符串类型 描述 范围 CHAR定长字符串长度为0到255个字符. 存储时, 如果字符串长度小于定义的长度, 会使用空格填充到指定长度.VARCHAR可变长度字符串长度为0到65,535个字节(具体取决于最大行大小和其他列). 存储时, 只使用必要的长度来存储字符串, 不会添加额外的空格.TINYTEXT非常小的文本字符串最大长度为255个字符.TEXT文本字符串最大长度为65,535个字符.MEDIUMTEXT中等大小的文本字符串最大长度为16,777,215个字符.LONGTEXT大文本字符串最大长度为4,294,967,295个字符.二进制字符串类型 描述 范围 BINARY定长二进制字符串类似于CHAR, 但存储二进制数据. 长度为0到255个字节.VARBINARY可变长度二进制字符串类似于VARCHAR, 但存储二进制数据. 长度为0到65,535个字节.TINYBLOB非常小的二进制大对象最大长度为255个字节.BLOB二进制大对象最大长度为65,535个字节.MEDIUMBLOB中等大小的二进制大对象最大长度为16,777,215个字节.LONGBLOB大二进制大对象最大长度为4,294,967,295个字节.
 
需要注意的是 ,  VARCHAR ,  TEXT和BLOB类型的实际存储需求取决于存储的字符串或二进制数据的长度 . 
此外 ,  VARCHAR和TEXT类型在存储时不会添加末尾的空格 ,  而CHAR类型则会用空格填充到指定长度 . 在选择字符型数据类型时 .  应根据实际的数据需求和存储限制来进行选择 . 
例如 ,  如果字符串的长度是固定的 ,  并且长度较短 ,  可以选择CHAR类型 ; 
如果字符串的长度是可变的 ,  可以选择VARCHAR类型 ; 
如果需要存储大量的文本数据 ,  可以选择TEXT或BLOB类型 . 
在MySQL中 ,  枚举 ( ENUM ) 类型是一种特殊的数据类型 ,  它允许你在表中定义一个列 ,  其中只能存储预定义的值 . 
枚举类型 描述 范围 ENUM允许在列中插入预定义的值列表中的一个值.范围: 最多可以有65535个不同的值.示例: ENUM('男', '女'); 只能存储'男'或'女'.如果值列表在255个以内, 使用一个字节存储;实际上不存储字符串本身, 而是存储值在列表中的位置(整数).如果超过255但小于65535, 使用两个字节存储.
 
需要注意的是 ,  虽然上述表格只列出了一种类型 ( ENUM ) ,  但实际上枚举类型的 '范围' 是由定义它时指定的值列表决定的 . 
每个枚举字段都可以有自己的值列表和范围 . 此外 ,  枚举类型有一些特点和限制 : 
*  1.  枚举值在物理存储时实际上是按照定义的顺序存储的整数索引 ,  而不是实际的字符串值 . 
*  2.  枚举字段在查询时返回的是字符串值 ,  而不是整数索引 . 
*  3.  如果尝试插入不在值列表中的值 ,  MySQL会报错 ( 除非该列允许NULL值 ,  并且插入了NULL ) . 
*  4.  枚举类型的值列表中的值必须是唯一的 ,  不能重复 . 
*  5.  修改枚举类型的值列表 ( 例如添加 ,  删除或重新排序值 ) 可能需要使用 'ALTER TABLE' 语句 ,  这可能会影响到已有的数据和应用逻辑 . 
*  6.  由于枚举类型的这些特点 ,  它最适合用于那些值的集合是固定的 ,  不会经常变化的字段 ,  例如性别 ,  星期几等 . 对于可能经常变化的字段 ,  使用其他数据类型 ( 如VARCHAR ) 可能更为合适 . 
在MySQL中 ,  集合 ( SET ) 类型是一种字符串对象 ,  用于存储一个预定义的字符串集合中的零个或多个值 . 
集合类型允许在单个列中存储多个值 ,  每个值都是集合定义时指定的一个元素 . 集合类型确实对元素的顺序有一定的敏感性 ,  但这种敏感性主要体现在集合元素的定义上 ,  而不是在存储和检索时 . 
当你在创建表并定义SET类型的列时 ,  需要按照特定的顺序列出集合中的元素 .  这个顺序在定义后是不可更改的 . 
集合类型 描述 范围 SET允许在单个列中存储多个预定义的字符串值(定义时指定).存储时, 每个集合元素使用多个位来表示, 每个集合元素之间用逗号分隔, 集合成员本身不能包含逗号.因此存储需求取决于集合的大小和元素数量.
 
需要注意的是 ,  集合类型的范围是由定义集合时指定的字符串元素集合决定的 . 
每个集合元素都是唯一的 ,  并且集合中元素的数量是有限制的 ( 最多 64 个元素 ) . 使用集合类型可以方便地在一个列中存储多个相关的值 ,  而无需使用多个列或进行复杂的字符串处理 . 然而 ,  集合类型也有一些限制 ,  比如元素的数量限制以及存储和检索时的性能考虑 . 
因此 ,  在选择是否使用集合类型时 ,  需要根据具体的应用场景和需求进行权衡 . 此外 ,  与集合类型相关的MySQL函数 ( 如 :  FIND_IN_SET ( ) ) 可以用于查询和操作集合数据 ,  提供了灵活的集合运算能力 . 
在MySQL中 ,  JSON类型是一种用于存储JSON格式数据的数据类型 .  
它允许你在MySQL数据库的表中直接存储 ,  查询和操作JSON数据 . 
JSON类型 描述 范围 JSON用于存储JSON格式的数据.可以存储任何有效的JSON数据, 包括对象, 数组, 字符串, 数字, 布尔值和NULL.JSON数据在MySQL中以二进制字符串的形式存储, 但可以使用专门的JSON函数进行查询和操作.JSON类型列可以接受空值(NULL).JSON_OBJECT返回一个JSON对象.在查询时用于构建JSON对象.可以使用列值或常量作为对象的键和值.返回的对象是一个JSON字符串.JSON_ARRAY返回一个JSON数组.在查询时用于构建JSON数组.可以使用列值或常量作为数组的元素.返回的数组是一个JSON字符串.
 
需要注意的是 ,  虽然上述表格中列出了JSON_OBJECT和JSON_ARRAY ,  但它们实际上是用于构建JSON数据的函数 ,  而不是数据类型本身 . 
在创建表时 ,  会使用JSON数据类型来定义列 ,  然后使用这些函数在查询时构建和操作JSON数据 . 关于范围 ,  JSON类型在MySQL中没有固定的长度限制 ,  它取决于存储的JSON数据的大小 . 
然而 ,  需要注意的是 ,  过大的JSON数据可能会对性能产生影响 ,  因此在设计数据库和查询时需要谨慎考虑 . MySQL提供了一系列专门的JSON函数 ,  用于在查询时验证 ,  提取和修改JSON数据 . 
这些函数使得在MySQL中处理JSON数据变得相对简单和高效 . 
可以使用这些函数来查询JSON对象中的特定字段 ,  修改JSON数据 ,  数组操作等 . MySQL的JSON类型提供了一种灵活的方式来存储和查询JSON格式的数据 ,  使得在数据库中直接处理结构化数据变得更加方便 . 
MySQL的空间数据类型是用于存储和处理地理空间信息的 . 
主要包括GEOMETRY ,  POINT ,  LINESTRING ,  POLYGON以及集合类型如MULTIPOINT、MULTILINESTRING、MULTIPOLYGON等 . 
这些数据类型允许用户在数据库中直接存储和操作地理空间数据 ,  如点 ,  线 ,  多边形等几何对象 . 
空间数据类型(单值) 描述 范围 GEOMETRY所有空间数据类型的基类.表示任意的几何对象, 可以是点, 线, 多边形等.POINT表示二维空间中的一个点.包含一个坐标值, 如(x, y).LINESTRING表示一系列有序的点, 形成一条线.由至少两个点组成, 表示一条连续的线段.POLYGON表示一个多边形.由一系列有序的点组成, 第一个和最后一个点必须相同, 表示闭合的多边形.空间数据类型(多值) 描述 范围 MULTIPOINT表示多个点的集合.包含多个POINT对象.MULTILINESTRING表示多条线的集合.包含多个LINESTRING对象.MULTIPOLYGON表示多个多边形的集合.包含多个POLYGON对象.GEOMETRYCOLLECTION表示几何对象的集合, 可以是点, 线, 多边形等的任意组合.包含上述任意类型的几何对象.
 
在范围方面 ,  这些空间数据类型没有固定的长度或大小限制 ,  它们根据实际存储的几何对象的复杂性和大小来确定 . 
例如 ,  一个简单的POINT类型可能只占用几个字节 ,  而一个包含大量顶点的POLYGON类型则可能占用更多的存储空间 . 需要注意的是 ,  这些空间数据类型在MySQL中是与空间索引和空间函数一起使用的 ,  以实现高效的空间数据查询和操作 . 
通过使用这些数据类型和相关功能 ,  用户可以在MySQL数据库中执行复杂的空间分析和地理信息处理任务 . 此外 ,  MySQL还支持将空间数据以BLOB类型的二进制数据形式进行存储 ,  这为那些不支持直接空间数据类型存储的系统提供了灵活性 . 
然而 ,  使用BLOB类型存储空间数据通常需要额外的解析和处理步骤 ,  以便在查询和分析时能够提取和使用空间信息 . 
数据类型 描述 INT从-2^31到2^31-1的整型数据. 存储大小为4个字节.CHAR(size)定长字符数据. 若未指定, 默认为1个字符, 最大长度255.VARCHAR(size)可变长字符数据. 根据字符串实际长度保存, 必须指定长度.FLOAT(M,D)单精度, 占用4个字节. M=整数位+小数位, D=小数位. D<=M<=255, 0<=D<=30. 默认M+D<=6.DOUBLE(M,D)双精度, 占用8个字节. D<=M<=255, 0<=D<=30. 默认M+D<=15.DECIMAL(M,D)高精度小数, 占用M+2个字节. D<=M<=65, 0<=D<=30. 最大取值范围与DOUBLE相同.ENUM枚举类型, 用于存储预定义的值列表中的一个值. 常用于存储如性别(男/女), 状态(开启/关闭)等固定选项的数据.DATE日期型数据, 格式'YYYY-MM-DD.'BLOB二进制形式的长文本数据, 最大可达4G.TEXT长文本数据, 最大可达4G.
 
注意 :  
-  在实际操作中 ,  确保你具有足够的权限来执行这些命令 ,  并且替换命令中的数据库名和表名为实际的数据库和表名称 . 
-  在修改任何数据库级别的设置之前 ,  请确保您了解这些更改可能带来的影响 ,  并始终在修改之前备份你的数据库 . 
在MySQL中 ,  可以使用CREATE  DATABASE语句来创建一个新的数据库 . 
以下是一些创建数据库的示例和注意事项 : 
*  1.  方式 1 :  创建数据库 :  CREATE  DATABASE  数据库名 ; 这条命令将创建一个新的数据库 ,  其中 '数据库名' 是你想要创建的数据库的名称 . 如果不指定字符集 ,  数据库将使用MySQL服务器的默认字符集 . *  2.  方式 2 :  创建数据库并指定字符集 :  CREATE  DATABASE  数据库名  CHARACTER  SET  字符集 ; 这条命令不仅创建一个新的数据库 ,  还指定了该数据库的字符集 . '字符集' 是你希望数据库使用的字符编码 ,  例如 'utf8' 或 'utf8mb4' . 指定字符集可以帮助确保正确存储和检索包含特殊字符的数据 . *  3.  方式 3 :  判断数据库是否已经存在 ,  不存在则创建数据库 :  CREATE  DATABASE  IF  NOT  EXISTS  数据库名 ; 使用 'IF NOT EXISTS' 子句是一种安全的做法 ,  因为它可以防止因尝试创建已存在的数据库而产生的错误 . 如果数据库已经存在 ,  MySQL将忽略该命令并继续执行后续语句 . 注意事项 : 
-  DATABASE ( 数据库 ) 一旦创建后 ,  MySQL本身并不提供直接重命名数据库的命令 . 如果需要重命名数据库 ,  通常的做法是创建一个新的数据库 ,  然后将旧数据库中的表和数据复制到新数据库中 ,  最后删除旧数据库 . 这个过程需要谨慎操作 ,  以避免数据丢失或损坏 . 
-  使用可视化工具进行数据库重命名时 ,  工具内部通常也是执行了上述步骤 ,  只是这个过程对用户来说是透明的 . -  在实际应用中 ,  建议使用方式 3 来创建数据库 ,  因为它更加健壮 ,  可以防止因重复创建数据库而导致的错误 . 同时 ,  在创建数据库时 ,  如果有可能的话 ,  最好也指定字符集 ,  以确保数据的正确存储和检索 . 
mysql>  CREATE  DATABASE  db0; 
Query OK,  1  row  affected ( 0.01  sec) 
mysql>  CREATE  DATABASE  db1 CHARACTER  SET  'utf8' ; 
Query OK,  1  row  affected,  1  warning ( 0.01  sec)   
mysql>  CREATE  DATABASE  IF  NOT  EXISTS  db2 CHARACTER  SET  'utf8mb4' ; 
Query OK,  1  row  affected ( 0.01  sec) 
以下是使用MySQL数据库的一些基本语句 : 
*  1.  查看当前所有的数据库 :  SHOW  DATABASES ;   --  有一个S ,  代表多个数据库 . 这条命令将列出MySQL服务器上所有的数据库 . *  2.  查看数据库的创建信息 :  SHOW  CREATE  DATABASE  数据库名 ; 这条命令都用于显示指定数据库的创建语句 . *  3.  使用 / 切换数据库 :  USE  数据库名 ; 这条命令用于选择或切换到指定的数据库 ,  以便后续的SQL语句都在该数据库上执行 . 在切换数据库之后 ,  你可以直接对表进行操作 ,  而不需要在表名前加上前缀 '数据库名.' . *  4.  查看当前正在使用的数据库 :  SELECT  DATABASE ( ) ;   --  DATABASE ( ) 是一个全局函数 . 这条命令返回当前会话中选择的数据库名 . 如果没有选择任何数据库 ,  它将返回一个NULL值 . *  5.  查看指定库下所有的表 :  SHOW  TABLES  FROM  数据库名 ; 这条命令列出指定数据库中的所有表 .  需要将数据库名替换为实际的数据库名称 . 
mysql>  SHOW  DATABASES ; 
+ 
|  Database            | 
+ 
|  atguigudb          |   
|  db0                |   
|  db1                |   
|  db2                |   
|  information_schema |   
|  mysql              |  
|  performance_schema | 
|  sys                | 
+ 
8  rows  in  set  ( 0.01  sec)   
以下数据库是MySQL服务器安装时自动创建的 ,  并且通常不建议用户直接修改它们 . 
*  1.  information_schema :  是MySQL中的一个特殊的数据库 ,  它包含了关于所有其他数据库的信息 . 这个数据库不能被直接修改 ,  它提供了一个只读的方式来访问数据库元数据 ( metadata ) . 通过查询information_schema数据库 ,  你可以获取关于所有数据库 ,  表 ,  列 ,  索引 ,  键 ,  约束 ,  分区等的信息 . 
*  2.  mysql :  是MySQL服务器的系统数据库 ,  包含了服务器的系统表 . 这些表存储了服务器的用户账号 ,  权限 ,  系统变量 ,  插件 ,  事件调度器等信息 . 
*  3.  performance_schema :  这个数据库提供了对服务器执行过程中低级别的统计信息 ,  帮助用户监控和分析服务器的性能 . 
*  4.  sys :  sys数据库是一个视图 ( view ) 和函数 ( function ) 的集合 ,  这些视图和函数基于performance_schema来提供一个更加友好和直观的方式来查看和分析服务器的性能数据 . 这个数据库的目的是简化性能监控和诊断 . 
mysql>  SHOW  CREATE  DATABASE  db0; 
SHOW  CREATE  DATABASE  db0\G
* * * * * * * * * * * * * * * * * * * * * * * * * * *  1.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * * Database : db0
Create  Database : CREATE  DATABASE  ` db0` 1  row  in  set  ( 0.00  sec) 
 
CREATE  DATABASE的信息介绍 : *  1.  CREATE  DATABASE  ` db0 ` :  这是创建新数据库的基本SQL语句 . db0是数据库的名称 ,  反引号 ( ` ) 用于包围数据库名称 ,  以确保即使名称与MySQL的保留关键字冲突 ,  也能正确解析 . *  2.  /*! 40100  DEFAULT  CHARACTER  SET  utf8mb4  COLLATE  utf8mb4_0900_ai_ci  * / :  这是一个特定于MySQL的注释 ,  用于设置新数据库的默认字符集和排序规则 . DEFAULT  CHARACTER  SET  utf8mb4 :  这指定了数据库的默认字符集为utf8mb4 . utf8mb4字符集支持所有Unicode字符 ,  包括emoji表情符号和其他一些扩展的Unicode字符 . COLLATE  utf8mb4_0900_ai_ci :  这指定了数据库的默认排序规则为utf8mb4_0900_ai_ci . 排序规则决定了数据库中字符的排序和比较方式 . _ai_ci表示排序是 '不区分大小写' ( case-insensitive ) 和 '不区分重音' ( accent-insensitive ) 的 . *  3.  /*! 80016  DEFAULT  ENCRYPTION = 'N'  * / :  这是另一个特定于MySQL的注释 ,  用于设置新数据库的默认加密选项 / DEFAULT  ENCRYPTION = 'N' :  这表示数据库的默认加密设置为 'N' ,  即不启用加密 . 这个选项在MySQL  8.0 及更高版本中可用 ,  允许管理员设置数据库的透明数据加密 ( Transparent  Data  Encryption ,  TDE ) . 通过将DEFAULT  ENCRYPTION设置为 'Y' ,  可以启用数据库的加密 .  而设置为 'N' 则意味着数据库不会默认加密存储的数据 . 总结一下 ,  这条命令创建了一个名为db0的新数据库 ,  
设置了其默认字符集为utf8mb4 ,  默认排序规则为utf8mb4_0900_ai_ci ,  并禁用了默认加密 . 
这些设置对于确保数据库正确存储和比较字符数据 ,  以及保护数据的安全性至关重要 . 
mysql>  USE  atguigudb; 
Database  changed  
mysql>  USE  db0; 
Database  changed  
MySQL并没有提供直接的命令或方法来 '返回上层' 或退出当前选择的数据库 . 
一旦你选择了某个数据库 ,  你只需再次使用USE命令来选择另一个数据库 ,  或者在执行查询时指定数据库名 . 
Bye
. . . 
Type  'help;'  or  '\h'  for  help.  Type  '\c'  to  clear the current  input statement. 
mysql>  SELECT  DATABASE ( ) ; 
+ 
|  DATABASE ( )  | 
+ 
|  NULL        |   
+ 
1  row  in  set  ( 0.00  sec) 
mysql>  USE  db0; 
Database  changed
mysql>  SELECT  DATABASE ( ) ; 
+ 
|  DATABASE ( )  | 
+ 
|  db0        | 
+ 
1  row  in  set  ( 0.00  sec) 
mysql>  USE  db1; 
Database  changed
+ 
|  DATABASE ( )  | 
+ 
|  db1        | 
+ 
1  row  in  set  ( 0.00  sec) 
mysql>  SHOW  TABLES  FROM  atguigudb; 
+ 
|  Tables_in_atguigudb |   
+ 
|  countries           | 
|  departments         | 
|  emp_details_view    | 
|  employees           | 
|  job_grades          | 
|  job_history         | 
|  jobs                | 
|  locations           | 
|  order                |   
|  regions             | 
+ 
10  rows  in  set  ( 0.01  sec) 
mysql>  SHOW  TABLES  FROM  db0; 
Empty set  ( 0.00  sec) 
在MySQL中 ,  不能在一个已经存在的数据库下再创建另一个数据库 . 
数据库是独立的 ,  它们之间并没有嵌套关系 . 
所以 ,  在数据库中创建数据库时 ,  实际上是在一个数据库管理系统中创建新的数据库 . 
成功连接到数据库后 ,  实际上已经处于数据库管理系统的环境中 . 
在这个环境中 ,  可以执行各种SQL命令来管理数据库和其中的对象 . 当使用USE  db_name ;  命令后 ,  则指定了当前会话要使用的数据库 . 
这意味着后续的SQL命令将默认在这个数据库db0中执行 ,  除非再次使用USE命令切换到另一个数据库 . 
通过在表名前加上数据库名前缀 ,  可以在不改变默认数据库的情况下对任何数据库中的表执行操作 . 
*  操作示例在  4.1 .1  创建方式 1  中 . 
在MySQL中 ,  可以ALTER  DATABASE  语句修改数据库的一些属性 .  以下是一些常见的修改数据库的操作 : 
*  1.  修改数据库的字符集和校对规则 :  ALTER  DATABASE  数据库名  CHARACTER  SET  字符集  COLLATE  校对规则 ; 例如 ,  将数据库mydatabase的字符集修改为utf8mb4并设置相应的校对规则 : ALTER  DATABASE  mydatabase  CHARACTER  SET  utf8mb4  COLLATE  utf8mb4_unicode_ci ; *  2.  修改数据库的默认存储引擎 ( 在MySQL中 ,  这通常在创建数据库时设置 ,  但之后也可以修改 ) : ALTER  DATABASE  数据库名  ENGINE  =  存储引擎 ; 例如 ,  将数据库mydatabase的默认存储引擎修改为InnoDB : ALTER  DATABASE  mydatabase  ENGINE  =  InnoDB ; 
对于gbk字符集 ,  MySQL提供了几个默认的校对规则 ,  比如 :  gbk_chinese_ci和gbk_bin . 
其中 ,  gbk_chinese_ci是大小写不敏感的 ( ci  表示  case-insensitive ) ,  并且是按照中文的语义进行排序的 . 
gbk_bin是二进制排序 ,  它是大小写敏感的 ,  并且是基于字符的二进制值进行排序的 . 
如果您在设置gbk字符集时没有明确指定校对规则 ,  MySQL可能会使用一个默认的校对规则 ,  但这取决于MySQL的具体版本和配置 . 
mysql>  SHOW  CREATE  DATABASE  db0; 
 
mysql>  ALTER  DATABASE  db0 CHARACTER  SET  gbk; 
Query OK,  1  row  affected ( 0.01  sec) 
mysql>  SHOW  CREATE  DATABASE  db0; 
 
在MySQL中 ,  可以使用DROP  DATABASE  语句永久删除数据库及其所有内容 . 
在执行之前请确保你已经备份了所有重要的数据 . 以下是一些删除数据库的格式 : 
*  1.  方式 1 :  删除指定的数据库 :  DROP  DATABASE  数据库名 ; 这种方式会直接删除指定的数据库 .  如果数据库不存在 ,  MySQL  会返回一个错误 . 这种方式在您确定数据库存在并且确实需要删除它时很有用 . 但如果你不确定数据库是否存在 ,  或者不希望因为数据库不存在而收到错误 ,  那么这种方式可能会导致问题 . *  2.  方式 2 :  删除指定的数据库 ( 推荐 ) :  DROP  DATABASE  IF  EXISTS  数据库名 ; 这种方式在删除数据库之前会先检查数据库是否存在 .  如果数据库存在 ,  它会执行删除操作如果数据库不存在 ,  它不会执行任何操作 ,  也不会返回错误 . 这种方式更加安全 ,  因为它可以避免因为尝试删除不存在的数据库而导致的错误 .  因此 ,  这种方式通常更受推荐 . 使用建议 : 
-  在执行DROP  DATABASE语句之前 ,  始终确保你已经备份了所有重要的数据 ,  以防万一操作失误导致数据丢失 . 
-  如果你不确定数据库是否存在 ,  或者想要避免因为数据库不存在而产生的错误 ,  请使用  IF  EXISTS  子句 . 
-  在执行任何可能对数据产生影响的操作之前 ,  最好先在一个测试环境中进行验证 ,  以确保您了解命令的实际效果 . 
-  无论使用哪种方式 ,  DROP  DATABASE都是一个高风险的操作 ,  因为它会永久删除数据库及其所有内容 . 因此 ,  在执行此操作之前 ,  请务必谨慎考虑并确认您的意图 . 
mysql>  SHOW  DATABASES ; 
+ 
|  Database            | 
+ 
|  atguigudb          | 
|  db0                | 
|  db1                | 
|  . . .                 |   
+ 
8  rows  in  set  ( 0.01  sec) 
mysql>  DROP  DATABASE  db0; 
Query OK,  0  rows  affected ( 0.02  sec) 
mysql>  SHOW  DATABASES ; 
+ 
|  Database            | 
+ 
|  atguigudb          | 
|  db1                | 
|  . . .                 |   
7  rows  in  set  ( 0.00  sec) 
mysql>  DROP  DATABASE  db0; 
ERROR 1008  ( HY000) : Can't drop database ' db0'; database doesn' t exist  
mysql>  DROP  DATABASE  IF  EXISTS  db1; 
Query OK,  0  rows  affected ( 0.01  sec) 
mysql>  SHOW  DATABASES ; 
+ 
|  Database            | 
+ 
|  atguigudb          | 
|  db2                | 
|  . . .                 |   
+ 
6  rows  in  set  ( 0.00  sec) 
mysql>  DROP  DATABASE  IF  EXISTS  db1; 
Query OK,  0  rows  affected,  1  warning ( 0.01  sec)   
表格的很多操作是危险的操作 ,  执行时一定要谨慎 ! ! ! 
删除表操作将把表的定义和表中的数据一起删除 ,  并且MySQL在执行删除操作时 ,  不会有任何的确认信息提示 ,  因此执行删除操时应当慎重 . 
在删除表前 ,  最好对表中的数据进行备份 ,  这样当操作失误时可以对数据进行恢复 ,  以免造成无法挽回的后果 . 
同样的 ,  在使用ALTER  TABLE进行表的基本修改操作时 ,  在执行操作过程之前 ,  也应该确保对数据进行完整的备份 , 
因为数据库的改变是无法撤销的 ,  如果添加了一个不需要的字段 ,  可以将其删除 ; 
相同的 ,  如果删除了一个需要的列 ,  该列下面的所有数据都将会丢失 . 
在MySQL中 , 使用CREATE  TABLE语句创建表格 . 
用户必须具备CREATE  TABLE权限与足够的存储空间 . 下面是一个简单的表格创建格式 : 
CREATE  TABLE  [ IF NOT EXISTS ] 表名 ( 
字段 1 ,  数据类型  [ 约束条件 ] [ 默认值 ] , 
字段 2 ,  数据类型  [ 约束条件 ] [ 默认值 ] , 
字段 3 ,  数据类型  [ 约束条件 ] [ 默认值 ] , 
. . .  
[ 表约束条件 ] ) ; 以下是一些详细的解释和示例 : 
*  1.  CREATE  TABLE :  这是创建新表的命令 . 
*  2.  [ IF NOT EXISTS ] :  可选子句 ,  它确保在尝试创建已存在的表时不会引发错误 . 如果当前数据库中不存在要创建的数据表 .  则创建数据表 ; 如果当前数据库中已经存在要创建的数据表 ,  则忽略建表语句 ,  不再创建数据表 . 
*  3.  表名 :  必须子句 ,  这是你要创建的表的名称 . 
*  4.  字段名 :  必须子句 ,  这是表中的列的名称 . 
*  5.  数据类型 :  必须子句 ,  每个字段都需要一个数据类型 ,  如INT ,  VARCHAR ,  DATE等 . 
*  6.  [ 约束条件 ] :  可选子句 ,  如PRIMARY  KEY ,  UNIQUE ,  NOT  NULL等 ,  用于限制字段中的数据 . 
*  7.  [ 默认值 ] :  可选子句 ,  当插入新记录但没有为某个字段提供值时 ,  该字段将使用的值 . 
*  8.  [ 表约束条件 ] :  可选子句 ,  这是应用于整个表的约束 ,  如FOREIGN  KEY . 
mysql>  CREATE  DATABASE  db0; 
Query OK,  1  row  affected ( 0.01  sec) 
mysql>  use  db0; 
Database  changed
mysql>  CREATE  TABLE  emp (  emp_id INT , emp_name VARCHAR ( 20 ) , salary DOUBLE , birthday DATE 
) ; 
Query OK,  0  rows  affected ( 0.02  sec) 
创建一个名为emp的表 ,  该表包含四个字段 :  emp_id ,  emp_name ,  salary和birthday . 
下面是每个字段的详细解释 : 
*  1.  emp_id :  这是一个整数 ( INT ) 类型的字段 ,  用于存储员工的ID . 通常 ,  这样的字段会设置为主键 ( PRIMARY  KEY ) ,  以确保每个员工的ID都是唯一的 . *  2.  emp_name :  这是一个可变字符 ( VARCHAR ) 类型的字段 ,  最大长度为 20 个字符 . 这个字段用于存储员工的名字 ,  可以包含中英文字符 . *  3.  salary :  这是一个双精度浮点数 ( DOUBLE ) 类型的字段 ,  用于存储员工的薪水 . DOUBLE类型可以存储非常大或非常小的数值 ,  包括小数 . *  4.  birthday :  这是一个日期 ( DATE ) 类型的字段 ,  用于存储员工的生日 . 
如果你不想切换到特定的数据库内 ,  而想直接对某个数据库中的表执行操作 ,  可以在表名前使用数据库名作为前缀 . 
在MySQL中 ,  这通常是通过在数据库名和表名之间使用点号 ( . ) 来实现的 . 格式 :  CREATE  TABLE  mydatabase . emp ( . . . ) ;  
mysql>  SELECT  DATABASE ( ) ; 
+ 
|  DATABASE ( )  | 
+ 
|  db0        | 
+ 
1  row  in  set  ( 0.00  sec) 
mysql>  CREATE  DATABASE  db1; 
Query OK,  1  row  affected ( 0.01  sec) 
mysql>  CREATE  TABLE  db1. emp( emp_id INT , emp_name VARCHAR ( 20 ) , salary DOUBLE , birthday DATE 
) ; 
Query OK,  0  rows  affected ( 0.01  sec) 
mysql>  SHOW  TABLES  FROM  db1; 
+ 
|  Tables_in_db1 | 
+ 
|  emp           | 
+ 
1  row  in  set  ( 0.01  sec) 
可以使用  CREATE  TABLE  . . .  AS  SELECT  语法来创建一个新表 ,  并将另一个查询的结果插入到这个新表中 . 
它是SQL中的一个非常有用的特性 ,  它允许你基于一个查询的结果创建一个新表 . 
这种方法特别适用于当你需要从一个或多个现有的表中提取数据 ,  并将其存储在一个新的 ,  具有特定结构的表中时 . 以下是使用  CREATE  TABLE  . . .  AS  SELECT  语法的基本步骤 : 
*  1.  确定你要从哪个表或哪些表中提取数据 . 
*  2.  编写一个查询来提取你需要的数据 . 
*  3.  创建一个新表 ,  并将查询的结果插入到这个新表中 . 注意事项 : 
查询结果中的列必须与要创建的新表中的列一一对应 . 
如果你想要为新表的列指定不同的名称或者想要排除某些列 ,  可以在SELECT语句中明确地列出所需的列 ,  如有需要可指定别名 . 
假设我们有一个名为employees表 ,  它包含员工的个人信息 ,  如 : employee_id ,  first_name ,  salary  和  department_id . 
现在 ,  我们想要创建一个新表highsalary_employees ,  其中只包含工资大于 17000 的员工 . 
我们可以使用以下SQL语句来实现这个目的 : 
mysql>  CREATE  TABLE  highsalary_employees AS 
SELECT  employee_id,  first_name,  salary,  department_id
FROM  atguigudb. employees
WHERE  salary >  17000 ; 
Query OK,  1  row  affected,  1  warning ( 0.02  sec) 
Records: 1   Duplicates: 0   Warnings : 1 
在这个例子中 : 
-  CREATE  TABLE  highsalary_employees  AS :  这部分表示我们要创建一个名为highsalary_employees的新表 . 
-  SELECT  employee_id ,  first_name ,  salary ,  department_id  FROM  employees  WHERE  salary  >  17000 ;  这部分是一个查询 ,  它从employees表中提取工资大于 17000 的员工的id ,  名字 ,  薪资和部门号 . 
-  CREATE  TABLE  . . .  AS  SELECT语法将查询的结果存储在新创建的highsalary_employees表中 . 执行上述SQL语句后 ,  会得到一个名为highsalary_employees的新表 ,  其中只包含工资大于 17000 的员工的记录 . 
mysql>  SELECT  *  FROM  highsalary_employees; 
+ 
|  employee_id |  first_name |  salary   |  department_id | 
+ 
|          100  |  Steven     |  24000.00  |             90  | 
+ 
1  row  in  set  ( 0.00  sec) 
在MySQL中创建好数据表之后 ,  可以使用  DESCRIBE / DESC  或  SHOW  CREATE  TABLE  语句查看数据表结构 . 以下是这两种方法的语法格式和使用说明 : 
*  1.  使用  DESCRIBE  或  DESC  语句 ( DESCRIBE和DESC是同义词 ,  它们都可以用来查看数据表的结构信息 ) . 语法格式 :  DESCRIBE  table_name ; 或者 :  DESC  table_name ; 使用说明 :  table_name  是你要查看结构的数据表的名称 . 执行这条命令后 ,  MySQL会返回数据表的字段名 ,  数据类型 ,  是否允许NULL值 ,  键信息 ,  默认值以及额外信息等 . *  2.  使用  SHOW  CREATE  TABLE  语句 . SHOW  CREATE  TABLE  语句用来查看创建表的SQL语句 ,  通过这个语句 ,  你可以了解到表的完整定义 , 包括表名 ,  字段定义 ,  索引 ,  默认值 ,  字符集等 . 语法格式 :  SHOW  CREATE  TABLE  table_name ; 使用说明 :  table_name  是你要查看创建语句的数据表的名称 . 执行这条命令后 ,  MySQL会返回一个包含创建表的完整SQL语句的结果集 .  这个语句可以用来重新创建该表 . 在实际使用中 ,  你可以根据自己的需求选择合适的方法来查看数据表的结构 . 
如果你只需要查看字段的基本信息 ( 如字段名 ,  数据类型等 ) ,  那么使用  DESCRIBE  或  DESC  就足够了 . 
如果你需要查看表的完整定义 ,  包括字符集 ,  校对规则以及所有的约束和索引 ,  那么  SHOW  CREATE  TABLE  会更合适 . 
mysql>  DESC  emp; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  emp_id   |  int          |  YES  |      |  NULL     |        | 
|  emp_name |  varchar ( 20 )  |  YES  |      |  NULL     |        | 
|  salary   |  double       |  YES  |      |  NULL     |        | 
|  birthday |  date         |  YES  |      |  NULL     |        | 
+ 
4  rows  in  set  ( 0.01  sec) 
输出中的列有特定的含义 : 
*  1.  Field :  列名 ,  表示表中的字段名称 . 
*  2.  Type :  数据类型 ,  表示该列存储的数据类型 ,  例如 ,  int  表示整数 ,  varchar ( 20 )  表示可变字符 ,  最大长度为 20 个字符 . 
*  3.  Null :  是否允许为NULL .  如果这一列的值是  YES ,  那么该列的值可以是NULL ;  如果值是NO ,  则该列的值不能是NULL . 
*  4.  Key :  索引类型 ,  如果这一列是表的某个索引的一部分 ( 如主键 ,  唯一索引或常规索引 ) ,  这里会显示相应的信息 . 常见的值有 :  PRI ( 主键 ) ,  UNI ( 唯一索引 ) 或空 ( 没有索引 ) . 
*  5.  Default :  默认值 .  如果为某列指定了默认值 ,  这里会显示出来 . 如果列允许  NULL  并且没有指定默认值 ,  则这一列通常是NULL . 
*  6.  Extra :  额外的信息 .  这里可能包含一些特殊的信息 ,  比如  auto_increment ( 表示该列是自增的 ) , 或者如果列是最后一个并且数据类型是  timestamp ,  则可能是  on  update  current_timestamp ( 表示当行被更新时 ,  这个  timestamp  列会被设置为当前时间戳 ) . 
mysql>  SHOW  CREATE  TABLE  emp\G
* * * * * * * * * * * * * * * * * * * * * * * * * * *  1.  row  * * * * * * * * * * * * * * * * * * * * * * * * * * * Table : emp
Create  Table : CREATE  TABLE  ` emp` ( ` emp_id` int  DEFAULT  NULL , ` emp_name` varchar ( 20 )  DEFAULT  NULL , ` salary` double  DEFAULT  NULL , ` birthday` date  DEFAULT  NULL 
)  ENGINE = InnoDB  DEFAULT  CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci
1  row  in  set  ( 0.00  sec) 
修改指的是修改数据库中已经存在的数据表的结构 . 
MySQL中使用ALTER  TABLE语句修改已存在的数据表的结构 . 
使用  ALTER  TABLE  语句可以实现 : 
*  1.  向已有的表中添加列 :   ALTER  TABLE  table_name  ADD  COLUMN  column_name  datatype  [ FIRST|AFTER column_name ] ; 
*  2.  修改现有表中的列 :     ALTER  TABLE  table_name  MODIFY  COLUMN  column_name  new_datatype ; 某些MySQL版本中 :     ALTER  TABLE  table_name  CHANGE  old_column_name  new_column_name  new_datatype ; ALTER  TABLE  table_name  MODIFY  COLUMN  address  TEXT ; ALTER  TABLE  table_name  CHANGE  address  new_address  VARCHAR ( 255 ) ; 
*  3.  删除现有表中的列 :    ALTER  TABLE  table_name  DROP  COLUMN  column_name ; 
*  4.  重命名现有表中的列 :  ALTER  TABLE  table_name  CHANGE  old_column_name  new_column_name  datatype ; 
在MySQL中 ,  使用ALTER  TABLE语句添加新字段时 ,  可以指定新字段应该放在哪个现有字段之后 ,  或者使用FIRST关键字将其放在表的开头 . 下面是使用这种语法的示例 : 
假设您有一个名为my_table的表 ,  并且想在existing_column字段之后添加一个新字段new_column ,  数据类型为VARCHAR ( 255 ) , 
可以这样做 :  ALTER  TABLE  my_table  ADD  COLUMN  new_column  VARCHAR ( 20 )  AFTER  existing_column ; 
这条语句会在my_table表的existing_column字段之后添加名为new_column的新字段 ,  数据类型为VARCHAR ( 20 ) . 如果您想将新字段放在表的开头 ,  可以使用FIRST关键字 : 
ALTER  TABLE  my_table  ADD  COLUMN  new_column  VARCHAR ( 255 )  FIRST ; 
这条语句会在my_table表的开头添加新字段 . 请注意 ,  AFTER  column_name和FIRST是可选的 . 
如果省略它们 ,  新字段将默认添加到表的末尾 . 
mysql>  ALTER  TABLE  emp ADD  COLUMN  age INT ;   
Query OK,  0  rows  affected ( 0.02  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  emp; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  emp_id   |  int          |  YES  |      |  NULL     |        | 
|  emp_name |  varchar ( 20 )  |  YES  |      |  NULL     |        | 
|  salary   |  double       |  YES  |      |  NULL     |        | 
|  birthday |  date         |  YES  |      |  NULL     |        | 
|  age      |  int          |  YES  |      |  NULL     |        |   
+ 
5  rows  in  set  ( 0.00  sec) 
mysql>   ALTER  TABLE  emp ADD  COLUMN  emp_pk INT  FIRST ;   
Query OK,  0  rows  affected ( 0.01  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  emp; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  emp_pk   |  int          |  YES  |      |  NULL     |        |   
|  emp_id   |  int          |  YES  |      |  NULL     |        | 
|  emp_name |  varchar ( 20 )  |  YES  |      |  NULL     |        | 
|  salary   |  double       |  YES  |      |  NULL     |        | 
|  birthday |  date         |  YES  |      |  NULL     |        | 
|  age      |  int          |  YES  |      |  NULL     |        |  
+ 
6  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  emp ADD  COLUMN  job_id INT  AFTER  salary;   
Query OK,  0  rows  affected ( 0.02  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  emp; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  emp_pk   |  int          |  YES  |      |  NULL     |        | 
|  emp_id   |  int          |  YES  |      |  NULL     |        | 
|  emp_name |  varchar ( 20 )  |  YES  |      |  NULL     |        | 
|  salary   |  double       |  YES  |      |  NULL     |        | 
|  job_id   |  int          |  YES  |      |  NULL     |        |   
|  birthday |  date         |  YES  |      |  NULL     |        |   
|  age      |  int          |  YES  |      |  NULL     |        | 
+ 
7  rows  in  set  ( 0.00  sec) 
可以修改列的数据名称 ,  类型 ,  长度 ,  默认值和位置 ,  详细的解释和示例 : 
*  1.  修改列的名称 :      ALTER  TABLE  table_name  CHANGE  [ COLUMN ] old_column_name  new_column_name  datatype ; 
*  2.  修改列的数据类型 :  ALTER  TABLE  table_name  MODIFY  [ COLUMN ] column_name  new_datatype ; 
*  3.  修改列的长度 :      ALTER  TABLE  table_name  MODIFY  [ COLUMN ] column_name  VARCHAR ( new_length ) ; 
*  4.  修改列的默认值 :    ALTER  TABLE  table_name  MODIFY  [ COLUMN ] column_name  datatype  DEFAULT  new_default_value ; 
*  5.  修改列的位置 :      ALTER  TABLE  table_name  MODIFY  [ COLUMN ] column_name  datatype  AFTER  another_column_name ; 或 :               ALTER  TABLE  table_name  MODIFY  [ COLUMN ] column_name  datatype  FIRST ; 注意事项 : 
-  COLUMN关键字在SQL语句中不是必需的 ,  但使用它可以使代码更加清晰和易于理解 . 
-  datatype是必须指定的 ,  尤其是在你想要改变列的数据类型时 . 即使你不打算改变数据类型 ,  而只是想要修改其他属性 ( 如默认值或位置 ) ,  数据库管理系统仍然要求你显式地包含数据类型 . 
-  上述操作中 ,  如果改变了datatype的值 ,  那么意味着同时修改该列的数据类型 . 综合示例 ,  假设您有一个名为users的表 ,  并且您想修改username列的数据类型为VARCHAR ( 100 ) ,  为其设置默认值 'anonymous' , 
并将其放在email列之后 ,  可以这样写 : 
ALTER  TABLE  users  MODIFY  COLUMN  username  VARCHAR ( 100 )  DEFAULT  'anonymous'  AFTER  email ; 请注事项 : 
当你更改列的数据类型时 ,  必须确保现有的数据能够适配新的数据类型 ,  否则操作会失败 . 
如果数据无法适配 ,  可能需要先对数据进行清洗或转换 ,  或者考虑其他解决方案 . 
mysql>  ALTER  TABLE  emp CHANGE COLUMN  emp_id gender INT ;   
Query OK,  0  rows  affected ( 0.01  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  emp; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        |   
|  gender   |  int          |  YES  |      |  NULL     |        | 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        | 
+ 
7  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  emp CHANGE COLUMN  gender sex VARCHAR ( 24 ) ; 
Query OK,  0  rows  affected ( 0.02  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  emp; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        |   
|  sex      |  varchar ( 24 )  |  YES  |      |  NULL     |        | 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        | 
+ 
7  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  emp MODIFY  COLUMN  salary VARCHAR ( 32 ) ; 
Query OK,  0  rows  affected ( 0.03  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  emp; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        |   
|  salary   |  varchar ( 32 )  |  YES  |      |  NULL     |        | 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        | 
+ 
7  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  emp MODIFY  COLUMN  emp_name VARCHAR ( 24 ) ; 
Query OK,  0  rows  affected ( 0.01  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  emp; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        |   
|  emp_name |  varchar ( 24 )  |  YES  |      |  NULL     |        | 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        | 
+ 
7  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  emp MODIFY  COLUMN  job_id INT  DEFAULT  1 ;   
Query OK,  0  rows  affected ( 0.01  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  emp; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        |   
|  job_id   |  int          |  YES  |      |  1        |        | 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        | 
+ 
7  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  emp MODIFY  COLUMN  job_id VARCHAR ( 20 )  DEFAULT  'IT' ;   
Query OK,  0  rows  affected ( 0.02  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        |   
|  job_id   |  varchar ( 20 )  |  YES  |      |  IT      |        | 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        | 
+ 
7  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  emp MODIFY  COLUMN  age INT  AFTER  emp_name;   
Query OK,  0  rows  affected ( 0.03  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  desc  emp; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        |   
|  emp_name |  varchar ( 24 )  |  YES  |      |  NULL     |        | 
|  age      |  int          |  YES  |      |  NULL     |        | 
|  . . .       |  . . .          |  . . .   |      |  . . .      |        |   
+ 
7  rows  in  set  ( 0.00  sec) 
在MySQL中 ,  可以使用  ALTER  TABLE  语句配合  DROP  COLUMN  子句删除一个列 . 下面是一个基本的例子来说明如何操作 : 
假设你有一个名为my_table的表 ,  并且你想要删除名为my_column的列 ,  可以使用以下SQL语句 : 
ALTER  TABLE  my_table  DROP  COLUMN  column_name ; 
这条命令会从my_table表中删除column_name  列 . 注意事项 : 
*  1.  请确保已经备份了数据库或表 ,  以防万一出现错误或需要回滚操作 . 
*  2.  该列没有作为其他表的外键约束 . 
*  3.  该列没有包含在任何视图或触发器中。 
*  4.  如果列被其他数据库对象 ( 如视图 ,  触发器或外键约束 ) 引用 ,  那么你可能需要先删除或修改这些对象 ,  然后再尝试删除列 . 
mysql>  ALTER  TABLE  emp DROP  COLUMN  sex; 
Query OK,  0  rows  affected ( 0.02  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
DESC  emp; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  emp_pk   |  int          |  YES  |      |  NULL     |        | 
|  emp_name |  varchar ( 24 )  |  YES  |      |  NULL     |        | 
|  age      |  int          |  YES  |      |  NULL     |        | 
|  salary   |  varchar ( 32 )  |  YES  |      |  NULL     |        | 
|  job_id   |  varchar ( 20 )  |  YES  |      |  IT      |        | 
|  birthday |  date         |  YES  |      |  NULL     |        | 
+ 
6  rows  in  set  ( 0.00  sec) 
在MySQL中 ,  可以使用RENAME  TABLE语句重命名一个表 . 
还可以使用ALTER  TABLE  . . .  RENAME  [ TO ] . . .  语句来重命名 ,  子句中的TO关键字是可选的 . 以下是如何使用它的基本示例 : 
假设你有一个名为old_table_name的表 ,  并且你想要将其重命名为new_table_name , 可以使用以下SQL语句 : 
RENAME  TABLE  old_table_name  TO  new_table_name ; 
这条命令会将old_table_name重命名为new_table_name . 或 : 
ALTER  TABLE  old_table_name  RENAME  TO  new_table_name ; 
ALTER  TABLE  old_table_name  RENAME  new_table_name ; 如果你是在一个包含多个表的数据库中重命名表 ,  并且你想要同时重命名多个表 ,  可以这样做 : 
RENAME  TABLE  old_table_name1  TO  new_table_name1 ,   old_table_name2  TO  new_table_name2 ,   . . . ; 注意事项 : 
-  不允许重命名到一个已存在的表名 . 
-  不能有其他数据库对象 ( 如视图 ,  触发器或存储过程 ) 依赖于old_table_name ,  否则你可能需要先更新或删除这些依赖项 . 
mysql>  RENAME  TABLE  emp TO  myemp; 
Query OK,  0  rows  affected ( 0.01  sec) 
mysql>  SHOW  TABLES ; 
+ 
|  Tables_in_db0        | 
+ 
|  highsalary_employees | 
|  myemp                | 
+ 
2  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  myemp RENAME  TO  emp; 
Query OK,  0  rows  affected ( 0.02  sec) 
mysql>  SHOW  TABLES ; 
+ 
|  Tables_in_db0        | 
+ 
|  emp                  | 
|  highsalary_employees | 
+ 
2  rows  in  set  ( 0.00  sec) 
在MySQL中 ,  可以使用DROP  TABLE语法删除表格 . 语法格式 : 
DROP  TABLE  [ IF EXISTS ] 数据表 1  [ ,  数据表 2 ,  . . . ,  数据表n ] ; 语法解释 : 
*  1.  DROP  TABLE  是用来删除数据表的SQL语句 . 
*  2.  [ IF EXISTS ] 是一个可选的子句 . 如果使用了这个子句 ,  并且在数据库中不存在指定的数据表 ,  MySQL将不会报错 , 而是简单地忽略该语句并继续执行后续操作 ( 如果有的话 ) . 如果不使用 [ IF EXISTS ] ,  而指定的数据表不存在 ,  MySQL会抛出一个错误 . 
*  3.  数据表 1 ,  数据表 2 ,  . . . ,  数据表n :  是你想要删除的数据表的名称列表 . 你可以在一个DROP  TABLE语句中指定多个数据表名称 ,  用逗号分隔 . 删除数据表的影响 : 
*  1.  数据和结构都被删除 :  当你删除一个数据表时 ,  该表中的所有数据行以及表结构 ( 包括列定义 ,  约束 ,  索引等 ) 都会被永久删除 . *  2.  所有正在运行的相关事务被提交 :  如果有任何事务正在访问或修改该表 ,  当执行DROP  TABLE语句时 ,  这些事务会被强制提交 . 这意味着它们所做的任何更改都会被保存 ,  但之后无法再访问该表 . *  3.  所有相关索引被删除 :  与表相关联的所有索引 ( 无论是主键 ,  唯一索引还是普通索引 ) 都会被删除 . *  4.  不能回滚 :  DROP  TABLE是一个DDL ( 数据定义语言 ) 操作 ,  它在MySQL中是不能回滚的 . 一旦执行了DROP  TABLE语句 ,  就无法撤销该操作 ,  除非你之前做了备份 . 注意事项 : 
*  1.  在执行DROP  TABLE语句之前 ,  请确保已经备份了任何重要的数据 ,  以防意外删除 . 
*  2.  确保没有其他数据库对象 ( 如触发器 ,  视图或外键 ) 依赖于您想要删除的数据表 ,  否则可能需要先删除或修改这些依赖对象 . 
*  3.  如果可能的话 ,  最好在数据库的低峰时段或维护窗口执行此类操作 ,  以减少对业务的影响 . 
mysql>  DROP  TABLE  IF  EXISTS  emp; 
Query OK,  0  rows  affected ( 0.01  sec) 
mysql>  SHOW  TABLES ; 
+ 
|  Tables_in_db0        | 
+ 
|  highsalary_employees | 
+ 
1  row  in  set  ( 0.00  sec) 
在MySQL中 ,  使用TRUNCATE  TABLE或SELECT  FROM  TABLE语句删除表中所有记录的语句 . 以下是关于  TRUNCATE  TABLE  语句的详细信息 : 
功能 : 
*  1.  删除所有记录 :  TRUNCATE  TABLE语句删除表中的所有数据行 ,  但不删除表本身或其结构 . 
*  2.  不记录个别行的删除 :  由于TRUNCATE操作不记录个别行的删除 ,  它通常比  DELETE  语句更快 , 因为DELETE会为每一行生成一个日志条目 . 
*  3.  重置任何自增计数器 :  如果表有一个自增字段 ( 如AUTO_INCREMENT ) ,  TRUNCATE  TABLE会重置该字段的计数器到其初始值 . *  4.  释放空间 :  在某些数据库系统中 ,  TRUNCATE  TABLE可能会释放表所使用的磁盘空间 ,  使其可用于数据库的其他部分 . 但是 ,  不是所有数据库系统都会这样操作 ;  这取决于特定的数据库实现 . 语法 :  
TRUNCATE  TABLE  table_name ; 
其中table_name是你想要删除所有记录的表的名称 . 注意事项 : 
*  1.  不可回滚 :  与DROP  TABLE类似 ,  TRUNCATE  TABLE也是一个不可回滚的操作 . 一旦执行 ,  数据将不可恢复 ,  除非你有备份 . *  2.  触发器不执行 :  与DELETE不同 ,  TRUNCATE  TABLE不会激活与表相关联的触发器 . *  3.  权限要求 :  执行TRUNCATE  TABLE通常需要具有对该表的TRUNCATE权限 ,  或者具有DROP权  ( 因为某些数据库系统可能将TRUNCATE视为一种删除表的特殊形式 ) . *  4.  锁定表 :  在执行TRUNCATE  TABLE时 ,  表通常会被锁定 ,  以防止其他用户同时访问或修改它 . 举例 :  假设你有一个名为employees的表 ,  并且你想要删除该表中的所有记录 : 
TRUNCATE  TABLE  employees ; 
执行这条语句后 ,  employees表中的所有数据行都将被删除 ,  但表本身及其结构将保持不变 . 
自增字段 ( 如果有的话 ) 将被重置到其初始值 . 对比  DELETE  和  TRUNCATE : 
*  1.  DELETE  语句可以带有  WHERE  子句来删除特定的行 ,  而  TRUNCATE  TABLE  删除所有行 . 
*  2.  DELETE  是一个可以回滚的事务操作 ,  而  TRUNCATE  TABLE  通常不可回滚 . 
*  3.  DELETE  会激活与表相关的触发器 ,  而  TRUNCATE  TABLE  不会 . 
*  4.  DELETE  会记录每一行的删除操作 ,  可能生成大量的日志 ,  而  TRUNCATE  TABLE  不记录个别行的删除 ,  因此通常更快 . 
在MySQL中 ,  回滚操作通常用于撤销在事务中所做的更改 ,  使数据库回到事务开始之前的状态 . 
以下是执行回滚操作的基本步骤 : 
*  1.  开始事务 :  首先 ,  需要开始一个新的事务 .  这可以通过使用START  TRANSACTION或BEGIN语句来完成 . 
*  2.  执行SQL语句 ,  在事务中 ,  可以执行一系列的SQL语句 ,  如 :  INSERT ,  UPDATE ,  DELETE等 . 
*  3.  遇到错误或决定回滚 :  如果在执行这些语句的过程中遇到错误 ,  或者你决定撤销这些更改 ,  可以使用ROLLBACK语句来回滚事务 . 
mysql>  CREATE  TABLE  emp AS 
SELECT  employee_id,  first_name,  salary,  department_id  FROM  atguigudb. employees; 
Query OK,  107  rows  affected,  1  warning ( 0.03  sec) 
Records: 107   Duplicates: 0   Warnings : 1 
mysql>  START  TRANSACTION ; 
Query OK,  0  rows  affected ( 0.00  sec) 
mysql>  DELETE  FROM  emp; 
Query OK,  107  rows  affected ( 0.01  sec)   
mysql>  SELECT  *  FROM  emp; 
Empty set  ( 0.00  sec) 
mysql>  DESC  emp; 
+ 
|  Field         |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  employee_id   |  int          |  NO    |      |  0        |        | 
|  first_name    |  varchar ( 20 )  |  YES  |      |  NULL     |        | 
|  salary        |  double ( 8 , 2 )  |  YES  |      |  NULL     |        | 
|  department_id |  int          |  YES  |      |  NULL     |        | 
+ 
4  rows  in  set  ( 0.00  sec) 
mysql>  ROLLBACK ; 
Query OK,  0  rows  affected ( 0.00  sec) 
mysql>  SELECT  *  FROM  emp; 
+ 
|  employee_id |  first_name  |  salary   |  department_id | 
+ 
|          100  |  Steven      |  24000.00  |             90  | 
|          . . .  |  . . .          |       . . .  |            . . .  |   
|          206  |  William     |   8300.00  |            110  |  
+ 
107  rows  in  set  ( 0.00  sec) 
DML和DDL是数据库管理系统中的两种重要语言 : 
*  1.  DML ( Data  Manipulation  Language ,  数据操纵语言 ) :  用于对数据库中的数据进行增删改操作 . 常见的DML命令包括 ( DML的主要操作对象是表里的数据 ( 记录 ) ) :  1.  INSERT ( 用于增加数据到数据库 ) . 2.  UPDATE ( 用于从数据库中修改现存的数据 ) . 3.  DELETE ( 用于从数据库中删除数据 ) 等语句 . *  2.  DDL ( Data  Definition  Language ,  数据库定义语言 ) :  用于对数据库内部的对象进行创建 ,  删除 ,  修改等操作 . 这些对象包括表 ,  视图 ,  索引 ,  序列等 .  DDL的主要目标是定义或改变数据库结构 ,  而不是处理数据本身 . 常见的DDL命令包括 : 1.  CREATE ( 用于创建数据库或数据库中的对象 ,  如表 ,  视图 ,  索引等 ) .  2.  ALTER ( 用于修改数据库或数据库中的对象 ,  如表结构 ,  视图定义等 ) . 3.  DROP ( 用于删除数据库或数据库中的对象 ,  如表 ,  视图等 ) . DDL的主要作用是对数据库的整体结构进行操作 ,  确保数据库的结构与业务需求相匹配 . 与DML ( 数据操纵语言 ) 不同 ,  DML主要用于对数据库中的数据进行增删改操作 ,  而DDL则更侧重于数据库结构的定义和修改 . 
COMMIT  和  ROLLBACK  是  SQL  语言中的两个关键命令 ,  它们与数据库事务的处理密切相关 . 
事务是数据库管理系统 ( DBMS ) 中执行的一个工作单元 ,  它可以包含多个SQL语句 . 
事务的主要目的是确保数据的完整性和一致性 ,  即使在多个操作失败或中断的情况下也能做到这一点 . *  1.  COMMIT命令 :  用于提交事务 ,  即将事务中所做的所有更改永久保存到数据库中 ( 意味着数据无法回滚 ) . 当你执行一个事务 ,  并对数据库进行了更改 ( 例如 ,  插入 ,  更新或删除记录 ) ,  这些更改在事务完成之前不会永久生效 . 只有在执行COMMIT命令后 ,  这些更改才会被保存到数据库中 ,  并且对其他数据库用户可见 . *  2.  ROLLBACK :  命令用于撤销事务中所做的所有更改 ( 回到最近的一次COMMIT之后 ) . 如果在执行事务的过程中发生错误 ,  或者由于某种原因你决定不保存所做的更改 ,  你可以使用ROLLBACK命令来撤销事务中的所有操作 . 这会将数据库恢复到事务开始之前的状态 . 
关于回滚的问题 : 
*  1.  DDL操作一旦执行 ,  确实无法回滚 . 这是因为DDL操作在执行前后会自动执行commit ,  所以不能使用rollback来回滚DDL操作的结果 . 然而 ,  如果在DDL操作执行过程中由于某种原因失败 ,  系统会自动将其回滚 ,  这属于隐式回滚 ,  用户无法控制 . *  2.  DML操作 ,  在默认情况下 ,  一旦执行也是不可回滚的 . 但是 ,  如果在执行DML操作之前 ,  执行了SET  autocommit  =  FALSE ,  则执行的DML操作就可以实现回滚 . 这是因为当autocommit设置为FALSE时 ,  DML操作不会立即提交 ,  而是等待后续的commit或rollback命令 . 详细说明 : 
当设置  SET  autocommit  =  FALSE  之后 ,  数据库管理系统的行为会发生变化 ,  特别是针对DML ( 数据操纵语言 ) 操作 . 在默认情况下 ,  大多数数据库系统都设置为自动提交模式 ( autocommit  =  TRUE ) . 
这意味着每次执行DML操作时 ( 如INSERT ,  UPDATE或DELETE ) ,  更改会立即被提交到数据库 ,  成为永久性的更改 . 但是 ,  当你执行  SET  autocommit  =  FALSE  后 ,  数据库进入手动提交模式 ( 临时性 ) . 
这意味着后续的DML操作不会立即提交到数据库 . 
相反 ,  它们会等待一个显式的  COMMIT  命令来提交更改 ,  或者如果出现问题 ,  可以使用  ROLLBACK  命令撤销这些更改 . 这种手动提交模式在处理多个相关的DML操作时非常有用 ,  因为它允许你将它们组合成一个单一的事务 . 
通过这样做 ,  你可以确保所有操作要么全部成功 ,  要么在出现问题时全部回滚 ,  从而保持数据的一致性 . 然而 ,  值得注意的是 ,  SET  autocommit  =  FALSE  对DDL ( 数据定义语言 ) 操作没有影响 . 
DDL操作 ( 如CREATE ,  ALTER和DROP ) 在执行时总是自动提交 ,  因此无法回滚 ,  即使autocommit被设置为FALSE . 
mysql>  CREATE  TABLE  emp1 AS 
SELECT  employee_id,  first_name,  salary,  department_id  FROM  atguigudb. employees; 
Query OK,  107  rows  affected,  1  warning ( 0.03  sec) 
Records: 107   Duplicates: 0   Warnings : 1 
mysql>  SET  autocommit =  FALSE ; 
Query OK,  0  rows  affected ( 0.00  sec) 
mysql>  SELECT  *  FROM  emp1; 
. . . 
107  rows  in  set  ( 0.00  sec)   
mysql>  DELETE  FROM  emp1; 
Query OK,  107  rows  affected ( 0.01  sec)   
mysql>  SELECT  *  FROM  emp1; 
Empty set  ( 0.00  sec) 
mysql>  ROLLBACK ; 
Query OK,  0  rows  affected ( 0.00  sec) 
mysql>  SELECT  *  FROM  emp1; 
. . . 
107  rows  in  set  ( 0.00  sec)   
mysql>  DELETE  FROM  emp1; 
Query OK,  107  rows  affected ( 0.00  sec) 
mysql>  SELECT  *  FROM  emp1; 
Empty set  ( 0.00  sec) 
mysql>  COMMIT ; 
Query OK,  0  rows  affected ( 0.00  sec) 
mysql>  ROLLBACK ; 
Query OK,  0  rows  affected ( 0.00  sec) 
mysql>  SELECT  *  FROM  emp1; 
Empty set  ( 0.00  sec) 
在MySQL  8.0 版本中 ,  InnoDB表的DDL支持事务完整性 ,  即DDL操作要么成功要么回滚 . 
DDL操作回滚日志写入到data  dictionary数据字典表mysql . innodb_ddl_log中 ,  
该表是隐藏的表 ,  通过show  tables无法看到中 ,  用于回滚操作 . 
通过设置参数 ,  可将DDL操作日志打印输出到MySQL错误日志中 . 
mysql>  CREATE  DATABASE  mytest; 
Query OK,  1  row  affected ( 0.00  sec) mysql>  USE  mytest; 
Database  changedmysql>  CREATE  TABLE  book1( book_id INT , book_name VARCHAR ( 255 ) 
) ; 
Query OK,  0  rows  affected ( 0.02  sec) mysql>  SHOW  TABLES ; 
+ 
|  Tables_in_mytest | 
+ 
|  book1            | 
+ 
1  row  in  set  ( 0.01  sec) 
mysql>  DROP  TABLE  book1, book2; 
ERROR 1051  ( 42 S02) : Unknown table  'mytest.book2' 
mysql>  SHOW  TABLES ; 
Empty set  ( 0.00  sec) 
mysql>  DROP  TABLE  book1, book2; 
ERROR 1051  ( 42 S02) : Unknown table  'mytest.book2' 
mysql>  show  tables ; 
+ 
|  Tables_in_mytest | 
+ 
|  book1      | 
+ 
1  row  in  set  ( 0.00  sec) 
mysql>  CREATE  DATABASE  test01_office CHARACTER  SET  'utf8' ; 
Query OK,  1  row  affected,  1  warning ( 0.01  sec) 
mysql>  USE  test01_office; 
Database  changed
mysql>  CREATE  TABLE  dept01( id INT , name VARCHAR ( 25 ) 
) ; 
Query OK,  0  rows  affected ( 0.02  sec) 
mysql>  DESC  dept01; 
+ 
|  Field |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  id    |  int          |  YES  |      |  NULL     |        | 
|  name  |  varchar ( 25 )  |  YES  |      |  NULL     |        | 
+ 
2  rows  in  set  ( 0.00  sec) 
mysql>  CREATE  TABLE  dept02 AS  SELECT  *  FROM  atguigudb. departments; 
Query OK,  27  rows  affected ( 0.01  sec) 
Records: 27   Duplicates: 0   Warnings : 0 
mysql>  DESC  dept02; 
+ 
|  Field           |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  department_id   |  int          |  NO    |      |  0        |        | 
|  department_name |  varchar ( 30 )  |  NO    |      |  NULL     |        | 
|  manager_id      |  int          |  YES  |      |  NULL     |        | 
|  location_id     |  int          |  YES  |      |  NULL     |        | 
+ 
4  rows  in  set  ( 0.00  sec) 
mysql>  SELECT  *  FROM  dept02; 
. . . 
27  rows  in  set  ( 0.00  sec) 
CREATE  TABLE  emp01( id INT , first_name VARCHAR ( 25 ) , LAST_name  VARCHAR ( 25 ) , dept_id INT 
) ; 
Query OK,  0  rows  affected ( 0.02  sec) 
mysql>  DESC  emp01; 
+ 
|  Field      |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  id         |  int          |  YES  |      |  NULL     |        | 
|  first_name |  varchar ( 25 )  |  YES  |      |  NULL     |        | 
|  LAST_name  |  varchar ( 25 )  |  YES  |      |  NULL     |        | 
|  dept_id    |  int          |  YES  |      |  NULL     |        | 
+ 
4  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  emp01 MODIFY  COLUMN  last_name VARCHAR ( 50 ) ; 
Query OK,  0  rows  affected ( 0.01  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  emp01; 
+ 
|  Field      |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  id         |  int          |  YES  |      |  NULL     |        | 
|  first_name |  varchar ( 25 )  |  YES  |      |  NULL     |        | 
|  last_name  |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
|  dept_id    |  int          |  YES  |      |  NULL     |        | 
+ 
4  rows  in  set  ( 0.00  sec) 
mysql>  CREATE  TABLE  emp02 AS  SELECT  *  FROM  atguigudb. employees; 
Query OK,  107  rows  affected,  2  warnings  ( 0.02  sec) 
Records: 107   Duplicates: 0   Warnings : 2 
mysql>  DESC  emp02; 
+ 
|  Field           |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  employee_id     |  int          |  NO    |      |  0        |        | 
|  first_name      |  varchar ( 20 )  |  YES  |      |  NULL     |        | 
|  last_name       |  varchar ( 25 )  |  NO    |      |  NULL     |        | 
|  email           |  varchar ( 25 )  |  NO    |      |  NULL     |        | 
|  phone_number    |  varchar ( 20 )  |  YES  |      |  NULL     |        | 
|  hire_date       |  date         |  NO    |      |  NULL     |        | 
|  job_id          |  varchar ( 10 )  |  NO    |      |  NULL     |        | 
|  salary          |  double ( 8 , 2 )  |  YES  |      |  NULL     |        | 
|  commission_pct  |  double ( 2 , 2 )  |  YES  |      |  NULL     |        | 
|  manager_id      |  int          |  YES  |      |  NULL     |        | 
|  department_id   |  int          |  YES  |      |  NULL     |        | 
+ 
11  rows  in  set  ( 0.00  sec) 
mysql>  SELECT  *  FROM  emp02; 
. . . 
107  rows  in  set  ( 0.00  sec) 
mysql>  DROP  TABLE  emp01; 
Query OK,  0  rows  affected ( 0.01  sec) 
mysql>  SHOW  TABLES ; 
+ 
|  Tables_in_test01_office | 
+ 
|  dept01                  | 
|  dept02                  | 
|  emp02                   | 
+ 
3  rows  in  set  ( 0.00  sec) 
mysql>  RENAME  TABLE  emp02 TO  emp01; 
Query OK,  0  rows  affected ( 0.02  sec) 
mysql>  SHOW  TABLES ; 
+ 
|  Tables_in_test01_office | 
+ 
|  dept01                  | 
|  dept02                  | 
|  emp01                   | 
+ 
3  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  dept02 ADD  COLUMN  test_column INT ; 
Query OK,  0  rows  affected ( 0.01  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  dept02; 
+ 
|  Field           |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  department_id   |  int          |  NO    |      |  0        |        | 
|  department_name |  varchar ( 30 )  |  NO    |      |  NULL     |        | 
|  manager_id      |  int          |  YES  |      |  NULL     |        | 
|  location_id     |  int          |  YES  |      |  NULL     |        | 
|  test_column     |  int          |  YES  |      |  NULL     |        | 
+ 
5  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  emp01 ADD  COLUMN  test_column INT ; 
Query OK,  0  rows  affected ( 0.01  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  emp01; 
+ 
|  Field           |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .              |  . . .          |  . . .   |      |  . . .      |        | 
|  test_column     |  int          |  YES  |      |  NULL     |        | 
+ 
12  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  emp01 DROP  COLUMN  department_id; 
Query OK,  0  rows  affected ( 0.02  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  emp01; 
+ 
|  Field           |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  employee_id     |  int          |  NO    |      |  0        |        | 
|  first_name      |  varchar ( 20 )  |  YES  |      |  NULL     |        | 
|  last_name       |  varchar ( 25 )  |  NO    |      |  NULL     |        | 
|  email           |  varchar ( 25 )  |  NO    |      |  NULL     |        | 
|  phone_number    |  varchar ( 20 )  |  YES  |      |  NULL     |        | 
|  hire_date       |  date         |  NO    |      |  NULL     |        | 
|  job_id          |  varchar ( 10 )  |  NO    |      |  NULL     |        | 
|  salary          |  double ( 8 , 2 )  |  YES  |      |  NULL     |        | 
|  commission_pct  |  double ( 2 , 2 )  |  YES  |      |  NULL     |        | 
|  manager_id      |  int          |  YES  |      |  NULL     |        | 
|  test_column     |  int          |  YES  |      |  NULL     |        | 
+ 
11  rows  in  set  ( 0.00  sec) 
mysql>  CREATE  DATABASE  test02_market; 
Query OK,  1  row  affected ( 0.01  sec) 
mysql>  USE  test02_market; 
Database  changed
mysql>  CREATE  TABLE  customers( c_num INT , c_name VARCHAR ( 50 ) , c_contact VARCHAR ( 50 ) , c_city VARCHAR ( 50 ) , c_birth DATE 
) ; 
Query OK,  0  rows  affected ( 0.01  sec) 
mysql>  DESC  customers; 
+ 
|  Field     |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  c_num     |  int          |  YES  |      |  NULL     |        | 
|  c_name    |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
|  c_contact |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
|  c_city    |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
|  c_birth   |  date         |  YES  |      |  NULL     |        | 
+ 
5  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  customers MODIFY  COLUMN  c_contact VARCHAR ( 50 )  AFTER  c_birth; 
Query OK,  0  rows  affected ( 0.02  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  customers; 
+ 
|  Field     |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  c_num     |  int          |  YES  |      |  NULL     |        | 
|  c_name    |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
|  c_city    |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
|  c_birth   |  date         |  YES  |      |  NULL     |        | 
|  c_contact |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
+ 
5  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  customers MODIFY  COLUMN  c_name VARCHAR ( 70 ) ; 
Query OK,  0  rows  affected ( 0.03  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  customers; 
+ 
|  Field     |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  c_num     |  int          |  YES  |      |  NULL     |        | 
|  c_name    |  varchar ( 70 )  |  YES  |      |  NULL     |        | 
|  . . .        |  . . .          |  . . .   |      |  . . .      |        | 
+ 
5  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  customers CHANGE COLUMN  c_contact c_phone VARCHAR ( 50 ) ; 
Query OK,  0  rows  affected ( 0.01  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  customers; 
+ 
|  Field   |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .        |  . . .        |  . . .   |      |  . . .      |        | 
|  c_phone |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
+ 
5  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  customers ADD  COLUMN  c_gender CHAR ( 1 )  AFTER  c_name; 
Query OK,  0  rows  affected ( 0.01  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  customers; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  c_num    |  int          |  YES  |      |  NULL     |        | 
|  c_name   |  varchar ( 70 )  |  YES  |      |  NULL     |        | 
|  c_gender |  char ( 1 )      |  YES  |      |  NULL     |        | 
|  . . .        |  . . .        |  . . .   |      |  . . .      |        | 
+ 
6  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  customers RENAME  TO  customers_info; 
Query OK,  0  rows  affected ( 0.01  sec) 
mysql>  SHOW  TABLES ; 
+ 
|  Tables_in_test02_market | 
+ 
|  customers_info          | 
+ 
1  row  in  set  ( 0.00  sec) 
mysql>  DESC  customers_info; 
+ 
|  Field    |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  c_num    |  int          |  YES  |      |  NULL     |        | 
|  c_name   |  varchar ( 70 )  |  YES  |      |  NULL     |        | 
|  c_gender |  char ( 1 )      |  YES  |      |  NULL     |        | 
|  c_birth  |  date         |  YES  |      |  NULL     |        | 
|  c_phone  |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
+ 
5  rows  in  set  ( 0.00  sec) 
mysql>  CREATE  DATABASE  test03_company; 
Query OK,  1  row  affected ( 0.01  sec) 
mysql>  USE  test03_company; 
Database  changed
mysql>  CREATE  TABLE  offices( officeCode INT , city VARCHAR ( 30 ) , address VARCHAR ( 50 ) , country VARCHAR ( 50 ) , POSTALcODE VARCHAR ( 25 ) 
) ; 
Query OK,  0  rows  affected ( 0.02  sec) 
mysql>  DESC  offices; 
+ 
|  Field      |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  officeCode |  int          |  YES  |      |  NULL     |        | 
|  city       |  varchar ( 30 )  |  YES  |      |  NULL     |        | 
|  address    |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
|  country    |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
|  POSTALcODE |  varchar ( 25 )  |  YES  |      |  NULL     |        | 
+ 
5  rows  in  set  ( 0.00  sec) 
mysql>  CREATE  TABLE  employees( empNum INT , lastName VARCHAR ( 50 ) , firstNmae VARCHAR ( 50 ) , mobile VARCHAR ( 25 ) , code INT , jobTitle VARCHAR ( 50 ) , birth date , note VARCHAR ( 255 ) , sex VARCHAR ( 5 ) 
) ; 
Query OK,  0  rows  affected ( 0.02  sec) 
mysql>  DESC  employees; 
+ 
|  Field     |  Type          |  Null  |  Key  |  Default  |  Extra | 
+ 
|  empNum    |  int           |  YES  |      |  NULL     |        | 
|  lastName  |  varchar ( 50 )   |  YES  |      |  NULL     |        | 
|  firstNmae |  varchar ( 50 )   |  YES  |      |  NULL     |        | 
|  mobile    |  varchar ( 25 )   |  YES  |      |  NULL     |        | 
|  code      |  int           |  YES  |      |  NULL     |        | 
|  jobTitle  |  varchar ( 50 )   |  YES  |      |  NULL     |        | 
|  birth     |  date          |  YES  |      |  NULL     |        | 
|  note      |  varchar ( 255 )  |  YES  |      |  NULL     |        | 
|  sex       |  varchar ( 5 )    |  YES  |      |  NULL     |        | 
+ 
9  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  employees MODIFY  COLUMN  mobile VARCHAR ( 25 )  AFTER  code; 
Query OK,  0  rows  affected ( 0.03  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  employees; 
+ 
|  Field     |  Type          |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .        |  . . .           |  . . .   |      |  . . .      |        | 
|  code      |  int           |  YES  |      |  NULL     |        | 
|  mobile    |  varchar ( 25 )   |  YES  |      |  NULL     |        | 
|  . . .        |  . . .           |  . . .   |      |  . . .      |        | 
+ 
9  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  employees CHANGE COLUMN  birth birthday DATE ; 
Query OK,  0  rows  affected ( 0.01  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  employees; 
+ 
|  Field     |  Type          |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .        |  . . .           |  . . .   |      |  . . .      |        | 
|  birthday  |  date          |  YES  |      |  NULL     |        | 
|  . . .        |  . . .           |  . . .   |      |  . . .      |        | 
+ 
9  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  employees MODIFY  COLUMN  sex CHAR ( 1 ) ; 
Query OK,  0  rows  affected ( 0.03  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  employees; 
+ 
|  Field     |  Type          |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .        |  . . .           |  . . .   |      |  . . .      |        | 
|  sex       |  char ( 1 )       |  YES  |      |  NULL     |        | 
+ 
9  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  employees DROP  COLUMN  note; 
Query OK,  0  rows  affected ( 0.01  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  employees; 
+ 
|  Field     |  Type         |  Null  |  Key  |  Default  |  Extra | 
+ 
|  empNum    |  int          |  YES  |      |  NULL     |        | 
|  lastName  |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
|  firstNmae |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
|  code      |  int          |  YES  |      |  NULL     |        | 
|  mobile    |  varchar ( 25 )  |  YES  |      |  NULL     |        | 
|  jobTitle  |  varchar ( 50 )  |  YES  |      |  NULL     |        | 
|  birthday  |  date         |  YES  |      |  NULL     |        | 
|  sex       |  char ( 1 )      |  YES  |      |  NULL     |        | 
+ 
8  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  employees ADD  COLUMN  favoriate_activity VARCHAR ( 100 ) ; 
Query OK,  0  rows  affected ( 0.01  sec) 
Records: 0   Duplicates: 0   Warnings : 0 
mysql>  DESC  employees; 
+ 
|  Field              |  Type          |  Null  |  Key  |  Default  |  Extra | 
+ 
|  . . .        |  . . .           |  . . .   |      |  . . .      |        | 
|  favoriate_activity |  varchar ( 100 )  |  YES  |      |  NULL     |        | 
+ 
9  rows  in  set  ( 0.00  sec) 
mysql>  ALTER  TABLE  employees RENAME  TO  employees_info; 
Query OK,  0  rows  affected ( 0.02  sec) 
mysql>  SHOW  TABLES ; 
+ 
|  Tables_in_test03_company | 
+ 
|  employees_info           | 
|  offices                  | 
+ 
2  rows  in  set  ( 0.00  sec)