準備數據
以一個簡易問答系統爲例,包括問題表和問題所屬標籤,問題表以下:php
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);
標籤表以下:css
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);
1、左鏈接(LEFT JOIN)
![圖片描述 圖片描述](http://static.javashuo.com/static/loading.gif)
問題 |
回答個數 |
標籤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
2、右鏈接(RIGHT JOIN)
![圖片描述 圖片描述](http://static.javashuo.com/static/loading.gif)
問題 |
回答個數 |
標籤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
3、內鏈接(INNER JOIN)
![圖片描述 圖片描述](http://static.javashuo.com/static/loading.gif)
問題 |
回答個數 |
標籤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
4、左獨有鏈接(LEFT JOIN)
![圖片描述 圖片描述](http://static.javashuo.com/static/loading.gif)
問題 |
回答個數 |
標籤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
5、右獨有鏈接(RIGHT JOIN)
![圖片描述 圖片描述](http://static.javashuo.com/static/loading.gif)
問題 |
回答個數 |
標籤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
6、全鏈接(FULL JOIN)
![圖片描述 圖片描述](http://static.javashuo.com/static/loading.gif)
因爲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
7、全鏈接去交集(FULL JOIN)
![圖片描述 圖片描述](http://static.javashuo.com/static/loading.gif)
問題 |
回答個數 |
標籤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