MySql链接查询与联合查询

PS:相关环境

测试表:web

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表中的数据:
这里写图片描述sql

为了方便你们测试将表结构与表中的数据都在上面贴了出来,直接拷贝到数据库执行便可。全部的测试都经过上面 2 张表完成,大于 2 张表时原理是同样的。数据库

1、等值链接

等值链接:查询的结果是 2 张表或多张表中“同时知足”条件的数据svg

主要语法:... INNER JOIN ... ON ...测试

示意图:
这里写图片描述spa

案例:查询有男友的女生的名字与其对应的男友的名字3d

SQL 语句(同 WHERE):code

SELECT g. name, b.boyName FROM girls g INNER JOIN boys b ON g.boyfriend_id = b.id;

查询结果:
这里写图片描述xml

2、左外链接

左外链接:也称为左链接,查询的结果是 2 张表“同时知足”条件的数据与左侧表中不符合条件的数据的结合blog

主要语法:... 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;

查询结果:
这里写图片描述

3、右外链接

右外链接:也称为右链接,查询的结果是 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:查询没有女友的男生的名字,这个的答案就不贴出来了,有兴趣的能够本身尝试一下

4、全外链接

全外链接:查询的结果是 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 数据库中是支持的。关于这个案例,咱们可使用联合查询的方式来实现,会在下面讲述。

5、联合查询

联合查询:就是把多个查询语句的查询结果结合在一块儿

主要语法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:查询单身男女的姓名,这个就留给你们本身作吧

UNIONUNION ALL的区别:联合查询支持UNIONUNION ALL两种用法,其中UNION 会把多个查询语句的结果合并后去重UNION ALL会把全部的查询结果合并,包括重复的数据。