当前位置: 首页 > news >正文

MySQL多表查询核心指南

MySQL多表查询核心指南

一、多表关系与ER模型

1. 关系类型与实现方案

关系类型实现方式经典案例
多对多独立关联表+双外键学生选课系统
一对多多的一方添加外键部门-员工关系
一对一任意一方添加UNIQUE约束外键用户基础信息-详情表拆分

二、连接查询全解析

1. 七种JOIN操作可视化

2. 核心查询类型详解

/* 隐式内连接(WHERE过滤)*/
SELECT e.name, d.name 
FROM emp e, dept d 
WHERE e.dept_id = d.id;

/* 显式左外连接(保留左表全部记录)*/
SELECT e.*, d.name 
FROM emp e 
LEFT JOIN dept d ON e.dept_id = d.id;

/* 全外连接实现(MySQL兼容方案)*/
(SELECT * FROM emp LEFT JOIN dept ON emp.dept_id = dept.id)
UNION
(SELECT * FROM emp RIGHT JOIN dept ON emp.dept_id = dept.id);

3. 自连接场景实践

/* 员工-领导层级查询 */
SELECT worker.name AS 员工,
       manager.name AS 直属领导,
       super_mgr.name AS 上级领导
FROM emp worker
LEFT JOIN emp manager ON worker.manager_id = manager.id
LEFT JOIN emp super_mgr ON manager.manager_id = super_mgr.id;

三、子查询深度优化

1. 四种子查询类型对比

«interface»
SubQuery
+execute()
ScalarQuery
单值结果
=, > 比较运算符
ColumnQuery
列结果
IN, ANY, ALL
RowQuery
行结构
多列匹配
TableQuery
临时表
JOIN操作

2. 典型应用案例

/* 标量子查询(部门最高薪)*/
SELECT name, salary
FROM emp 
WHERE salary = (
    SELECT MAX(salary) 
    FROM emp 
    WHERE dept_id = 2
);

/* EXISTS替代IN(存在订单的用户)*/
SELECT *
FROM users u
WHERE EXISTS (
    SELECT 1 
    FROM orders 
    WHERE user_id = u.id
);

/* 派生表联合查询(近三月数据聚合)*/
SELECT d.name, COUNT(*) 
FROM (
    SELECT * 
    FROM emp 
    WHERE entry_date > DATE_SUB(NOW(), INTERVAL 3 MONTH)
) AS new_emp
JOIN dept d ON new_emp.dept_id = d.id
GROUP BY d.name;

四、性能优化策略

1. 查询执行分析工具

0 1 2 3 4 5 6 7 8 9 10 语法解析 逻辑优化 物理执行 结果处理 查询执行流程

2. 优化清单手册

  1. 索引策略
  • 为所有JOIN字段添加索引(最左前缀原则)
  • WHERE条件列使用复合索引
  1. 改写技巧
  • 用BETWEEN代替双条件比较
  • 将OR转换为UNION查询
  • 使用LIMIT分页优化
  1. 危险操作
  • 禁止在WHERE中使用函数计算:
    /* 错误示例 */
    WHERE YEAR(create_time) = 2023
    
    /* 正确写法 */
    WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'
    
  1. 最佳实践
  • 单次查询JOIN表不超过3个
  • 批量处理代替循环单条操作
  • NULL判断使用IS NULL替代= NULL

速查表总结

问题类型推荐解决方案
多表关联过滤显式INNER JOIN + WHERE
保留未匹配记录LEFT/RIGHT JOIN
层级关系查询自连接+递归CTE(MySQL 8.0+)
存在性验证EXISTS替代IN
分页优化使用游标代替OFFSET
大数据量统计物化视图+定期刷新

相关文章:

  • Unity程序嵌入Qt后点击UI按钮Button没有反应
  • 上海芯片企业列表
  • 豪越消防一体化安全管控平台:消防管理智能化
  • 《深度剖析SQL之WHERE子句:数据过滤的艺术》
  • uni-app:指引蒙层
  • chrome插件,绕过CSP限制,Refused to run the JavaScript URL问题
  • NameError: name ‘disclaim_key_flags‘ is not defined
  • Docker-从入门到实践
  • 平板实现 adb connect 连接的步骤
  • (C语言)学生信息表(基于通讯录改版)(测试版)(C语言项目)
  • 创作者会被AI取代吗?AIGC为电影行业带来新变革
  • CCF CSP 第34次(2024.06)(1_矩阵重塑(其一)_C++)
  • 【OCR】技术
  • 关于计算机视觉中的插值小记
  • Ansible:playbook实战案例
  • PaddleX产线集成功能的使用整理
  • 第21周:RestNet-50算法实践
  • 独立站怎么推广运营?详细教程和引流重点
  • 刚刚整理实测可用的股票数据API接口集合推荐:同花顺、雅虎API、智兔数服、聚合数据等Python量化分析各项数据全面丰富
  • 94二叉树中序遍历解题记录
  • 梅州网站建设公司/网站诊断分析
  • 图片设计制作/南宁百度seo优化
  • 如何利用js来做网站表单/seo推广培训费用
  • 怎么查看网站外链效果/自己有网站怎么推广
  • 仪征市建设发展有限公司网站/怎么建立网站平台
  • 网页设计介绍说明/北海百度seo