08. 创建和管理表

一、基础知识

1.1、一条数据的存储过程

  存储数据时处理数据的第一步。只有正确地把数据存储起来,我们才能进行有效地处理和分析。在MySQL中,一个完整的数据存储过程总共有4步,分别是 创建数据库确认字段创建数据表插入数据。从系统架构的层次上看,MySQL数据库系统从大到小依次是 数据库服务器数据库数据表 、 数据表的

1.2、标识符的命名规则

  • 数据库名、表名不得超多30个字符,变量名限制为29个
  • 必须只能包含A-Z,a-z,0-9,_ 共63个字符
  • 数据库名、表名、字段名等对象名中间不能包含空格
  • 同一个MySQL软件中,数据库名不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
  • 必须保证字段名没有和关键字和保留字、数据库系统或常用方法冲突
    • 如果坚持使用,请在SQL语句中使用着重号(`)引起来
  • 保持字段名和类型的一致性:
    • 在命名字段并为其指定数据类型的时候一定要保证一致性

1.4、MySQL中的数据类型

类型 类型举例
整数类型 TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT
浮点类型 FLOAT、DOUBLE
定点数类型 DECIMAL
位类型 BIT
日期时间类型 YEAR、TIME、DATE、DATETIME、TIMESTAMP
文本字符串类型 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
枚举类型 ENUM
集合类型 SET
二进制字符串类型 BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB
JSON类型 JSON对象、JSON数组
空间数据类型 单值:GEOMETRY、POINT、LINESTRING、POLYGON;
集合:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION

其中,常用的几类类型介绍如下:

数据类型 描述
INT 从-231到231-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相同。
DATE 日期型数据,格式'YYYY-MM-DD'
BLOB 二进制形式的长文本数据,最大可达4G
TEXT 长文本数据,最大可达4G

二、创建和管理数据库

2.1、创建数据库

-- 方式1:创建数据库
CREATE DATABASE 数据库名; 
-- 方式2:创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
-- 方式3:判断数据库是否已经存在,不存在则创建数据库(`推荐`),如果存在,则不创建
CREATE DATABASE IF NOT EXISTS 数据库名; 

注意:DATABASE 不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删旧库完成的。

example:

CREATE DATABASE IF NOT EXISTS template CHARACTER SET utf8;

2.2、使用数据库

-- 查看当前所有的数据库
SHOW DATABASES;
-- 查看当前正在使用的数据库
SELECT DATABASE(); 
-- 查看指定库下所有的表
SHOW TABLES FROM 数据库名;
-- 查看数据库的创建信息
SHOW CREATE DATABASE 数据库名;
-- 使用/切换数据库
USE 数据库名;
-- 更改数据库字符集
ALTER DATABASE 数据库名 CHARACTER SET 字符集;
-- 方式1:删除指定的数据库
DROP DATABASE [IF EXISTS] 数据库名;

注意:要操作表格和数据之前必须先说明是对哪个数据库进行操作,否则就要对所有对象加上“数据库名.”。

example:

-- 查看当前所有的数据库
SHOW DATABASES;
-- 查看当前正在使用的数据库
SELECT DATABASE(); 
-- 查看指定库下所有的表
SHOW TABLES FROM template;
-- 查看数据库的创建信息
SHOW CREATE DATABASE template;
-- 使用/切换数据库
USE template;
-- 更改数据库字符集
ALTER DATABASE template CHARACTER SET utf8;
-- 删除指定的数据库
DROP DATABASE IF EXISTS template;

三、创建表

3.1、创建表的方式

方式一

CREATE TABLE [IF NOT EXISTS] 表名(
	字段1, 数据类型 [约束条件] [默认值],
	字段2, 数据类型 [约束条件] [默认值],
	字段3, 数据类型 [约束条件] [默认值],
	……
	[表约束条件]
);

加上了IF NOT EXISTS关键字,则表示:如果当前数据库中不存在要创建的数据表,则创建数据表;如果当前数据库中已经存在要创建的数据表,则忽略建表语句,不再创建数据表。

example:

CREATE TABLE IF NOT EXISTS emp(
    id INT,
    emp_name VARCHAR(15),
    hire_date DATE
);

方式二:基于现有的表创建新的表

CREATE TABLE 表名2
AS
SELECT 字段名 FROM 表名1;

example:

CREATE TABLE emp1
AS 
SELECT id,emp_name,hire_date
FROM emp;

3.2、查看数据表结构

-- 查看数据表结构
DESC/DESCRIBE 表名;
SHOW CREATE TABLE 表名;

使用SHOW CREATE TABLE语句不仅可以查看表创建时的详细语句,还可以查看存储引擎和字符编码。

example:

DESC emp;
SHOW CREATE TABLE emp;

四、修改表

修改表指的是修改数据库中已经存在的数据表的结构。

使用 ALTER TABLE 语句可以实现:

  • 向已有的表中添加列
  • 修改现有表中的列
    • 可以修改列的数据类型,长度、默认值、位置、约束等
    • 对默认值的修改只影响今后对表的修改
  • 删除现有表中的列
  • 重命名现有表中的列
-- 追加一个列:默认添加到表中的最后一个字段的位置
ALTER TABLE 表名 ADD [COLUMN] 字段名 字段类型 [FIRST|AFTER 字段名];
-- 修改一个列
ALTER TABLE 表名 MODIFY [COLUMN] 字段名1 字段类型 [DEFAULT 默认值][FIRST|AFTER 字段名2];
-- 重命名一个列
ALTER TABLE 表名 CHANGE [column] 列名 新列名 新数据类型;
-- 删除一个列
ALTER TABLE 表名 DROP [COLUMN]字段名;
-- 重命名表
RENAME TABLE 旧表名 TO 新表名;
ALTER table 旧表名 RENAME [TO] 新表名; 

example

-- 追加一个字段:默认添加到表中的最后一个字段的位置
ALTER TABLE emp ADD salary DOUBLE(10,2);
ALTER TABLE emp ADD phone_number VARCHAR(20) FIRST;
ALTER TABLE emp ADD email VARCHAR(45) AFTER emp_name;

-- 修改一个字段
ALTER TABLE emp MODIFY emp_name VARCHAR(25);
ALTER TABLE emp MODIFY emp_name VARCHAR(35) DEFAULT 'sakura';

-- 重命名一个字段
ALTER TABLE emp CHANGE salary montyly_salary DOUBLE(10,2);
ALTER TABLE emp CHANGE email my_email VARCHAR(50);

-- 删除一个字段
ALTER TABLE emp DROP COLUMN my_email;

-- 重名名表
RENAME TABLE emp TO emp2;
ALTER TABLE emp2 RENAME TO myemp;

六、删除表

  • 在MySQL中,当一张数据表没有与其他任何数据表形成关联关系时,可以将当前数据表直接删除。
  • 数据和结构都被删除
  • 所有正在运行的相关事务被提交
  • 所有相关索引被删除
  • DROP TABLE 语句不能回滚
DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];

IF EXISTS的含义为:如果当前数据库中存在相应的数据表,则删除数据表;如果当前数据库中不存在相应的数据表,则忽略删除语句,不再执行删除数据表的操作。

***sql
-- 删除表
DROP TABLE IF EXISTS emp1;


七、清空表

  • TRUNCATE TABLE语句:
    • 删除表中所有的数据
    • 释放表的存储空间
  • TRUNCATE语句不能回滚,而使用 DELETE 语句删除数据,可以回滚
TRUNCATE TABLE 表名;

example

-- 复制表
CREATE TABLE employee_copy 
AS 
SELECT * FROM atguigudb.employees;

SELECT * FROM employee_copy;

-- 清空表
TRUNCATE TABLE employee_copy;

SELECT * FROM employee_copy;

7.1、DCL 中 COMMIT 和 ROLLBACK

  • COMMIT:提交数据
    • 一旦执行COMMIT,则数据就被永久的保存在数据库中,意味着数据不可以回滚;
  • ROLLBACK:回滚数据
    • 一旦执行ROLLBACK,则可以实现数据的回滚,回滚到最近的一次COMMIT之后;

7.2、对比 TRUNCATE TABLE 和 DELETE FROM

  • 相同点:
    • 都可以实现对表中所有数据的删除,同时保留表的结构。
  • 不同点:
    • TRUNCATE TABLE:
      • 一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的。
    • DELETE FROM:
      • 一旦执行此操作,表数据可以全部清除(不带where)。
      • 同时数据可以实现回滚。

7.3、DDL 和 DML 的说明

  • DDL的操作一旦执行,就不可回滚;
    • 在执行完DDL操作之后,一定会执行一次COMMIT。而此COMMIT操作不受SET autocommit = FALSE影响;
  • DML的操作默认情况下,一旦执行,也是不可回滚的;
    • 如果在执行DML之前,执行了 SET autocommit = FALSE,则执行的DML操作就可以回滚;
-- 复制表
CREATE TABLE employees_copy
AS
SELECT * FROM atguigudb.employees;

-- 先提一次
COMMIT;
SELECT * FROM employees_copy;
-- 关闭自动提交
SET autocommit = FALSE;
-- 删除表的数据
DELETE FROM employees_copy;
SELECT * FROM employees_copy;
-- 回滚数据
ROLLBACK;
SELECT * FROM employees_copy;

-- 先提一次
COMMIT;
-- 关闭自动提交
SET autocommit = FALSE;
-- 删除表的数据
TRUNCATE TABLE employees_copy;
SELECT * FROM employees_copy;
-- 回滚数据
ROLLBACK;
SELECT * FROM employees_copy;

八、练习题

-- 1. 创建数据库test01_office,指明字符集为utf8。并在此数据库下执行下述操作 
CREATE DATABASE IF NOT EXISTS test01_office DEFAULT CHARACTER SET 'utf8';

-- 2. 创建表dept01 
/*
	字段 类型 
	id INT(7) 
	NAME VARCHAR(25) 
*/
CREATE TABLE IF NOT EXISTS dept01(
	id INT(7),
	NAME VARCHAR(25)
);

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

-- 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 to emp01;
RENAME TABLE emp02 TO emp01;

-- 9.在表dept02和emp01中添加新列test_column,并检查所作的操作 
ALTER TABLE dept02 ADD COLUMN test_column VARCHAR(10);
ALTER TABLE emp01 ADD test_column VARCHAR(10);

-- 10.直接删除表emp01中的列 department_id
ALTER TABLE emp01 DROP COLUMN department_id;

-- 11、创建数据库 test02_market 
CREATE DATABASE IF NOT EXISTS test02_market CHARACTER SET 'utf8';

-- 12、创建数据表 customers
/*
	字段名		数据类型
	c_num		int 
	c_name		varchar(50) 
	c_contact	varchar(50) 
	c_city 		varchar(50) 
	c_birth 	date
*/
CREATE TABLE IF NOT EXISTS customers (
	c_num INT,
	c_name VARCHAR(50),
	c_contact VARCHAR(50),
	c_city VARCHAR(50),
	c_birth DATE
);

-- 13、将 c_contact 字段移动到 c_birth 字段后面 
ALTER TABLE customers MODIFY c_contact VARCHAR(50) AFTER c_birth;

-- 14、将 c_name 字段数据类型改为 varchar(70) 
ALTER TABLE customers MODIFY c_name VARCHAR(70);

-- 15、将c_contact字段改名为c_phone 
ALTER TABLE customers CHANGE c_contact c_phone VARCHAR(50);

-- 16、增加c_gender字段到c_name后面,数据类型为char(1) 
ALTER TABLE customers ADD c_gender CHAR(1) AFTER c_name;

-- 17、将表名改为customers_info
RENAME TABLE customers TO customers_info;

-- 18、删除字段c_city
ALTER TABLE customers_info DROP COLUMN c_city;

-- 19、创建数据库test03_company 
CREATE DATABASE IF NOT EXISTS test03_company CHARACTER SET 'utf8';

-- 20、创建表offices
/*
	字段名		数据类型
	officeCode	int 
	city 		varchar(30) 
	address 	varchar(50) 
	country 	varchar(50) 
	postalCode 	varchar(25)
*/
CREATE TABLE IF NOT EXISTS offices (
	officeCode INT,
	city VARCHAR(30),
	address VARCHAR(50),
	country VARCHAR(50),
	postalCode VARCHAR(25)
);

-- 21、创建表employees
/*
	字段名		数据类型
	empNum		int 
	lastName	varchar(50) 
	firstName 	varchar(50) 
	mobile 		varchar(25) 
	code 		int 
	jobTitle 	varchar(50) 
	birth 		date 
	note 		varchar(255) 
	sex 		varchar(5)
*/
CREATE TABLE IF NOT EXISTS employees (
	empNum INT,
	lastName VARCHAR(50),
	first_name VARCHAR(50),
	mobile VARCHAR(25),
	CODE INT,
	jobTitle VARCHAR(50),
	birth DATE,
	note VARCHAR(255),
	sex VARCHAR(5)
);

-- 22、将表employees的mobile字段修改到code字段后面 
ALTER TABLE employees MODIFY mobile VARCHAR(25) AFTER CODE;

-- 23、将表employees的birth字段改名为birthday 
ALTER TABLE employees CHANGE birth birthday DATE;

-- 24、修改sex字段,数据类型为char(1) 
ALTER TABLE employees MODIFY sex CHAR(1);

-- 25、删除字段note 
ALTER TABLE employees DROP COLUMN note;

-- 26、增加字段名favoriate_activity,数据类型为varchar(100) 
ALTER TABLE employees ADD favoriate_activity VARCHAR(100);

-- 27、将表employees的名称修改为 employees_info
RENAME TABLE employees TO employees_info;
上一篇:数据库权限管理


下一篇:3.DDL语言