这里举一个例子来介绍一下,看起来更容易理解。首先建立三个表:
![](https://i-blog.csdnimg.cn/blog_migrate/f749d9b7898dded1f86992b69f7499b9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c4518920f5941b237dd598940caed890.png)
![](https://i-blog.csdnimg.cn/blog_migrate/22b64ae822d414a6408a8d760bd1f4c3.png)
数据库的内连接主要分为以下三种:
1、等值连接:在连接条件中使用等号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
或者
2、自然连接:在连接条件中使用等号(=)运算符比较被连接列的列值,但它会删除连接表中的重复数据列。
SELECT * FROM tab_a NATURAL JOIN tab_b
特别注意一下:
①注意自然连接的时候,必须有相同名称的属性类,查询的结果会去除相同的属性列,如上图的查询结果。
②如果两个这个两个属性列的类型不同,则查询的结果会保存为前面那个表的属性的类型。例如现在把a表的userid改成int类型的,b表的userid是varchar类型的,则查询结果如下所示:
③我试了一下,当自然连接的两个表没有共同的属性时会产生如下的结果。如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/1340aaafac3a00efc55daab909905bf8.png)
不等值连接只是改变查询条件,不做重点介绍。
外连接分:左外连接、右外连接、全外连接
1、左外连接(LEFT JOIN或LEFT OUTER JOIN )
左外连接的结果包括 LEFT OUTER子句中指定的左表的所有行。如果左表的某行在右表中没有匹配行,则在相关联的结果中右表对应行为空值。
2、右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN )
右外连接是左外连接的反向连接。查询结果与左外连接正好相反。
3、全外连接(FULL JOIN 或 FULL OUTER JOIN)
全外连接是在等值连接的基础上将左表和右表的未匹配数据都加上。但是MySQL目前应该不支持此种方式,我在测试的时候出现下面的情况。如果去掉on条件语句的话,是有查询结果的。
交叉连接
交叉连接又称笛卡尔连接(cartesian join)。如果表a和表b是两个集合的话,交叉连接即返回这两个集合的笛卡尔积。
最后附上一张网上找到的图,感觉对这些语句的解释很到位,可以借鉴一下。
最后说一点,本文使用的数据库为 MySQL 5.6