本文章主要对目前比较常用的SQL四种连接方式进行介绍,文笔略有粗糙,还请阅读的朋友多提些建议。
四种连接方式:
- 内连接(INNER JOIN)
- 左外连接(LEFT JOIN)
- 右外连接(RIGHT JOIN)
- 交叉连接(CROSS JOIN)
接下将对四种连接方式做详细的介绍
首先先创建出两张下面会用到的a、b两张表。
例:a表
id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
例:b表
id | job | parent_id |
---|---|---|
1 | java工程师 | 1 |
2 | iOS工程师 | 2 |
3 | 测试 | 4 |
a表中的id字段与b表中的parent_id字段为关联关系
1、内连接(INNER JOIN)
内连接使用比较运算符进行表间某些列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接分为等值连接、自然连接、不等连接三种。
等值连接
通过a.id和b.parent_id使用等于号(=)运算符比较被连接的列的列值,进行SQL语句的查询。
select * from a inner join b on a.id=b.parent_id
结果
id | name | id(2) | job | parent_id |
---|---|---|---|---|
1 | 张三 | 1 | java工程师 | 1 |
2 | 李四 | 2 | iOS工程师 | 2 |
自然连接
自然连接和等值连接唯一不同的是,它是有选择地显示列,请看下面的案例。
select a.id as '编号',a.`name` as '姓名',b.job as '工作' from a inner join b on a.id=b.parent_id
结果
编号 | 姓名 | 工作 |
---|---|---|
1 | 张三 | java工程师 |
2 | 李四 | iOS工程师 |
不等连接
在连接条件使用时除了运算符以外的其他比较运算符,来比较被连接的列值,那么这个连接就称为不等连接。这些运算符包括>、>=、<、<=、!>、!<和<>。这个就不做演示了,自已理解一下哈,我想这个不太困难(毕竟程序员都是高智商的动物)。
2、左外连接(LEFT JOIN)
以左边表为主表,右边表为从表,显示出主表中所有的数据行,如果右表中没有与之匹配的数据,则显示NULL。
select * from a left join b on a.id=b.parent_id
结果
id | name | id(2) | job | parent_id |
---|---|---|---|---|
1 | 张三 | 1 | java工程师 | 1 |
2 | 李四 | 2 | iOS工程师 | 2 |
3 | 王五 | null | null | null |
3、右外连接(RIGHT JOIN)
右外连接和左外连接对应,以右表为主表,左表为从表,其他一样。显示出主表中所有的数据行,如果从表中没有与之匹配的数据,则显示NULL。
select * from a RIGHT join b on a.id=b.parent_id
结果
id | name | id(2) | job | parent_id |
---|---|---|---|---|
1 | 张三 | 1 | java工程师 | 1 |
2 | 李四 | 2 | iOS工程师 | 2 |
null | null | 3 | 测试 | 4 |
4、交叉连接(CROSS JOIN)
如果没有WHERE子句,交叉连接返回连接表中所有数据行的笛卡尔积,数据行行数 = 表a行数 * 表b行数
select * from a cross join b
结果
id | name | id(2) | job | parent_id |
---|---|---|---|---|
1 | 张三 | 1 | java工程师 | 1 |
2 | 李四 | 1 | java工程师 | 1 |
3 | 王五 | 1 | java工程师 | 1 |
1 | 张三 | 2 | iOS工程师 | 2 |
2 | 李四 | 2 | iOS工程师 | 2 |
3 | 王五 | 2 | iOS工程师 | 2 |
1 | 张三 | 3 | 测试 | 4 |
2 | 李四 | 3 | 测试 | 4 |
3 | 王五 | 3 | 测试 | 4 |
以上就是我通过实际运用对四种连接的理解,如果大家觉得有什么不对的地方,欢迎指示。