语法:
SELECT
<查询>
FROM
<表名 1 > <连接类型>
JOIN <表名 2 > ON <连接条件>
WHERE
<筛选类型>
GROUP BY
<分组字段>
HAVING
<分组后筛选字段>
ORDER BY
<排序条件>
内连接
内连接使用关键字 inner。
等值连接
# 查询员工名、部门名。
SELECT
last_name,
department_name
FROM
employees e
INNER JOIN departments d ON e.department_id = d.department_id;
# 查询名字中包含 e 的员工名和工种名。
SELECT
last_name,
job_title
FROM
employees AS e
INNER JOIN jobs AS j ON e.job_id = j.job_id
WHERE
e.last_name LIKE '%e%';
# 查询部门个数 > 3 的城市名和部门个数。
SELECT
city,
COUNT(*)
FROM
departments AS d
INNER JOIN locations AS l ON d.location_id = l.location_id
GROUP BY
city
HAVING
COUNT(*) > 3;
# 查询哪个部门的员工个数 > 3 的部门名和员工个数,并按个数降序。
SELECT
COUNT(*),
department_name
FROM
employees AS e
INNER JOIN departments AS d ON e.department_id = d.department_id
GROUP BY
department_name
HAVING
COUNT(*) > 3
ORDER BY
COUNT(*) DESC;
# 查询员工名、部门名、工种名,并按照部门名降序(三表查询)。
SELECT
last_name,
department_name,
job_title
FROM
employees AS e
INNER JOIN departments AS d ON e.department_id = d.department_id
INNER JOIN jobs AS j ON e.job_id = j.job_id
ORDER BY
department_name DESC;
非等值连接
# 查询员工的工资级别
SELECT
salary,
grade_level
FROM
employees AS d
INNER JOIN job_grades AS jg ON d.salary BETWEEN jg.lowest_sal
AND jg.highest_sal;
自连接
# 查询姓名中包含 k 字符的员工的名字、上级的名字。
SELECT
e.last_name,
m.last_name
FROM
employees AS e
INNER JOIN employees AS m ON e.manager_id = m.employee_id
WHERE
e.last_name LIKE '%k%';
外连接
用于查询一个表中有的,而另一个表没有的记录。有主从表之分。
查询结果为主表中的所有记录。
- 如果从表中有和它匹配的,则显示匹配的值。
- 如果从表中没有和它匹配的,则显示 null。
外连接的结果 = 内连接结果 + 主表中有而从表中没有的记录。
外连接根据关键字的不同分为左外连接(Left)、右外连接(Right)、全外连接(Full)。
# 查询男朋友不在男神表的女神名(左外连接)
SELECT
b.NAME,
bo.*
FROM
beauty AS b
LEFT OUTER JOIN boys AS bo ON b.boyfriend_id = bo.id
WHERE
bo.id IS NULL;
# 查询哪个部门没有员工(右外连接)。
SELECT
d.*,
e.employee_id
FROM
employees AS e
RIGHT OUTER JOIN departments AS d ON d.department_id = e.department_id
WHERE
e.employee_id IS NULL;
全外连接没有主从表之分。
全外连接的结果 = 内连接的结果 + 表 1 中有的但表 2 中没有的 + 表 2 中有的但表 1 中没有的。
# 全外连接
SELECT
b.*,
bo.*
FROM
beauty AS b
FULL OUTER JOIN boys AS bo ON b.boyfriend_id = bo.id;
交叉连接
交叉连接其实就是笛卡尔乘积。
# 交叉连接
SELECT
b.*
FROM
beauty AS b
CROSS JOIN boys;
参考: