MySQL查询中的各种join

MySQL查询中的各种join

1- 定义两个表来介绍下SQL查询中的各种join,建表语句如下

table-a:

CREATE TABLE `table_a` (
  `id` bigint(12) NOT NULL,
  `name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `age` int(6) DEFAULT NULL,
  `gender` tinyint(2) DEFAULT NULL,
  `company` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

table-b:

CREATE TABLE `table_b` (
  `id` bigint(12) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `age` int(6) DEFAULT NULL,
  `gender` tinyint(2) DEFAULT NULL,
  `company` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

2 - 向两个表中插入数据

table-a:

INSERT INTO `table_a` (`id`, `name`, `age`, `gender`, `company`) VALUES('1','aa','21','1','公司1');
INSERT INTO `table_a` (`id`, `name`, `age`, `gender`, `company`) VALUES('2','bb','22','0','公司2');
INSERT INTO `table_a` (`id`, `name`, `age`, `gender`, `company`) VALUES('3','cc','23','1','公司3');

table-b:

INSERT INTO `table_b` (`id`, `name`, `age`, `gender`, `company`) VALUES('1','bb','22','0','公司2');
INSERT INTO `table_b` (`id`, `name`, `age`, `gender`, `company`) VALUES('2','cc','23','1','公司3');
INSERT INTO `table_b` (`id`, `name`, `age`, `gender`, `company`) VALUES('3','ff','26','1','公司C');

两张表数据如下图:

    

3- 各种join介绍

3.1-left join

Left join:两表共有+左表独有,SQL如下:

SELECT * FROM table_a a LEFT JOIN table_b b ON a.name = b.name

查询结果如下:



3.2-right join

Right join:两表共有+右表独有,SQL如下:

SELECT * FROM table_a a RIGHT JOIN table_b b ON a.name = b.name

查询结果如下:



3.3-inner join

Inner join:两表共有,SQL如下:

SELECT * FROM table_a a INNER JOIN table_b b ON a.name = b.name

查询结果如下:

4- 查询两表差集、并集

4.1-查询table_a表独有,SQL如下:

SELECT a.* FROM table_a a LEFT JOIN table_b b ON a.name = b.name WHERE b.name IS NULL

查询结果:


4.2-查询table_b表独有,SQL如下:

SELECT b.* FROM table_a a RIGHT JOIN table_b b ON a.name = b.name WHERE a.name IS NULL

查询结果:


4.3-查询table_a和table_b两表并集,SQL如下:

SELECT a.name,a.age,a.gender,a.company FROM table_a a
UNION
SELECT b.name,b.age,b.gender,b.company FROM table_b b

查询结果:

此处如果使用union all的得到的结果是不同的,SQL如下:

SELECT a.name,a.age,a.gender,a.company FROM table_a a
UNION ALL
SELECT b.name,b.age,b.gender,b.company FROM table_b b

对比union和union all的查询结果可知:

union会合并相同的查询结果,union all不会!

4.4-查询table_a独有和table_b独有,SQL如下:

SELECT a.name,a.age,a.gender,a.company FROM table_a a LEFT JOIN table_b b ON a.name = b.name WHERE b.name IS NULL
UNION
SELECT b.name,b.age,b.gender,b.company FROM table_b b LEFT JOIN table_a a ON a.name = b.name WHERE a.name IS NULL

查询结果如下:





猜你喜欢

转载自blog.csdn.net/weixin_38810239/article/details/80041787
今日推荐