MySQL & JOIN

今天来熟悉下 MySQL 中的连接查询,最常用的有三种,分别是内连接,左连接和右连接。
首先准备测试的数据表和测试数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE 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

坚持原创技术分享,您的支持将鼓励我继续创作!
Flyertutor WeChat Pay

WeChat Pay

Flyertutor Alipay

Alipay