一、库管理
1.1 创建库
库命名规范
- 库的作用:用于存放表
- 仅可使用数字、字母、下划线,不能纯数字
- 区分字母大小写
- 库名全局唯一
- 不可使用SQL关键字(如CREATE等,会造成混乱)、特殊字符
可以把数据库(database)类比成操作系统里的文件夹 / 目录:存放多张数据表;
数据表就相当于目录里的一个个文件,文件存文本,表存结构化数据
创建语法
sql
-- 库名重复会直接报错
CREATE DATABASE 库名;
-- 库不存在才创建,存在则忽略,无报错
CREATE DATABASE IF NOT EXISTS 库名;
-- 输出建该数据库完整的 SQL 建库语句和该库默认使用的字符集、排序规则(校对集)
SHOW CREATE DATABASE 库名;
-- 只针对已经存在的数据库使用
实操示例
sql
#建库
mysql> CREATE DATABASE gamedb;
#忽略报错(如果该库不存在,则创建)
mysql> CREATE DATABASE IF NOT EXISTS gamedb;
#库名严格区分大小写
mysql> CREATE DATABASE GAMEDB;
1.2 数据库相关操作命令
| SQL命令 | 功能说明 |
|---|---|
| SHOW DATABASES ; | 查看当前服务器所有已有库 |
| USE 库名; | 切换当前操作的数据库 |
| SELECT DATABASE(); | 查看当前正在使用的库 |
| SHOW TABLES; | 查看当前库下所有数据表 |
| DROP DATABASE 库名; | 删除指定数据库,库内所有表同步删除 |
| DROP DATABASE IF EXISTS 库名; | 库存在才删除,不存在不报错 |
重要提醒:删除库操作为高危操作,请慎用。删除库会连带删除库内全部数据表!
删除库实操示例
sql
#删除库
mysql> DROP DATABASE gamedb;
#删除库时,忽略报错
mysql> DROP DATABASE IF EXISTS gamedb;
#删除库时,忽略报错
mysql> DROP DATABASE IF EXISTS GAMEDB;
二、表管理
2.1 创建表格
- 表:专门用于存储数据
- 表组成:表结构(字段、类型)+ 表记录(真实数据)
- 查看表结构语法:
DESC 库名.表名;
建表标准语法
sql
CREATE TABLE 库名.表名 (
表头1 数据类型 [约束],
表头2 数据类型 [约束],
表头3 数据类型 [约束],
表头n 数据类型 [约束]
);
约束可加可不加,需视情况而定
实操案例:创建studb库与stuinfo表
需求:表包含name、class、gender、age字段
sql
mysql> CREATE DATABASE studb; #创建studb库
mysql> CREATE TABLE studb.stuinfo( #创建表格
-> name CHAR(10),
-> class CHAR(15),
-> gender CHAR(8),
-> age INT);
mysql> SHOW TABLES FROM studb; #查看指定库下所有表
mysql> DESC studb.stuinfo; #查看表结构
2.2 修改表
通用语法:ALTER TABLE 库名.表名 操作命令;
支持操作:新增字段、修改字段类型、修改字段名、修改表名、删除字段

