语法:

  1. SELECT
  2. <查询>
  3. FROM
  4. <表名 1 > <连接类型>
  5. JOIN <表名 2 > ON <连接条件>
  6. WHERE
  7. <筛选类型>
  8. GROUP BY
  9. <分组字段>
  10. HAVING
  11. <分组后筛选字段>
  12. ORDER BY
  13. <排序条件>

内连接

内连接使用关键字 inner。

等值连接

  1. # 查询员工名、部门名。
  2. SELECT
  3. last_name,
  4. department_name
  5. FROM
  6. employees e
  7. INNER JOIN departments d ON e.department_id = d.department_id;
  8. # 查询名字中包含 e 的员工名和工种名。
  9. SELECT
  10. last_name,
  11. job_title
  12. FROM
  13. employees AS e
  14. INNER JOIN jobs AS j ON e.job_id = j.job_id
  15. WHERE
  16. e.last_name LIKE '%e%';
  17. # 查询部门个数 > 3 的城市名和部门个数。
  18. SELECT
  19. city,
  20. COUNT(*)
  21. FROM
  22. departments AS d
  23. INNER JOIN locations AS l ON d.location_id = l.location_id
  24. GROUP BY
  25. city
  26. HAVING
  27. COUNT(*) > 3;
  28. # 查询哪个部门的员工个数 > 3 的部门名和员工个数,并按个数降序。
  29. SELECT
  30. COUNT(*),
  31. department_name
  32. FROM
  33. employees AS e
  34. INNER JOIN departments AS d ON e.department_id = d.department_id
  35. GROUP BY
  36. department_name
  37. HAVING
  38. COUNT(*) > 3
  39. ORDER BY
  40. COUNT(*) DESC;
  41. # 查询员工名、部门名、工种名,并按照部门名降序(三表查询)。
  42. SELECT
  43. last_name,
  44. department_name,
  45. job_title
  46. FROM
  47. employees AS e
  48. INNER JOIN departments AS d ON e.department_id = d.department_id
  49. INNER JOIN jobs AS j ON e.job_id = j.job_id
  50. ORDER BY
  51. department_name DESC;

非等值连接

  1. # 查询员工的工资级别
  2. SELECT
  3. salary,
  4. grade_level
  5. FROM
  6. employees AS d
  7. INNER JOIN job_grades AS jg ON d.salary BETWEEN jg.lowest_sal
  8. AND jg.highest_sal;

自连接

  1. # 查询姓名中包含 k 字符的员工的名字、上级的名字。
  2. SELECT
  3. e.last_name,
  4. m.last_name
  5. FROM
  6. employees AS e
  7. INNER JOIN employees AS m ON e.manager_id = m.employee_id
  8. WHERE
  9. e.last_name LIKE '%k%';

外连接

用于查询一个表中有的,而另一个表没有的记录。有主从表之分。

查询结果为主表中的所有记录。

  • 如果从表中有和它匹配的,则显示匹配的值。
  • 如果从表中没有和它匹配的,则显示 null。

外连接的结果 = 内连接结果 + 主表中有而从表中没有的记录。

外连接根据关键字的不同分为左外连接(Left)、右外连接(Right)、全外连接(Full)。

  1. # 查询男朋友不在男神表的女神名(左外连接)
  2. SELECT
  3. b.NAME,
  4. bo.*
  5. FROM
  6. beauty AS b
  7. LEFT OUTER JOIN boys AS bo ON b.boyfriend_id = bo.id
  8. WHERE
  9. bo.id IS NULL;
  10. # 查询哪个部门没有员工(右外连接)。
  11. SELECT
  12. d.*,
  13. e.employee_id
  14. FROM
  15. employees AS e
  16. RIGHT OUTER JOIN departments AS d ON d.department_id = e.department_id
  17. WHERE
  18. e.employee_id IS NULL;

全外连接没有主从表之分。

全外连接的结果 = 内连接的结果 + 表 1 中有的但表 2 中没有的 + 表 2 中有的但表 1 中没有的。

  1. # 全外连接
  2. SELECT
  3. b.*,
  4. bo.*
  5. FROM
  6. beauty AS b
  7. FULL OUTER JOIN boys AS bo ON b.boyfriend_id = bo.id;

交叉连接

交叉连接其实就是笛卡尔乘积。

  1. # 交叉连接
  2. SELECT
  3. b.*
  4. FROM
  5. beauty AS b
  6. CROSS JOIN boys;

参考: