欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySql连接查询与联合查询

程序员文章站 2022-05-03 19:40:20
...

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表中的数据:
MySql连接查询与联合查询
boys表中的数据:
MySql连接查询与联合查询

为了方便大家测试将表结构与表中的数据都在上面贴了出来,直接拷贝到数据库执行即可。所有的测试都通过上面 2 张表完成,大于 2 张表时原理是一样的。

一、等值连接

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

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

示意图:
MySql连接查询与联合查询

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

SQL 语句(同 WHERE):

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

查询结果:
MySql连接查询与联合查询

二、左外连接

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

主要语法:... LEFT OUTER JOIN ... ON ...

示意图:
MySql连接查询与联合查询
案例 1:查询有男朋友的女生的名字与对应的男朋友的名字,并查询没有男朋友的女生的名字

SQL 语句(OUTER 可以省略):

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

查询结果:
MySql连接查询与联合查询

案例二:查询没有男朋友的女生的名字

SQL 语句:

SELECT
    g. name
FROM
    girls g
LEFT JOIN boys b ON g.boyfriend_id = b.id
WHERE b.id IS NULL;

查询结果:
MySql连接查询与联合查询

三、右外连接

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

主要语法:... RIGHT OUTER JOIN ... ON ...

示意图:
MySql连接查询与联合查询

案例 1:查询有男朋友的女生的名字与对应的男朋友的名字,并查询没有女朋友的男生的名字

SQL 语句:

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

查询结果:
MySql连接查询与联合查询

案例 2:查询没有女朋友的男生的名字,这个的答案就不贴出来了,有兴趣的可以自己尝试一下

四、全外连接

全外连接:查询的结果是 2 张表“同时满足”条件的数据与左侧表和右侧表中不符合条件的数据的结合

主要语法:... FULL JOIN ... ON ...

示意图:
MySql连接查询与联合查询

案例 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;

查询结果:
MySql连接查询与联合查询

案例 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;

查询结果:
MySql连接查询与联合查询
在实现全外连接的时候我们使用了左外连接与右外连接相结合,并且在数据结合的时候把重复的数据去除了。

案例 3:查询单身男女的姓名,这个就留给大家自己做吧

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