1. 引言
MySQL 作为最流行的开源关系型数据库之一,是 Web 开发、数据存储和后台服务的核心组件。掌握其基础操作是每一位开发者、数据分析师乃至运维人员的必备技能。本文将以一个学生信息管理场景为例,系统讲解 MySQL 中数据库、数据表的创建、删除,以及数据的插入、查询、更新、删除(CRUD)和表结构修改等核心操作。通过清晰的 SQL 语句示例和分步解析,帮助您快速上手并理解 MySQL 的基础语法与最佳实践。
2. 环境准备与数据库创建
在开始操作前,请确保您已安装并启动了 MySQL 服务(如 MySQL 8.0 或 MariaDB),并可以通过命令行客户端(如 mysql)或图形化工具(如 MySQL Workbench, Navicat)连接到数据库服务器。
首先,我们创建一个名为 abc 的数据库,并切换到该数据库进行后续操作。
sql
-- 创建数据库
CREATE DATABASE abc;
-- 使用数据库
USE abc;
代码说明:
CREATE DATABASE abc;:创建一个名为abc的数据库。USE abc;:将当前会话的默认数据库切换为abc,后续所有操作(如表创建、数据查询)都将在此数据库中进行。
3. 数据表操作
3.1 删除与创建学生表
为了避免重复创建表导致错误,通常先检查并删除已存在的同名表,然后再创建新表。
sql
-- 删除数据表(如果存在)
DROP TABLE IF EXISTS student;
-- 创建学生表
CREATE TABLE s (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '编号',
s_name VARCHAR(20) UNIQUE NOT NULL COMMENT '姓名',
age INT NOT NULL COMMENT '年龄',
sex ENUM('男', '女', '未知') DEFAULT '未知' COMMENT '性别',
s_sno CHAR(12) UNIQUE NOT NULL COMMENT '学号',
tel char(11) NOT NULL COMMENT '手机号',
start_time DATE DEFAULT (current_date) comment '入学时间'
);
表结构解析:
id:主键,自动递增,作为每条记录的唯一标识。s_name:学生姓名,VARCHAR(20)类型,UNIQUE约束确保姓名不重复,NOT NULL表示该字段必填。age:年龄,整型,必填。sex:性别,使用ENUM类型限定值只能为 '男'、'女' 或 '未知',默认值为 '未知'。s_sno:学号,定长字符串,唯一且必填。tel:手机号,定长字符串,必填。start_time:入学时间,日期类型,默认值为当前日期 (current_date)。
3.2 查看表结构与数据
创建表后,可以使用以下命令查看表的结构和已有数据。
sql
-- 查看数据表结构
DESC s;
-- 查询表中全部数据
SELECT * FROM s;
4. 数据操作(CRUD)
4.1 插入数据 (Create)
向表中插入数据有多种语法,适应不同场景。
sql
-- 2-1. 完整的插入数据语句
-- 语法:INSERT INTO table_name(column1, column2, column3) VALUES (value1, value2, value3);
INSERT INTO s(id, s_name, age, sex, s_sno, tel, start_time) VALUES (1, '张三', 18, '男', '202607150001', '12345678901', NOW());
-- 2-2. 部分插入数据语句(为指定列插入值)
INSERT INTO s(id, s_name, age, sex, s_sno, tel, start_time) VALUES (2, '李四', 18, '男', '202607150002', '12345678905', NOW());
-- 2-3. 使用 NULL 占位插入自增主键数据
-- 对于 AUTO_INCREMENT 的 id 字段,插入 NULL 或省略该字段,数据库会自动生成递增值。
-- 如果删除了某条数据 再次插入数据 id会在最大值(包括已经删除的id)的基础上+1
-- 此时还可以使用删除的不存在的id进行插入数据,但是不推荐
INSERT INTO s(id, s_name, age, sex, s_sno, tel, start_time) VALUES (NULL, '王五', 18, '男', '202607150003', '12345678906', NOW());
-- 2-4. 使用 DEFAULT 关键字插入默认值
-- 对于有默认值的字段(如 sex 的 '未知',start_time 的当前日期),可以使用 DEFAULT 关键字。
INSERT INTO s(s_name, age, sex, s_sno, tel, start_time) VALUES ('赵六', 18, '男', '202607150004', '12345678907', DEFAULT);
-- 2-5. 省略字段列表的插入语句(必须为所有列提供值,且顺序与表定义一致)
INSERT INTO s VALUES (NULL, '孙七', 18, '男', '202607150005', '12345678908', '2026-01-01');
4.2 查询数据 (Read)
查询是数据库最常用的操作,使用 SELECT 语句。
sql
-- 1. 查询全部数据
SELECT * FROM s;
-- 2. 带条件的查询:查询状态为"在读"的数据(假设已添加 status 字段)
-- SELECT * FROM s WHERE status = '在读';
-- 3. 查询特定列
SELECT s_name, age FROM s;
-- 4. 带排序的查询
SELECT * FROM s ORDER BY age DESC;
4.3 更新数据 (Update)
使用 UPDATE 语句修改表中已有的数据。
sql
-- 3-3. 修改数据:将 id 为 1 的学生的手机号更新
UPDATE s SET tel = '11111111111' WHERE id = 1;
注意 :WHERE 子句至关重要,它指定了要更新哪些行。如果省略 WHERE,将更新表中的所有行,这通常是严重的事故。
4.4 删除数据 (Delete)
删除操作需谨慎,分为逻辑删除(软删除)和物理删除(硬删除)。
4.4.1 物理删除(硬删除)
数据将从表中永久移除。
sql
-- 4-2. 删除符合条件的数据
DELETE FROM s WHERE id = 1;
-- 4-3. 清空数据表(删除所有行,但保留表结构,下回数据可以从id为1开始)
TRUNCATE TABLE s;
-- 4-4. 删除数据表(删除表结构和所有数据)
DROP TABLE s;
4.4.2 逻辑删除(软删除)
在实际业务中,为了保留数据历史或防止误删,常采用软删除。即通过一个标志位(如 status 字段)来标记数据是否"被删除",而非真正从数据库移除。
首先,我们需要为表添加一个状态字段:
sql
-- 为表添加状态字段,用于软删除
ALTER TABLE s ADD COLUMN status ENUM('在读', '毕业') DEFAULT '在读' COMMENT '状态' AFTER tel;
然后,通过更新该字段来实现"删除"和"恢复":
sql
-- 4-5-1: 执行软删除(将 id 为 6 的学生状态改为'毕业')
UPDATE s SET status = '毕业' WHERE id = 6;
-- (1) 查询已被软删除的数据
SELECT * FROM s WHERE status = '毕业';
-- (2) 查询正常(在读)数据
SELECT * FROM s WHERE status = '在读';
-- (3) 查询全部数据(包括已"删除"的)
SELECT * FROM s;
-- 4-5-2:恢复软删除的数据(将状态改回'在读')
UPDATE s SET status = '在读' WHERE id = 6;
5. 修改数据表结构
随着业务变化,可能需要对已存在的表进行结构调整。
常用语法格式
sql
ALTER TABLE<表名>[修改选项]
[修改选项]
{ADD COLUMN <列名><类型>}
|CHANGE COLUMN<旧列名><新列名><新列类型>
|ALTER COLUMN<列名>{SET DEFAULT<默认值>|DROP DEFAULT}
|MODIFY COLUMN<列名><类型>
|DROP COLUMN<列名>
|RENAME TO<新表名>}
5.1 添加与删除字段
sql
-- 3-1-1. 添加字段
ALTER TABLE s ADD COLUMN status ENUM('在读', '毕业') DEFAULT '在读' COMMENT '状态' AFTER tel;
-- 3-1-2. 删除字段
ALTER TABLE s DROP COLUMN status;
5.2 修改字段名与类型
sql
-- 3-1-3. 修改字段名(同时也可修改类型)
-- 语法:ALTER TABLE table_name CHANGE COLUMN old_column_name new_column_name datatype;
ALTER TABLE s CHANGE COLUMN tel phone CHAR(11) NOT NULL COMMENT '手机号';
-- 3-1-4. 仅修改字段属性(类型、约束等)
-- 语法:ALTER TABLE table_name MODIFY COLUMN column_name new_datatype;
ALTER TABLE s MODIFY COLUMN tel CHAR(12) NOT NULL COMMENT '手机号';
总结 :修改字段名用 CHANGE,仅修改字段属性用 MODIFY,同时修改字段名和属性用 CHANGE。COLUMN 关键字可以省略。
5.3 修改表名与主键
sql
-- 3-2. 修改表名
ALTER TABLE s RENAME TO student;
-- 3-4. 添加主键和设置自增(如果建表时未设置)
-- 先设置主键
ALTER TABLE s ADD PRIMARY KEY (id);
-- 再设置自增属性
ALTER TABLE s MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT COMMENT '编号';
6. 总结
本文通过一个完整的 学生表(s) 案例,系统演示了 MySQL 的核心操作流程:
- 库与表管理 :
CREATE DATABASE,USE,CREATE TABLE,DROP TABLE,DESC。 - 数据增删改查 (CRUD) :
INSERT,SELECT,UPDATE,DELETE/TRUNCATE。 - 表结构维护 :
ALTER TABLE进行字段的增 (ADD)、删 (DROP)、改 (CHANGE/MODIFY)、表重命名 (RENAME)。 - 重要概念 :
- 主键与自增:确保数据唯一性。
- 约束 :
NOT NULL,UNIQUE,DEFAULT,ENUM保证数据完整性。 - 条件子句 :
WHERE在UPDATE和DELETE中防止误操作。 - 软删除 vs 硬删除:根据业务需求选择逻辑删除或物理删除。
掌握这些基础操作后,您已经能够独立完成大多数简单的数据库管理和数据操作任务。建议在本地或测试环境中反复练习,并始终牢记在生产环境执行 UPDATE 和 DELETE 前,先使用 SELECT 确认 WHERE 条件是否正确。