多表查询 :当我们查询的多个字段不在同一张表中时就需要用到多表查询
连接条件:
自连接 vs 非自连接
等值连接 vs 非等值连接
内连接 vs 外连接
语法:sql92语法和sql99语法(主要使用sql99语法)
sql92语法
非自连接:连接的表不是同一张表
等值连接: 连接条件使用的是等号
内连接: 只查询两张表中匹配的内容
需求:查询员工的姓名和员工所在部门的名称
SELECT first_name,department_name
FROM employees JOIN departments
ON employees.department_id=departments.department_id;
非等值连接
需求:查询员工的姓名,薪水及薪水的等级
SELECT e.`first_name`,e.`salary`,j.`GRADE`
FROM employees e JOIN job_grades j
on e.`salary` >= j.`LOWEST_SAL` and e.`salary` <= j.`HIGHEST_SAL`;
ON e.`salary` BETWEEN j.`LOWEST_SAL` AND j.`HIGHEST_SAL`;
自连接:
需求:查询员的姓名及管理者的姓名
SELECT e1.`first_name` 员工的姓名,e2.`first_name` 管理者的姓名
FROM employees e1 JOIN employees e2 e1:员工表 e2:管理者表
ON e1.`manager_id`=e2.`employee_id`;
左外连接:查找所有的员工及员工所在的部门名称
SELECT e.`first_name`,d.`department_name`
FROM employees e LEFT JOIN departments d
ON e.`department_id`=d.`department_id`;
右外连接: 查找所有的部门及部门中所有的员工
SELECT e.`first_name`,d.`department_name`
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
满外连接:查找所有的员工及所有的部门
mysql不支持。
SELECT 字段名1,字段名2,...
FROM 表名1 full JOIN 表名2
ON 连接条件;
untion:将两张表的结果进行合并(去重)
untion all : 将两张表的结果进行合并(不去重)
左外连接
union
右外连接
SELECT e.`first_name`,d.`department_name`
FROM employees e LEFT JOIN departments d
ON e.`department_id`=d.`department_id`
UNION
SELECT e.`first_name`,d.`department_name`
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
补充
飘号 : ``
作用 :用来区分关键字和字段名