🌟 嗨,我是Lethehong!🌟

🌍 立志在坚不欲说,成功在久不在速🌍

🚀 欢迎关注:👍点赞⬆️留言收藏🚀

🍀欢迎使用:小智初学计算机网页IT深度知识智能体

🚀个人博客:Lethehong有一起互链的朋友可以私信我

GPT体验码https://gitee/lethehong/chatgpt-share

GPT体验码:私信博主~免费领取体验码

Lethehong诚邀您加入社群,送您海量编程资源,DeepSeek资料包,各种线上线下活动等你来开启,快来占据你得一席之地吧! 

【人工智能教程】——人工智能学习者的未来战舰!这个平台用"星际探索"模式重构AI教育:从机器学习基础到多模态大模型实战,每个技术栈都化身可交互的太空舱。上周我在「Transformer空间站」通过修复对话系统的注意力漏洞,竟掌握了BERT的微调精髓!平台三大核心引擎:

  1. 工业级沙盘:复刻字节跳动推荐算法系统,用真实点击数据训练你的排序模型
  2. 智能调试舱:代码错误会被三维可视化,梯度消失问题竟用银河系粒子动画演示
  3. 大厂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;
  1. READ UNCOMMITTED:可以读取未提交的数据(脏读)

  2. READ COMMITTED:只能读取已提交的数据

  3. REPEATABLE READ:MySQL默认级别,确保同一事务中多次读取结果一致

  4. 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;

索引类型

  1. B-Tree索引:默认索引类型,适用于等值查询和范围查询

  2. 哈希索引:仅适用于等值比较,Memory引擎支持

  3. 全文索引:用于全文搜索

    CREATE FULLTEXT INDEX idx_fulltext ON articles(title, content);
  4. 空间索引:用于地理空间数据

    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;

视图的优点

  1. 简化复杂查询:将复杂查询封装为视图

  2. 提高安全性:限制用户只能访问视图中的特定列

  3. 数据独立性:应用程序使用视图,底层表结构变化时不需要修改应用

五、存储过程与函数

存储过程是一组预编译的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;

触发器类型

  1. BEFORE触发器:在操作执行前触发

  2. AFTER触发器:在操作执行后触发

  3. 行级触发器:对每一行执行一次(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的权限系统分为四个级别:

  1. 全局级别:适用于所有数据库

  2. 数据库级别:适用于特定数据库中的所有对象

  3. 表级别:适用于特定表

  4. 列级别:适用于特定列

八、备份与恢复

数据备份是数据库管理的关键部分:

# 使用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

逻辑备份与物理备份

  1. 逻辑备份

    • 以SQL语句形式保存数据(如mysqldump)

    • 优点:可跨版本、平台迁移,可选择性恢复

    • 缺点:备份和恢复速度较慢,尤其是大型数据库

  2. 物理备份

    • 直接复制数据文件(如MySQL Enterprise Backup, Percona XtraBackup)

    • 优点:备份和恢复速度快

    • 缺点:通常依赖于特定MySQL版本和平台

备份策略

  1. 完整备份:备份整个数据库

    # 完整备份
    mysqldump -u root -p --all-databases > full_backup.sql
    
  2. 增量备份:仅备份自上次备份以来的变化

    # 使用二进制日志进行增量备份
    mysqlbinlog mysql-bin.000001 > incremental_backup.sql
    
  3. 差异备份:备份自上次完整备份以来的所有变化

备份选项与参数 

# 包含存储过程和函数
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高级特性指南,适合已掌握基础知识并希望进阶的数据库开发人员和管理员参考。