【MySQL笔记】七种JOIN的SQL

准备数据

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

 
 
 
 
  1. CREATE TABLE `t_qa` (
  2.   `id` bigint(20) NOT NULL AUTO_INCREMENT,
  3.   `title` varchar(200) NOT NULL DEFAULT '' COMMENT '标题',
  4.   `answer_count` int(5) unsigned NOT NULL DEFAULT '0' COMMENT '回答个数',
  5.   `label_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '标签id',
  6.   `create_by` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建人',
  7.   `create_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
  8.   `update_by` bigint(20) unsigned DEFAULT NULL COMMENT '更新人',
  9.   `update_date` datetime DEFAULT NULL COMMENT '更新时间',
  10.   `del_flag` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0:不删除,1:删除',
  11.   PRIMARY KEY (`id`)
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  13. INSERT INTO `t_qa` (`id`, `title`, `answer_count`, `label_id`, `create_by`, `create_date`, `update_by`, `update_date`, `del_flag`)
  14. VALUES
  15.     (1, 'Java是什么?', 5, 1, 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),
  16.     (2, 'PHP是什么?', 4, 2, 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),
  17.     (3, '前端是什么?', 3, 3, 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),
  18.     (4, 'nodejs是什么?', 2, 0, 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),
  19.     (5, 'css是什么?', 1, 0, 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),
  20.     (6, 'JavaScript是什么?', 0, 0, 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0); 

标签表如下:

 
 
 
 
  1. CREATE TABLE `t_label` (
  2.   `id` bigint(20) NOT NULL AUTO_INCREMENT,
  3.   `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',
  4.   `create_by` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建人',
  5.   `create_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
  6.   `update_by` bigint(20) unsigned DEFAULT NULL COMMENT '更新人',
  7.   `update_date` datetime DEFAULT NULL COMMENT '更新时间',
  8.   `del_flag` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '0:不删除,1:删除',
  9.   PRIMARY KEY (`id`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  11. INSERT INTO `t_label` (`id`, `name`, `create_by`, `create_date`, `update_by`, `update_date`, `del_flag`)
  12. VALUES
  13.     (1, 'java', 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),
  14.     (2, 'php', 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),
  15.     (3, '大前端', 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),
  16.     (4, 'mybatis', 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),
  17.     (5, 'python', 0, '2017-08-24 17:43:53', 0, '2017-08-24 17:43:53', 0),
  18.     (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
 
 
 
 
  1. SELECT 
  2.     tq.title, tq.answer_count, tl.id, tl.name
  3. FROM 
  4.     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 多线程
 
 
 
 
  1. SELECT 
  2.    tq.title, tq.answer_count, tl.id, tl.name
  3. FROM 
  4.     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 大前端
 
 
 
 
  1. SELECT 
  2.     tq.title, tq.answer_count, tl.id, tl.name
  3. FROM 
  4.     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
 
 
 
 
  1. SELECT 
  2.     tq.title, tq.answer_count, tl.id, tl.name
  3. FROM 
  4.     t_qa tq LEFT JOIN t_label tl ON tq.label_id = tl.id
  5. WHERE
  6.     tl.id IS NULL 

五、右独有连接(RIGHT JOIN)

问题 回答个数 标签id 标签名称
NULL NULL 4 mybatis
NULL NULL 5 python
NULL NULL 6 多线程
 
 
 
 
  1. SELECT 
  2.     tq.title, tq.answer_count, tl.id, tl.name
  3. FROM 
  4.     t_qa tq RIGHT JOIN t_label tl ON tq.label_id = tl.id
  5. WHERE
  6.     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 多线程
 
 
 
 
  1. 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
  2. UNION
  3. 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 多线程
 
 
 
 
  1. 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
  2. UNION
  3. 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
当前链接:http://www.shufengxianlan.com/qtweb/news43/446293.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联