博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【MySQL笔记】七种JOIN的SQL
阅读量:6305 次
发布时间:2019-06-22

本文共 4528 字,大约阅读时间需要 15 分钟。

准备数据

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

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.nameFROM     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.nameFROM     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.nameFROM     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.nameFROM     t_qa tq LEFT JOIN t_label tl ON tq.label_id = tl.idWHERE    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.nameFROM     t_qa tq RIGHT JOIN t_label tl ON tq.label_id = tl.idWHERE    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.idUNIONSELECT 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 NULLUNIONSELECT 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

转载地址:http://moixa.baihongyu.com/

你可能感兴趣的文章
堆排序算法
查看>>
folders.cgi占用系统大量资源
查看>>
路由器ospf动态路由配置
查看>>
zabbix监控安装与配置
查看>>
python 异常
查看>>
last_insert_id()获取mysql最后一条记录ID
查看>>
可执行程序找不到lib库地址的处理方法
查看>>
bash数组
查看>>
Richard M. Stallman 给《自由开源软件本地化》写的前言
查看>>
oracle数据库密码过期报错
查看>>
修改mysql数据库的默认编码方式 .
查看>>
zip
查看>>
How to recover from root.sh on 11.2 Grid Infrastructure Failed
查看>>
rhel6下安装配置Squid过程
查看>>
《树莓派开发实战(第2版)》——1.1 选择树莓派型号
查看>>
在 Linux 下使用 fdisk 扩展分区容量
查看>>
结合AlphaGo算法和大数据的量化基本面分析法探讨
查看>>
如何在 Ubuntu Linux 16.04 LTS 中使用多个连接加速 apt-get/apt
查看>>
《OpenACC并行编程实战》—— 导读
查看>>
机器学习:用初等数学解读逻辑回归
查看>>