MySQL 中的多表查询你必须要掌握。

107 阅读3分钟

作为后端Java程序员,mysql中多表关联是处理复杂数据的必备技能。本文用最通俗的方式,结合电商案例,带你快速掌握核心技巧。


一、为什么需要多表关联?

场景
电商系统中,用户信息、订单信息和商品信息分别存储在不同表中,查询"张三买了哪些商品"时,需要关联这些表。


二、3种核心关联方式

1. 内连接(INNER JOIN)

特点:只返回两表匹配的记录
示例:查询用户及其订单

	SELECT u.username, o.order_id, o.total_amount
	FROM user u
	INNER JOIN orders o ON u.id = o.user_id;

2. 左连接(LEFT JOIN)

特点:返回左表所有记录,右表无匹配则显示NULL
示例:查询所有用户(包括没有订单的用户)

	SELECT u.username, o.order_id
	FROM user u
	LEFT JOIN orders o ON u.id = o.user_id;

3. 子查询关联

特点:先执行子查询,再用结果关联主表
示例:查询购买过手机的用户

	SELECT u.username
	FROM user u
	WHERE u.id IN (
	    SELECT DISTINCT user_id 
	    FROM orders o 
	    JOIN order_item oi ON o.id = oi.order_id
	    JOIN product p ON oi.product_id = p.id
	    WHERE p.name LIKE '%手机%'

	);

三、电商案例实战

1. 表结构设计

	-- 用户表
	CREATE TABLE user (

	    id INT PRIMARY KEY,

	    name VARCHAR(50)

	);

	-- 订单表
	CREATE TABLE orders (
	    id INT PRIMARY KEY,
	    user_id INT,
	    amount DECIMAL(10,2),
	    FOREIGN KEY (user_id) REFERENCES user(id)

	);

	-- 订单商品表
	CREATE TABLE order_item (
	    id INT PRIMARY KEY,
	    order_id INT,
	    product_name VARCHAR(100),
	    quantity INT,
	    FOREIGN KEY (order_id) REFERENCES orders(id)

	);

2. 典型查询场景

场景1:查询用户订单详情

	SELECT 
	    u.name AS 用户名,
	    o.id AS 订单号,
	    oi.product_name AS 商品名,
	    oi.quantity AS 数量,
	    o.amount AS 总金额

	FROM 
	    user u
	JOIN 
	    orders o ON u.id = o.user_id
	JOIN 
	    order_item oi ON o.id = oi.order_id
	WHERE 
	    u.id = 1;  -- 查询ID为1的用户

场景2:统计每个用户的订单数

	SELECT 
	    u.name,
	    COUNT(o.id) AS 订单数,
	    SUM(o.amount) AS 总消费
	FROM 
	    user u
	LEFT JOIN 
	    orders o ON u.id = o.user_id
	GROUP BY 
	    u.id, u.name;

四、性能优化技巧

1. 必须做的事

  • 加索引:给关联字段(如user_id)加索引

    	ALTER TABLE orders ADD INDEX idx_user_id (user_id);
    
  • 减少数据量:只查询需要的字段,避免SELECT *

2. 不要做的事

  • 避免关联大表(超过10万行)
  • 避免多层嵌套关联(超过3层)

3. 分页优化

错误方式

	-- 当页码很大时会很慢
	SELECT * FROM orders LIMIT 100000, 20;

正确方式

	-- 使用游标分页(基于ID)
	SELECT * FROM orders 
	WHERE id > 100000  -- 上次查询的最后ID
	ORDER BY id 
	LIMIT 20;

五、常见问题解决

  1. 查询慢?

    • 先给关联字段加索引
    • EXPLAIN分析SQL执行计划
  2. 结果不对?

    • 检查关联条件是否正确(ON u.id = o.user_id
    • 检查表名/字段名是否拼写正确
  3. 报错"Unknown column"?

    • 确认字段确实存在于表中
    • 检查是否写错了表别名

总结

掌握多表关联只需记住:

  1. 明确关联关系(1对1/1对多)
  2. 选择合适的关联方式(INNER/LEFT)
  3. 给关联字段加索引
  4. 复杂查询拆分成简单查询

练习建议
在自己的MySQL中创建示例表,动手写SQL,效果远胜于只看不练!