共计 4284 个字符,预计需要花费 11 分钟才能阅读完成。
这篇文章将为大家详细讲解有关 MySQL 中七种 JOIN 的 SQL 是怎样的,文章内容质量较高,因此丸趣 TV 小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
准备数据
以一个简易问答系统为例,包括问题表和问题所属标签,问题表如下:
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 是什么?51javaPHP 是什么?42php 前端是什么?33 大前端 nodejs 是什么?2NULLNULLcss 是什么?1NULLNULLJavaScript 是什么?1NULLNULL
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 是什么?51javaPHP 是什么?42php 前端是什么?33 大前端 NULLNULL4mybatisNULLNULL5pythonNULLNULL6 多线程
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 是什么?51javaPHP 是什么?42php 前端是什么?33 大前端
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 是什么?2NULLNULLcss 是什么?1NULLNULLJavaScript 是什么?0NULLNULL
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 标签名称 NULLNULL4mybatisNULLNULL5pythonNULLNULL6 多线程
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 是什么?51javaPHP 是什么?42php 前端是什么?33 大前端 nodejs 是什么?2NULLNULLcss 是什么?1NULLNULLJavaScript 是什么?0NULLNULLNULLNULL4mybatisNULLNULL5pythonNULLNULL6 多线程
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
UNIONSELECT 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 是什么?2NULLNULLcss 是什么?1NULLNULLJavaScript 是什么?0NULLNULLNULLNULL4mybatisNULLNULL5pythonNULLNULL6 多线程
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 UNIONSELECT 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
关于 MySQL 中七种 JOIN 的 SQL 是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。