在MySQL中,多表连接的语法格式如下: SELECT <查找列表>FROM <表名1> [连接类型] JOIN <表名2> ON <连接要求>WHERE <查找要求>
其中连接类型有四种:
内连接(inner join)
自然连接(nature join)
交叉连接(cross join)
外连接(outer join)
多表连接常常要经过表之间的理学外键(或规律外键)进行相关查找。
接下来就分别介绍一下这几个连接的详细用法和区别。
表数据准备
table1:
CREATE TABLE `table1`(`a` VARCHAR(20),`b` VARCHAR(20) NOT NULL DEFAULT ,`c` VARCHAR(20) NOT NULL DEFAULT ,`g` VARCHAR(20) NOT NULL DEFAULT ,PRIMARY KEY(`a`));insert into table1 values(1 , 2 , 3,3);insert into table1 values(2 , 3 , 4,4);insert into table1 values(5 , 6 , 7,4);insert into table1 values(8 , 9 , 10,5);
table2: CREATE TABLE `table2`(`c` VARCHAR(20),`d` VARCHAR(20) NOT NULL DEFAULT ,`e` VARCHAR(20) NOT NULL DEFAULT ,`g` VARCHAR(20) NOT NULL DEFAULT );insert into table2 values(3 , 4 , 5,3);insert into table2 values(4 , 5 , 6,4);insert into table2 values(8 , 9 , 1,5);insert into table2 values(10 , 11 , 12,6);
内连接:
在数据库多表相关查找中,内连接是最常用的连接类型了,当然亦是默认的连接类型。能够在FROM子句中运用INNER JOIN(INNER关键字能够省略)来实现内连接
如上图inner join便是取A和B的交集 select * from table1 e inner join table2 f on e.c=f.c;
自然连接:
自然连接是一种特殊的等值连接,他需求两个关系表中进行比较的必要是相同的属性列,无须添加连接要求,并且在结果中消除重复的属性列。 Select * from table1 natural join table2;
注:去除重复是按照表table1和表table2中都有的列组合起来(c+g)
交叉连接:
MySQL cross join是mysql中的一种连接方式,区别于内连接和外连接,针对cross join连接来讲,其实运用的便是笛卡尔连接 Select * from table1 CROSS join table2;
外连接:
运用外连接时,以主表中每行的数据去匹配从表中的数据行,倘若符合连接要求则返回到结果集中;倘若无找到匹配行,则主表的行仍然保存,并且返回到结果集中,相应的从表中的数据行被填上NULL值后亦返回到结果集中。
外连接有3种类型,分别是:
左外连接(LEFT OUTER JOIN)
右外连接(RIGHT OUTER JOIN)
全外连接(FULL OUTER JOIN)
然则,在MySQL中,是不支持全外连接的。这一点要重视。
外链接-左外连接
左外连接的结果集中包括左表(JOIN关键字左边的表)中所有的记录,倘若右表中无满足连接要求的记录,则结果集中右表中的相应行数据填充为NULL
select * from table1 e left join table2 f on e.c = f.c;
外链接-右外连接
右外连接的结果集中,包括满足连接要求的所有数据,另外还包含右表(JOIN关键字右边的表)中不满足要求的数据,此时左表中的相应行数据为NULL
select * from table1 e right OUTER join table2 f on e.c = f.c;
外连接-全外连接
左表和右表都不做限制,所有的记录都表示,两表不足的地区用null 填充;亦便是:
左外连接 = 左表所有记录 + 关联联结果
右外连接 = 右表所有记录 + 关联联结果
全外连接 = 左表所有记录 + 右表所有记录 + 关联联结果 = 左外连接 + 右外连接 - 关联联结果(即去重复)
select * from table1 e left OUTER jointable2 fon e.c = f.cunionselect * from table1 e right OUTER join table2 f on e.c = f.c;
|