1. MySQL中的数据类型
1.1 常用的数据类型
2. 创建表
创建表必须具备CREATE TABLE权限和存储空间
2.1 方式一:创建空的新表
2.1.1 新表的创建
语法:
CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
字段3, 数据类型 [约束条件] [默认值],
……
[表约束条件]
);
加上了IF NOT EXISTS关键字,则表示:如果当前数据库中不存在要创建的数据表,则创建数据表;如果当前数据库中已经存在要创建的数据表,则忽略建表语句,不再创建数据表。
- 必须指定:
- 表名
- 列名(或字段名),数据类型,长度
- 可选指定:
- 约束条件
- 默认值
# 使用 mytest3 数据库
USE mytest3;
SELECT DATABASE();
CREATE TABLE IF NOT EXISTS myemp1 (
# id int类型
id INT,
# 员工姓名 字符类型,最长15个字符
# 使用VARCHAR必须指明长度
emp_name VARCHAR(15),
# 雇佣时间 日期类型
hire_date DATE
);
2.1.2 查看表结构
DESC myemp1;
2.1.3 查询创建表的语句
SHOW CREATE TABLE myemp1;
如果创建表的时候没有指明使用的字符集,则默认使用表所在的数据库的字符集。
2.2 方式二:基于现有的表创建表
基于现有的表创建新的表,新的表的字段名和数据类型都和基于的现有表一致。
语法:
CREATE TABLE 将要新建的表名
AS
查询现有表的SELECT语句
查询语句查询出来的数据,会放入新建的表中
USE atguigudb;
CREATE TABLE myemp2
AS
SELECT employee_id,
last_name,
salary
FROM employees;
SELECT * FROM myemp2;
DESC myemp2;
DESC employees;
如果查询语句中有指定字段的别名,那么新的表的字段名就使用指定的别名,否则使用原表的字段名。
CREATE TABLE myemp3
AS
SELECT employee_id emp_id,
last_name emp_name,
salary
FROM employees;
SELECT * FROM myemp3;
2.3 练习
2.3.1 练习1
创建一个表employees_copy,实现对employees表的复制,包括表数据
# 创建一个表employees_copy,实现对employees表的复制,包括表数据
CREATE TABLE employees_copy
AS
SELECT * FROM employees;
SELECT * FROM employees_copy;
2.3.2 练习2
创建一个表employees_blank,实现对employees表的复制,不包括表数据
# 创建一个表employees_blank,实现对employees表的复制,不包括表数据
CREATE TABLE employees_blank
AS
# 实现对employees表的复制,不包括表数据
# 只需要查询出来的数据为空即可
SELECT *
FROM employees
# 由于该条件一定为false,所以查询出来的数据一定为空
WHERE 1 = 0;
SELECT * FROM employees_blank;
3. 修改表
修改表,使用ALTER TABLE
语句。
3.1 添加字段
语法:
ALTER TABLE 表名 ADD [COLUMN] 字段名 字段类型 [FIRST|AFTER 字段名];
3.1.1 添加一个字段
给myemp1添加一个字段。
USE mytest3;
DESC myemp1;
ALTER TABLE myemp1
# 添加一个字段,字段名为salary,数据类型为double,
# 且位数为10位,其中小数位数占2位,整数部分10位
# 新字段默认添加到表的最后
ADD COLUMN salary DOUBLE(10, 2);
DESC myemp1;
3.1.2 添加字段到指定位置
ALTER TABLE myemp1
# 将新的字段添加到emp_name字段后
ADD phone_num VARCHAR(20) AFTER emp_name;
DESC myemp1;
3.2 修改字段
对表的字段进行修改,可以修改字段的数据类型、长度、默认值、位置等。
一般修改字段不会修改字段的数据类型,修改字段的数据类型很可能影响原本的数据。
语法:
ALTER TABLE 表名
MODIFY [COLUMN] 字段名1 字段类型 [DEFAULT 默认值] [FIRST|AFTER 字段名 2];
3.2.1 修改字段的长度
ALTER TABLE myemp1
# 将emp_name字段的长度修改为25
MODIFY emp_name VARCHAR(25);
DESC myemp1;
3.2.2 修改字段的同时设置默认值
ALTER TABLE myemp1
# 将emp_name字段的长度修改为35
# 同时指定默认名字为张三
MODIFY emp_name VARCHAR(35) DEFAULT '张三';
DESC myemp1;
3.2.3 修改字段的位置
ALTER TABLE myemp1
# 将emp_name字段的长度修改为25
# 同时字段位于phone_num之后
# 不能单独设置字段的位置,即不能只写AFTER phone_num
MODIFY emp_name VARCHAR(25) AFTER phone_num;
DESC myemp1;
3.3 重命名字段
语法:
ALTER TABLE 表名 CHANGE [column] 列名 新列名 新数据类型;
ALTER TABLE myemp1
CHANGE salary monthly_salary double(10,2);
DESC myemp1;
3.4 删除字段
语法:
ALTER TABLE 表名 DROP [COLUMN] 字段名
ALTER TABLE myemp1
DROP phone_num;
DESC myemp1;
4. 重命名表
4.1 方式一:RENAME
语法:
RENAME TABLE 旧表名 TO 新表名;
RENAME TABLE myemp1 TO emp1;
SHOW TABLES;
4.2 方式二:ALTER
语法:
ALTER table 要修改的表 RENAME [TO] 新表名;
ALTER TABLE emp1
RENAME myemp1;
SHOW TABLES;
5. 删除表
语法:
DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];
USE atguigudb;
DROP TABLE IF EXISTS employees_blank;
SHOW TABLES;
数据表删除之后,不能撤销删除操作。
不光将表结构删除掉,同时表中的数据也删除掉,释放表空间。即数据和结构都被删除。
6. 清空表
清空表,表示清空表中的所有数据,但是表结构保留。
语法:
TRUNCATE TABLE 表名;
TRUNCATE TABLE employees_copy;
SELECT * FROM employees_copy;
6.1 TRUNCATE TABLE与DELETE FROM的对比
- 相同点:
- 都可以实现对表中所有数据的删除,同时保留表结构。
- 不同点:
- TRUNCATE TABLE:一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的。
- DELETE FROM:一旦执行此操作,表数据可以全部清除(不带WHERE)。同时,数据是可以实现回滚的(COMMIT之前)。
7. DCL中的COMMIT与ROLLBACK
- COMMIT:
- 提交数据。
- 一旦执行COMMIT,则数据就被永久的保存在了数据库中,意味着数据不可以回滚。
- ROLLBACK:
- 回滚数据。
- 一旦执行ROLLBACK,则可以实现数据的回滚。回滚到最近的一次COMMIT之后。
阿里开发规范:
【参考】TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务且不触发 TRIGGER,有可能造成事故,故不建议在开发代码中使用此语句。
说明:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。
8. DDL 与 DML 说明
- DDL
- DDL的操作一旦执行,就不可回滚。
- 指令
SET autocommit = FALSE
对DDL操作失效。(因为在执行完DDL操作之后,一定会执行一次COMMIT。而此COMMIT操作不受SET autocommit = FALSE
影响的。)
- DML
- DML的操作默认情况,一旦执行,也是不可回滚的。DML执行完成默认会执行一次COMMIT。
- 如果在执行DML之前,执行了
SET autocommit = FALSE
,则执行的DML操作就可以实现回滚。
8.1 演示
8.1.1 DML
# 为了避免之前的操作造成影响,先提交一次
COMMIT;
# 查询myemp3中的数据
SELECT * FROM myemp3;
# 取消DML操作的自动提交
SET AUTOCOMMIT = FALSE;
# 使用DELETE FROM清空myemp3中的数据
DELETE FROM myemp3;
# 再次查询myemp3
SELECT * FROM myemp3;
# 进行数据的回滚
ROLLBACK;
# 再次查询myemp3
# 由于没有提交清空操作所以可以进行数据的回滚
SELECT * FROM myemp3;
在执行DML之前,执行了
SET autocommit = FALSE
,则执行的DML操作就可以实现回滚。
8.1.2 DDL
# 为了避免之前的操作造成影响,先提交一次
COMMIT;
# 查询myemp3中的数据
SELECT * FROM myemp3;
# 取消DML操作的自动提交
SET AUTOCOMMIT = FALSE;
# 使用TRUNCATE TABLE清空myemp3中的数据
TRUNCATE TABLE myemp3;
# 再次查询myemp3
SELECT * FROM myemp3;
# 进行数据的回滚
ROLLBACK;
# 再次查询myemp3
# 由于执行的为DDL操作,所以不能进行数据的回滚
SELECT * FROM myemp3;
DDL的操作一旦执行,就不可回滚。且指令
SET autocommit = FALSE
对DDL操作无效。
9. 阿里MySQL命名规范
- 【 强制 】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
- 正例:aliyun_admin,rdc_config,level3_name
- 反例:AliyunAdmin,rdcConfig,level_3_name
- 【 强制 】禁用保留字,如 desc、range、match、delayed 等,请参考 MySQL 官方保留字。
- 【 强制 】表必备三字段:id, gmt_create, gmt_modified。
- 说明:其中 id 必为主键,类型为BIGINT UNSIGNED、单表时自增、步长为 1。gmt_create, gmt_modified 的类型均为 DATETIME 类型,前者现在时表示主动式创建(最开始[第一次]添加数据的时间),后者过去分词表示被动式更新(后期对数据进行修改的时间)
- 【 推荐 】表的命名最好是遵循 “业务名称_表的作用”。
- 正例:alipay_task 、 force_project、 trade_config
- 【 推荐 】库名与应用名称尽量一致。
- 【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
- 正例:无符号值可以避免误存负数,且扩大了表示范围。
10. MySQL8新特性—DDL的原子化
在MySQL 8.0版本中,InnoDB表的DDL支持事务完整性,即 DDL操作要么成功要么回滚 。
CREATE DATABASE mytest;
USE mytest;
CREATE TABLE book1(
book_id INT ,
book_name VARCHAR(255)
);
SHOW TABLES;
由于删除两种表为同一个事务,在MySQL 8.0版本中,InnoDB表的DDL支持事务完整性,所以删除第二个表失败时会进行事务的回滚,撤销对表1的删除。因为在删除表2失败时并没有整个事务执行成功,所以会回滚。