8.1 SQL92标准中的查询
8.1.1等值连接
等值连接
为了确定一个雇员的部门名,需要比较 EMPLOYEES 表中的 DEPARTMENT_ID 列与DEPARTMENTS 表中的 DEPARTMENT_ID 列的值。在 EMPLOYEES 和DEPARTMENTS 表之间的关系是一个相等 (equijoin) 关系,即,两 个 表 中DEPARTMENT_ID 列的值必须相等。
等值连接特点:
- 多表等值连接的结果为多表的交集部分;
- n表连接,至少需要n-1个连接条件;
- 多表不分主次,没有顺序要求;
- 一般为表起别名,提高阅读性和性能;
- 可以搭配排序、分组、筛选….等子句使用;
注意:
等值连接也被称为简单连接 (simple joins) 或内连接 (inner joins)。
等值连接的使用
增加搜索条件
使用表别名
表别名定义原则
- 表别名不易过长,短一些更好。
- 表别名应该是有意义的。
- 表别名只对当前的 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;
8.1.2非等值连接
示例三:
查询所有雇员的薪水级别。
select e.last_name,j.grade_level from employees e ,job_grades j where e.salary between j.lowest_sal and j.highest_sal;
8.1.3自连接
自连接
连接一个表到它自己。有时需要连接一个表到它自己。为了找到每个雇员的经理的名字,则需要连接EMPLOYEES 表到它自己,或执行一个自连接。
图片中的例子连接 EMPLOYEES 表到它自己。为了在 FROM 子句中模拟两个表,对于相同的表 EMPLOYEES,用两个别名,分别为 worker 和 manager。在该例中,WHERE 子句包含的连接意味着 “一个工人的经理号匹配该经理的雇员号”。
示例一:
查询每个雇员的经理的名字以及雇员的名字,雇员名字列别名为W,经理列别名为M。
SELECT worker.LAST_NAME W,manager.LAST_NAME M from employees worker,employees manager where worker.MANAGER_ID = manager.EMPLOYEE_ID;
示例二:
查询Fox的经理是谁?显示他的名字。
SELECT worker.LAST_NAME,manager.LAST_NAME from employees worker,employees manager where worker.MANAGER_ID = manager.EMPLOYEE_ID AND worker.LAST_NAME = 'Fox';
8.2SQL99标准中的查询
8.2.1交叉连接
8.2.2自然连接
自然连接
连接只能发生在两个表中有相同名字和数据类型的列上。如果列有相同的名字,但数据类型不同,NATURAL JOIN 语法会引起错误。
自然连接也可以被写为等值连接:
SELECT d.department_id, d.department_name, d.location_id , l.city FROM departments d , locations l WHERE d.location_id = l.location_id;
8.2.3内连接
示例:
查询雇员名字为 Fox 的雇员 ID ,薪水与部门名称。
select e.employee_id,e.salary,d.department_name from employees e inner JOIN departments d on e.department_id = d.department_id where e.last_name = 'Fox';