共計(jì) 4284 個(gè)字符,預(yù)計(jì)需要花費(fèi) 11 分鐘才能閱讀完成。
這篇文章將為大家詳細(xì)講解有關(guān) MySQL 中七種 JOIN 的 SQL 是怎樣的,文章內(nèi)容質(zhì)量較高,因此丸趣 TV 小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
準(zhǔn)備數(shù)據(jù)
以一個(gè)簡(jiǎn)易問答系統(tǒng)為例,包括問題表和問題所屬標(biāo)簽,問題表如下:
CREATE TABLE `t_qa` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `title` varchar(200) NOT NULL DEFAULT COMMENT 標(biāo)題 , `answer_count` int(5) unsigned NOT NULL DEFAULT 0 COMMENT 回答個(gè)數(shù) , `label_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT 標(biāo)簽 id , `create_by` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT 創(chuàng)建人 , `create_date` datetime NOT NULL DEFAULT 0000-00-00 00:00:00 COMMENT 創(chuàng)建時(shí)間 , `update_by` bigint(20) unsigned DEFAULT NULL COMMENT 更新人 , `update_date` datetime DEFAULT NULL COMMENT 更新時(shí)間 , `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);
標(biāo)簽表如下:
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 創(chuàng)建人 , `create_date` datetime NOT NULL DEFAULT 0000-00-00 00:00:00 COMMENT 創(chuàng)建時(shí)間 , `update_by` bigint(20) unsigned DEFAULT NULL COMMENT 更新人 , `update_date` datetime DEFAULT NULL COMMENT 更新時(shí)間 , `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)
問題回答個(gè)數(shù)標(biāo)簽 id 標(biāo)簽名稱 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)
問題回答個(gè)數(shù)標(biāo)簽 id 標(biāo)簽名稱 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
三、內(nèi)連接 (INNER JOIN)
問題回答個(gè)數(shù)標(biāo)簽 id 標(biāo)簽名稱 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
四、左獨(dú)有連接 (LEFT JOIN)
問題回答個(gè)數(shù)標(biāo)簽 id 標(biāo)簽名稱 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
五、右獨(dú)有連接 (RIGHT JOIN)
問題回答個(gè)數(shù)標(biāo)簽 id 標(biāo)簽名稱 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,所以如果有全連接需求時(shí),可用表達(dá)式:full outer join = left outer join UNION right outer join 來實(shí)現(xiàn)。
問題回答個(gè)數(shù)標(biāo)簽 id 標(biāo)簽名稱 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.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)
問題回答個(gè)數(shù)標(biāo)簽 id 標(biāo)簽名稱 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.idWHERE tl.id IS NULL UNIONSELECT tq.title, tq.answer_count, tl.id, tl.name FROM t_qa tq RIGHT JOIN t_label tl ON tq.label_id = tl.idWHERE tq.label_id IS NULL
關(guān)于 MySQL 中七種 JOIN 的 SQL 是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。