MySQL 数据库基础操作全解:从建库到增删改查

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,同时修改字段名和属性用 CHANGECOLUMN 关键字可以省略。

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 的核心操作流程:

  1. 库与表管理CREATE DATABASE, USE, CREATE TABLE, DROP TABLE, DESC
  2. 数据增删改查 (CRUD)INSERT, SELECT, UPDATE, DELETE/TRUNCATE
  3. 表结构维护ALTER TABLE 进行字段的增 (ADD)、删 (DROP)、改 (CHANGE/MODIFY)、表重命名 (RENAME)。
  4. 重要概念
    • 主键与自增:确保数据唯一性。
    • 约束NOT NULL, UNIQUE, DEFAULT, ENUM 保证数据完整性。
    • 条件子句WHEREUPDATEDELETE 中防止误操作。
    • 软删除 vs 硬删除:根据业务需求选择逻辑删除或物理删除。

掌握这些基础操作后,您已经能够独立完成大多数简单的数据库管理和数据操作任务。建议在本地或测试环境中反复练习,并始终牢记在生产环境执行 UPDATEDELETE 前,先使用 SELECT 确认 WHERE 条件是否正确。

相关推荐
Spider Cat 蜘蛛猫1 小时前
OIDC 联邦 SSO(复旦 OP / 清华 RP)完整全链路(纯标准OIDC、无User Storage SPI、含用户浏览器操作)
数据库·iam
oradh1 小时前
Oracle 11g单库升级至19c单库(dbua图形方式)
数据库·oracle·11g升级19c·dbua升级方式
王九思2 小时前
对称加密与非对称加密详解
java·网络·数据库
周杰伦的稻香2 小时前
(1071, ‘Specified key was too long; max key length is 767 bytes‘)
数据库·mysql
Leo.yuan2 小时前
数据目录和数据字典有什么区别?一文讲清
大数据·数据库·人工智能
全堆鸿蒙2 小时前
鸿蒙应用开发实战【37】— 数据统计:countByStatus 聚合查询
数据库·华为·harmonyos·鸿蒙系统
惜分飞2 小时前
记录block 0损坏,数据文件大量坏块,使用不当数据库版本恢复等各种操作之后的故障处理---惜分飞
数据库·block0损坏·ora-17503
执笔论英雄2 小时前
【大模型推理】redis kv cache
数据库·redis·缓存
渣渣灰飞2 小时前
MySQL 系统学习 第六阶段:Redis + 缓存 + 高并发设计 第八章:Redis 高级应用
学习·mysql·缓存