MySQL 学习笔记(第二期):SQL 语言之库/表操作与数据类型
本笔记承接第一期,进入 SQL 语言核心部分。本期重点:数据库与表的创建、修改、删除操作,MySQL 数据类型详解,字符集与排序规则,以及约束属性的使用。所有代码经过整理与注释,便于理解和实践。
一、SQL 语言概述
1.1 SQL 分类
| 类别 | 全称 | 功能 | 常用语句 |
|---|---|---|---|
| DDL | Data Definition Language | 定义数据结构(库、表、索引等) | CREATE, DROP, ALTER |
| DML | Data Manipulation Language | 操作表中数据 | INSERT, DELETE, UPDATE |
| DQL | Data Query Language | 查询表中数据 | SELECT |
| DCL | Data Control Language | 权限控制 | GRANT, REVOKE |
| TCL | Transaction Control Language | 事务控制 | BEGIN, COMMIT, ROLLBACK, SAVEPOINT |
1.2 SQL 语言规范
-
SQL 语句不区分大小写(建议关键字大写,表名/库名在某些系统中区分大小写)
-
语句以分号
;结尾,可单行或多行书写 -
关键词不能跨行或简写
-
使用空格和缩进提高可读性
-
注释方式:
sql
-- 单行注释 # MySQL 特有的单行注释 /* 多行注释 */
1.3 数据库对象与命名规则
数据库组件:数据库、表、索引、视图、用户、存储过程、函数、触发器、事件调度器等。
命名规则:
- 可包含字母、数字和
#_$ - 不能使用 MySQL 保留字
二、字符集与排序规则
2.1 查看支持的字符集
sql
SHOW CHARSET;
- MySQL 8.0 默认字符集为
utf8mb4(早期为latin1) utf8mb4支持完整的 Unicode(包括 emoji),推荐使用
2.2 查看当前字符集变量
sql
SHOW VARIABLES LIKE 'character%';
示例输出(默认 utf8mb4):
| Variable_name | Value |
|---|---|
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
2.3 修改默认字符集(配置文件中)
ini
# /etc/my.cnf.d/mysql-server.cnf
[mysqld]
character-set-server=utf8mb4
# /etc/my.cnf.d/client.cnf
[client]
default-character-set=utf8mb4
修改后需重启服务:
bash
systemctl restart mysqld
2.4 查看排序规则
sql
SHOW COLLATION;
SHOW VARIABLES LIKE 'collation%';
utf8mb4_0900_ai_ci是 MySQL 8.0 的默认排序规则(不区分大小写)utf8mb4_bin区分大小写,按二进制值比较
三、管理数据库(DDL)
3.1 查看数据库列表
sql
SHOW DATABASES;
默认四个系统库:information_schema, mysql, performance_schema, sys(不可删除)。
3.2 创建数据库
语法:
sql
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_option] ...
create_option:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
| [DEFAULT] ENCRYPTION [=] {'Y' | 'N'}
范例:
sql
-- 基本创建
CREATE DATABASE testdb1;
-- 如果已存在则忽略错误
CREATE DATABASE IF NOT EXISTS testdb1;
-- 查看创建语句(含默认字符集)
SHOW CREATE DATABASE testdb1;
-- 创建时指定字符集
CREATE DATABASE testdb2 DEFAULT CHARACTER SET latin1;
-- 创建后修改字符集
ALTER DATABASE testdb2 CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
原理 :创建数据库本质是在数据目录(如 /var/lib/mysql/)下创建一个同名目录。
3.3 修改数据库
sql
ALTER {DATABASE | SCHEMA} [db_name] alter_option ...
范例:
sql
ALTER DATABASE testdb2 READ ONLY = 1; -- 设为只读
ALTER DATABASE testdb2 READ ONLY = 0; -- 取消只读
ALTER DATABASE testdb2 ENCRYPTION = 'Y'; -- 启用加密
3.4 删除数据库
sql
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;
范例:
sql
DROP DATABASE testdb2;
DROP DATABASE IF EXISTS testdb2; -- 如果不存在不报错
命令行等价操作:
bash
mysqladmin create db1
mysqladmin drop testdb1 # 会提示确认,加 -f 强制删除
四、数据类型(核心)
数据类型定义了字段可存储的数据种类、范围和格式,目的是保证规范性、节省空间、提升效率。
4.1 数值类型
整数类型
| 类型 | 字节 | 有符号范围 | 无符号范围 | 用途 |
|---|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 小整数(如性别 0/1) |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 | 较大整数 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 | 中等整数 |
| INT (INTEGER) | 4 | -2.1e9 ~ 2.1e9 | 0 ~ 4.29e9 | 最常用:年龄、ID |
| BIGINT | 8 | -9.22e18 ~ 9.22e18 | 0 ~ 1.84e19 | 极大整数(手机号、身份证号) |
浮点与定点数
| 类型 | 字节 | 说明 |
|---|---|---|
| FLOAT | 4 | 单精度,约 7 位有效数字 |
| DOUBLE | 8 | 双精度,约 15 位有效数字 |
| DECIMAL(M,D) | 变长 | 定点数,精确,用于金额、价格,避免精度丢失。M 为总位数,D 为小数位数 |
示例:DECIMAL(10,2) 表示总共 10 位,其中小数 2 位(如 12345678.90)。
4.2 日期和时间类型
| 类型 | 字节 | 范围 | 格式 | 用途 |
|---|---|---|---|---|
| DATE | 3 | '1000-01-01' ~ '9999-12-31' | YYYY-MM-DD | 日期值(出生日期) |
| TIME | 3 | '-838:59:59' ~ '838:59:59' | HH:MM:SS | 时间值或持续时间 |
| YEAR | 1 | 1901 ~ 2155 | YYYY | 年份 |
| DATETIME | 8 | '1000-01-01 00:00:00' ~ '9999-12-31 23:59:59' | YYYY-MM-DD HH:MM:SS | 最常用:注册时间、订单时间 |
| TIMESTAMP | 4 | '1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC | YYYY-MM-DD HH:MM:SS | 时间戳,自动更新(范围较小) |
注意:TIMESTAMP 存储的是 UTC 值,受时区影响;DATETIME 不受时区影响。推荐使用 DATETIME。
4.3 字符串类型
| 类型 | 最大长度(字符/字节) | 说明 |
|---|---|---|
| CHAR(n) | 0 ~ 255 字符 | 定长字符串,效率高,存储固定长度信息(如身份证号) |
| VARCHAR(n) | 0 ~ 65535 字符 | 变长字符串,节省空间,推荐用于姓名、地址等 |
| TINYTEXT | 255 字节 | 短文本 |
| TEXT | 65535 字节(约 64KB) | 长文本 |
| MEDIUMTEXT | 16,777,215 字节(约 16MB) | 中等长度文本 |
| LONGTEXT | 4,294,967,295 字节(约 4GB) | 极大文本 |
| BINARY/VARBINARY | 类似 CHAR/VARCHAR | 存储二进制字节串,无字符集 |
| BLOB 系列 | TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB | 二进制数据(图片、文件) |
| ENUM | 最多 65535 个值 | 枚举,从预设值中选择一个(如性别 'M','F') |
| SET | 最多 64 个成员 | 集合,可选择多个值 |
使用建议:
- 定长且长度稳定的字段用
CHAR(如 MD5 密码) - 长度可变用
VARCHAR - 大文本用
TEXT系列 - 金额用
DECIMAL,避免FLOAT/DOUBLE的精度问题
4.4 列属性
| 属性 | 含义 |
|---|---|
NOT NULL |
该列不能为空 |
DEFAULT |
默认值 |
PRIMARY KEY |
主键(唯一且非空) |
AUTO_INCREMENT |
自动递增(通常用于 INT 主键) |
UNSIGNED |
无符号(非负) |
CHARACTER SET name |
指定该列的字符集 |
五、管理表(DDL)
5.1 创建表
基本语法:
sql
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (
column_name data_type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY],
...
) ENGINE=engine_name DEFAULT CHARSET=charset_name;
范例:创建学生表
sql
USE db1; -- 先切换到目标数据库
CREATE TABLE student (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, -- 无符号自增主键
name VARCHAR(20) NOT NULL, -- 变长字符串,非空
age TINYINT UNSIGNED, -- 小整数,非负
gender ENUM('M','F') DEFAULT 'M' -- 枚举,默认为 M
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;
查看表
sql
SHOW TABLES; -- 查看当前库所有表
DESC student; -- 查看表结构(字段)
SHOW COLUMNS FROM student; -- 同上
SHOW CREATE TABLE student; -- 查看建表语句(含所有细节)
插入测试数据
sql
INSERT INTO student (name, age) VALUES ('xiaoming', 20);
INSERT INTO student (name, age, gender) VALUES ('xiaohong', 18, 'F');
查询数据
sql
SELECT * FROM student;
5.2 通过查询结果创建表(复制数据)
sql
-- 复制数据(包含结构和数据)
CREATE TABLE student2 SELECT name, age FROM student;
-- 复制结构但不复制数据
CREATE TABLE student3 LIKE student;
5.3 修改表(ALTER TABLE)
修改表名
sql
ALTER TABLE student RENAME TO stu;
添加字段
sql
ALTER TABLE stu ADD phone VARCHAR(11) AFTER name; -- 在 name 之后添加
修改字段类型
sql
ALTER TABLE stu MODIFY phone INT;
修改字段名和类型
sql
ALTER TABLE stu CHANGE COLUMN phone mobile CHAR(11);
删除字段
sql
ALTER TABLE stu DROP COLUMN mobile;
修改表字符集
sql
ALTER TABLE stu CHARACTER SET utf8;
同时修改字段类型和字符集
sql
ALTER TABLE stu CHANGE name name CHAR(30) CHARACTER SET utf8;
设置字段默认值
sql
ALTER TABLE stu ALTER COLUMN gender SET DEFAULT 'M';
添加字段并设置默认值
sql
ALTER TABLE stu ADD is_del BOOL DEFAULT false;
ALTER TABLE stu MODIFY is_del BOOL DEFAULT true; -- 修改默认值
添加主键
sql
ALTER TABLE stu2 ADD PRIMARY KEY (id);
删除主键
sql
ALTER TABLE stu2 DROP PRIMARY KEY;
5.4 查看表状态
sql
-- 查看指定表状态
SHOW TABLE STATUS LIKE 'student'\G
-- 查看当前库所有表状态
SHOW TABLE STATUS FROM db1;
-- 查看所有存储引擎
SHOW ENGINES;
5.5 删除表
sql
DROP TABLE [IF EXISTS] tbl_name [, tbl_name] ...;
范例:
sql
DROP TABLE student2, student3;
DROP TABLE IF EXISTS student4;
六、本期知识点归纳一览表
| 类别 | 知识点 | 关键点/命令 |
|---|---|---|
| SQL 分类 | DDL / DML / DQL / DCL / TCL | 各司其职 |
| 字符集 | utf8mb4(推荐) |
SHOW CHARSET, SHOW VARIABLES LIKE 'character%' |
| 排序规则 | utf8mb4_0900_ai_ci(默认不区分大小写) |
SHOW COLLATION, SHOW VARIABLES LIKE 'collation%' |
| 数据库操作 | 创建、修改、删除 | CREATE DATABASE, ALTER DATABASE, DROP DATABASE |
| 数值类型 | INT, DECIMAL, TINYINT, BIGINT | 金额用 DECIMAL,年龄用 INT UNSIGNED |
| 日期类型 | DATETIME(推荐), DATE, TIMESTAMP | 注册时间用 DATETIME |
| 字符串类型 | VARCHAR(变长), CHAR(定长), TEXT, ENUM | 姓名用 VARCHAR,固定码用 CHAR |
| 列属性 | NOT NULL, DEFAULT, AUTO_INCREMENT, PRIMARY KEY | 主键通常为自增 INT |
| 创建表 | CREATE TABLE ... |
需指定引擎(InnoDB)、字符集 |
| 查看表 | SHOW TABLES, DESC, SHOW CREATE TABLE |
快速获取结构 |
| 复制表 | CREATE TABLE ... SELECT(含数据) CREATE TABLE ... LIKE(仅结构) |
灵活复用 |
| 修改表 | ALTER TABLE ADD/MODIFY/CHANGE/DROP/RENAME |
谨慎使用 DROP COLUMN |
| 删除表 | DROP TABLE |
不可恢复,慎用 |
下一期预告:SQL 语言之数据操作与单表查询(DML:INSERT/UPDATE/DELETE,DQL:SELECT 详解、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT、聚合函数等)。