MySQL5.7 支持部分的SQL99 标准。
示例:
使用交叉连接查询 employees 表与 departments 表。
select * from employees cross join departments;
自然连接
连接只能发生在两个表中有相同名字和数据类型的列上。如果列有相同的名字,但数据类型不同,NATURAL JOIN 语法会引起错误。
自然连接查询
在图片例子中,LOCATIONS 表被用 LOCATION_ID 列连接到 DEPARTMENT表,这是在两个表中唯一名字相同的列。如果存在其它的同名同类型的列,自然连接会使用等值连接的方式连接他们,连接条件的关系为and。
自然连接也可以被写为等值连接:
SELECT d.department_id, d.department_name,
d.location_id , l.city
FROM
departments d , locations l
WHERE
d.location_id = l.location_id;
示例:
使用自然连接查询所有有部门的雇员的名字以及部门名称。
select e.last_name,d.department_name from employees e natural join departments d;
语法:
用ON子句指定连接条件
用ON子句指定更多的连接条件
示例:
查询雇员名字为 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';
孤儿数据(Orphan Data)
孤儿数据是指被连接的列的值为空的数据。
左外连接
左边的表 (EMPLOYEES) 中即使没有与 DEPARTMENTS 表中匹配的行,该查询
也会取回 EMPLOYEES 表中所有的行。
示例:
查询所有雇员的名字以及他们的部门名称,包含那些没有部门的雇员。
select e.last_name,d.department_name from employees e LEFT OUTER JOIN departments d on e.dept_id = d.department_id;
右外连接
右边的表 (DEPARTMENTS ) 中即使没有与 EMPLOYEES 表中匹配的行,该查询
也会取回 DEPARTMENTS 表中所有的行。
示例:
查询所有雇员的名字以及他们的部门名称,包含那些没有雇员的部门。
select e.last_name,d.department_name from employees e RIGHT OUTER JOIN departments d on e.DEPARTMENT_ID = d.department_id;
注意: MySQL 中不支持 FULL OUTER JOIN 连接
可以使用 union 实现全完连接。
语法结构
(SELECT 投影列 FROM 表名 LEFT OUTER JOIN 表名 ON 连接条件)
UNION
(SELECT 投影列 FROM 表名 RIGHT OUTER JOIN 表名 ON 连接条件)
示例:
查询所有雇员的名字以及他们的部门名称,包含那些没有雇员的部门以及没有部门的雇 员。
(select e.last_name,d.department_name from employees e LEFT OUTER JOIN departments d on e.department_id = d.department_id)
UNION
(select e1.last_name,d1.department_name from employees e1 RIGHT OUTER JOIN departments d1 on d1.department_id = e1.department_id)