连表方式有三大种,分别是外连接(OUTER JOIN)、内连接(INNER JOIN)和交叉连接(CROSS JOIN),其中外连接又包括三种,分别是左外连接、右外连接、全外连接。
表的数据如下:
表A (TABLEA) | id | name |
|
表B (TABLEB) | id | job | parent_id |
1 | 张三 |
| 1 | 学生 | 1 | ||
2 | 李四 |
| 2 | 经理 | 2 | ||
3 | 王五 |
| 3 | 工程师 | 4 |
注意:TABLEA.id同TABLEB.parent_id存在关系
一、左、右外连接
左、右外连接都会以一种表为基表(左连接以连接的左表为基表,右连接以连接的右表为基表),另外一个表的外表,其中基表的所有行、列都会显示,外表如果和条件不匹配则所有的外表列值都为NULL。sql关键字LEFT/RIGHTOUTER JOIN,通常我们省略OUTER写成LEFT/RIGHTJOIN
例子:
左连接:select* from TABLEA a LEFT JOIN TABLEB b on a.ID=b.PARENT_ID;
结果是:
id | name | id | job | parent_id |
1 | 张三 | 1 | 学生 | 1 |
2 | 李四 | 2 | 经理 | 2 |
3 | 王五 |
|
|
|
右连接:select* from TABLEA a RIGHT JOIN TABLEB b on a.ID=b.PARENT_ID;
结果是:
id | name | id | job | parent_id |
1 | 张三 | 1 | 学生 | 1 |
2 | 李四 | 2 | 经理 | 2 |
|
| 3 | 工程师 | 4 |
二、全外连接
全外连接中所有表的行、列都会显示,条件不匹配的值皆为NULL。sql关键字FULL OUTER JOIN,通常我们省略OUTER写成FULL JOIN
例子:
selecta.*,b.* from TABLEA a FULL JOIN TABLEB bon a.id=b.parent_id ;
结果是:
id | name | id | job | parent_id |
1 | 张三 | 1 | 学生 | 1 |
2 | 李四 | 2 | 经理 | 2 |
|
| 3 | 工程师 | 4 |
3 | 王五 |
|
|
|
三、内连接
内连接是用比较运算符比较要连接的列的值的连接,不匹配的行不会被显示。sql关键字JOIN 或者INNERJOIN,通常我们写成JOIN
例子:
select a.*,b.* from TABLEA a JOINTABLEB b on a.id=b.parent_id ;
结果是:
id | name | id | job | parent_id |
1 | 张三 | 1 | 学生 | 1 |
2 | 李四 | 2 | 经理 | 2 |
四、交叉连接
没有where条件的交叉连接将产生连接表所涉及的笛卡尔积。即TableA的行数*TableB的行数的结果集。(TableA 3行*TableB 3行=9行)
例子:
select * from TableA cross join TableB
结果是:
id | name | id | job | parent_id |
1 | 张三 | 1 | 学生 | 1 |
2 | 李四 | 1 | 学生 | 1 |
3 | 王五 | 1 | 学生 | 1 |
1 | 张三 | 2 | 经理 | 2 |
2 | 李四 | 2 | 经理 | 2 |
3 | 王五 | 2 | 经理 | 2 |
1 | 张三 | 3 | 工程师 | 4 |
2 | 李四 | 3 | 工程师 | 4 |
3 | 王五 | 3 | 工程师 | 4 |