JOIN查询是关系型数据库的基本功能,MySQL提供多种JOIN关联查询方式,包括内连接,左连接,右连接等等,本文将简单介绍MySQL JOIN查询的分类,基本语法和使用案例。
在MySQL中,JOIN可以分为内连接和外连接,外连接又可以分为左连接和右连接。
- join内连接
- join外连接
- join左连接
- join右连接
下面将通过案例对内连接,左连接和右连接的使用进行说明。案例数据如下:
mysql> select * from t_a;
+------+--------+
| id_a | name_a |
+------+--------+
| 1 | a_1 |
| 2 | a_2 |
| 3 | a_3 |
+------+--------+
3 rows in set (0.01 sec)
mysql> select * from t_b;
+------+--------+
| id_b | name_b |
+------+--------+
| 2 | b_2 |
| 3 | b_3 |
| 4 | b_4 |
+------+--------+
3 rows in set (0.00 sec)
1. join内连接
在MySQL中,下面3个内连接join在语法上是完全相等的。注意在标准SQL中,INNER JOIN与CROSS JOIN并不等同。
- JOIN
- CROSS JOIN
- INNER JOIN
内联JOIN有多种写法,以下查询结果相同。
// 没有使用join关键字
select * from t_a, t_b where t_a.id_a=t_b.id_b;
// join where
select * from t_a join t_b where t_a.id_a=t_b.id_b;
// join on
select * from t_a join t_b on t_a.id_a=t_b.id_b;
// inner join on
select * from t_a inner join t_b on t_a.id_a=t_b.id_b;
// cross join on
select * from t_a cross join t_b on t_a.id_a=t_b.id_b;
// cross join where
select * from t_a cross join t_b where t_a.id_a=t_b.id_b;
执行结果如下:
mysql> select * from t_a inner join t_b on t_a.id_a=t_b.id_b;
+------+--------+------+--------+
| id_a | name_a | id_b | name_b |
+------+--------+------+--------+
| 2 | a_2 | 2 | b_2 |
| 3 | a_3 | 3 | b_3 |
+------+--------+------+--------+
2 rows in set (0.01 sec)
2. left join 左连接
左连接join,以左边表的连接字段,依次匹配右边表,如果在右侧的表没有记录匹配上,则右则表的记录值以NULL填充。
left join示例如下:
mysql> select * from t_a left join t_b on t_a.id_a=t_b.id_b;
+------+--------+------+--------+
| id_a | name_a | id_b | name_b |
+------+--------+------+--------+
| 2 | a_2 | 2 | b_2 |
| 3 | a_3 | 3 | b_3 |
| 1 | a_1 | NULL | NULL |
+------+--------+------+--------+
3 rows in set (0.00 sec)
3. right join 右连接
右连接join,以右边表的连接字段,依次匹配左边表,如果在左侧的表没有记录匹配上,则左则表的记录值以NULL填充。
right join示例如下:
mysql> select * from t_a right join t_b on t_a.id_a=t_b.id_b;
+------+--------+------+--------+
| id_a | name_a | id_b | name_b |
+------+--------+------+--------+
| 2 | a_2 | 2 | b_2 |
| 3 | a_3 | 3 | b_3 |
| NULL | NULL | 4 | b_4 |
+------+--------+------+--------+
3 rows in set (0.00 sec)