🌟 嗨,我是Lethehong!🌟
🌍 立志在坚不欲说,成功在久不在速🌍
🚀 欢迎关注:👍点赞⬆️留言收藏🚀
🍀欢迎使用:小智初学计算机网页IT深度知识智能体
🚀个人博客:Lethehong有一起互链的朋友可以私信我
✅GPT体验码:https://gitee/lethehong/chatgpt-share
✅GPT体验码:私信博主~免费领取体验码
Lethehong诚邀您加入社群,送您海量编程资源,DeepSeek资料包,各种线上线下活动等你来开启,快来占据你得一席之地吧!
【人工智能教程】——人工智能学习者的未来战舰!这个平台用"星际探索"模式重构AI教育:从机器学习基础到多模态大模型实战,每个技术栈都化身可交互的太空舱。上周我在「Transformer空间站」通过修复对话系统的注意力漏洞,竟掌握了BERT的微调精髓!平台三大核心引擎:
- 工业级沙盘:复刻字节跳动推荐算法系统,用真实点击数据训练你的排序模型
- 智能调试舱:代码错误会被三维可视化,梯度消失问题竟用银河系粒子动画演示
- 大厂AI工坊:开放京东智能客服训练框架,零距离接触千万级对话语料库
独创的「元宇宙研习」模式更震撼——戴上VR头盔即刻潜入神经网络内部,亲眼见证卷积核如何捕捉图像特征!新用户注册即送《AIGC实战宝典》+100小时Tesla V100算力卡,隐藏口令【AI_Captain】可解锁谷歌DeepMind课程解密版。点击启航:前言 – 人工智能教程 → 让你的AI能力光年跃迁!
优质专栏:
热点时事
星辰瀚海——Linux秘境之操作系统
Python在手,bug溜走!码农的快乐,你不懂~
目录
一、高级查询技巧
连接查询详解
子查询详解
公用表表达式(CTE)
窗口函数
二、事务控制
事务隔离级别
保存点
三、索引与性能优化
索引类型
EXPLAIN分析查询
查询优化
四、视图
视图的优点
五、存储过程与函数
存储过程的高级特性
六、触发器
触发器类型
七、用户管理与权限控制
权限级别
八、备份与恢复
逻辑备份与物理备份
备份策略
备份选项与参数
自动备份
备份验证与恢复测试
九、总结
一、高级查询技巧
连接查询详解
MySQL支持多种连接类型:
-
INNER JOIN(内连接):返回两表中匹配的行
-
LEFT JOIN(左连接):返回左表所有行和右表匹配的行
-
RIGHT JOIN(右连接):返回右表所有行和左表匹配的行
-
CROSS JOIN(交叉连接):返回两表的笛卡尔积
假设我们有一个课程表:
CREATE TABLE courses (
course_id INT AUTO_INCREMENT PRIMARY KEY,
course_name VARCHAR(50) NOT NULL,
teacher VARCHAR(30),
credits INT
);
CREATE TABLE student_courses (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT,
course_id INT,
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);
-- 插入一些数据
INSERT INTO courses (course_name, teacher, credits) VALUES
('数据库原理', '陈教授', 3),
('计算机网络', '王教授', 4),
('操作系统', '李教授', 4);
INSERT INTO student_courses (student_id, course_id) VALUES
(1, 1), (1, 2), (2, 1), (3, 3), (4, 2), (5, 3);
连接查询示例:
-- 内连接:查询学生及其选修的课程
SELECT s.name, c.course_name, c.teacher
FROM students s
JOIN student_courses sc ON s.id = sc.student_id
JOIN courses c ON sc.course_id = c.course_id
ORDER BY s.name;
-- 左连接:查询所有学生,包括未选课的
SELECT s.name, IFNULL(c.course_name, '未选课') as course
FROM students s
LEFT JOIN student_courses sc ON s.id = sc.student_id
LEFT JOIN courses c ON sc.course_id = c.course_id
ORDER BY s.name;
-- 右连接:查询所有课程,包括无人选修的
SELECT c.course_name, IFNULL(s.name, '无人选修') as student
FROM student_courses sc
RIGHT JOIN courses c ON sc.course_id = c.course_id
LEFT JOIN students s ON sc.student_id = s.id
ORDER BY c.course_name;
-- 自连接:查找同班同学
SELECT s1.name, s2.name as classmate
FROM students s1
JOIN students s2 ON s1.class = s2.class AND s1.id != s2.id
ORDER BY s1.class, s1.name;
子查询详解
子查询是嵌套在另一个查询中的SELECT语句,可以用在:
-
SELECT子句
-
FROM子句
-
WHERE子句
-
HAVING子句
-- WHERE子句中的子查询
-- 查询选修了"数据库原理"课程的学生
SELECT name, age, class
FROM students
WHERE id IN (
SELECT student_id
FROM student_courses
WHERE course_id = (SELECT course_id FROM courses WHERE course_name = '数据库原理')
);
-- FROM子句中的子查询(派生表)
-- 查询每个班级的平均分,并与学生个人分数比较
SELECT s.name, s.score, c.avg_score,
s.score - c.avg_score as difference
FROM students s
JOIN (
SELECT class, AVG(score) as avg_score
FROM students
GROUP BY class
) c ON s.class = c.class
ORDER BY difference DESC;
-- SELECT子句中的子查询(标量子查询)
-- 查询每个学生选修的课程数量
SELECT s.name, s.class,
(SELECT COUNT(*) FROM student_courses WHERE student_id = s.id) AS course_count
FROM students s
ORDER BY course_count DESC;
-- EXISTS子查询
-- 查询至少选修了一门课程的学生
SELECT name, class
FROM students s
WHERE EXISTS (
SELECT 1 FROM student_courses
WHERE student_id = s.id
);
公用表表达式(CTE)
CTE是一种临时结果集,可以在单个SQL语句中多次引用:
-- 使用WITH子句定义CTE
WITH ClassAvg AS (
SELECT class, AVG(score) as avg_score
FROM students
GROUP BY class
),
ClassRanking AS (
SELECT s.id, s.name, s.score, s.class,
RANK() OVER (PARTITION BY s.class ORDER BY s.score DESC) as class_rank
FROM students s
)
-- 使用定义的CTE
SELECT r.name, r.score, r.class, r.class_rank, c.avg_score
FROM ClassRanking r
JOIN ClassAvg c ON r.class = c.class
WHERE r.class_rank <= 3
ORDER BY r.class, r.class_rank;
窗口函数
窗口函数对一组行执行计算,返回每行的值:
-- 计算每个班级中学生的排名
SELECT name, score, class,
RANK() OVER (PARTITION BY class ORDER BY score DESC) as class_rank,
DENSE_RANK() OVER (PARTITION BY class ORDER BY score DESC) as dense_rank,
ROW_NUMBER() OVER (PARTITION BY class ORDER BY score DESC) as row_num
FROM students;
-- 计算累计总和
SELECT name, score, class,
SUM(score) OVER (PARTITION BY class ORDER BY score) as running_total,
AVG(score) OVER (PARTITION BY class) as class_avg
FROM students;
二、事务控制
事务是一组操作,要么全部成功,要么全部失败。
-- 开始事务
START TRANSACTION;
-- 执行操作
UPDATE students SET score = score + 10 WHERE id = 1;
UPDATE courses SET credits = credits + 1 WHERE course_id = 2;
-- 如果一切正常,提交事务
COMMIT;
-- 如果出现问题,回滚事务
-- ROLLBACK;
事务隔离级别
MySQL支持四种事务隔离级别:
-- 查看当前隔离级别
SELECT @@TRANSACTION_ISOLATION;
-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-
READ UNCOMMITTED:可以读取未提交的数据(脏读)
-
READ COMMITTED:只能读取已提交的数据
-
REPEATABLE READ:MySQL默认级别,确保同一事务中多次读取结果一致
-
SERIALIZABLE:最高级别,完全串行执行
保存点
在长事务中,可以设置保存点,回滚到特定位置:
START TRANSACTION;
UPDATE students SET score = score + 5 WHERE id = 1;
SAVEPOINT point1;
UPDATE students SET score = score + 10 WHERE id = 2;
-- 如果需要,可以回滚到保存点
ROLLBACK TO SAVEPOINT point1;
-- 继续事务
UPDATE students SET score = score + 15 WHERE id = 3;
COMMIT;
三、索引与性能优化
索引是提高查询性能的关键:
-- 创建索引
CREATE INDEX idx_student_name ON students(name);
-- 创建复合索引
CREATE INDEX idx_class_score ON students(class, score);
-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON students(email);
-- 查看表的索引
SHOW INDEX FROM students;
-- 删除索引
DROP INDEX idx_student_name ON students;
索引类型
-
B-Tree索引:默认索引类型,适用于等值查询和范围查询
-
哈希索引:仅适用于等值比较,Memory引擎支持
-
全文索引:用于全文搜索
CREATE FULLTEXT INDEX idx_fulltext ON articles(title, content);
-
空间索引:用于地理空间数据
CREATE SPATIAL INDEX idx_location ON places(location);
EXPLAIN分析查询
-- 分析查询执行计划
EXPLAIN SELECT * FROM students WHERE class = '计算机科学1班' AND score > 80;
查询优化
-- 使用FORCE INDEX强制使用特定索引
SELECT * FROM students FORCE INDEX (idx_class_score)
WHERE class = '计算机科学1班' AND score > 80;
-- 使用STRAIGHT_JOIN控制连接顺序
SELECT STRAIGHT_JOIN s.name, c.course_name
FROM students s
JOIN student_courses sc ON s.id = sc.student_id
JOIN courses c ON sc.course_id = c.course_id;
四、视图
视图是基于SQL查询的虚拟表,可以简化复杂查询:
-- 创建视图
CREATE VIEW student_course_view AS
SELECT s.id, s.name, s.class, c.course_name, c.teacher
FROM students s
JOIN student_courses sc ON s.id = sc.student_id
JOIN courses c ON sc.course_id = c.course_id;
-- 使用视图
SELECT * FROM student_course_view WHERE class = '计算机科学1班';
-- 更新视图(如果基表允许)
UPDATE student_course_view SET name = '张三丰' WHERE id = 1;
-- 删除视图
DROP VIEW student_course_view;
视图的优点
-
简化复杂查询:将复杂查询封装为视图
-
提高安全性:限制用户只能访问视图中的特定列
-
数据独立性:应用程序使用视图,底层表结构变化时不需要修改应用
五、存储过程与函数
存储过程是一组预编译的SQL语句,可以接受参数并执行复杂操作:
-- 创建存储过程
DELIMITER //
CREATE PROCEDURE update_student_score(IN student_id INT, IN new_score FLOAT)
BEGIN
UPDATE students SET score = new_score WHERE id = student_id;
-- 条件语句
IF new_score >= 90 THEN
INSERT INTO honor_students (student_id, honor_type)
VALUES (student_id, '优秀学生');
END IF;
END //
DELIMITER ;
-- 调用存储过程
CALL update_student_score(1, 95);
-- 创建函数
DELIMITER //
CREATE FUNCTION get_grade(score FLOAT) RETURNS CHAR(1)
DETERMINISTIC
BEGIN
DECLARE grade CHAR(1);
IF score >= 90 THEN
SET grade = 'A';
ELSEIF score >= 80 THEN
SET grade = 'B';
ELSEIF score >= 70 THEN
SET grade = 'C';
ELSEIF score >= 60 THEN
SET grade = 'D';
ELSE
SET grade = 'F';
END IF;
RETURN grade;
END //
DELIMITER ;
-- 使用函数
SELECT name, score, get_grade(score) as grade FROM students;
存储过程的高级特性
DELIMITER //
CREATE PROCEDURE process_new_students(IN class_name VARCHAR(50))
BEGIN
-- 声明变量
DECLARE done INT DEFAULT FALSE;
DECLARE s_id INT;
DECLARE s_name VARCHAR(50);
-- 声明游标
DECLARE student_cursor CURSOR FOR
SELECT id, name FROM students
WHERE class = class_name AND score IS NULL;
-- 声明异常处理
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 开始事务
START TRANSACTION;
-- 打开游标
OPEN student_cursor;
-- 循环处理
read_loop: LOOP
FETCH student_cursor INTO s_id, s_name;
IF done THEN
LEAVE read_loop;
END IF;
-- 为新生创建初始记录
INSERT INTO student_records (student_id, status)
VALUES (s_id, 'active');
END LOOP;
-- 关闭游标
CLOSE student_cursor;
-- 提交事务
COMMIT;
END //
DELIMITER ;
六、触发器
触发器是在表上执行特定操作(INSERT、UPDATE、DELETE)时自动执行的特殊存储过程:
-- 创建触发器
DELIMITER //
CREATE TRIGGER after_student_update
AFTER UPDATE ON students
FOR EACH ROW
BEGIN
-- 记录成绩变化
IF OLD.score != NEW.score THEN
INSERT INTO score_changes (student_id, old_score, new_score, change_date)
VALUES (NEW.id, OLD.score, NEW.score, NOW());
END IF;
END //
DELIMITER ;
-- 查看触发器
SHOW TRIGGERS;
-- 删除触发器
DROP TRIGGER after_student_update;
触发器类型
-
BEFORE触发器:在操作执行前触发
-
AFTER触发器:在操作执行后触发
-
行级触发器:对每一行执行一次(FOR EACH ROW)
七、用户管理与权限控制
MySQL提供了完善的用户管理和权限控制系统:
-- 创建用户
CREATE USER 'teacher'@'localhost' IDENTIFIED BY 'password123';
-- 授予权限
GRANT SELECT, UPDATE ON school.students TO 'teacher'@'localhost';
-- 授予所有权限
GRANT ALL PRIVILEGES ON school.* TO 'admin'@'localhost';
-- 查看用户权限
SHOW GRANTS FOR 'teacher'@'localhost';
-- 撤销权限
REVOKE UPDATE ON school.students FROM 'teacher'@'localhost';
-- 删除用户
DROP USER 'teacher'@'localhost';
权限级别
MySQL的权限系统分为四个级别:
-
全局级别:适用于所有数据库
-
数据库级别:适用于特定数据库中的所有对象
-
表级别:适用于特定表
-
列级别:适用于特定列
八、备份与恢复
数据备份是数据库管理的关键部分:
# 使用mysqldump备份数据库
mysqldump -u root -p school > school_backup.sql
# 备份特定表
mysqldump -u root -p school students courses > tables_backup.sql
# 恢复数据库
mysql -u root -p school < school_backup.sql
逻辑备份与物理备份
-
逻辑备份:
-
以SQL语句形式保存数据(如mysqldump)
-
优点:可跨版本、平台迁移,可选择性恢复
-
缺点:备份和恢复速度较慢,尤其是大型数据库
-
-
物理备份:
-
直接复制数据文件(如MySQL Enterprise Backup, Percona XtraBackup)
-
优点:备份和恢复速度快
-
缺点:通常依赖于特定MySQL版本和平台
-
备份策略
-
完整备份:备份整个数据库
# 完整备份 mysqldump -u root -p --all-databases > full_backup.sql
-
增量备份:仅备份自上次备份以来的变化
# 使用二进制日志进行增量备份 mysqlbinlog mysql-bin.000001 > incremental_backup.sql
-
差异备份:备份自上次完整备份以来的所有变化
备份选项与参数
# 包含存储过程和函数
mysqldump -u root -p --routines school > school_with_routines.sql
# 包含触发器
mysqldump -u root -p --triggers school > school_with_triggers.sql
# 包含事件
mysqldump -u root -p --events school > school_with_events.sql
# 锁定表以确保一致性
mysqldump -u root -p --lock-tables school > school_locked.sql
# 使用单个事务进行一致性备份
mysqldump -u root -p --single-transaction school > school_consistent.sql
自动备份
使用cron作业自动执行备份:
# 在crontab中添加以下内容,每天凌晨2点执行备份
0 2 * * * /usr/bin/mysqldump -u root -p'password' school > /backup/school_$(date +\%Y\%m\%d).sql
备份验证与恢复测试
定期测试备份的有效性:
# 创建测试数据库
mysql -u root -p -e "CREATE DATABASE school_test;"
# 恢复备份到测试数据库
mysql -u root -p school_test < school_backup.sql
# 验证数据
mysql -u root -p -e "SELECT COUNT(*) FROM school_test.students;"
九、总结
这篇文章深入探讨了MySQL的高级应用技术,包括复杂的连接查询(内连接、左连接、右连接、自连接)、子查询、公用表表达式(CTE)和窗口函数等高级查询技巧;详细讲解了事务控制机制(隔离级别、保存点);介绍了索引创建和性能优化方法(索引类型、EXPLAIN分析、查询优化);阐述了视图、存储过程与函数、触发器等数据库编程对象的应用;还涵盖了用户权限管理以及数据库备份与恢复策略等实用技术,是一份全面的MySQL高级特性指南,适合已掌握基础知识并希望进阶的数据库开发人员和管理员参考。
发布评论