1.内连接:只列出匹配的记录
语法:
SELECT … FROM join_table
INNER JOIN join_table2
ON join_condition
WHERE where_defnition
解释:只列出这些连接表中与连接条件相匹配的数据行。INNER可以不写,则默认为内连接。[ON join_condition]里面写的是连接的条件。
举例:
select e.name,d.name from employee e inner join department d on e.dept_id=d.id;(常用)
等价于:
select e.name,d.name from employee e join department d on e.dept_id=d.id;(常用)
等价于:
select e.name,d.name from employee e,department d where e.dept_id=d.id;
2.外连接:
左外连接(LEFT [OUTER] JOIN)
右外连接(RIGHT [OUTER] JOIN)
全外连接(FULL [OUTER] JOIN) 注:MySQL5.1的版本暂不支持
解释:不仅列出与连接条件(on)相匹配的行,还列出左表table1(左外连接)、或右表table2(右外连接)、或两个表(全外连接)中所有符合WHERE过滤条件的数据行。一般都是用左连接或者外连接.其中,[OUTER]部分可以不写,(LEFT | RIGHT | FULL)部分要写其中一个。
2.1 左外连接:左表列出全部,右表只列出匹配的记录。
举例:
SELECT m.`name` ,b.name from sys_menu m LEFT OUTER JOIN sys_button b ON m.id=b.menuId
等价于:
SELECT m.`name` ,b.name from sys_menu m LEFT JOIN sys_button b ON m.id=b.menuId
2.2 右外连接 :右表列出全部,左表只列出匹配的记录。
举例:
SELECT m.`name` ,b.name from sys_menu m RIGHT JOIN sys_button b ON m.id=b.menuId
等价于:
SELECT m.`name` ,b.name from sys_menu m RIGHT OUTER JOIN sys_button b ON m.id=b.menuId
3 交叉连接:
解释:假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}
其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
等价于:(荐)
SELECT … FROM table1, table2;
4.自连接:
解释:参与连接的表都是同一张表。(通过给表取别名虚拟出两张表)
注:非常重要,在JavaWeb中的目录树中用的特别多。(使用什么连接由需求而定)
举例:
SELECT m.`name` parent ,m2.`name` c from sys_menu m LEFT JOIN sys_menu m2 on m.id=m2.parentId
说明: 查询当前所有菜单的名称以及其子菜单的名称