资讯专栏INFORMATION COLUMN

【MySQL笔记】七种JOIN的SQL

miya / 2248人阅读

摘要:问题回答个数标签标签名称是什么是什么前端是什么大前端是什么是什么是什么多线程七全连接去交集问题回答个数标签标签名称是什么是什么是什么多线程

准备数据

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17630.html

相关文章

  • mysql - 收藏集 - 掘金

    摘要:步优化以及其它数据库后端掘金原文链接在发表了一篇简洁有效有趣和令人信服的分钟教程描述了如何进行优化。关于的七种后端掘金对于的,在学习起来可能是比较乱的。 5 步优化 MongoDB 以及其它数据库 - 后端 - 掘金原文链接 Jared Rosoff 在 Scale Out Camp 发表了一篇简洁、有效、有趣和令人信服的《8 分钟 MongoDB 教程》描述了如何进行 MongoDB...

    Donald 评论0 收藏0

发表评论

0条评论

miya

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<