表连接

一、INNER JOIN(内连接)

返回两个表中匹配的行

-- 显式写法(推荐)
SELECT * 
FROM table1 
INNER JOIN table2 
ON table1.id = table2.table1_id;

-- 隐式写法
SELECT * 
FROM table1, table2 
WHERE table1.id = table2.table1_id;

二、LEFT JOIN(左连接)

返回左表所有行 + 右表匹配的行(不匹配则为NULL)

SELECT *
FROM table1
LEFT JOIN table2 
ON table1.id = table2.table1_id;

-- 只查左表有但右表没有的记录
SELECT *
FROM table1
LEFT JOIN table2 
ON table1.id = table2.table1_id
WHERE table2.table1_id IS NULL;

三、RIGHT JOIN(右连接)

返回右表所有行 + 左表匹配的行(不匹配则为NULL)

SELECT *
FROM table1
RIGHT JOIN table2 
ON table1.id = table2.table1_id;

四、FULL OUTER JOIN(全外连接)

MySQL不直接支持,但可通过UNION模拟

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.table1_id
UNION
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.table1_id
WHERE table1.id IS NULL;

五、CROSS JOIN(交叉连接)

返回笛卡尔积(所有可能的组合)

-- 显式写法
SELECT * 
FROM table1 
CROSS JOIN table2;

-- 隐式写法
SELECT * 
FROM table1, table2;

六、SELF JOIN(自连接)

表与自身连接

-- 查询员工的经理信息
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

七、NATURAL JOIN(自然连接)

自动根据相同列名连接(不推荐使用)

SELECT * 
FROM table1 
NATURAL JOIN table2;

八、USING 子句

当连接列名相同时的简化写法

SELECT *
FROM table1
JOIN table2 USING (id);  -- 等同于 ON table1.id = table2.id

九、多表连接

SELECT *
FROM orders o
JOIN customers c ON o.customer_id = c.id
JOIN products p ON o.product_id = p.id
LEFT JOIN shippers s ON o.shipper_id = s.id;

十、连接性能优化建议

  1. 使用索引:确保连接条件的列有索引

  2. 小表驱动大表:将小表放在前面

  3. **避免SELECT ***:只选择需要的列

  4. 注意NULL值:NULL会影响连接结果

  5. 使用EXPLAIN分析:查看执行计划

posted @ 2025-12-19 10:26  小胡666  阅读(4)  评论(0)    收藏  举报
39
0