为什么要用联接
我们可以使用子查询帮助进行多表查询,但它有时候并不能给我们所需要的一切,而且不断嵌套的子查询显得语法有些杂乱,特别是相关子查询更会严重影响性能。那么如何更好地解决多表查询所存在的问题呢,SQL为我们提供了一种更简单的语法,那就是联接。
内联接
内联接是一种典型的联接运算,使用像=或者<>之类的比较运算符。包括相等联接、非相等联接和自然联接,是使用比较运算符根据每个表共有的列的值匹配两个表中的行。比如select e.eName,d.dName from emp e (inner)join dept d on e.deptNo=d.deptNo;这句话就是将员工表emp和部门表dept根据相等的部门编号depNo进行内联接,并查找出员工名和部门名字,括号表示可以省略的关键字。
外联接
1、左外联接(left join 或left outer join):左向外联接的结果包括left outer 子句中指定左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集
行中右表的所有选择列表均为空值。比如select e.eName,d.dName from emp e left join dept d on e.deptNo=d.deptNo;这时,在员工表emp中有一个员工‘zhangsan’还没分配部门,但任然会显示出该行,但在部门名字depName一列则显示为空。
2、右外联接(right join 或 right outer join):右向外联接是左向外联接的反向联接,与左外联接刚好相反,右表的某行在左表中没有匹配行,则将为左表返回空值。比如select e.eName,d.dName from emp e RIGHT join dept d on e.deptNo=d.deptNo;这时,部门表dept中有一个部门‘research’还没有员工,但仍然会显示该行,但在员工名eName一列会显示为空,但没有部门的‘zhangsan’则不会被显示出来。
3、全外联接(full join 或 full outer join):全外联接返回左表和右表中的所有行,是左外联接和右外联接的结合,但在mysql中不支持。