等值连接
为了确定一个雇员的部门名,需要比较 EMPLOYEES 表中的 DEPARTMENTID 列与DEPARTMENTS 表中的 DEPARTMENT_ID 列的值。在 EMPLOYEES 和DEPARTMENTS 表之间的关系是一个相等 (_equijoin) 关系,即,两 个 表 中DEPARTMENT_ID 列的值必须相等。
等值连接特点:
- 多表等值连接的结果为多表的交集部分;
- n表连接,至少需要n-1个连接条件;
- 多表不分主次,没有顺序要求;
- 一般为表起别名,提高阅读性和性能;
- 可以搭配排序、分组、筛选….等子句使用;
注意:等值连接也被称为简单连接 (simple joins) 或内连接 (inner joins)。
- SELECT 子句指定要返回的列名:
− employee last name、employee number 和 department number,这些是EMPLOYEES 表中的列
− department number、department name 和 location ID,这些是 DEPARTMENTS 表中的列
- FROM 子句指定数据库必须访问的两个表:
− EMPLOYEES 表
− DEPARTMENTS 表
- WHERE 子句指定表怎样被连接:EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID,因为 DEPARTMENT_ID 列是两个表的同名列,它必须用表名做前缀以避免混淆。
添加查询条件
除连接之外,可能还要求用 WHERE 子句在连接中限制一个或多个表中的行。
限制不明确的列名
- 需要在 WHERE 子句中用表的名字限制列的名字以避免含糊不清。没有表前缀,DEPARTMENT_ID 列可能来自 DEPARTMENTS 表,也可能来自 EMPLOYEES 表,这种情况下需要添加表前缀来执行查询。
- 如果列名在两个表之间不相同,就不需要限定列。但是,使用表前缀可以改善性能,因为MySQL服务器可以根据表前缀找到对应的列。
- 必须限定不明确的列名也适用于在其它子句中可能引起混淆的那些列,例如 SELECT子句或 ORDER BY 子句。
表别名定义原则
- 表别名不易过长,短一些更好。
- 表别名应该是有意义的。
- 表别名只对当前的 SELECT 语句有效。
示例一:
查询雇员 King 所在的部门名称。
select d.department_name
from employees e,departments d
where e.dept_id= d.department_id and e.last_name=’King’;
示例二:
显示每个雇员的 last name、departmentname 和 city。
SELECT 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;