目录
[1. MySQL中的数据类型编辑编辑](#1. MySQL中的数据类型编辑编辑)
[2. 创建和管理数据库](#2. 创建和管理数据库)
[方式3:判断数据库是否已经存在,不存在则创建数据库( 推荐 )](#方式3:判断数据库是否已经存在,不存在则创建数据库( 推荐 ))
[2.2 使用数据库](#2.2 使用数据库)
[2.3 修改数据库](#2.3 修改数据库)
[2.4 删除数据库](#2.4 删除数据库)
[方式2:删除指定的数据库( 推荐 )](#方式2:删除指定的数据库( 推荐 ))
[3. 创建表](#3. 创建表)
[3.1 创建方式1](#3.1 创建方式1)
[3.2 创建方式2](#3.2 创建方式2)
[4. 修改表](#4. 修改表)
[使用 ALTER TABLE 语句可以实现](#使用 ALTER TABLE 语句可以实现)
[4.1 追加一个列](#4.1 追加一个列)
[4.2 修改一个列](#4.2 修改一个列)
[4.3 重命名一个列](#4.3 重命名一个列)
[4.4 删除一个列](#4.4 删除一个列)
[5. 重命名表](#5. 重命名表)
[6. 删除表](#6. 删除表)
[7. 清空表](#7. 清空表)
[TRUNCATE TABLE语句:](#TRUNCATE TABLE语句:)
1. MySQL中的数据类型
**2.**创建和管理数据库
方式1:创建数据库
sql
CREATE DATABASE 数据库名;
方式2:创建数据库并指定字符集
sql
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
方式3:判断数据库是否已经存在,不存在则创建数据库( 推荐 )
sql
CREATE DATABASE IF NOT EXISTS 数据库名;
如果 MySQL 中已经存在相关的数据库,则忽略创建语句,不再创建数据库。
注意:DATABASE 不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删旧库完成的。
总结
sql
数据库的创建
创建数据库
create database 数据库名;
判断在创建数据库
create database if not exists 数据库名;
创建数据库指定字符集
create database 数据库名 character set 字符集;
创建数据库指定排序方式
create database 数据库名 collate 排序方式;
创建数据库指定字符集和排序方式
create database 数据库名 character set 字符集 collate 排序方式;
查询数据库的字符集和排序方式
mysql18:默认 utf8mb4 utf8mb4_0900_ai_ci
show variables like 'character_set_database';
show variables like 'collate_database';
2.2****使用数据库
查看当前所有的数据库
sql
SHOW DATABASES; #有一个S,代表多个数据库
查看当前正在使用的数据库
sql
SELECT DATABASE(); #使用的一个 mysql 中的全局函数
查看指定库下所有的表
sql
SHOW TABLES FROM 数据库名;
查看数据库的创建信息
sql
SHOW CREATE DATABASE 数据库名;
或者:
SHOW CREATE DATABASE 数据库名\G
使用/切换数据库
sql
USE 数据库名;
注意:要操作表格和数据之前必须先说明是对哪个数据库进行操作,否则就要对所有对象加上"数
据库名."。
总结
sql
1.2 数据库查看
查看所有库
show databases;
查看当前使用库
select database();
查看库下所有表
show tables from 数据库名;
查看创建库的信息和语句
show create database 数据库名;
选中和切换库;
use 数据库名;
注意: 对数据进行操作之前,必须要选中库! use 数据库; use 数据库名;
2.3****修改数据库
更改数据库字符集
sql
ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:gbk、utf8等
总结
sql
1.3 数据库修改
修改字符集
alter database 数据库名 character set 字符集;
修改排序方式
alter database 数据库名 collate 排序方式;
修改字符集和排序方式
alter database 数据库名 character set 字符集 collate 排序方式;
注意: 数据库中没有修改名称的指令,如果你想改名字,备份数据,删除旧库,创建新库,恢复数据即可!
2.4****删除数据库
方式1:删除指定的数据库
sql
DROP DATABASE 数据库名;
方式2:删除指定的数据库( 推荐 )
sql
DROP DATABASE IF EXISTS 数据库名;
总结
sql
1.4 数据库删除
直接删除
drop database 数据库名;
判断删除
drop database if exists 数据库名;
注意: 删除是一个危险命令,确认明确,再操作!!
**3.**创建表
sql
修改和删除表
修改表中列
添加列
alter table 表名 add 列名 类型 [first|alter 列名] ;
修改列名
alter table 表名 change 原列名 新列名 新类型 [first|alter 列名] ;
修改列类型
alter table 表名 modify 列名 新类型 [first|alter 列名] ;
删除列
alter table 表名 drop 列名;
修改表名
alter table rename [to] 新表名;
删除表
drop table [if exists ] 表名;
清空表数据
truncate table 表名;
3.1创建方式1
必须具备:
- CREATE TABLE权限
- 存储空间
语法格式:
sql
CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
字段3, 数据类型 [约束条件] [默认值],
......
[表约束条件]
);
加上了IF NOT EXISTS关键字,则表示:如果当前数据库中不存在要创建的数据表,则创建数据表; 如果当前数据库中已经存在要创建的数据表,则忽略建表语句,不再创建数据表。
必须指定:
- 表名
- 列名(或字段名),数据类型,长度
可选指定:
- 约束条件
- 默认值
sql
-- 创建表
CREATE TABLE emp (
-- int类型
emp_id INT,
-- 最多保存20个中英文字符
emp_name VARCHAR(20),
-- 总位数不超过15位
salary DOUBLE,
-- 日期类型
birthday DATE
);
3.2创建方式2
- 使用 AS subquery 选项,将创建表和插入数据结合起来
- 指定的列和子查询中的列要一一对应
- 通过列名和默认值定义列
sql
CREATE TABLE emp1 AS SELECT * FROM employees;
CREATE TABLE emp2 AS SELECT * FROM employees WHERE 1=2; -- 创建的emp2是空表
sql
CREATE TABLE dept80
AS
SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
FROM employees
WHERE department_id = 80;
DESCRIBE dept80;
**4.**修改表
sql
修改和删除表
修改表中列
添加列
alter table 表名 add 列名 类型 [first|alter 列名] ;
修改列名
alter table 表名 change 原列名 新列名 新类型 [first|alter 列名] ;
修改列类型
alter table 表名 modify 列名 新类型 [first|alter 列名] ;
删除列
alter table 表名 drop 列名;
修改表名
alter table rename [to] 新表名;
删除表
drop table [if exists ] 表名;
清空表数据
truncate table 表名;
使用ALTER TABLE语句可以实现
- 向已有的表中添加列
- 修改现有表中的列
- 删除现有表中的列
- 重命名现有表中的列
4.1****追加一个列
语法格式
sql
ALTER TABLE 表名 ADD 【COLUMN】 字段名 字段类型 【FIRST|AFTER 字段名】;
举例:
sql
SHOW CREATE TABLE 表名\G
ALTER TABLE dept80
ADD job_id varchar(15);
4.2****修改一个列
可以修改列的数据类型,长度、默认值和位置
语法格式:
sql
ALTER TABLE 表名 MODIFY 【COLUMN】 字段名1 字段类型 【DEFAULT 默认值】【FIRST|AFTER 字段名
2】;
举例
sql
ALTER TABLE dept80
MODIFY last_name VARCHAR(30);
sql
ALTER TABLE dept80
MODIFY salary double(9,2) default 1000;
4.3****重命名一个列
使用 CHANGE old_column new_column dataType子句重命名列。
语法格式
sql
ALTER TABLE 表名 CHANGE 【column】 列名 新列名 新数据类型;
举例:
sql
ALTER TABLE dept80
CHANGE department_name dept_name varchar(15);
4.4****删除一个列
删除表中某个字段的
语法格式
sql
ALTER TABLE 表名 DROP 【COLUMN】字段名
举例
sql
ALTER TABLE dept80
DROP COLUMN job_id;
**5.**重命名表
sql
修改和删除表
修改表中列
添加列
alter table 表名 add 列名 类型 [first|alter 列名] ;
修改列名
alter table 表名 change 原列名 新列名 新类型 [first|alter 列名] ;
修改列类型
alter table 表名 modify 列名 新类型 [first|alter 列名] ;
删除列
alter table 表名 drop 列名;
修改表名
alter table rename [to] 新表名;
删除表
drop table [if exists ] 表名;
清空表数据
truncate table 表名;
方式一:使用RENAME
sql
RENAME TABLE emp
TO myemp;
方式二:
sql
ALTER table dept
RENAME [TO] detail_dept; -- [TO]可以省略
必须是对象的拥有
6. 删除表
sql
修改和删除表
修改表中列
添加列
alter table 表名 add 列名 类型 [first|alter 列名] ;
修改列名
alter table 表名 change 原列名 新列名 新类型 [first|alter 列名] ;
修改列类型
alter table 表名 modify 列名 新类型 [first|alter 列名] ;
删除列
alter table 表名 drop 列名;
修改表名
alter table rename [to] 新表名;
删除表
drop table [if exists ] 表名;
清空表数据
truncate table 表名;
- 在MySQL中,当一张数据表 没有与其他任何数据表形成关联关系 时,可以将当前数据表直接删除。
- 数据和结构都被删除
- 所有正在运行的相关事务被提交
- 所有相关索引被删除
语法格式
sql
DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, ..., 数据表n];
IF EXISTS 的含义为:如果当前数据库中存在相应的数据表,则删除数据表;如果当前数据库中不存在相应的数据表,则忽略删除语句,不再执行删除数据表的操作。
举例
sql
DROP TABLE dept80;
注意:DROP TABLE 语句不能回滚
7. 清空表
sql
修改和删除表
修改表中列
添加列
alter table 表名 add 列名 类型 [first|alter 列名] ;
修改列名
alter table 表名 change 原列名 新列名 新类型 [first|alter 列名] ;
修改列类型
alter table 表名 modify 列名 新类型 [first|alter 列名] ;
删除列
alter table 表名 drop 列名;
修改表名
alter table rename [to] 新表名;
删除表
drop table [if exists ] 表名;
清空表数据
truncate table 表名;
TRUNCATE TABLE语句:
- 删除表中所有的数据
- 释放表的存储空间
如:
sql
TRUNCATE TABLE detail_dept;
大总结
sql
/*
1.1数据库的创建
创建数据库
create database 数据库名;
判断在创建数据库
create database if not exists 数据库名;
创建数据库指定字符集
create database 数据库名 character set 字符集;
创建数据库指定排序方式
create database 数据库名 collate 排序方式;
创建数据库指定字符集和排序方式
create database 数据库名 character set 字符集 collate 排序方式;
查询数据库的字符集和排序方式
mysql18:默认 utf8mb4 utf8mb4_0900_ai_ci
show variables like 'character_set_database';
show variables like 'collate_database';
*/
/*练习:
创建ddl_d1库,指定字符集为utf8,且排序方式用大小写敏感的utf8mb4_0900_as_cs模式
*/
CREATE DATABASE IF NOT EXISTS ddl_d1 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs;
/*1.2 数据库查看
查看所有库
show databases;
查看当前使用库
select database();
查看库下所有表
show tables from 数据库名;
查看创建库的信息和语句
show create database 数据库名;
选中和切换库;
use 数据库名;
注意: 对数据进行操作之前,必须要选中库! use 数据库; use 数据库名;
*/
SHOW DATABASES;
SELECT DATABASE();
USE mysql;
SHOW TABLES FROM mysql;
SHOW CREATE DATABASE ddl_d1;
/*
1.3 数据库修改
修改字符集
alter database 数据库名 character set 字符集;
修改排序方式
alter database 数据库名 collate 排序方式;
修改字符集和排序方式
alter database 数据库名 character set 字符集 collate 排序方式;
注意: 数据库中没有修改名称的指令,如果你想改名字,备份数据,删除旧库,创建新库,恢复数据即可!
*/
/*
1.4 数据库删除
直接删除
drop database 数据库名;
判断删除
drop database if exists 数据库名;
注意: 删除是一个危险命令,确认明确,再操作!!
*/
# 2. DDL之数据表操作
/*
2.1 建表语法
建表语法总结
create table [if not exist] 表名(
# 列的信息
列名 类型 [列的约束] [列的注释],
列名 类型 [列的约束] [列的注释],
...
列名 类型 [列的约束] [列的注释]
)[描述][注释]
建表事项
1. 表名 列名 列类型必须填写的
2. 推荐使用if not exists
3. 注释不是必须得,但是是很有必要的!
4. 列之间使用,隔开,最后一列没有,
*/
CREATE DATABASE IF NOT EXISTS book_libs CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs;
USE book_libs;
CREATE TABLE IF NOT EXISTS books(
# 列的信息
book_name VARCHAR(20) COMMENT '图书名',
book_price DOUBLE(4,1) COMMENT '图书价格',
book_num INT COMMENT '图书数量'
)CHARSET = utf8mb4 COMMENT '图书表';
SHOW TABLES FROM book_libs;
/*
2.3 建表类型[整数]
整数类型(类型,占有空间,范围)
标准sql:
int / integer 4字节 无符号 0 - 2/32-1 有符号 -2 31 / 2 / 31 -1
smallint 2字节 无符号 0 - 2/16-1 有符号 -2 17 / 2 / 17 -1
mysql方言:
tinyint 1字节 无符号 0 - 2/8 -1 有符号 -2 7 / 2/7-1
mediumint 3字节 无符号 0 - 2/24 -1 有符号 -2 23 / 2/23-1
bigint 8字节 无符号 0 - 2/64 -1 有符号 -2 63 / 2/63-1
有符号: 列名 整数类型 -> 有符号| 有符号 有负值和正值
列名 整数类型 unsigned -> 无符号|无符号 没有负值,都是正值,将负值部分,绝对值后,加入正值部分!
注意: 选合适范围,范围合适先占有空间最小的!
创建一个ddl_d1库中,创建一个t1表,包含: 年龄和学号(范围不确定,但是没有负值)
*/
CREATE TABLE t1(
t1_age TINYINT UNSIGNED COMMENT '年龄,无符号,范围就是 0 - 255',
t1_number BIGINT UNSIGNED COMMENT '学号,最大的,且没有负号'
);
/*
2.4 建表类型[浮点/定值]
浮点类型(类型,M,D)
float(m,d) 4字节 m 24 d 8
double(m,d) 8字节 m 53 d 30
定值类型(类型,M,D)
decimal(m,d) 动态占有 m 65 d 30
使用对比:
精度要求不高,例如:身高,体重 float / double
精度要求特别高,钱 工资,价格 decimal
*/
/*
2.5 建表类型[浮点/定值]
浮点类型(类型,M,D)
float(m,d) 4字节 m 24 d 8
double(m,d) 8字节 m 53 d 30
定值类型(类型,M,D)
decimal(m,d) 动态占有 m 65 d 30
使用对比:
精度要求不高,例如:身高,体重 float / double
精度要求特别高,钱 工资,价格 decimal
*/
/*
2.6 建表类型[字符串]
字符串类型
char 固定长度类型 一旦声明固定占有对应的空间 M 最大255 [性能较好]
varchar 可变长度类型 一旦声明,可以插入小于的长度,自动进行伸缩 M 占有的空间不能超过一行的最大显示65535字节 [性能一般]
text 大文本类型,声明不要指定长度,有固定的大小限制, text [65535] , 不占有一行的最大限制空间
细节理解
1. char声明的时候可以不写m char = char(1)
2. char声明了最大长度限制,输入的文本小于长度限制,会在右侧补全空格 char(5) -> 'abc' -> 'abc '
3. char类型在读取的时候,会自动去掉右侧的空格 'abc ' -> 'abc'
4. varchar声明的时候,必须添加m限制 varchar(m)
5. mysql4.0以下版本 varchar(20) -> 20字节限制 mb3 -> 6
6. mysql5.0以上版本 varchar(20) -> 20字符限制
7. varchar类型中识别空格,插入空格 读取也是有空格
演示varchar最大限制
前提: mysql中一行数据最大的占有空间是65535字节,除了TEXT or BLOBs类型的列(不占有65535限制 法外狂徒)
一行-> name1列 -> name1列占有的最大空间65535字节
varchar类型默认会使用1字节标识是否为null -> 65535-1 = 65534字节
字符集utf8mb4 1个字符 = 4个字节 65534 / 4 = 16383
解决方案 :
1. 缩小字符大小限制 m变小 [不合理]
2. 可以修改字符集 [不合理]
3. 可以将字符串类型变成TEXT,不占有一行的限制
*/
CREATE TABLE t1(
name1 VARCHAR(16000),
name2 TEXT
)CHARSET=utf8mb4;
/*
2.7 建表类型[时间类型]
时间类型
year 1 yyyy | yy '1910' | 1910
time 3 HH:MM:SS '10:10:10'
date 3 YYYY-MM-DD '1910-10-10'
datetime 8 YYYY-MM-DD HH:MM:SS '1910-10-10 10:10:10'
timestamp 4 YYYY-MM-DD HH:MM:SS '1970-10-10 10:10:10'
注意情况
1. year可以写两位年 00 - 99 00-69 =2000 - 2069 70 - 99 = 1970 - 1999 推荐四位的年
2. 时间类型,要遵循他们的格式插入,插入的时候就是按字符插入,时间默认不会自动赋值
扩展自动填写时间:
1.插入默认添加时间
datatime | timestamp default current_timestamp
2.修改默认更改时间
datatime | timestamp default current_timestamp on update current_timestamp
演示: 创建t2表,
注册日期 字段插入自动添加时间,更新数据不变
更新日期 字段插入自动添加时间,更新数据时间改变
*/
CREATE TABLE t2(
name1 VARCHAR(20),
reg_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '注册日期,插入数据自动维护时间',
up_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日期,插入数据填写时间,更新数据自动改变时间'
);
/*
2.8 修改和删除表
修改表中列
添加列
alter table 表名 add 列名 类型 [first|alter 列名] ;
修改列名
alter table 表名 change 原列名 新列名 新类型 [first|alter 列名] ;
修改列类型
alter table 表名 modify 列名 新类型 [first|alter 列名] ;
删除列
alter table 表名 drop 列名;
修改表名
alter table rename [to] 新表名;
删除表
drop table [if exists ] 表名;
清空表数据
truncate table 表名;
*/
/*
2.9 表操作实战
要求1:创建表格employees
要求2:将表employees的mobile字段修改到code字段后面。
要求3:将表employees的birth字段改名为birthday;
要求4:修改sex字段,数据类型为char(1)。
要求5:删除字段note;
要求6:增加字段名favoriate_activity,数据类型为varchar(100);
要求7:将表employees的名称修改为 employees_info
*/
CREATE TABLE employeess(
emp_num INT,
last_name VARCHAR(50),
first_name VARCHAR(50),
mobile VARCHAR(25),
CODE INT,
job_time VARCHAR(50),
birth DATE,
note VARCHAR(255),
sex VARCHAR(5)
);
# 要求2:将表employees的mobile字段修改到code字段后面。
ALTER TABLE employeess MODIFY mobile VARCHAR(25) AFTER CODE;
# 要求3:将表employees的birth字段改名为birthday;
ALTER TABLE employeess CHANGE birth birthday DATE;
# 要求4:修改sex字段,数据类型为char(1)。
ALTER TABLE employeess MODIFY sex CHAR(1);
DESC employeess;
# 要求5:删除字段note;
ALTER TABLE employeess DROP note;
#要求6:增加字段名favoriate_activity,数据类型为varchar(100);
ALTER TABLE employeess ADD favoriate_activity VARCHAR(100);
#要求7:将表employees的名称修改为 employees_info
ALTER TABLE employeess RENAME employees_info;