/*
演绎式:提出问题1----->解决问题1---->提出问题2----->解决问题2
归纳式:总--分
*/
# 多表查询的分类
/*
角度1:等值连接 vs 非等值连接
角度2:自连接(自我引用) vs 非自连接
角度3:内连接 vs 外连接
*/
#角度1:等值连接 vs 非等值连接
#非等值连接
SELECT * FROM job_grades;
#查询名字,月薪和对应的等级
SELECT e.last_name,e.salary,j.grade_level
FROM employees e,job_grades j
WHERE e.salary BETWEEN j.lowest_sal AND j.highest_sal;
SELECT e.last_name,e.salary,j.grade_level
FROM employees e,job_grades j
WHERE e.salary >= j.lowest_sal AND
e.salary <= j.highest_sal;
#角度2:自连接(自我引用 自恋) 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;
#公司老大没有管理者
#角度3:内连接 vs 外连接
#内连接:合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
#上面写的都是内连接,举例
SELECT employee_id,department_name
FROM employees,departments
WHERE employees.department_id=departments.department_id;
#只有106条记录
#可能有的员工没有部门,可能有的部门(新部门)没有对应的员工
#外连接:合并具有同一列的两个以上的表的行, 结果集中除了包含一个表与另一个表匹配的行之外,还查询到了左表或右表中不匹配的行
#外连接的分类:左外连接、右外连接、满外连接
#左外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左表中不满足条件的行,这种连接称为左连接
#右外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回右表中不满足条件的行,这种连接称为右连接
#查询所有员工的employee_id,department_name信息
SELECT employee_id,department_name
FROM departments,employees
WHERE employees.department_id=departments.department_id;
#(需要使用左外连接)
#SQL92语法实现内连接:见上
#SQL92语法实现外连接,使用+(MySQL不支持SQL92语法中外连接的写法)
SELECT employee_id,department_name
FROM departments,employees
WHERE employees.department_id=departments.department_id(+);