10. 创建表和管理表
10.1 创建和管理数据库
创建数据库
-
方式一:创建数据库
CREATE DATABASE 数据库名;
-
方式二:创建数据库并指定数据集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
-
方式三:判断数据库是否已经存在,不存在则创建数据库(推荐)
CREATE DATABASE IF NOT EXISTS 数据库名;
如果MySQL中存在相关数据库,忽略创建语句,不再创建数据库
注:DATABASE是不能改名的,一些可视化工具可以改名,是创建新库,然后把所有表复制到新库,再删除旧库完成的。
使用数据库
-
查看当前所有的数据库
SHOW DATABASES;
-
查看当前正在使用的数据库
SELECT DATABASE(); # mysql数据库中的一个全局函数
-
查看指定库下的所有表
SELECT TABLES FROM 数据库名;
-
查看数据库的创建信息
SHOW CREATE DATABASE 数据库名; SHOW CREATE DATABASE 数据库名\G
-
使用/切换数据库
USE 数据库名;
注:要操作表格和数据之前必须要先说明是对哪个数据库进行操作,否则就要对所有对象加上数据库名
修改数据库
-
更改数据库字符集
ALTER DATABASE 数据库名 CHARACTER SET 字符集; # 比如gbk,utf8
删除数据库
-
方式一:删除指定数据库
DROP DATABASE 数据库名;
-
方式二:删除存在的的数据库(推荐)
DROP DATABASE IF EXISTS 数据库名;
10.2 创建表
创建方式一
-
必须有
- CREATE TABLE权限
- 存储空间
-
语法格式
CREATE TABLE [IF NOT EXISTS] 表名( 字段1, 数据类型 [约束条件] [默认值], 字段2, 数据类型 [约束条件] [默认值], 字段3, 数据类型 [约束条件] [默认值], …… [表约束条件] );
加上了IF NOT EXISTS关键字,表示不存在创建,若存在表,忽略创建语句
-
必须指定
- 表名
- 列名(字段名),数据类型,长度
-
可选指定
- 约束条件
- 默认值
-
创建表举例
# 创建表 CREATE TABLE IF NOT EXISTS emp( # int类型 emp_id int, # 最多保存20个中英文字符 emp_name VARCHAR(20), # 总位数不超过15位 salary DOUBLE, # 日期类型 birthday DATE ); # 查看表的信息 DESC emp; CREATE TABLE IF NOT EXISTS dept( # int类型,自增 deptno INT(2) AUTO_INCREMENT, dname VARCHAR(14), loc VARCHAR(13), # 主键 PRIMARY KEY (deptno) ); DESC dept;
创建方式二
- 使用AS将创建表和插入数据结合起来
- 指定的列和子查询中的列要一一对应
- 通过列名和默认值定义列
简单地说就是将查询到的中间表变成实际需要创建的表
# 创建emp1表,将employees中查询到的所有数据放到emp1中
CREATE TABLE emp1 AS SELECT * FROM employees;
# 由于SELECT查询到的是空表,所以emp2也是空表,但是查询结果的字段会被保存下来
CREATE TABLE emp2 AS SELECT * FROM employees WHERE 1=2; -- 创建的emp2是空表
CREATE TABLE dept80
AS SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
FROM employees
WHERE department_id = 80;
DESCRIBE dept80;
查看数据表结构
# DESC或者是DESCRIBE:查询的表的字段信息
DESC 表名;
DESCRIBE 表名;
# 使用SHOW CREATE TABLE 查看数据表结构:查询的是表的创建信息
SHOW CREATE TABLE 表名;
10.3 修改表
修改表指的是修改数据库中已经存在的数据表的机构
使用ALTER TABLE语句可以实现
- 向已有的表中添加列
- 修改现有表中的列
- 删除现有表中的列
- 重命名现有表中的列
追加一个列
语法格式
ALTER TABLE 表名 ADD [COLUMN] 字段名 字段类型;
举例
ALTER TABLE dept80 ADD job_id varchar(15);
修改一个列
-
可以修改列的数据类型,长度、默认值和位置
-
修改字段数据类型、长度、默认值、位置的语法格式
ALTER TABLE 表名 MODIFY [COLUMN] 字段名1 字段类型 [DEFAULT 默认值];
举例
ALTER TABLE dept80
MODIFY last_name VARCHAR(30);
ALTER TABLE dept80
MODIFY salary double(9,2) default 1000;
- 默认值的修改只影响今后对表的修改
- 可以修改列的约束
重命名一个列
语法格式
ALTER TABLE 表名 CHANGE [COLUMN] 列名 新列名 新数据类型;
举例
ALTER TABLE dept80
CHANGE department_name dept_nam varchar(15);
删除列
语法格式
ALTER TABLE 表名 DROP [COLUMN] 字段名
举例
ALTER TABLE dept80
DROP job_id;
10.4 重命名表
-
使用RENAME
RENAME TABLE emp TO myemp;
-
方式二:
ALTER table dept RENAME [TO] detail_dept;
10.5 删除表
-
如果一张数据表没有和其他任何数据表形成关联关系的时候,可以将当前数据表直接删除
-
数据和结构都会被删除
-
正在运行的相关事务被提交
-
所有索引都会被删除
-
语法格式
DROP TABLE [IF EXISTS] 数据表1 [,数据表2.....];
-
举例
DROP TABLE dept80;
-
DROP TABLE语句不能回滚
10.6 清空表
-
TRUNCATE TABLE
- 删除表中所有数据
- 释放表的存储空间
-
举例
TRUNCATE TABLE dept_80; DELETE FROM dept80;
-
DELETE和TRUNCATE的异同点
- 两者都是删除表中数据,保留了表的结构
- TRUNCATE相当于保留了表的结构创建了新的表,DELETE只是删除了表的数据;
- 简单的例子,自增的记录点再TRUNCATE中会被清空,会从1开始;DELETE不会,会从原来的记录点开始。
- TRUNCATE的效率高于DELETE
- DELETE可以 回滚,但是TRUNCATE不能
10.7 扩展
阿里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
- 【 推荐 】库名与应用名称尽量一致。
- 【参考】合适的字符存储长度,不但节约数据库表空间、节约索
- 正例:无符号值可以避免误存负数,且扩大了表示范围。
清空表、删除表等操作需谨慎
表删除
操作将把表的定义和表中的数据一起删除,并且MySQL在执行删除操作时,不会有任何的确认信 息提示,因此执行删除操时应当慎重。在删除表前,最好对表中的数据进行 备份 ,这样当操作失误时可 以对数据进行恢复,以免造成无法挽回的后果。
同样的,在使用ALTER TABLE
进行表的基本修改操作时,在执行操作过程之前,也应该确保对数据进行完整的 备份
,因为数据库的改变是无法撤销
的,如果添加了一个不需要的字段,可以将其删除;相同的,如果删除了一个需要的列,该列下面的所有数据都将会丢失。
MySQL8新特性—DDL的原子化
在MySQL 8.0版本中,InnoDB表的DDL支持事务完整性,即 DDL操作要么成功要么回滚
。DDL操作回滚日志 写入到data dictionary数据字典表mysql.innodb_ddl_log(该表是隐藏的表,通过show tables无法看到) 中,用于回滚操作。通过设置参数,可将DDL操作日志打印输出到MySQL错误日志中。
分别在MySQL 5.7版本和MySQL 8.0版本中创建数据库和数据表,结果如下:
CREATE DATABASE mytest;
USE mytest;
CREATE TABLE book1(
book_id INT ,
book_name VARCHAR(255)
);
SHOW TABLES;
(1)在MySQL 5.7版本中,测试步骤如下: 删除数据表book1和数据表book2,结果如下:
mysql> DROP TABLE book1,book2;
ERROR 1051 (42S02): Unknown table 'mytest.book2'
再次查询数据库中的数据表名称,结果如下:
mysql> SHOW TABLES;
Empty set (0.00 sec)
从结果可以看出,虽然删除操作时报错了,但是仍然删除了数据表book1。
(2)在MySQL 8.0版本中,测试步骤如下: 删除数据表book1和数据表book2,结果如下:
mysql> DROP TABLE book1,book2;
ERROR 1051 (42S02): Unknown table 'mytest.book2'
再次查询数据库中的数据表名称,结果如下:
mysql> show tables;
+------------------+
| Tables_in_mytest |
+------------------+
| book1 |
+------------------+
1 row in set (0.00 sec)
从结果可以看出,数据表book1并没有被删除。
10.8 练习
练习一
#1. 创建数据库test01_office,指明字符集为utf8。并在此数据库下执行下述操作
CREATE DATABASE IF NOT EXISTS test01_office CHARACTER SET utf8;
#2. 创建表dept01
/*
字段 类型
id INT(7)
NAME VARCHAR(25)
*/
CREATE TABLE IF NOT EXISTS dept01(
id INT(7),
`NAME` VARCHAR(25)
);
DESC dept01;
#3. 将表departments中的数据插入新表dept02中
CREATE TABLE IF NOT EXISTS dept02 AS SELECT * FROM atguigudb.departments;
#4. 创建表emp01
/*
字段 类型
id INT(7)
first_name VARCHAR (25)
last_name VARCHAR(25)
dept_id INT(7)
*/
CREATE TABLE IF NOT EXISTS emp01(
id INT(7),
first_name VARCHAR (25),
last_name VARCHAR(25),
dept_id INT(7)
);
#5. 将列last_name的长度增加到50
ALTER TABLE emp01 MODIFY last_name VARCHAR(30);
DESC emp01;
#6. 根据表employees创建emp02
CREATE TABLE IF NOT EXISTS emp02 AS SELECT * FROM atguigudb.employees;
#7. 删除表emp01
DROP TABLE emp01;
#8. 将表emp02重命名为emp01
ALTER TABLE emp02 RENAME emp01;
#9.在表dept02和emp01中添加新列test_column,并检查所作的操作
ALTER TABLE dept02 ADD test_column VARCHAR(10);
DESC dept02;
ALTER TABLE emp01 ADD test_column VARCHAR(10);
DESC emp01;
#10.直接删除表emp01中的列 department_id
ALTER TABLE emp01
DROP department_id;
练习二
# 1、创建数据库 test02_market
CREATE DATABASE IF NOT EXISTS test02_market CHARACTER SET utf8;
# 2、创建数据表 customers
CREATE TABLE IF NOT EXISTS customers(
c_num INT,
c_name varhar(50),
c_contact varchar(50),
c_city varchar(50),
c_birth date
);
# 3、将 c_contact 字段移动到 c_birth 字段后面
ALTER TABLE customers MODIFY c_contact varchar(50) AFTER c_birth;
DESC customers;
# 4、将 c_name 字段数据类型改为 varchar(70)
ALTER TABLE customers MODIFY c_name VARCHAR(70);
# 5、将c_contact字段改名为c_phone
ALTER TABLE customers CHANGE c_contact c_phone VARCHAR(50);
DESC customers;
# 6、增加c_gender字段到c_name后面,数据类型为char(1)
ALTER TABLE customers ADD c_gender CHAR(1) AFTER c_name;
DESC customers;
# 7、将表名改为customers_info
ALTER TABLE customers RENAME customers_info;
DESC customers_info;
# 8、删除字段c_city
ALTER TABLE customers_info DROP c_city;
DESC customers_info;
练习三
# 1、创建数据库test03_company
CREATE DATABASE IF NOT EXISTS test03_company;
USE test03_company;
# 2、创建表offices
CREATE TABLE IF NOT EXISTS offices(
officeCode INT,
city VARCHAR(30),
address VARCHAR(50),
country VARCHAR(50),
postalCode VARCHAR(25)
);
DESC offices;
# 3、创建表employees
CREATE TABLE IF NOT EXISTS employees(
empNum INT,
city VARCHAR(50),
lastName VARCHAR(50),
firstName VARCHAR(50),
mobile VARCHAR(25),
`code` INT,
jobTitle VARCHAR(50),
birth DATE,
note VARCHAR(255),
sex VARCHAR(5)
);
DESC employees;
# 4、将表employees的mobile字段修改到code字段后面
ALTER TABLE employees MODIFY mobile VARCHAR(25) AFTER `code`;
DESC employees;
# 5、将表employees的birth字段改名为birthday
ALTER TABLE employees CHANGE birth birthday DATE;
DESC employees;
# 6、修改sex字段,数据类型为char(1)
ALTER TABLE employees MODIFY sex CHAR(1);
DESC employees;
# 7、删除字段note
ALTER TABLE employees DROP note;
DESC employees;
# 8、增加字段名favoriate_activity,数据类型为varchar(100)
ALTER TABLE employees ADD favoriate_activity varchar(100);
DESC employees;
# 9、将表employees的名称修改为 employees_info
ALTER TABLE employees RENAME employees_info;
DESC employees_info;