当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。
从大类上分,表连接分为内连接和外连接,
它们之间的最主要区别是內连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。
我们最常用的是内连接。
例如:
查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表emp和dept中,因此,
需要使用表连接来进行查询:
select emp.*,dept.deptname from emp, dept where emp.deptno=dept.deptno;
外连接有分为左连接和右连接
具体定义如下。
•左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录
•右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录
例如,查询emp中所有用户名和所在部门名称:
比较这个查询和上例中的查询,都是查询用户名和部门名,两者的区别在于本例中列出了所有的用户名,即使有的用户名(dony)并不存在合法的部门名称(部门号为4,在dept中没有这个部门);
子查询
某些情况下,当我们查询的时候,需要的条件是另外一个select语句的结果,这个时候,就要用到子查询。
用于子查询的关键字主要包括in、not in、=、!=、exists、not exists等。
例如:从emp表中查询出所有部门在dept表中的所有记录
某些情况下,子查询可以转化为表连接,如上,转换表连接后:
select emp.* from emp ,dept where emp.deptno=dept.deptno;
注意:子查询和表连接之间的转换主要应用在两个方面。
- MySQL 4.1以前的版本不支持子查询,需要用表连接来实现子查询的功能
- 表连接在很多情况下用于优化子查询
记录联合
我们经常会碰到这样的应用,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,这个时候,就需要用union和union all关键字来实现这样的功能,具体语法如下: