概念

因为内连接中,连接的两个表中必须要有可以连接的字段才能,进行有效的操作。

而外连接就是操作没有必然联系的两个表。

左连接:两个表连接之后,保留左边的。即查询的结果条数始终大于等于左边的表。

右连接:同理。

语法中的OUTER可以省略。

  1. -- 引入:查询男朋友 不在男神表的的女神名
  2. SELECT * FROM beauty;
  3. SELECT * FROM boys;
  4. -- 左外连接
  5. SELECT b.*,bo.*
  6. FROM boys bo
  7. LEFT OUTER JOIN beauty b
  8. ON b.`boyfriend_id` = bo.`id`
  9. WHERE b.`id` IS NULL;
  10. -- 案例1:查询哪个部门没有员工
  11. -- 左外
  12. SELECT d.*,e.employee_id
  13. FROM departments d
  14. LEFT OUTER JOIN employees e
  15. ON d.`department_id` = e.`department_id`
  16. WHERE e.`employee_id` IS NULL;
  17. -- 右外
  18. SELECT d.*,e.employee_id
  19. FROM employees e
  20. RIGHT OUTER JOIN departments d
  21. ON d.`department_id` = e.`department_id`
  22. WHERE e.`employee_id` IS NULL;
  23. -- 案例2:查询编号>3的女神的男朋友信息,如果有则列出详细,如果没有,用null填充
  24. SELECT b.id,b.name,bo.*
  25. FROM beauty b
  26. LEFT OUTER JOIN boys bo
  27. ON b.`boyfriend_id` = bo.`id`
  28. WHERE b.`id`>3;
  29. -- 案例3:查询哪个城市没有部门
  30. SELECT city
  31. FROM departments d
  32. RIGHT OUTER JOIN locations l
  33. ON d.`location_id`=l.`location_id`
  34. WHERE d.`department_id` IS NULL;
  35. -- 案例4:查询部门名为SALIT的员工信息
  36. SELECT e.*,d.department_name,d.`department_id`
  37. FROM departments d
  38. LEFT JOIN employees e
  39. ON d.`department_id` = e.`department_id`
  40. WHERE d.`department_name` IN('SAL','IT');
  41. SELECT * FROM departments
  42. WHERE `department_name` IN('SAL','IT');
  43. -- 全外,但是MySQL不支持该连接
  44. -- 全外等价于,左连接+右连接。即两个表中对方没有的都使用Null填充。
  45. USE girls;
  46. SELECT b.*,bo.*
  47. FROM beauty b
  48. FULL OUTER JOIN boys bo
  49. ON b.`boyfriend_id` = bo.id;