【MySQL笔记】七种JOIN的SQL

网友投稿 625 2023-05-03

【MySQL笔记】七种JOIN的SQL

【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)

问题回答个数标签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)

问题回答个数标签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)

问题回答个数标签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)

问题回答个数标签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)

问题回答个数标签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)

由于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)

问题回答个数标签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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:优化SQL语句的一般步骤
下一篇:一次Mysql改表引发LVS下RS机器全下线的问题
相关文章