修改数据类型同时也可以修改约束条件
2.2.1 添加字段 ADD
语法:ALTER TABLE 库名.表名 ADD 字段名 类型 [FIRST | AFTER 已有字段];
- 不加位置参数:默认追加到表末尾
FIRST:放到表最前方AFTER 字段名:放在指定字段后方
实操示例
sql
#在最后添加mail字段
mysql> ALTER TABLE studb.stuinfo ADD mail char(30);
mysql> DESC studb.stuinfo;
#最前方添加id字段
mysql> ALTER TABLE studb.stuinfo ADD id int first;
mysql> DESC studb.stuinfo;
#name字段后方添加school字段
mysql> ALTER TABLE studb.stuinfo ADD school char(20) after name;
mysql> DESC studb.stuinfo;
2.2.2 修改字段数据类型 MODIFY
语法:ALTER TABLE 库名.表名 MODIFY 字段名 新数据类型 [约束];
注意:新数据类型不能和表中已存储数据冲突,否则报错。(如原表头下存储的char字符串类型,改成int整数类型会报错)
实操示例
sql
mysql> DESC studb.stuinfo;
mysql> ALTER TABLE studb.stuinfo MODIFY school varchar(25); #修改school字段数据类型
mysql> ALTER TABLE studb.stuinfo MODIFY mail varchar(20); #修改mail字段数据类型
mysql> DESC studb.stuinfo;
2.2.3 修改字段名 CHANGE
语法:ALTER TABLE 库名.表名 CHANGE 旧字段名 新字段名 新类型 [约束];
说明:修改字段名称时可同步修改字段类型,数据类型不能与现有数据冲突。
实操示例
sql
mysql> ALTER TABLE studb.stuinfo CHANGE class 班级 CHAR(15); #将class字段改为班级字段
mysql> DESC studb.stuinfo;
2.2.4 修改表名 RENAME
语法:ALTER TABLE 库名.旧表名 rename 库名.新表名;
实操示例
sql
mysql> ALTER TABLE studb.stuinfo rename studb.stu; #修改表名为studb.stu
mysql> DESC studb.stu; #查看表结构(使用新表名)
mysql> SHOW TABLES FROM studb; #查看表名,已修改
mysql> ALTER TABLE studb.stu rename studb.stuinfo; #改回原表名
2.2.5 删除表字段 DROP
语法:ALTER TABLE 库名.表名 drop 字段1, drop 字段2, drop 字段n;
支持一次性删除多个字段。
实操示例
sql
mysql> ALTER TABLE studb.stuinfo drop school, drop 班级, drop mail; #删除多个字段
mysql> DESC studb.stuinfo; #查看表结构
2.3 表记录管理
2.3.1 插入记录 INSERT
方式1:不指定字段,全字段插入
要求:值的顺序、数量、数据类型必须和建表字段完全匹配
sql
-- 插入单行
INSERT INTO 库名.表名 VALUES (值列表);
-- 插入多行
INSERT INTO 库名.表名 VALUES (值列表),(值列表), ...;
(INTO可以省略,但建议加上)
示例:
假设表头为:name,age,phone
INSERT INTO 库名.表名 VALUES ("zhangsan",12,999999);
表数据会变成:
name age phone
zhangsan 12 999999
方式2:指定字段插入
仅给指定字段赋值,未指定字段自动填充默认值/NULL
sql
-- 插入单行
INSERT INTO 库名.表名(表头名列表) VALUES (值列表);
-- 插入多行
INSERT INTO 库名.表名(表头名列表) VALUES (值列表),(值列表) ,...;
假设表头为:name,age,phone
示例:INSERT INTO 库名.表名(name,phone) VALUES ("zhangsan",999999);
表数据会变成:
name age phone
zhangsan null/默认值 999999
实操示例
sql
mysql> INSERT INTO studb.stuinfo VALUES
-> (1,"jim","man",18),
-> (2,"lucy","woman",30),
-> (3,"bob","man",27);
mysql> INSERT INTO studb.stuinfo(name) VALUES("mike"),("tom"); #指定字段插入多行数据
mysql> SELECT * FROM studb.stuinfo; #查询全表数据
2.4 修改表记录 UPDATE
语法说明:强烈建议搭配WHERE 条件,否则会批量修改全表数据
注意,修改的值也需要和表头对应的数据类型等约束相匹配,否则会报错
sql
-- 无WHERE:全表批量修改
UPDATE 库名.表名 SET 字段=值 , 字段=值;
-- 带WHERE:仅修改匹配条件的行
UPDATE 库名.表名 SET 字段=值 , 字段=值 WHERE 条件;
实操示例
sql
mysql> UPDATE studb.stuinfo SET age = 19 WHERE name="tom"; #修改tom的age为19
mysql> SELECT * FROM studb.stuinfo; #查看数据,已更新
2.5 删除表记录 DELETE / TRUNCATE
两种方式仅删除数据,表结构保留,操作谨慎使用
| 语句 | 功能 |
|---|---|
| DELETE FROM 库名.表名 WHERE 条件; | 仅删除满足条件的行 |
| DELETE FROM 库名.表名; | 清空整张表 所有数据,保留表结构 (自增主键不清零) |
| TRUNCATE TABLE 库名.表名; | 清空整张表,重置自增主键,效率高于DELETE |
| 不重置自增主键 :删除数据后,新增记录的自增ID会从删除前的最后一个值继续递增。 |
实操示例
sql
mysql> DELETE FROM studb.stuinfo WHERE name in ("mike","tom"); #删除满足条件的行
三、MySQL数据类型
3.1 概述
关系数据库使用二维表格存储数据,每个字段通过数据类型限制存储数据的类型、取值范围、占用存储空间。
MySQL 数据类型是定义数据表字段所能存储数据的种类、取值范围与占用存储空间的规范。
3.2 字符类型
3.2.1 定长 CHAR
- 格式:
CHAR(字符个数) - 最大限制:最多255个字符
- 存储规则:数据不足指定长度,右侧自动补空格;超出长度无法写入
- 支持中文,MySQL8默认字符集utf8mb4
特性:建议实际需要多少字符就分配多少长度。因为: 如 char(20)
限制最大20个字符,数据库就会拨给它20个字符的空间。如果实际存入字符只有10个字符,剩下的10个字符空间被空格补齐,也就是说会有10个字符的空间被浪费
建表示例
sql
mysql> CREATE DATABASE db1; #创建db1库
mysql> CREATE TABLE db1.t1( #创建db1.t1表
-> name CHAR(5),
-> homedir CHAR(50)
-> );
mysql> DESC db1.t1 #查看表结构
插入测试
sql
mysql> INSERT INTO db1.t1 VALUES("lisi","Beijing"); #正确
mysql> INSERT INTO db1.t1 VALUES("tom","Shanghai"); #正确
mysql> INSERT INTO db1.t1 VALUES("janner","Tianjin"); #报错,字符超出长度约束
mysql> INSERT INTO db1.t1 VALUES("张大山","内蒙古"); #插入中文正常
查看表字符集
sql
mysql> SHOW CREATE table db1.t1;
3.2.2 变长 VARCHAR
- 格式:
VARCHAR(字符个数) - 存储规则:按数据实际长度分配空间(不会像char造成空间浪费),最大65532字符
- 超过限制无法写入
- 超大文本( 超过65532 字符时)使用TEXT/BLOB
- VARCHAR底层会额外占用 1~2 字节用来记录当前字符串实际长度,损耗极小,可以忽略。所以:
- 固定长度的短数据建议使用char
- 长度不固定的数据建议使用VARCHAR
建表&插入示例
sql
mysql> CREATE TABLE db1.t2(
-> name CHAR(5),
-> email VARCHAR(30)
-> );
mysql> DESC db1.t2; #查看表结构
mysql> INSERT INTO db1.t2 VALUES
-> ("tom","tom@test.com"),
-> ("jerry","jerry@test.com"),
-> ("lucy","lucy@163.com");
3.2.3 整型
仅存储整数,支持unsigned无符号修饰,扩大正数取值范围

