内连接查询中,返回的结果只包含符合查询条件和连接条件的数据,然而有时还需要包含没有关联的数据,即返回查询结果中不仅包含符合条件的数据,而且还包括左表(左连接或左外连接)、右表(右连接或右外连接)或两个表(全外连接)中的所据,此时就需要使用外连接查询,外连接分为左连接和右连接。
外连接的语法格式如下:
sql
SELECT 所查字段 FROM 表1 LEFT|RIGHT [OUTER] JOIN 表2
ON 表1.关系字段=表2.关系字段 WHERE 条件
外连接的语法格式和内连接类似,只不过使用的是 LEFT JOIN、RIGHT JOIN 关键字,其中关键字左边的表被称为左表,关键字右边的表被称为右表。
在使用左连接和右连接查询时,查询结果是不一致的,具体如下。
(1)LEFT JOIN(左连接):返回包括左表中的所有记录和右表中符合连接条件的记录。
(2)RIGHT JOIN(右连接):返回包括右表中的所有记录和左表中符合连接条件的记录。
接下来就针对外连接中的左连接和右连接进行详细的讲解。
1. LEFT JOIN(左连接)
左连接的结果包括LEFTJOIN 子句中指定的左表的所有记录,以及所有满足连接条件的记录。如果左表的某条记录在右表中不存在,则在右表中显示为空。
例如,在 department 表和 employee 表之间使用左连接查询,SQL 语句如下:
sql
SELECT department.did,department.dname,employee.name FROM department LEFT JOIN employee on department.did=employee.did;
上述语句执行成功后,结果如下:
sql
mysql> SELECT department.did,department.dname,employee.name FROM department LEFT JOIN employee on department.did=employee.did;
+-----+-----------+--------+
| did | dname | name |
+-----+-----------+--------+
| 1 | 网络部 | 小强 |
| 1 | 网络部 | 小红 |
| 2 | 媒体部 | 小明 |
| 3 | 研发部 | NULL |
| 5 | 人事部 | NULL |
+-----+-----------+--------+
5 rows in set (0.00 sec)
从上述结果可以看出,显示了5条记录,并且人事部没有 did 等于5的员工。
2.RIGHT JOIN(右连接)
右连接与左连接正好相反,返回右表中所有指定的记录和所有满足连接条件的记录。如果右表的某条记录在左表中没有匹配,则左表将返回空值。
例如,在 department 表和 employee 表之间使用右连接査询,SQL语句如下:
sql
SELECT department.did,department.dname,employee.name FROM department RIGHT JOIN employee ON department.did=employee.did;
上述语句执行成功后,结果如下:
sql
mysql> SELECT department.did,department.dname,employee.name FROM department RIGHT JOIN employee ON department.did=employee.did;
+------+-----------+--------+
| did | dname | name |
+------+-----------+--------+
| 1 | 网络部 | 小红 |
| 1 | 网络部 | 小强 |
| 2 | 媒体部 | 小明 |
| NULL | NULL | 小刚 |
+------+-----------+--------+
4 rows in set (0.00 sec)
从上述结果可以看出,显示了4条记录,并且 name 值为小刚的员工并没有被分配部门。