一、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;
十、连接性能优化建议
-
使用索引:确保连接条件的列有索引
-
小表驱动大表:将小表放在前面
-
**避免SELECT ***:只选择需要的列
-
注意NULL值:NULL会影响连接结果
-
使用EXPLAIN分析:查看执行计划