对于一些不能是负数的数据,可以使用无符号进行限制
实操案例:创建游戏信息表
需求:name(CHAR10)、level(TINYINT无符号)、money(INT)
sql
mysql> CREATE TABLE db1.gameinfo(
-> name CHAR(10),
-> level TINYINT unsigned,
-> money INT
-> );
mysql> INSERT INTO db1.gameinfo VALUES("潘多拉","10",10000);
mysql> INSERT INTO db1.gameinfo VALUES("奥摩","9",12000);
mysql> INSERT INTO db1.gameinfo VALUES("塞斯","8",8000);
mysql> SELECT * FROM db1.gameinfo;
3.2.4 浮点型
存储带小数数字,区分单精度float、双精度double
- float:有效数字6~7位
- double:有效数字15~16位,精度更高
- 有效数字:从第一个非0数字开始计数

在数据量小、无密集数值计算、对精度容忍度高的普通业务场景里,两者使用体验几乎没有差别,不用刻意纠结区分
定点写法 FLOAT(M,D) / DOUBLE(M,D)
M=总数字长度,D=小数位数
sql
#创建表格
mysql> CREATE TABLE db1.t3(pay FLOAT,id DOUBLE);
#限制长度。pay总长度:5位,小数位:2位;id总长度:4位,小数位:2位
mysql> CREATE TABLE db1.t4(pay FLOAT(5,2),id DOUBLE(4,2));
#成功写入
mysql> INSERT INTO db1.t4 VALUES (123.12,99.99);
#写入失败,超出总长度范围
mysql> INSERT INTO db1.t4 VALUES (12345.12,9999.99);
#写入成功,自动补0小数
mysql> INSERT INTO db1.t4 VALUES (999,99);
3.2.5 枚举与集合类型
ENUM 枚举类型(单个选择)
字段值只能从定义的列表中 选择单个值
sql
mysql> CREATE TABLE db1.t5(
-> name CHAR(10),
-> gender ENUM("boy","girl")
-> );
mysql> INSERT INTO db1.t5 VALUES
-> ("dc","boy"),
-> ("eve","girl"),
-> ("jack","boy");
ENUM 枚举的所有选项值,必须是字符串格式,要用引号包裹
SET 集合类型(多项选择)
可在存储列表中选择多个值,逗号分隔填写
sql
mysql> CREATE TABLE db1.t6(
-> name CHAR(10),
-> gender ENUM("boy","girl"),
-> likes SET("唱","跳","rap","睡觉")
-> );
mysql> INSERT INTO db1.t6 VALUES
-> ("zhangsan","boy","eat,game,music"),
-> ("janner","girl","唱,跳");
-- 多个选项写在一个引号内用逗号隔开
3.2.6 日期时间类型

