操作数据库当中,常常涉及多表查询。而在进行多表查询操作时,SQL提供了不同的表与表之间的连接方式,来获取用户所需的数据。
以下我们将主要围绕以下两个表进行数据库的多表查询操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 > -- 雇员表 > select * from employee; +----+------+---------------+ | id | name | department_id | +----+------+---------------+ | 1 | 张三 | 1 | | 2 | 李四 | 1 | | 3 | 王五 | 2 | | 4 | 赵六 | 2 | | 5 | 郑七 | 3 | +----+------+---------------+ > -- 部门表 > select * from department; +----+--------+ | id | name | +----+--------+ | 1 | 技术部 | | 2 | 技术部 | | 3 | 工程部 | +----+--------+
内连接使用比较运算符根据每个表共有的列的值匹配两个表中的行。
1 2 3 4 5 6 7 8 9 10 11 12 > -- 由于雇员表中郑七没有与部门表中任何一行匹配,即在返回的数据不会显示 > SELECT e.id AS '员工编号', e. NAME AS '员工名称', d. NAME AS '所属部门' > FROM employee AS e > INNER JOIN department AS d ON e.department_id = d.id; +----------+----------+----------+ | 员工编号 | 员工名称 | 所属部门 | +----------+----------+----------+ | 1 | 张三 | 技术部 | | 2 | 李四 | 技术部 | | 3 | 王五 | 市场部 | | 4 | 赵六 | 市场部 | +----------+----------+----------+
左向外连接的结果集包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
1 2 3 4 5 6 7 8 9 10 11 12 13 > -- 左外连接会根据左表中的所有内容与右表进行匹配,即使右表不匹配也会显示所有数据 > SELECT e.id AS '员工编号', e. NAME AS '员工名称', d. NAME AS '所属部门' > FROM employee AS e > LEFT JOIN department AS d ON e.department_id = d.id; +----------+----------+----------+ | 员工编号 | 员工名称 | 所属部门 | +----------+----------+----------+ | 1 | 张三 | 技术部 | | 2 | 李四 | 技术部 | | 3 | 王五 | 市场部 | | 4 | 赵六 | 市场部 | | 5 | 郑七 | NULL | +----------+----------+----------+
右向外连接是左向外连接的反向连接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
1 2 3 4 5 6 7 8 9 10 11 12 13 > -- 与左外连接完全相反 > SELECT e.id AS '员工编号', e. NAME AS '员工名称', d. NAME AS '所属部门' > FROM employee AS e > RIGHT JOIN department AS d ON e.department_id = d.id; +----------+----------+----------+ | 员工编号 | 员工名称 | 所属部门 | +----------+----------+----------+ | 1 | 张三 | 技术部 | | 2 | 李四 | 技术部 | | 3 | 王五 | 市场部 | | 4 | 赵六 | 市场部 | | NULL | NULL | 工程部 | +----------+----------+----------+
完整外部连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 > -- MYSQL不支持全外连接,这个例子为手写例子 > SELECT e.id AS '员工编号', e. NAME AS '员工名称', d. NAME AS '所属部门' > FROM employee AS e > FULL JOIN department AS d ON e.department_id = d.id; +----------+----------+----------+ | 员工编号 | 员工名称 | 所属部门 | +----------+----------+----------+ | 1 | 张三 | 技术部 | | 2 | 李四 | 技术部 | | 3 | 王五 | 市场部 | | 4 | 赵六 | 市场部 | | 5 | 郑七 | NULL | | NULL | NULL | 工程部 | +----------+----------+----------+
参考资料:
[1] http://www.cnblogs.com/devilmsg/archive/2009/03/24/1420543.html
[2] http://www.cnblogs.com/youzhangjin/archive/2009/05/22/1486982.html