今天来熟悉下 MySQL 中的连接查询,最常用的有三种,分别是内连接,左连接和右连接。
首先准备测试的数据表和测试数据。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15CREATE TABLE `users` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`cls_id` int NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `cls` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
insert into users(name,cls_id) values('wang', 1), ('zhang', 2), ('li', 3),('zhao', 4);
insert into cls(id,name) values(1, 'one'),(2, 'two'),(3, 'three'),(5,'five');
inner join
1 | select * from users u inner join cls c where u.cls_id = c.id; |
查看显示结果1
2
3
4
5
6
7
8
9+------+--------+----------+------+--------+
| id | name | cls_id | id | name |
|------+--------+----------+------+--------|
| 1 | wang | 1 | 1 | one |
| 2 | zhang | 2 | 2 | two |
| 3 | li | 3 | 3 | three |
+------+--------+----------+------+--------+
3 rows in set
Time: 0.003s
分析:很明显显示了两个表中同时存在的数据,如 users
表中 id 为 4 和 cls
表中 id 为 5 的数据没有关联数据,没有显示。
1 | select * from users u,cls c where u.cls_id=c.id; |
查看显示结果1
2
3
4
5
6
7
8
9+------+--------+----------+------+--------+
| id | name | cls_id | id | name |
|------+--------+----------+------+--------|
| 1 | wang | 1 | 1 | one |
| 2 | zhang | 2 | 2 | two |
| 3 | li | 3 | 3 | three |
+------+--------+----------+------+--------+
3 rows in set
Time: 0.003s
分析:上面两种 SQL 的执行结果是一样的,在开发中两种都可以。
left join
以左表为基准,显示左表全部数据,关联右表数据不存在的话,用 null 代替。1
select * from users u left join cls c on u.cls_id = c.id;
查看结果1
2
3
4
5
6
7
8
9
10+------+--------+----------+--------+--------+
| id | name | cls_id | id | name |
|------+--------+----------+--------+--------|
| 1 | wang | 1 | 1 | one |
| 2 | zhang | 2 | 2 | two |
| 3 | li | 3 | 3 | three |
| 4 | zhao | 4 | <null> | <null> |
+------+--------+----------+--------+--------+
4 rows in set
Time: 0.003s
分析:上面 users
表中 id 为 4 的数据,和明显在 cls
表中没有关联的数据,那么就用 null 代替。
right join
以右表为基准,显示右表全部数据,关联左表数据不存在的话,用 null 代替。1
select * from users u right join cls c on u.cls_id = c.id;
查看结果1
2
3
4
5
6
7
8
9
10+--------+--------+----------+------+--------+
| id | name | cls_id | id | name |
|--------+--------+----------+------+--------|
| 1 | wang | 1 | 1 | one |
| 2 | zhang | 2 | 2 | two |
| 3 | li | 3 | 3 | three |
| <null> | <null> | <null> | 5 | five |
+--------+--------+----------+------+--------+
4 rows in set
Time: 0.004s
分析:上面以 cls
为基准,显示全部的数据,很明显 cls
表中的 id 为 5 的数据在 users
表中没有关联数据,所以用 null 代替。
©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息。
End