MySql连接查询与联合查询
PS:相关环境
测试表:
DROP TABLE IF EXISTS `boys`;
CREATE TABLE `boys` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`boyName` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
INSERT INTO `boys` VALUES ('1', '张无忌');
INSERT INTO `boys` VALUES ('2', '令狐冲');
INSERT INTO `boys` VALUES ('3', '郭靖');
INSERT INTO `boys` VALUES ('4', '杨过');
INSERT INTO `boys` VALUES ('5', '宋青书');
DROP TABLE IF EXISTS `girls`;
CREATE TABLE `girls` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`boyfriend_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;
INSERT INTO `girls` VALUES ('1', '小龙女', '4');
INSERT INTO `girls` VALUES ('2', '赵敏', '1');
INSERT INTO `girls` VALUES ('3', '东方不败', '2');
INSERT INTO `girls` VALUES ('4', '黄蓉', '3');
INSERT INTO `girls` VALUES ('5', '郭襄', '100');
girls
表中的数据: boys
表中的数据:
为了方便大家测试将表结构与表中的数据都在上面贴了出来,直接拷贝到数据库执行即可。所有的测试都通过上面 2 张表完成,大于 2 张表时原理是一样的。
一、等值连接
等值连接:查询的结果是 2 张表或多张表中“同时满足”条件的数据
主要语法:... INNER JOIN ... ON ...
示意图:
案例:查询有男朋友的女生的名字与其对应的男朋友的名字
SQL 语句(同 WHERE
):
SELECT
g. name,
b.boyName
FROM
girls g
INNER JOIN boys b ON g.boyfriend_id = b.id;
查询结果:
二、左外连接
左外连接:也称为左连接,查询的结果是 2 张表“同时满足”条件的数据与左侧表中不符合条件的数据的结合
主要语法:... LEFT OUTER JOIN ... ON ...
示意图:
案例 1:查询有男朋友的女生的名字与对应的男朋友的名字,并查询没有男朋友的女生的名字
SQL 语句(OUTER
可以省略):
SELECT
g. name,
b.boyName
FROM
girls g
LEFT OUTER JOIN boys b ON g.boyfriend_id = b.id;
查询结果:
案例二:查询没有男朋友的女生的名字
SQL 语句:
SELECT
g. name
FROM
girls g
LEFT JOIN boys b ON g.boyfriend_id = b.id
WHERE b.id IS NULL;
查询结果:
三、右外连接
右外连接:也称为右连接,查询的结果是 2 张表“同时满足”条件的数据与右侧表中不符合条件的数据的结合
主要语法:... RIGHT OUTER JOIN ... ON ...
示意图:
案例 1:查询有男朋友的女生的名字与对应的男朋友的名字,并查询没有女朋友的男生的名字
SQL 语句:
SELECT
g. name, B.boyName
FROM
girls g
RIGHT JOIN boys b ON g.boyfriend_id = b.id;
查询结果:
案例 2:查询没有女朋友的男生的名字,这个的答案就不贴出来了,有兴趣的可以自己尝试一下
四、全外连接
全外连接:查询的结果是 2 张表“同时满足”条件的数据与左侧表和右侧表中不符合条件的数据的结合
主要语法:... FULL JOIN ... ON ...
示意图:
案例 1:查询有男朋友的女生的名字与对应的男朋友的名字,并查询没有男朋友的女生的名字与没有女朋友的男生的名字
SQL 语句:
SELECT
g. name, B.boyName
FROM
girls g
FULL JOIN boys b ON g.boyfriend_id = b.id
注:MySql 并不支持全外连接,所有上面的语句在执行的时候会报错,但是在 Oracle 数据库中是支持的。关于这个案例,我们可以使用联合查询的方式来实现,会在下面讲述。
五、联合查询
联合查询:就是把多个查询语句的查询结果结合在一起
主要语法1:... UNION ...
主要语法2:... UNION ALL ...
案例 1:查询所有女生的名字与男生的名字
SQL 语句:
SELECT name FROM girls
UNION
SELECT boyName FROM boys;
查询结果:
案例 2:实现上面的全外连接
SQL 语句:
SELECT
g. name,
b.boyName
FROM
girls g
LEFT JOIN boys b ON g.boyfriend_id = b.id
UNION
SELECT
g. name, B.boyName
FROM
girls g
RIGHT JOIN boys b ON g.boyfriend_id = b.id;
查询结果:
在实现全外连接的时候我们使用了左外连接与右外连接相结合,并且在数据结合的时候把重复的数据去除了。
案例 3:查询单身男女的姓名,这个就留给大家自己做吧
UNION
与 UNION ALL
的区别:联合查询支持UNION
与 UNION ALL
两种用法,其中UNION
会把多个查询语句的结果合并后去重,UNION ALL
会把所有的查询结果合并,包括重复的数据。
上一篇: 百度开源的分布式 id 生成器
下一篇: Python - 分布式爬取百度贴吧