MySQL的左连接,右连接和内连接

创建测试表

这里创建两张测试表

创建 test_provinceid 表

1
2
3
4
5
6
7
8
CREATE TABLE `test_province` (
`id` CHAR(2) NOT NULL,
`pname` CHAR(6) NOT NULL,
PRIMARY KEY (`id`)
)
COMMENT='省份'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

创建 test_cityid 表

1
2
3
4
5
6
7
8
9
CREATE TABLE `test_city` (
`id` CHAR(2) NOT NULL,
`pid` CHAR(10) NOT NULL,
`cname` CHAR(10) NOT NULL COLLATE 'latin1_swedish_ci',
PRIMARY KEY (`id`)
)
COMMENT='城市'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

插入测试数据

1
2
3
4
5
6
7
INSERT INTO `test`.`test_province` (`id`, `pname`) VALUES ('AH', '安徽省');
INSERT INTO `test`.`test_province` (`id`, `pname`) VALUES ('ZJ', '浙江');
INSERT INTO `test`.`test_province` (`id`, `pname`) VALUES ('HN', '河南');
INSERT INTO `test`.`test_city` (`id`, `pid`, `cname`) VALUES ('01', 'AH', '合肥');
INSERT INTO `test`.`test_city` (`id`, `pid`, `cname`) VALUES ('04', 'AH', '六安');
INSERT INTO `test`.`test_city` (`id`, `pid`, `cname`) VALUES ('02', 'HN', '郑州');
INSERT INTO `test`.`test_city` (`id`, `pid`, `cname`) VALUES ('03', 'HB', '石家庄');

数据库中 test_province 数据现在有如下这些:

数据库中 test_city 数据现在有如下这些:

左连接

语法

1
2
3
SELECT *
FROM a LEFT JOIN b
ON a.key = b.key

左连接以左边的表作为主表,这里我们以 test_province 为主表,查看一个省份在 test_city 中有哪些城市

测试

1
select * from test_province a LEFT JOIN (select * from test_city) b on a.id = b.pid

执行结果


注意:这里将省份存在,城市不存在的数据也显示出来了

右连接

语法

1
2
3
SELECT *
FROM a RIGHT JOIN b
ON a.key = b.key

有上述的左连接的认知,我们不难得出,右连接是以右边的表作为主表的认识,这里我们将上面的语句简单修改一下

测试

1
select * from test_province a RIGHT JOIN (select * from test_city) b on a.id = b.pid

执行结果


注意:这里将城市存在,省份不存在的数据也显示出来了

内连接

语法

1
2
3
SELECT *
FROM a INNER JOIN b
ON a.key = b.key

左连接以左边的表作为主表,有连接以右边的表作为主表,还差一个以双方作为主表的连接,那就是内连接啦,内连接的想法很简单,你有我有大家都有才是真的有,同样简单修改一下语句

测试

1
select * from test_province a INNER JOIN (select * from test_city) b on a.id = b.pid

执行结果


注意: 这里只显示了城市和省份想匹配的数据