mysql七种join_【MySQL笔记】七种JOIN的SQL

准备数据

以一个简易问答系统为例,包括问题表和问题所属标签,问题表如下:

CREATE TABLE `t_qa` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`title` varchar(200) NOT NULL DEFAULT '' COMMENT '标题',

`answer_count` int(5) unsigned NOT NULL DEFAULT '0' COMMENT '回答个数',

`label_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '标签id',

`create_by` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建人',

`create_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',

`update_by` bigint(20) unsigned DEFAULT NULL COMMENT '更新人',

`update_date` datetime DEFAULT NULL COMMENT '更新时间',

`del_flag` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0:不删除,1:删除',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `t_qa` (`id`, `title`, `answer_count`, `label_id`, `create_by`, `create_date`, `update_by`, `update_date`, `del_flag`)

VALUES

(1, 'Java是什么?', 5, 1, 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),

(2, 'PHP是什么?', 4, 2, 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),

(3, '前端是什么?', 3, 3, 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),

(4, 'nodejs是什么?', 2, 0, 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),

(5, 'css是什么?', 1, 0, 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),

(6, 'JavaScript是什么?', 0, 0, 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0);

标签表如下:

CREATE TABLE `t_label` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',

`create_by` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建人',

`create_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',

`update_by` bigint(20) unsigned DEFAULT NULL COMMENT '更新人',

`update_date` datetime DEFAULT NULL COMMENT '更新时间',

`del_flag` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0:不删除,1:删除',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `t_label` (`id`, `name`, `create_by`, `create_date`, `update_by`, `update_date`, `del_flag`)

VALUES

(1, 'java', 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),

(2, 'php', 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),

(3, '大前端', 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),

(4, 'mybatis', 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),

(5, 'python', 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),

(6, '多线程', 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0);

一、左连接(LEFT JOIN)

78b349389b45e019bd8580e64ca5a4af.png

问题

回答个数

标签id

标签名称

Java是什么?

5

1

java

PHP是什么?

4

2

php

前端是什么?

3

3

大前端

nodejs是什么?

2

NULL

NULL

css是什么?

1

NULL

NULL

JavaScript是什么?

1

NULL

NULL

SELECT

tq.title, tq.answer_count, tl.id, tl.name

FROM

t_qa tq LEFT JOIN t_label tl ON tq.label_id = tl.id

二、右连接(RIGHT JOIN)

f08675d480b48c7f5b6e3f8caf3ca0f7.png

问题

回答个数

标签id

标签名称

Java是什么?

5

1

java

PHP是什么?

4

2

php

前端是什么?

3

3

大前端

NULL

NULL

4

mybatis

NULL

NULL

5

python

NULL

NULL

6

多线程

SELECT

tq.title, tq.answer_count, tl.id, tl.name

FROM

t_qa tq RIGHT JOIN t_label tl ON tq.label_id = tl.id

三、内连接(INNER JOIN)

31bebb3d4da4eb013a0a1a9e4f379a01.png

问题

回答个数

标签id

标签名称

Java是什么?

5

1

java

PHP是什么?

4

2

php

前端是什么?

3

3

大前端

SELECT

tq.title, tq.answer_count, tl.id, tl.name

FROM

t_qa tq INNER JOIN t_label tl ON tq.label_id = tl.id

四、左独有连接(LEFT JOIN)

8395c6435e36856a0fc99dfbbd585032.png

问题

回答个数

标签id

标签名称

nodejs是什么?

2

NULL

NULL

css是什么?

1

NULL

NULL

JavaScript是什么?

0

NULL

NULL

SELECT

tq.title, tq.answer_count, tl.id, tl.name

FROM

t_qa tq LEFT JOIN t_label tl ON tq.label_id = tl.id

WHERE

tl.id IS NULL

五、右独有连接(RIGHT JOIN)

a99b83c611c7be212125dfa027900482.png

问题

回答个数

标签id

标签名称

NULL

NULL

4

mybatis

NULL

NULL

5

python

NULL

NULL

6

多线程

SELECT

tq.title, tq.answer_count, tl.id, tl.name

FROM

t_qa tq RIGHT JOIN t_label tl ON tq.label_id = tl.id

WHERE

tq.label_id IS NULL

六、全连接(FULL JOIN)

b5e7b55706e049e778cdd863f9fe8df7.png

由于MySQL不支持FULL OUTER JOIN,所以如果有全连接需求时,可用表达式:full outer join = left outer join UNION right outer join来实现。

问题

回答个数

标签id

标签名称

Java是什么?

5

1

java

PHP是什么?

4

2

php

前端是什么?

3

3

大前端

nodejs是什么?

2

NULL

NULL

css是什么?

1

NULL

NULL

JavaScript是什么?

0

NULL

NULL

NULL

NULL

4

mybatis

NULL

NULL

5

python

NULL

NULL

6

多线程

SELECT tq.title, tq.answer_count, tl.id, tl.name FROM t_qa tq LEFT JOIN t_label tl ON tq.label_id = tl.id

UNION

SELECT tq.title, tq.answer_count, tl.id, tl.name FROM t_qa tq RIGHT JOIN t_label tl ON tq.label_id = tl.id

七、全连接去交集(FULL JOIN)

38367fba65e3a1f3d32aa675b5a2e7d5.png

问题

回答个数

标签id

标签名称

nodejs是什么?

2

NULL

NULL

css是什么?

1

NULL

NULL

JavaScript是什么?

0

NULL

NULL

NULL

NULL

4

mybatis

NULL

NULL

5

python

NULL

NULL

6

多线程

SELECT tq.title, tq.answer_count, tl.id, tl.name FROM t_qa tq LEFT JOIN t_label tl ON tq.label_id = tl.id WHERE tl.id IS NULL

UNION

SELECT tq.title, tq.answer_count, tl.id, tl.name FROM t_qa tq RIGHT JOIN t_label tl ON tq.label_id = tl.id WHERE tq.label_id IS NULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值