避免笛卡尔积
在MySQL中如下情况会 出现 笛卡尔积: 不可取
#查询员工姓名和所在部门名称 SELECT last_name,department_name FROM employees,departments; SELECT last_name,department_name FROM employees CROSS JOIN departments; SELECT last_name,department_name FROM employees INNER JOIN departments; SELECT last_name,department_name FROM employees JOIN departments;
多表联查分类方式1:
SELECT e.employee_id, e.last_name, e.department_id,d.department_id, d.location_id FROM employees e , departments d WHERE e.department_id = d.department_id;
- 非等值连接
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;
多表联查分类方式2:
SELECT CONCAT(worker.last_name ,' works for ', manager.last_name) FROM employees worker, employees manager WHERE worker.manager_id = manager.employee_id ;
- 非自连接
略
多表联查分类方式3:
内连接: 合并多表具有同一列的行, 结果集中不包含多表中不匹配的行 。
- 内连接
SELECT e.employee_id, e.last_name, e.department_id,d.department_id, d.location_id FROM employees e JOIN departments d ON (e.department_id = d.department_id);
外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的 行 ,这种连接 称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。
除了查询满足条件的记录以外,外连接还可以查询某一方不满足条件的记录。
- 如果是左外连接,则连接条件中左边的表也称为 主表 ,右边的表称为 从表 。
- 如果是右外连接,则连接条件中右边的表也称为 主表 ,左边的表称为 从表 。
- 左外连接
SELECT e.last_name, e.department_id, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id) ;
- 右外连接
SELECT e.last_name, e.department_id, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id) ;
如图: