3.多表查询的分类
#7.多表查询的分类
/*
角度1:等值连接 vs 非等值连接
角度2:自连接 vs 非自连接
角度3:内连接 vs 外连接
*/
等值连接 vs 非等值连接
SELECT *
FROM job_grades; #非等值连接,薪资是在一个范围内然后定等级
SELECT last_name,salary,grade_level
FROM employees e,job_grades j
WHERE e.`salary` BETWEEN j.`lowest_sal` AND highest_sal;
非等值连接,薪资是在一个范围内然后定等级
自连接 vs 非自连接
SELECT *FROM employees;
#自连接的例子:都在一张表,自己连接自己
#练习:查询员工id,员工姓名,及其管理者的id和姓名
#查询语句中出现了多个表中都存在的字段,则必须指明此字段所在的表
SELECT emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name
FROM employees emp, employees mgr
WHERE emp.`manager_id`=mgr.`employee_id`;
内连接 vs 外连接
内连接
#内连接:合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
# 通俗来说就是只满足他俩匹配的
SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.`department_id`=d.`department_id`; #有一个人没有部门所以只有106
外连接
#外连接的分类:左外连接、右外连接、满外连接
#左外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左表中不满足条件的
# 行,这种连接称为左外连接。
#右外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回右表中不满足条件的
# 行,这种连接称为右外连接。
左外连接
#SQL92语法实现外连接:使用+ ---MySQL不支持SQL92语法中外连接的写法
SELECT employee_id,department_name
FROM employees e,departments d #(需要左外连接,因为左边的107,右边106)
WHERE e.`department_id`=d.`department_id`(+);
#SQL99语法中使用JOIN...ON的方式实现多表的查询。这种方式也能解决外连接的问题
#SQL99语法实现外连接:
#练习:查询所有的员工的last_name,department_name信息
#左外连接:(左边多,有人没有部门)
select last_name,department_name
from employees e left outer join departments d
on e.`department_id`=d.`department_id`;
右外连接
#右外连接:(右边多,有些部门没有人)
SELECT last_name,department_name
FROM employees e RIGHT OUTER JOIN departments d
ON e.`department_id`=d.`department_id`;
满外连接
#满外连接:把两边和中间的全加上 1+106+16
#mysql不支持FULL OUTER JOIN
SELECT last_name,department_name
FROM employees e FULL OUTER JOIN departments d
ON e.`department_id`=d.`department_id`;