为了演示方便,提前准备了两张表department和employees,其中的字段和数据如图所示:
department
employees
连接分为:内连接、外连接、交叉连接
一、内连接( 最常用 )
定义:仅将两个表中满足连接条件的行组合起来作为结果集。
关键词:INNER JOIN
select * from employees e inner join department d
on e.employee_id = d.department_id where e.employee_id = "1";
等价于
select * from employees e,department d
where e.employee_id = d.department_id and e.employee_id = "1";
查询出来的结果如图所示:
二、外连接
1、左(外)连接
定义:在内连接的基础上,还包含左表中所有不符合条件的数据行,并在其中的右表列填写NULL
只有在两个表中匹配的行才能在结果集中出现 。有一下三种情况:
a. 对于table1中的每一条记录对应的记录如果在table2中也恰好存在而且刚好只有一条,那么就会在
返回的结果中形成一条新的记录。
b. 对于table1中的每一条记录对应的记录如果在table2中也恰好存在而且有N条,那么就会在返回的结果中形成 N条新的记录。
c. 对于table1中的每一条记录对应的记录如果在table2中不存在,那么就会在返回的结果中形成一条
条新的记录,且该记录的右边全部NULL。
关键字:LEFT JOIN
注意:
当在内连接查询中加入条件是,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,但对于外连接情况就不同了。当把条件加入到 join子句时,SQL Server、Informix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到where子句 中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响:
条件在join子句:
select * from employees e
left outer join department d
on e.employee_id = d.department_id
and e.employee_id = "2" (其中outer可以省略)
查询出来的结果如图所示:
条件在where子句:
select * from employees e
left outer join department d
on e.employee_id = d.department_id
where e.employee_id = "2"
查询出来的结果如图所示:
相当于只把满足条件的结果集查询出来
2、右(外)连接
定义:在内连接的基础上,还包含右表中所有不符合条件的数据行,并在其中的左表列填写NULL
关键字:RIGHT JOIN
3、完全连接
定义:在内连接的基础上,还包含两个表中所有不符合条件的数据行,并在其中的左表、和右表列填写NULL
关键字:FULL JOIN
内联接显示的是两列数据匹配下的相关数据,外联接分为左外联接右外联接和全联接,mysql中不支持全联接,所以以左外联接为例来讨论区别,左外联接(以左表为主)是只在join前面是这张表不管是否两张有无满足的匹配信息,这张表的内容都要全部显示,而后面的那张表只显示匹配的信息。右外联接则刚好相反。