迪卡尔集
笛卡尔集会在下面条件下产生:
省略连接条件
连接条件无效
所有表中的所有行互相连接
为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件。
使用连接多表连接查询
在 where字句写加入连接条件
在表中有相同列事,在表名之前加上表名前缀
等价连接
select e.department_id,d.department_id,l.city
from employees e,departments d,locations l
where e.department_id = d.department_id
and l.location_id = d.location_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;
外连接
- 使用外连接可以查询不满足连接条件的数据
- 外连接的符号是 (+)。
右外连接
左外连接(+)在右边
SELECT e.last_name, e.department_id, d.department_name,d.department_id
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id ;
交集
使用CROSS JOIN 子句使连接的表产生叉集。
叉集和笛卡尔集是相同的。
SELECT last_name, department_name,employee_id
FROM employees cross join departments --不能写on
自然连接
NATURAL JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。
在表中查询满足等值条件的数据。
SELECT department_id, department_name,location_id, city
FROM departments natural join locations
使用using
SELECT e.employee_id, e.last_name, d.location_id
FROM employees e join departments d
USING (department_id)
使用ON 子句创建连接(常用)
自然连接中是以具有相同名字的列为连接条件的。
可以使用 ON 子句指定额外的连接条件。
这个连接条件是与其它条件分开的。
ON 子句使语句具有更高的易读性。
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);
使用 ON 子句创建多表连接
select employee_id,city,department_name,l.location_id
from employees e join departments d
on e.department_id = d.department_id
join locations l
on d.location_id = l.location_id
满外连接
--两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行 ,
--这种连接称为满外连接
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON (e.department_id = d.department_id) ;