前言
本文章的语言描述会比上篇多一些
数据库的创建修改与删除
标识符命名规则
- 数据库名、表名不得超过30个字符,变量限制为29个
- 必须只能包含A-Z,a-z,0-9,_等63个字符
- 数据库名、表名、字段名等对象名中间不要包含空格
- 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
- 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用`(着重号)引起来(不建议这么做)
- 保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据类型在一个表里是整数,那在另一个表中可别变成其他类型了
创建数据库
创建数据库的方式有三种:
#创建和管理表
SELECT * FROM ORDER;
SELECT * FROM `ORDER`;#使用着重号来区别保留字或关键字
#如何创建数据库
#创建数据库也是要有用户权限的
#root是根目录,我们学习都是用的root
数据库是不能改名的,有些图形工具可以改名的原因是,底层创建了一个新数据库,然后把要修改的数据库数据全部复制到新数据库里,然后删除旧数据库,所以一般不要修改数据库名,数据表是可以修改的
字符集默认使用utf8mb4
#显示创建的数据库的字符集和其他信息
#SHOW CREATE DATABASE databaseName;
#CREATE DATABASE `mytest1`
#/*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */
#方式1:
CREATE DATABASE mytest1;
SHOW CREATE DATABASE mytest1;#默认utf8mb4
#方式2:指定字符集
CREATE DATABASE mytest2 CHARACTER SET 'gbk';
SHOW CREATE DATABASE mytest2;#gbk
#方式3(推荐使用):判断是否存在
#执行完毕后,字符集仍然是gbk,可以发现并不会覆盖和影响,只是不报错了
CREATE DATABASE IF NOT EXISTS mytest2 CHARACTER SET 'utf8';
#如果不存在,则正常创建
CREATE DATABASE IF NOT EXISTS mytest3 CHARACTER SET 'utf8';
SHOW CREATE DATABASE mytest3;#UTF8
#显示当前所有的数据库
SHOW DATABASES;#可以看到三个mytest数据库在列表中
#在非图形用户界面或者没有进入特定数据库时,是需要通过点击或use来进入数据库的
#切换\进入\使用数据库
USE atguigudb;#进入后,才可以进行表的操作,否则是提示命令表不存在
#查看当前数据库都存有哪些表
#没有表的话,图形中会是空的,命令行会提示:Empty set (0.00 sec),如果表没有数据也会是这样
USE mytest1;#进入数据库
SHOW TABLES;#显示该数据库的全部数据表
USE atguigudb;
SHOW TABLES;
#查看当前使用的数据库
SELECT DATABASE()FROM DUAL;#函数
#查看指定数据库下保存的表
SHOW TABLES FROM mysql;
修改数据库
#修改数据库
#更改数据库字符集
SHOW CREATE DATABASE mytest2;#查看创建结构
#将gbk修改成utf8
ALTER DATABASE mytest2 CHARACTER SET 'utf8';
SHOW CREATE DATABASE mytest2;#修改成功
#删除数据库
#方式1:
DROP DATABASE mytest1;#不能执行2次
SHOW DATABASES;
#方法2:
DROP DATABASE IF EXISTS mytest1;#如果不存在则不做任何处理
DROP DATABASE IF EXISTS mytest2;
SHOW DATABASES;
常见的数据类型_创建表的两种方式
数据类型
#如何创建数据表
USE atguigudb;
SHOW CREATE DATABASE atguigudb;#默认使用的是utf8
SHOW TABLES;
#方式1:
CREATE TABLE IF NOT EXISTS myemp1(#需要用户具备创建表的权限
id INT,
emp_name VARCHAR(15),#使用VARCHAR来定义字符串,必须在使用VARCAHR时指明其长度
hire_date DATE
);
DESC myemp1;#查看表结构
#如果创建表时没有指明使用的字符集,则默认使用表所在的数据库的字符集
SHOW CREATE TABLE myemp1;#显示数据库创建时的语句
SELECT*FROM myemp1;#查看表数据
#方式2:
CREATE TABLE myemp2
AS
SELECT employee_id ,last_name,salary
FROM employees;
DESC myemp2;SELECT*FROM myemp2;#有字段的
DESC employees;
#说明1:查询语句中字段的别名,可以作为新创建的表的字段的名称
#说明2:此时的查询语句可以结构比较丰富,使用前面讲过的各种SELECT
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*FROM myemp3
DESC myemp3;
#练习1:创建一个表employees_copy,实现对employees表的复制,包括表数
CREATE TABLE employees_copy
AS
SELECT * FROM employees;
SELECT*FROM employees_copy;
#练习2:创建一个表employees_blank,实现对employees表的复制,不包括表数
CREATE TABLE employees_blank
AS
SELECT *
FROM employees
WHERE department_id > 10000;
SELECT * FROM employees_blank;
DESC employees_blank;
修改表_重命名表_删除表_清空表
#修改表_重命名表_删除表_清空表
DESC myemp1;
#修改表 --> ALTER TABLE
#添加一个字段
ALTER TABLE myemp1
ADD salary DOUBLE(10,2);#默认添加到表中的最后一个字段
DESC myemp1;
ALTER TABLE myemp1
ADD phone_number VARCHAR(20) FIRST;#FIRST:第一个
DESC myemp1;
ALTER TABLE myemp1
ADD email VARCHAR(45) AFTER emp_name;#AFTER:指定添加在某字段的后面
DESC myemp1;
#修改一个字段:数据类型、长度、默认值(略)
ALTER TABLE myemp1
MODIFY emp_name VARCHAR(25);#将emp_name的类型从VARCHAR(15)改为VARCHAR(25)
DESC myemp1;
ALTER TABLE myemp1
MODIFY emp_name VARCHAR(35) DEFAULT 'aaa'; #指定了默认值,如果插入数据为NULL,则默认为'aaa'
DESC myemp1;
#重命名一个字段
ALTER TABLE myemp1
CHANGE salary monthly_salary DOUBLE(10,2);
DESC myemp1;
ALTER TABLE myemp1
CHANGE email my_email VARCHAR(50);#类型也是可以修改的
DESC myemp1;
#删除一个字段
ALTER TABLE myemp1
DROP COLUMN my_email;
DESC myemp1;
#重命名表
#方式1:
RENAME TABLE myemp1
TO myemp11;
DESC myemp11;
#方式2:
ALTER TABLE myemp2
RENAME TO myemp12;
DESC myemp12;
#删除表:不光将结构删除,同时表中的数据也被删除,释放表空间
DROP TABLE IF EXISTS myemp2;
DROP TABLE IF EXISTS myemp12;
#清空表:只删除表数据,表结构不变 --> 包括自增列也会重置,而delete from 和 回滚事务 是无法重置自增列自增长值的
SELECT * FROM employees_copy;
TRUNCATE TABLE employees_copy;
SELECT * FROM employees_copy;
DCL中的COMMIT和ROLLBACK的使用
COMMIT表示提交,在数据库中是默认提交的,如果不是默认提交,则每次执行完数据库操作,如果不提交,则所有数据都会回滚,就像你写Word文档,但是没有保存,一旦没有保存,这些数据都会消失。
#DCL中COMMIT和ROLLBACK
#COMMIT:提交数据。一旦执行COMMIT,则数据就被永久的保存在数据库中,意味着数据不可以回滚
#ROLLBACK:回滚数据。一旦执行ROLLBACK,则可以实现数据的回滚。回滚到最近的一次COMMIT最后
#对比TRUNCATE TABLE 和 DELETE FROM
#相同点:都可以实现对表中所有数据的删除,同时保留表结构
#不同点:
# TURNCATE TABLE:一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的
# DELETE FROM:一旦执此操作,表数据可以全部清除(不带WHERE)同时,数据是可以实现回滚的
/*
DDL 和 DML的说明
① DDL的操作一旦执行,就不可回滚SET autocommit = FALSE对DDL操作无效.
(因为在执行完DDL操作之后,一定会执行一次COMMIT,而此操作不受SET autocomiit=false的影响)
② DML的默认情况下,一旦执行,也是不可回滚的。但是,如果在执行DML之前,
执行了 SET autocommit = FALSE,则执行的DML操作就可以实现回滚
*/
#演示:DELETE FROM
#1)
COMMIT;#先提交一下
#2)
SELECT*FROM myemp3;#106条数据
#3)
SET autocommit = FALSE;
#4)
DELETE FROM myemp3;
#5)
SELECT*FROM myemp3;#0条数据
#6)
ROLLBACK;#回滚数据
#7)
SELECT*FROM myemp3;#106条数据
阿里MySQL命名规范及MySQL8.0DDL的原子化
阿里开发规范:
【参考】TRUNCATE TABLE比DELETE速度快,且使用的系统和事务日志资源少,但TRUNCATE无事务且不触发TRIGGER,有可能造成事故,故不建议在开发代码中使用此语句
说明:TRUNCATE TABLE在功能上与不带WHERE子句的DELETE语句相同
内容扩展
#测试MySQL8.0的新特性:DDL的原子化
CREATE DATABASE mytest;
USE mytest;
CREATE TABLE book1(
book_id INT,
book_name VARCHAR(255)
);
SHOW TABLES;
DROP TABLE book1,book2
SHOW TABLES;
#区别是,如果是5.7版本的MySQL,上面的删除数据表语句,会将book1删除掉
#这里是没有book2的,所以肯定报错,但是8.0中,如果报错了就不会删除book1
#这也是DDL的原子化:要么都成功,要么就回滚
创建管理表练习
54P