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);

image-20220707000520359

修改一个列

  • 可以修改列的数据类型,长度、默认值和位置

  • 修改字段数据类型、长度、默认值、位置的语法格式

    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
);

image-20220707082616885

# 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;

image-20220708002700082

# 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;

image-20220708002727712

# 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;
posted @ 2022-07-08 00:34  GoodForNothing  阅读(140)  评论(0编辑  收藏  举报
//看板娘