多表查询的分类
多表查询可分为3个角度
角度一:等值连接 & 非等值连接
1、等值连接
需求:查询员工号,员工姓名,部门名。
SELECT emp.employeeId,emp.employeeName,dept.departmentName
FROM employees emp,departments dept
WHERE emp.departmentId = dept.departmentId
2、非等值连接
需求:查询员工号,员工姓名,员工薪水,员工薪水的评级。
SELECT emp.employeeId,emp.employeeName,emp.salary,job.grade_level
FROM employees emp,job_grades job
WHERE emp.salary BETWEEN job.lowest_sal AND job.highest_sal
注意:规定在 job_grades 表中,1000元到2000元为C档工资,2000元到5000元为B档工资,5000元到10000元为A档工资。
角度二:自连接 & 非自连接
(一张表自己跟自己所连接为自连接,如果跨表连接为非自连接)
1、自连接
需求:查询员工编号、员工姓名、员工上司编号、员工上司的姓名。
(这几个字段都在同一张表中)
SELECT emp.employeeId,emp.employeeName,mgr.employeeId,mgr.employeeName
FROM employees emp,employees mgr
WHERE emp.managerId = mgr.employeeId
2、非自连接
同上述等值连接例子
角度三:内连接 & 外连接
1、内连接
定义:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行(交集)
需求:查询员工编号、部门名称。
SELECT emp.employeeId,dept.departmentName
FROM employees emp,departments dept
WHERE emp.departmentId = dept.departmentId
2、外连接
定义:合并具有同一列的两个以上的表的行,结果集中除了包含一个表与另一个表匹酊的行之外,还查询到了左表或右表中不匹配的行。(并集)
根据定义可知:外连接还可分为 左外连接、右外连接、满外连接。
左外连接:
定义:两个表在连接过程中除了返回满足连接条件的行以外还返回左表中不满足条件的行,这种连接称为左外连接。
需求:查询所有员工的姓名、部门名称。(左外连接)
SELECT emp.employeeId,dept.departmentName
FROM employees emp LEFT JOIN departments dept
ON emp.departmentId = dept.departmentId
右外连接
定义:两个表在连接过程中除了返回满足连接条件的行以外还返回右表中不满足条件的行,这种连接称为右外连接。
需求:查询员工的姓名、所有部门名称。(左外连接)
SELECT emp.employeeId,dept.departmentName
FROM employees emp RIGHT JOIN departments dept
ON emp.departmentId = dept.departmentId
满外连接
定义:两个表在连接过程中除了返回满足连接条件的行以外还返回左、右表中不满足条件的行,这种连接称为满外连接。
需求:查询所有员工的姓名、所有部门名称。(左外连接)
SELECT emp.employeeId,dept.departmentName
FROM employees emp FULL JOIN departments dept
ON emp.departmentId = dept.departmentId
注:mysql不支持 FULL JOIN 这种写法。