[mysql]join操作+筛选

55 阅读1分钟

在SQL中,对两张表进行JOIN操作并同时对它们进行筛选,有几种常见的写法。

以下是详细的示例:

方法1:在WHERE子句中筛选

SELECT a.*, b.*
FROM table1 a
JOIN table2 b ON a.id = b.table1_id
WHERE a.column1 = 'value1' 
  AND b.column2 = 'value2';

方法2:在JOIN条件中筛选

SELECT a.*, b.*
FROM table1 a
JOIN table2 b ON a.id = b.table1_id 
               AND a.column1 = 'value1'
               AND b.column2 = 'value2';

方法3:使用子查询先筛选

SELECT a.*, b.*
FROM (SELECT * FROM table1 WHERE column1 = 'value1') a
JOIN (SELECT * FROM table2 WHERE column2 = 'value2') b
ON a.id = b.table1_id;

实际示例

假设有 users 表和 orders 表:

-- 查询年龄大于25的用户及其在2024年的订单
-- 方法1:WHERE筛选
SELECT u.name, u.age, o.order_date, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.age > 25 
  AND o.order_date >= '2024-01-01';

-- 方法2:JOIN条件中筛选
SELECT u.name, u.age, o.order_date, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id 
               AND u.age > 25
               AND o.order_date >= '2024-01-01';

-- 方法3:子查询筛选
SELECT u.name, u.age, o.order_date, o.amount
FROM (SELECT * FROM users WHERE age > 25) u
JOIN (SELECT * FROM orders WHERE order_date >= '2024-01-01') o
ON u.id = o.user_id;

不同JOIN类型的筛选

-- LEFT JOIN + 筛选
SELECT u.name, o.order_date
FROM users u
LEFT JOIN orders o ON u.id = o.user_id AND o.status = 'completed'
WHERE u.city = 'Beijing';

-- INNER JOIN + 筛选
SELECT u.name, o.order_date
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE u.city = 'Beijing' 
  AND o.status = 'completed';

性能建议

  1. 推荐方法1(WHERE子句):逻辑清晰,大多数数据库优化器能很好处理
  2. 对于大表:使用方法3(子查询)可以先减少数据量再进行JOIN
  3. LEFT JOIN时:右表的筛选条件放在ON子句中,左表的筛选条件放在WHERE子句中

选择哪种方法主要取决于具体的业务需求、数据量和可读性要求。