【MySQL笔记】七种JOIN的SQL

发布时间:2025-05-20 05:10:57 作者:益华网络 来源:undefined 浏览量(2) 点赞(2)
摘要:准备数据 以一个简易问答系统为例,包括问题表和问题所属标签,问题表如下:CREATETABLE`t_qa`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`title`varchar(200)NOTNULLDEFAULTCOMMEN

准备数据

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

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

二维码

扫一扫,关注我们

声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。

感兴趣吗?

欢迎联系我们,我们愿意为您解答任何有关网站疑难问题!

您身边的【网站建设专家】

搜索千万次不如咨询1次

主营项目:网站建设,手机网站,响应式网站,SEO优化,小程序开发,公众号系统,软件开发等

立即咨询 15368564009
在线客服
嘿,我来帮您!