MySQL多表查询实战指南:从SQL到XML映射的完整实现(2W+字深度解析)
第一章 多表查询基础与核心原理
1.1 关系型数据库设计范式
以电商系统为例的三范式实践:
-- 原始数据表(违反第三范式)
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_name VARCHAR(50),
product_name VARCHAR(50),
product_category VARCHAR(20)
);
-- 规范化后的设计
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(50),
category_id INT
);
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
product_id INT
);
1.2 七种JOIN类型全解
-- 内连接(获取有订单的客户)
SELECT c.name, o.order_date
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id;
-- 左外连接(获取所有客户及其订单)
SELECT c.name, o.order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id;
-- 全外连接模拟(MySQL不支持FULL OUTER JOIN)
SELECT c.name, o.order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
UNION
SELECT c.name, o.order_date
FROM customers c
RIGHT JOIN orders o ON c.id = o.customer_id;
1.3 子查询进阶应用
-- 相关子查询(查询每个客户的最近订单)
SELECT c.name,
(SELECT MAX(order_date)
FROM orders o
WHERE o.customer_id = c.id) AS last_order
FROM customers c;
-- 派生表查询(统计部门平均工资)
SELECT d.name, emp_stats.avg_salary
FROM departments d
JOIN (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id
) emp_stats ON d.id = emp_stats.dept_id;
第二章 MyBatis XML映射深度解析
2.1 基础映射标签详解
<!-- 订单基础映射 -->
<resultMap id="BaseOrderMap" type="com.example.Order">
<id column="id" property="id"/>
<result column="order_no" property="orderNumber"/>
<result column="create_time" property="createTime"/>
</resultMap>
<!-- 包含客户信息的复杂映射 -->
<resultMap id="OrderWithCustomerMap" extends="BaseOrderMap" type="Order">
<association property="customer" javaType="Customer">
<id column="customer_id" property="id"/>
<result column="customer_name" property="name"/>
<result column="customer_email" property="email