🌟 嗨,我是Lethehong!🌟
🌍 立志在坚不欲说,成功在久不在速🌍
🚀 欢迎关注:👍点赞⬆️留言收藏🚀
🍀欢迎使用:小智初学计算机网页IT深度知识智能体
🚀个人博客:Lethehong有一起互链的朋友可以私信我
✅GPT体验码:https://gitee.com/lethehong/chatgpt-share
✅GPT体验码:私信博主~免费领取体验码
Lethehong诚邀您加入社群,送您海量编程资源,DeepSeek资料包,各种线上线下活动等你来开启,快来占据你得一席之地吧!
【人工智能教程】——人工智能学习者的未来战舰!这个平台用"星际探索"模式重构AI教育:从机器学习基础到多模态大模型实战,每个技术栈都化身可交互的太空舱。上周我在「Transformer空间站」通过修复对话系统的注意力漏洞,竟掌握了BERT的微调精髓!平台三大核心引擎:
点击启航:前言 – 人工智能教程 → 让你的AI能力光年跃迁!
优质专栏:
热点时事
星辰瀚海——Linux秘境之操作系统
Python在手,bug溜走!码农的快乐,你不懂~
目录
一、MySQL简介与理论基础
关系型数据库核心概念
MySQL架构
存储引擎
MySQL数据类型
二、数据库和表的基本操作
数据库操作语法详解
表操作语法详解
三、增:INSERT 插入数据
插入语法详解
实际应用场景
四、查:SELECT 查询数据
SELECT语法详解
排序与ORDER BY子句
分组和聚合函数
限制结果数量
模糊查询与LIKE操作符
正则表达式查询
实际应用场景
五、改:UPDATE 更新数据
UPDATE语法详解
更新单个记录
更新多个字段
条件更新与表达式
多表更新
实际应用场景
六、删:DELETE 删除数据
DELETE语法详解
删除特定记录
条件删除
限制删除数量
多表删除
清空表
DELETE与TRUNCATE的区别
实际应用场景
七、总结
一、MySQL简介与理论基础
MySQL是世界上最流行的开源关系型数据库管理系统之一,广泛应用于网站、应用程序和企业级系统。它采用客户端/服务器架构,支持多用户环境,并基于SQL(结构化查询语言)标准。
关系型数据库核心概念
关系模型:数据以表格(二维表)形式存储,表之间通过关系连接
ACID特性:
-
原子性(Atomicity):事务中的操作要么全部完成,要么全部不完成
-
一致性(Consistency):事务执行前后,数据库从一个一致状态变到另一个一致状态
-
隔离性(Isolation):并发执行的事务之间不会互相影响
-
持久性(Durability):事务一旦提交,其结果将永久保存
MySQL架构
MySQL采用多层架构设计:
连接层:处理客户端连接请求
服务层:包括查询解析、优化和缓存
存储引擎层:负责数据的存储和提取
文件系统层:将数据持久化到磁盘
存储引擎
MySQL支持多种存储引擎,每种都有特定的特性和用途:
-
InnoDB:默认存储引擎,支持事务、外键和行级锁
CREATE TABLE example (id INT) ENGINE=InnoDB;
-
MyISAM:适合读密集型应用,支持全文索引
CREATE TABLE logs (id INT, message TEXT) ENGINE=MyISAM;
-
Memory:将数据存储在内存中,速度极快但不持久
CREATE TABLE temp_data (id INT) ENGINE=MEMORY;
-
Archive:适合存储和检索大量很少被查询的历史数据
CREATE TABLE old_logs (id INT, log_text TEXT) ENGINE=ARCHIVE;
MySQL数据类型
数值类型:
-
INT:整数类型,4字节
-
TINYINT:小整数,1字节
-
BIGINT:大整数,8字节
-
FLOAT/DOUBLE:浮点数
-
DECIMAL:精确小数
字符串类型:
-
CHAR(n):固定长度字符串
-
VARCHAR(n):可变长度字符串
-
TEXT:长文本
日期和时间类型:
-
DATE:日期,格式'YYYY-MM-DD'
-
TIME:时间,格式'HH:MM:SS'
-
DATETIME:日期和时间,格式'YYYY-MM-DD HH:MM:SS'
-
TIMESTAMP:时间戳
其他类型:
-
ENUM:枚举类型
-
SET:集合类型
-
BLOB:二进制大对象
二、数据库和表的基本操作
数据库操作语法详解
— 创建数据库
CREATE DATABASE [IF NOT EXISTS] mydb
[CHARACTER SET charset_name]
[COLLATE collation_name];
— 查看所有数据库
SHOW DATABASES;
— 使用数据库
USE mydb;
— 删除数据库
DROP DATABASE [IF EXISTS] mydb;
表操作语法详解
— 创建表
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY, — 主键,自动递增
name VARCHAR(50) NOT NULL, — NOT NULL约束
age INT CHECK (age > 0), — CHECK约束
gender ENUM('男', '女'), — 枚举类型
class VARCHAR(20),
score FLOAT DEFAULT 0, — 默认值
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, — 自动记录创建时间
INDEX idx_class (class) — 索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
— 查看表结构
DESCRIBE students;
— 或
SHOW COLUMNS FROM students;
— 修改表结构
ALTER TABLE students ADD COLUMN email VARCHAR(100);
ALTER TABLE students MODIFY COLUMN name VARCHAR(100);
ALTER TABLE students DROP COLUMN email;
— 删除表
DROP TABLE [IF EXISTS] students;
三、增:INSERT 插入数据
插入语法详解
基本语法:
INSERT INTO table_name [(column1, column2, …)]
VALUES (value1, value2, …)[, (value1, value2, …), …];
插入单条数据
INSERT INTO students (name, age, gender, class, score)
VALUES ('张三', 20, '男', '计算机科学1班', 89.5);
插入多条数据
INSERT INTO students (name, age, gender, class, score) VALUES
('李四', 19, '男', '计算机科学1班', 76.0),
('王五', 21, '男', '计算机科学2班', 92.5),
('赵六', 20, '女', '计算机科学2班', 85.0),
('钱七', 22, '女', '计算机科学1班', 79.5);
INSERT的高级用法
— 插入或更新(如果主键存在则更新)
INSERT INTO students (id, name, score)
VALUES (1, '张三', 95)
ON DUPLICATE KEY UPDATE score = 95;
— 从其他表插入数据
INSERT INTO students_backup
SELECT * FROM students WHERE class = '计算机科学1班';
— 忽略错误继续执行
INSERT IGNORE INTO students (id, name, age)
VALUES (1, '张三', 20);
实际应用场景
当新学生入学时,需要将学生信息录入系统:
— 新学期开始,添加一批新生
INSERT INTO students (name, age, gender, class, score) VALUES
('刘备', 18, '男', '计算机1班', NULL), — 新生还没有成绩
('关羽', 19, '男', '计算机1班', NULL),
('张飞', 18, '男', '计算机1班', NULL);
四、查:SELECT 查询数据
SELECT语法详解
基本语法:
SELECT [DISTINCT] column1, column2, …
FROM table_name
[JOIN table_name2 ON join_condition]
[WHERE condition]
[GROUP BY column(s)]
[HAVING group_condition]
[ORDER BY column(s) [ASC|DESC]]
[LIMIT offset, row_count];
查询所有记录
SELECT * FROM students;
查询特定列
SELECT name, age, score FROM students;
条件查询与WHERE子句详解
— 查询计算机科学1班的学生
SELECT * FROM students WHERE class = '计算机科学1班';
— 查询成绩大于80的学生
SELECT name, score FROM students WHERE score > 80;
— 查询年龄在19到21岁之间的学生
SELECT * FROM students WHERE age BETWEEN 19 AND 21;
— 复合条件:AND, OR, NOT
SELECT * FROM students
WHERE (class = '计算机科学1班' OR class = '计算机科学2班')
AND score >= 80
AND NOT gender = '女';
— NULL值处理
SELECT * FROM students WHERE score IS NULL;
SELECT * FROM students WHERE score IS NOT NULL;
排序与ORDER BY子句
— 按成绩降序排列
SELECT * FROM students ORDER BY score DESC;
— 先按班级升序,再按成绩降序
SELECT * FROM students ORDER BY class ASC, score DESC;
— 按字段位置排序(不推荐,但需了解)
SELECT name, age, score FROM students ORDER BY 3 DESC; — 按第3列(score)排序
分组和聚合函数
— 计算每个班级的平均分
SELECT class, AVG(score) as avg_score FROM students GROUP BY class;
— 查找每个班级的最高分和最低分
SELECT
class,
MAX(score) as highest_score,
MIN(score) as lowest_score,
COUNT(*) as student_count,
SUM(score) as total_score,
STDDEV(score) as score_deviation — 标准差
FROM students
WHERE score IS NOT NULL
GROUP BY class;
— HAVING子句(对分组结果进行筛选)
SELECT class, AVG(score) as avg_score
FROM students
GROUP BY class
HAVING avg_score > 80;
限制结果数量
— 查询前3名学生
SELECT * FROM students ORDER BY score DESC LIMIT 3;
— 分页查询:每页5条,查询第2页
SELECT * FROM students LIMIT 5, 5; — 偏移量5,返回5条
— 或使用更现代的语法
SELECT * FROM students LIMIT 5 OFFSET 5;
模糊查询与LIKE操作符
— 查询名字中包含"张"的学生
SELECT * FROM students WHERE name LIKE '%张%';
— 查询以"计算机"开头的班级
SELECT DISTINCT class FROM students WHERE class LIKE '计算机%';
— 通配符说明
— %:匹配任意数量的字符
— _:匹配单个字符
SELECT * FROM students WHERE name LIKE '张_'; — 匹配"张"后跟一个字符的名字
正则表达式查询
— 查询名字中包含数字的学生
SELECT * FROM students WHERE name REGEXP '[0-9]';
— 查询名字以"张"或"王"开头的学生
SELECT * FROM students WHERE name REGEXP '^[张王]';
实际应用场景
期末考试后,教师需要统计班级情况:
— 查询每个班级的及格率
SELECT
class,
COUNT(*) as total_students,
SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) as passed_students,
ROUND(SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) / COUNT(*) * 100, 2) as pass_rate
FROM students
WHERE score IS NOT NULL
GROUP BY class;
五、改:UPDATE 更新数据
UPDATE语法详解
基本语法:
UPDATE table_name
SET column1 = value1, column2 = value2, …
[WHERE condition]
[ORDER BY …]
[LIMIT row_count];
更新单个记录
— 更新张三的成绩
UPDATE students SET score = 92.0 WHERE name = '张三';
更新多个字段
— 李四转班并更新信息
UPDATE students
SET class = '计算机科学2班', age = 20
WHERE name = '李四';
条件更新与表达式
— 给所有90分以上的学生加5分奖励(但不超过100分)
UPDATE students
SET score = LEAST(score + 5, 100)
WHERE score > 90;
— 所有学生年龄增加1岁
UPDATE students SET age = age + 1;
— 使用CASE表达式进行条件更新
UPDATE students
SET score = CASE
WHEN score < 60 THEN score + 5 — 不及格加5分
WHEN score >= 60 AND score < 90 THEN score + 3 — 良好加3分
ELSE score — 优秀不变
END;
多表更新
— 基于另一个表的数据更新当前表
UPDATE students s
JOIN student_extra_info sei ON s.id = sei.student_id
SET s.email = sei.email, s.phone = sei.phone
WHERE sei.update_flag = 1;
实际应用场景
期中考试后,某些学生参加了补考,需要更新成绩:
— 批量更新补考成绩
UPDATE students
SET score = CASE
WHEN name = '李四' THEN 82.5
WHEN name = '钱七' THEN 88.0
ELSE score
END
WHERE name IN ('李四', '钱七');
六、删:DELETE 删除数据
DELETE语法详解
基本语法:
DELETE FROM table_name
[WHERE condition]
[ORDER BY …]
[LIMIT row_count];
删除特定记录
— 删除指定学生
DELETE FROM students WHERE name = '赵六';
条件删除
— 删除成绩不及格的学生
DELETE FROM students WHERE score < 60;
限制删除数量
— 删除成绩最低的3名学生
DELETE FROM students
ORDER BY score ASC
LIMIT 3;
多表删除
— 删除已经在毕业生表中的学生
DELETE s FROM students s
JOIN graduated_students g ON s.id = g.student_id;
清空表
— 删除表中所有数据(逐行删除,可回滚)
DELETE FROM students;
— 或者(直接删除表并重建,效率更高,不可回滚)
TRUNCATE TABLE students;
DELETE与TRUNCATE的区别
事务支持:DELETE支持事务回滚,TRUNCATE不支持
速度:TRUNCATE通常更快
自增值:TRUNCATE会重置AUTO_INCREMENT计数器
触发器:DELETE会触发DELETE触发器,TRUNCATE不会
实际应用场景
学期结束,需要清理临时学生数据:
— 删除已经毕业的学生
DELETE FROM students WHERE id IN (
SELECT id FROM graduated_students
);
— 假设要删除旧学期的数据并保留新学期数据
— 创建备份
CREATE TABLE students_new_semester AS
SELECT * FROM students WHERE entry_year = 2025;
— 清空原表
TRUNCATE TABLE students;
— 将新数据插回原表
INSERT INTO students
SELECT * FROM students_new_semester;
— 删除临时表
DROP TABLE students_new_semester;
七、总结
这篇文章全面介绍了MySQL数据库系统的核心知识,涵盖了MySQL的基础理论、架构和存储引擎,以及数据库与表的基本操作(创建、查看、修改、删除)。文章系统地讲解了SQL的四大操作:INSERT(数据插入)、SELECT(数据查询,包括条件查询、排序、分组、聚合等高级功能)、UPDATE(数据更新)和DELETE(数据删除),并为每种操作提供了丰富的语法示例和实际应用场景。这是一份适合从入门到进阶的MySQL学习指南,结构清晰,实例丰富,既包含了语法详解,又结合了实际场景应用,对于数据库初学者和需要查阅参考的开发者都具有很高的实用价值。
评论前必须登录!
注册