特性区分:
- TIMESTAMP:不赋值时自动填充当前系统时间
- DATETIME:不赋值默认NULL(但是需要指定:DEFAULT CURRENT_TIMESTAMP)
- YEAR支持2位简写:01-69 = 2001-2069,70~99 = 1970-1999。推荐4位数标准写法赋值
建表与插入示例
sql
mysql> CREATE TABLE db1.t7(
-> 姓名 CHAR(10),
-> 生日 DATE,
-> 出生年份 YEAR,
-> 家庭聚会 DATETIME,
-> 聚会地点 VARCHAR(15),
-> 上班时间 TIME
-> );
mysql> INSERT INTO db1.t7 VALUES
-> ("张三丰",19920625,1992,20261005183030,"北京饭店",090000),
-> ("武松",19821016,1982,20260807190310,"景阳冈",083000);
mysql> SELECT * FROM db1.t7;
四、字段基本约束
4.1 约束作用
约束是字段的限制规则,控制字段允许存入的数据,保证数据完整性。
4.2 约束分类
NOT NULL:非空约束,字段禁止存储NULL空值DEFAULT:默认值约束,无手动赋值时自动填入预设值UNIQUE:唯一约束,字段值不能重复,允许存NULLPRIMARY KEY:主键约束,等价UNIQUE + NOT NULL,值唯一且不能为空FOREIGN KEY:外键约束,关联两张表,从表字段取值必须来自主表主键
4.3 查看约束
执行 DESC 库名.表名;
查看表结构,Key、Default、Extra列展示约束信息。

4.4 约束实操案例
sql
mysql> CREATE TABLE db1.学生表(
姓名 CHAR(10) NOT NULL ,
年龄 TINYINT unsigned DEFAULT 21, #无符号类型(代表不为负数),默认值21
学号 INT UNIQUE,
班级 CHAR(7) NOT NULL DEFAULT "cloud"
)DEFAULT CHARSET=utf8;
验证1:NOT NULL 非空约束
sql
mysql> INSERT INTO db1.学生表 VALUES (null,20,1,"cloud01"); #姓名字段为空,直接报错
验证2:DEFAULT 默认值
sql
mysql> INSERT INTO db1.学生表 VALUES ("宋江",19,1,"cloud01"); #完整赋值
mysql> INSERT INTO db1.学生表(姓名,学号,班级) VALUES("卢俊义",2,"cloud01"); #仅指定部分字段
mysql> SELECT * FROM db1.学生表; #未赋值的年龄自动填充默认值21
验证3:UNIQUE 唯一约束
sql
mysql> INSERT INTO db1.学生表 VALUES ("林冲",25,1,"cloud01"); #学号1已存在,重复报错
mysql> INSERT INTO db1.学生表 VALUES ("林冲",25,null,"cloud01"); #唯一约束允许存入NULL
五、整体知识点总结
- 库管理:创建库、查看库、切换库、删除库,库名命名规范
- 表管理
- 建表语法规范
- 修改表:新增字段、修改字段类型、修改字段名、修改表名、删除字段
- 表记录:插入、更新、删除数据操作语法
- 数据类型
- 字符:CHAR定长、VARCHAR变长
- 整数:TINYINT/SMALLINT/MEDIUMINT/INT/BIGINT,unsigned无符号
- 浮点:float、double精度与取值范围
- 枚举集合:ENUM单选、SET多选
- 日期时间:YEAR/DATE/TIME/DATETIME/TIMESTAMP特性与区别
- 字段约束:NOT NULL、DEFAULT、UNIQUE、PRIMARY KEY、FOREIGN KEY功能与实操验证