一、基础知识
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)。
- 同时数据可以实现回滚。
- TRUNCATE TABLE:
7.3、DDL 和 DML 的说明
- DDL的操作一旦执行,就不可回滚;
- 在执行完DDL操作之后,一定会执行一次COMMIT。而此COMMIT操作不受
SET autocommit = FALSE
影响;
- 在执行完DDL操作之后,一定会执行一次COMMIT。而此COMMIT操作不受
- DML的操作默认情况下,一旦执行,也是不可回滚的;
- 如果在执行DML之前,执行了
SET autocommit = FALSE
,则执行的DML操作就可以回滚;
- 如果在执行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;