精选专栏链接 🔗
欢迎订阅,点赞+关注,每日精进1%,与百万开发者共攀技术珠峰
更多内容持续更新中!希望能给大家带来帮助~ 😀😀😀
MySQL数据库与表的创建、修改及数据操作指南
1,数据库的创建和管理
1.1,创建数据库
创建数据库的三种常用方式如下,推荐使用方式三:
方式一:创建数据库
CREATE DATABASE 数据库名;
方式二:创建数据库并指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
方式三:判断数据库是否已经存在,不存在则创建数据库(
推荐
)
# 如果MySQL中已经存在相关的数据库,则忽略创建语句,不再创建数据库。
CREATE DATABASE IF NOT EXISTS 数据库名;
注意:
- DATABASE 不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删旧库完成的;
- 如果创建表时没有指明使用的字符集,则默认使用表所在的数据库的字符集;
1.2,使用数据库
① 查看当前所有的数据库:
SHOW DATABASES;
② 查看当前正在使用的数据库
SELECT DATABASE(); #使用的一个 mysql 中的全局函数
③ 查看指定库下所有的表
SHOW TABLES FROM 数据库名;
④ 查看数据库的创建信息
SHOW CREATE DATABASE 数据库名;
或者:
SHOW CREATE DATABASE 数据库名\G
⑤ 使用/切换数据库
USE 数据库名;
注意:要操作表格和数据之前必须先说明是对哪个数据库进行操作。
1.3,修改数据库
更改数据库字符集
ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:'gbk'、'utf8'等
1.4,删除指定数据库
- 方式一:
DROP DATABASE 数据库名;
- 方式二:(
推荐
)
DROP DATABASE IF EXISTS 数据库名;
2,表的创建和管理
2.1,表的创建
创建表方式一:从零创建
语法格式:
CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
字段3, 数据类型 [约束条件] [默认值],
……
[表约束条件]
);
SQL示例:
CREATE TABLE IF NOT EXISTS myemp1( #需要用户具备创建表的权限。
id INT,
emp_name VARCHAR(15), #使用VARCHAR来定义字符串,必须在使用VARCHAR时指明其长度。
hire_date DATE
);
创建完成后可以使用如下SQL查看表结构:
DESC myemp1;
运行结果如下:
表的创建方式二:基于子查询创建新表
语法格式:
CREATE TABLE 表名 AS 子查询
SQL示例:
CREATE TABLE emp1 AS SELECT * FROM employees;
CREATE TABLE myemp3
AS
# 说明:查询语句中字段的别名,可以作为新创建的表的字段的名称
SELECT e.employee_id emp_id,e.last_name lname,d.department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id;
注意:
- 查询语句中字段的别名,可以作为新创建的表的字段的名称
- 此时的查询语句可以结构比较丰富,使用前面章节讲过的各种SELECT,具体可以看文章开头的
MySQL技术笔记专栏
练习:
需求1:创建一个表employees_copy,实现对employees表的复制,包括表数据
CREATE TABLE employees_copy
AS
SELECT *
FROM employees;
需求2:创建一个表employees_blank,实现对employees表的复制,不包括表数据
CREATE TABLE employees_blank
AS
SELECT *
FROM employees
WHERE 1 = 2;
2.2,查看数据表结构
在MySQL中创建好数据表之后,可以查看数据表的结构。MySQL支持使用 DESCRIBE 或 DESC
语句查看数据表结构,也支持使用SHOW CREATE TABLE
语句查看数据表结构。
语法格式如下:
SHOW CREATE TABLE 表名\G
使用SHOW CREATE TABLE语句不仅可以查看表创建时的详细语句,还可以查看存储引擎和字符编码。
2.3,修改表
2.3.1,添加字段
先查看myemp1的结构:
DESC myemp1;
给myemp1表添加字段salary:
ALTER TABLE myemp1
# (10,2)表示一共有10位(包括小数点),2表示小数点后保留2位
ADD salary DOUBLE(10,2);
添加后继续通过DESC myemp1;
查看表结构:
注意:添加字段时,默认添加到表中的最后一个字段的位置。如果不想添加到最后一个字段位置可以显式指定。 比如:
需求:添加phone_number字段到表中的第一个字段位置:
ALTER TABLE myemp1
ADD phone_number VARCHAR(20) FIRST;
需求:添加email字段到表中的emp_name字段后面
ALTER TABLE myemp1
ADD email VARCHAR(45) AFTER emp_name;
2.3.2,修改字段
修改字段使用ALTER关键字
需求:修改emp_name字段的
最大长度
位25(原本是15)
ALTER TABLE myemp1
MODIFY emp_name VARCHAR(25) ;
需求:修改emp_name字段的
最大长度
位35,并修改默认值为 ’aaa‘
ALTER TABLE myemp1
MODIFY emp_name VARCHAR(35) DEFAULT 'aaa';
通过DESC myemp1;
查看表结构:
- 设置默认值可以实现:当我们向表中插入数据的时候,没有指定该字段时,会自动使用此默认值。
2.3.3,重命名字段
重命名字段使用CHANGE关键字。
需求:将salary 字段改为monthly_salary
ALTER TABLE myemp1
CHANGE salary monthly_salary DOUBLE(10,2);
运行后,通过DESC myemp1;
查看表结构:
重命名字段的同时还可以修改字段长度,比如:
ALTER TABLE myemp1
CHANGE email my_email VARCHAR(50);
2.3.4,删除字段
删除字段使用DROP关键字。
需求:删除my_email字段(或my_email列)
ALTER TABLE myemp1
DROP COLUMN my_email;
2.4,重命名表
重命名表有两种方式,分别是:RENAME方式和ALTER方式
方式一:RENAME方式
RENAME TABLE myemp1
TO myemp11;
方式二:ALTER方式
ALTER TABLE myemp2
RENAME TO myemp12;
2.5,删除表
删除表操作使用DROP关键字,不光将表结构删除掉,同时表中的数据也删除掉,释放表空间。
需求:删除表myemp12
DROP TABLE IF EXISTS myemp12;
2.6,清空表
清空表使用TRUNCATE关键字,表示清空表中的所有数据,但是表结构保留。
需求:清空employees_copy
employees_copy 表中原本有如下数据:
清空表:
TRUNCATE TABLE employees_copy;
再次查询表中记录:
3,数据操作
3.1,添加数据
可以使用 INSERT 语句向表中插入数据。有如下两种插入方式:
- 使用VALUES方式插入数据;
- 将查询结果插入到表中,可快速地
从一个或多个表中向一个表中插入多行
;
接下来一一介绍:
3.1.1,VALUES的方式添加
情况1: 没有指明添加的字段。
此时值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段声明时的顺序相同,否则可能报错。语法格式如下:
INSERT INTO 表名
VALUES (value1,value2,....);
emp1表结构如下:
插入数据SQL实例如下:
INSERT INTO emp1
VALUES (1,'Tom','2000-12-21',3400); #注意:一定要按照声明的字段的先后顺序添加
插入后执行查询:
SELECT *
FROM emp1;
查询结果如下:
情况2: 指明要添加的字段 (推荐)
INSERT INTO emp1(id,hire_date,salary,`name`) # 插入时需要和此处的字段顺序匹配
VALUES(2,'1999-09-09',4000,'Jerry');
插入后,查询结果如下:
情况3: 同时插入多条记录
INSERT INTO emp1(id,NAME,salary)
VALUES
(4,'Jim',5000), # 多条记录之间使用逗号隔开
(5,'张俊杰',5500);
插入后,查询结果如下:
3.1.2,将查询结果插入到表中
将查询结果插入到表中会结合SELECT查询语句。
SQL示例:
INSERT INTO emp1(id,NAME,salary,hire_date)
#查询语句
SELECT employee_id,last_name,salary,hire_date
FROM employees
WHERE department_id IN (70,60);
注意:
- 查询的字段一定要与添加到的表的字段一 一对应;
- 上述SQL中,
emp1表中要添加的数据的字段的最大长度不能低于employees表中查询的字段的长度
。否则会有添加不成功的风险。
如果emp1中的最大字段长度小,employees中的最大字段长度更大,可能出问题;比如:employees表中last_name字段长度为 varchar(25),emp1表中name字段长度为 varchar(15),执行上述SQL,如果employees表中某条记录的last_name长为20,则会报错。
3.3,修改数据
使用 UPDATE …SET…语句修改数据。语法如下:
UPDATE table_name
SET column1=value1, column2=value2, … , column=valuen
[WHERE condition]
需求:修改id为5的员工的hire_date为当前时间
SQL语句如下:
UPDATE emp1
SET hire_date = CURDATE()
WHERE id = 5;
需求:修改4号员工的薪资为6000,hire_date为当前时间
UPDATE emp1
SET hire_date = CURDATE(),salary = 6000
WHERE id = 4;
需求:将表中姓名中包含字符a的提薪20%
UPDATE emp1
SET salary = salary * 1.2
WHERE NAME LIKE '%a%';
注意:
- UPDATE语句可以一次更新多条数据。如果省略 WHERE 子句,则表中的所有数据都将被更新;
3.2,删除数据
使用 DELETE FROM 删除数据 。语法如下:
DELETE FROM table_name [WHERE <condition>];
需求:删除表中id为1的员工信息
SQL语句如下:
DELETE FROM emp1
WHERE id = 1;
3.3,对比TRUNCATE TABLE 和 DELETE FROM
对比二者之前,需要了解数据库中的 COMMIT命令 和 ROLLBACK命令 :
COMMIT提交数据:
一旦执行COMMIT,则数据就被永久的保存在了数据库中,意味着数据不可以回滚;ROLLBACK回滚数据:
一旦执行ROLLBACK,则可以实现数据的回滚。回滚到最近的一次COMMIT之后;
TRUNCATE TABLE 和 DELETE FROM 的相同点:
- 都可以实现对表中所有数据的删除,同时保留表结构。
TRUNCATE TABLE 和 DELETE FROM 的不同点:
- TRUNCATE TABLE: 一旦执行此操作,表数据全部清除。同时,
数据是不可以回滚的;
- DELETE FROM: 一旦执行此操作,表数据可以全部清除(不带WHERE的DELETE FROM语句)。同时,
数据是可以实现回滚的;
原因是:
- TRUNCATE TABLE属于DDL数据定义语言,DELETE FROM属于DML数据操作语言;
- DDL数据定义语言一旦执行就不可回滚(因此执行DDL操作要慎重);
- DML数据操作语言,默认情况下,一旦执行,也是不可回滚的,但是如果在执行DML之前,执行了
SET autocommit = FALSE
,则执行的DML操作就可以实现回滚; SET autocommit = FALSE
指令对DDL操作无效。因为在执行完DDL操作之后,一定会执行一次COMMIT。而此COMMIT操作不受SET autocommit = FALSE
指令影响。
SQL演示:DELETE FROM
① 先提交一次
COMMIT;
② 查看表中数据
SELECT *
FROM emp1;
运行结果如下:
③ 禁用自动提交
SET autocommit = FALSE;
④ 执行 TRUNCATE TABLE
TRUNCATE TABLE emp1;
查看表中数据发现删除成功:
⑤ 回滚
ROLLBACK;
回滚后查看表中数据发现数据回滚成功,回滚到最近一次COMMIT之后:
SQL演示:TRUNCATE TABLE
① 先提交一次
COMMIT;
② 查看表中数据
SELECT *
FROM emp1;
运行结果如下:
③ 禁用自动提交
SET autocommit = FALSE;
④ 执行DELETE FROM
DELETE FROM emp1;
查看表中数据发现删除成功:
⑤ 回滚
ROLLBACK;
回滚后查看表中数据发现数据回滚后数据未恢复:
3.4,MySQL8新特性:计算列
计算列简单来说就是某一列的值是通过别的列计算得来的。
例如,a列值为1、b列值为2,c列不需要手动插入,定义a+b的结果为c的值,那么c就是计算列,是通过别的列计算得来的。
在MySQL 8.0中,CREATE TABLE 和 ALTER TABLE 中都支持增加计算列。下面以CREATE TABLE为例进行讲解。
需求:定义数据表tb1,然后定义字段id、字段a、字段b和字段c,其中字段c为计算列,用于计算 a+b 的值。
首先创建测试表tb1:
CREATE TABLE tb1(
id INT,
a INT,
b INT,
c INT GENERATED ALWAYS AS (a + b) VIRTUAL # 字段c即为计算列
);
插入一条记录:
# 只指明了字段a和字段b
INSERT INTO tb1(a,b) VALUES (100,200);
查看数据:
SELECT * FROM tb1;
运行结果如下,c字段自动计算出结果:
更新字段值:
UPDATE tb1 SET a = 500;
查看数据:
SELECT * FROM tb1;
运行结果如下,c字段自动更新结果: