# 思考: 三张表不能合成一张表
#查询员工ID和部门名称
#错误示范,把每个员工和每个部门都排序一遍
SELECT employee_id,department_name
FROM employees,
SELECT * FROM employees;
正确操作
SELECT employee_id,department_name,departments.department_id
FROM employees,departments
#两个表的连接条件
WHERE employees.manager_id=departments.manager_id;
简化
SELECT employee_id,department_name,dep.department_id
FROM employees emp,departments dep
#两个表的连接条件
WHERE emp.manager_id=dep.manager_id;
SELECT emp.last_name,dep.department_name
FROM employees emp,departments dep
WHERE emp.department_id=dep.department_id; 连接条件
#如果查询中出现了两个表都有的字段,需要指出具体的表
#可以给表起别名,在SELECT和where中使用表别名
#如果给表起了别名,一但在SELECT和where中使用表别名,则必须使用表别名,而不能再使用原名
#从sql的优化角度来看,建议每个字段前都加上对应着的表名。
#简写只在一条语句中有效
#结论:如果有n个表实现多表查询,至少需要n-1连接条件。
#查询员工的employee_id,last_name,dep.department_name,city
SELECT e.employee_id,e.last_name,d.department_name,l.city
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id
and d.location_id=l.location_id;
#结论:如果有n个表实现多表查询,至少需要n-1连接条件。
#查询员工的employee_id,last_name,dep.department_name,city
SELECT e.employee_id,e.last_name,d.department_name,l.city
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id
and d.location_id=l.location_id;
#多表查询的分类
/*
角度1:等值连接 VS 非等值连接
角度2:自连接(自我引用)vs 非自连接
角度3:内连接 vs 外连接
*/
# 角度1:等值连接 VS 非等值连接
SELECT * FROM job_grades;
#查询名字月薪和对应的等级
SELECT last_name,salary,grade_level
FROM employees,job_grades
WHERE employees.salary
BETWEEN job_grades.lowest_sal
AND job_grades.highest_sal;
第二种方法
SELECT last_name,salary,grade_level
FROM employees,job_grades
WHERE employees.salary >= job_grades.lowest_sal
AND employees.salary <= job_grades.highest_sal;
#角度2:自连接(自我引用)vs 非自连接
SELECT * FROM employees;
#练习:查询员工的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;