MySQL多表查询实战指南:从SQL到XML映射的完整实现(2W+字深度解析)

发布于:2025-04-10 ⋅ 阅读:(38) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到