MySQL中七种JOIN的SQL是怎样的

63次阅读
没有评论

共计 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 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 是什么?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 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

关于 MySQL 中七种 JOIN 的 SQL 是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计4284字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)