管理库
CREATE DATABASE IF NOT EXISTS c_db CHARACTER SET 'gbk';创建 数据库 如果相同的库名不存在的话 库名 设置字符集为 gbk# 查看数据库信息SHOW CREATE DATABASE c_db;# 使用指定数据库USE c_db;# 查看当前库中的所有表SHOW TABLES;# 查看指定库中的所有表SHOW TABLES FROM c_db;# 查看当前使用use 的库SELECT DATABASE();# 修改库字符集ALTER DATABASE c_db CHARACTER SET 'utf8mb4';# 删除库DROP DATABASE IF EXISTS tdt;
管理表
# 先指定数据库USE atguigudb;# 在当前使用的库中创建表 创建表方式【1】CREATE TABLE IF NOT EXISTS c_tb(id INT COMMENT 'id',name VARCHAR(66) COMMENT '姓名',weight DECIMAL(6, 6) COMMENT '体重',create_date DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间') COMMENT '测试表-创建表' CHARACTER SET 'utf8mb4';# 基础格式/*CREATE TABLE IF NOT EXISTS c_tb创建 表 如果不存在相同表名 表名(id INT COMMENT 'id'字段名 类型及长度 字段备注 。。。。 其他限定) COMMENT '测试表-创建表' CHARACTER SET 'utf8mb4';表备注 使用字符集*/# 查看表DESC c_tb;# 基于表 创建表 并复制查询到的数据 可用别名 创建表方式【2】 但不能复制部分约束[外键]CREATE TABLE copy_c_tbSELECT id, name AS c_nameFROM c_tb;###### 修改# 加字段 AFTER 字段 将字段加到指定字段后面ALTER TABLE c_tbADD create_user BIGINT(14) COMMENT '创建人' AFTER weight;# 加字段 加最前面 默认不写加最后面ALTER TABLE c_tbADD c BIGINT FIRST;# 改字段ALTER TABLE c_tbMODIFY id BIGINT(14) COMMENT 'id' FIRST;# 删字段ALTER TABLE c_tbDROP COLUMN create_user;# 重命名字段 并可以修改其他内容ALTER TABLE c_tbCHANGE create_by create_by BIGINT(14) COMMENT '创建人';# 重命名表RENAME TABLE c_db2 TO c_tb;# 重命名表2ALTER TABLE c_tb RENAME c_db2;# 删表DROP TABLE IF EXISTS c_tb;# 清空表数据TRUNCATE TABLE atguigudb.c_tb;
提交 和 回滚
提交 COMMIT 提交后数据写入到库中 不可回滚
回滚 ROLLBACK 回滚到上一个提交节点COMMIT 不一定成功
TRUNCATE TABLE 和 delete from 都可以删除数据
TRUNCATE TABLE 不能回滚
delete from 可以回滚
DCL DML
DCL 一旦执行 不可回滚 set AUTOCOMMIT = FALSE; 无用 必定自动提交
DML 默认不可回滚 但如果再执行前 开启了 set AUTOCOMMIT = FALSE; 之后 若 不执行COMMIT 则可回滚
示例:
# 关闭自动提交SET AUTOCOMMIT = FALSE;INSERT INTO atguigudb.c_tb(id, name, weight, create_by)VALUES (1, 'xxx', 2.2, 1);# 添加后查询SELECT *FROM atguigudb.c_tb;# 回滚ROLLBACK;# 回滚后查询SELECT *FROM atguigudb.c_tb;
了解: MySQL 8 之后出现了 ddl的原子操作
例如
在 8之前 使用
DROP TABLE a,b,c; 删除多张表时 a删除成功 b删除成功 c失败 那么 即使c删除失败 a,b也被删除了
但在 8后 删除多张表的操作具有原子性 成功则全部成功 失败则全部回滚
数据管理
DML 可开关自动提交设置
# 增加【1】INSERT INTO atguigudb.c_tbVALUES (1, 'andm', 3.6, 1, '2020-10-10');# 增加【2】INSERT INTO atguigudb.c_tb (id, weight, create_by, create_date, name)VALUES (4, 4.63, 14, '2021-10-14', '4anxdm'),(3, 6.63, 16, '2021-10-11', 'anxdmxx');# 不建议使用的增加【2.2】INSERT INTO atguigudb.c_tb (id, weight, create_by, create_date, name)SELECT 4, 4.63, 14, '2021-10-14', '4anxdm'UNION ALLSELECT 3, 6.63, 16, '2021-10-11', 'anxdmxx';# 增加【3】 需保持数据长度是 查询表的字段长度 < 目标表的字段长度 否则有可能添加失败INSERT INTO c_tb (id, name, weight, create_by)SELECT department_id, last_name, salary, manager_idFROM employeesWHERE department_id > 90;# 查看SELECT *FROM atguigudb.c_tb;# 修改UPDATE atguigudb.c_tbSET atguigudb.c_tb.weight = 36.5,atguigudb.c_tb.name = CONCAT(atguigudb.c_tb.name, ' _copy')WHERE id > 90;# 同时修改相关表数据UPDATE user_infoleft join dept_info ON user_info.dept_id = dept_info.dept_idSET user_info.dept_id = 16,dept_info.dept_id=16WHEREdept_info.dept_id = 1;# 删除DELETEFROM atguigudb.c_tbWHERE id = 110AND atguigudb.c_tb.name LIKE '%Gie%';# 同时删除 两个相关表中的数据DELETE j, tFROM t_jsl AS jINNER JOIN atguigudb.c_tb t ON t.id = j.aWHERE t.id = 1;
特殊 了解
MySQL8 新特性 计算列 例如 c列字段 由 a列和b列经过计算得来的
CREATE TABLE t_jsl(a INT,b INT,c INT GENERATED ALWAYS AS (a * b) VIRTUAL# 创建字段c 类型INT 是计算列 并且是由 a列和b列做乘法得到的);# 添加a b 值时将自动计算 c 值INSERT INTO t_jsl(a, b)VALUES (1, 2),(2, 3),(3, 4),(4, 5),(5, 6),(6, 7),(7, 8),(8, 9);# 查询SELECT *FROM t_jsl;
