MySQL中的集合运算

一、表的加减运算

说起集合就不知不觉得想起了我的高中时代,必修A第一册的第一章,学习的内容就是集合,转眼间毕业就快一年了。

空集是任何非空集合的子集······

当然我今天并不是来讲述关于我的高中时代的,只是勾起了我的一些回忆。

集合的运算表示

通俗的来说就是事物的总和

以下就是venn图的表示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
[图片源于网络]

MySQL中使用UNION,INTERSECT,EXCEPT来检索结果

表示加法 – UNION

接下来我们通过一个例子来演示一下UNION的用法

假设一个表存储了学生的信息,包括学生的姓名和年龄,另一个表存储了员工的信息,包括员工的姓名和年龄。

SELECT name, age 
FROM students 
UNION 
SELECT name, age 
FROM employees;

上述这串代码我们首先选择学生表中的姓名和年龄,然后使用UNION操作符选择员工表中的姓名和年龄。最后,将两个结果合并并显示所有人的姓名和年龄。


UNION 与 OR 谓词
SELECT name, age 
FROM students 
WHERE name IN (SELECT name FROM employees) 
OR age > 19;

上述代码中,我们选择学生表中的姓名和年龄,使用IN子查询选择与员工表中的姓名匹配的记录,并且使用OR谓词来添加另一个条件,也就是说年龄大于19岁的学生信息。查询将返回满足姓名匹配或年龄大于19岁条件的学生信息。

UNION和OR谓词在MySQL中都可以用来组合多个条件来筛选数据,因此它们大概区别:

UNION的起到的作用是属性值合并,对于重复的值来说,UNION它有默认删除重复值的效果。

OR谓词用于在单个查询中指定多个条件,只要其中任意一个条件为真,就会返回该行数据。

综上所述,UNION适用于合并多个独立的查询结果的集合,OR适用于在一个查询中组合多个筛选条件。

包含重复行的集合运算 UNION ALL

有删除重复行自然也就有保留重复行,这里我们就需要引入一个新的关键字ALL。

接下来我们就通过一个具体的例子来说明一下

SELECT * 
FROM students 
WHERE major = '计算机科学'
UNION ALL 
SELECT * 
FROM students 
WHERE age > 19;

上述代码中,我们首先查询专业为计算机科学的学生信息,然后使用UNION ALL将年龄大于19岁的学生信息添加到结果集中,为此就可以保留包含重复行的结果。



二、连接

连接是用于在多个表之间建立关联关系的一种操作。连接可以让我们与存储在不同表中的数据进行关联查询,从而搜寻出更加复和有用的信息。

就好比是将多个表中的数据粘在一起,让它们之间建立联系。通过连接操作,我们可以像拼图一样,将不同表中相关的数据组合在一起,使查询变得更加灵活和精确。这样我们就可以轻松地在各个表中查找、对比和分析数据,获取更丰富、更准确的信息。

1.内连接

以下是内连接的基本格式

SELECT 列表名 --指定需要查询的列表明
FROM1
INNER JOIN2
ON '指定的连接条件';--这里可以填入两个表之间的关联字段。

2.外连接

是一种在关系数据库中使用的连接操作,用于将两个或多个表中的数据进行连接,并返回符合连接条件的数据,同时保留未匹配的行。

就像在找朋友联系方式时,有的朋友有手机号码,有的朋友没有,外连接可以让你把所有朋友的信息整理出来,没有手机号码的朋友也能显示出来。

2.1左外连接

左外连接会显示左表中的所有行,即使右表中没有匹配的行。

SELECT 列表名
FROM1
LEFT JOIN2
ON '指定的连接条件';--这里可以填入两个表之间的关联字段。

下面就来看一个关于左外连接的例子

SELECT students.student_name, grades.math_grade
FROM student
LEFT JOIN grades
ON student.student_id = grades.student_id;

在上述代码中我们首先要定义

表1:student (学生信息)

表2::grades (成绩信息)

student 中包含了学生的学号(student_id)和姓名(student_name)等

成绩表 (grades) 包含学生的学号(student_id)和数学成绩(math_grade)等

查找所有学生的姓名和数学成绩

2.2右外连接

左外连接会显示右表中的所有行,即使左表中没有匹配的行。

SELECT 列名
FROM1
RIGHT JOIN2
ON '指定的连接条件';--这里可以填入两个表之间的关联字段。

通过上述的左外连接我们可以举出一个和右外连接的例子

SELECT students.student_name, grades.math_grade
FROM student
RIGHT JOIN grades
ON student.student_id = grades.student_id;

在上述代码中我们首先要定义

表1:student (学生信息)

表2::grades (成绩信息)

student 中包含了学生的学号(student_id)和姓名(student_name)等

成绩表 (grades) 包含学生的学号(student_id)和数学成绩(math_grade)等

查找所有学生的姓名和数学成绩

看到这里也许你会有和我最开始学习MySQL一样对于这个左右查询有些疑惑,所以它们之间到底区别在哪里呢?

这就是我的一点小见解,如果是左外连接就是看左边表的所有数据,再加上右边表里能匹配上的数据,如果是右外连接就是看右边表的所有数据,再加上左边表里能匹配上的数据。

2.3全外连接

可以将左右两个表中的所有数据都包括在结果集中,不管是否有匹配的记录。

SELECT 列名
FROM1
FULL JOIN2
ON '指定的连接条件';--这里可以填入两个表之间的关联字段。

下面就举个全外连接的例子来说明一下

--这种是原始的全外连接的方式
SELECT students.student_name, grades.math_grade
FROM student
LEFT JOIN grades
ON student.student_id = grades.student_id;
UNION
SELECT students.student_name, grades.math_grade
FROM student
RIGHT JOIN grades
ON student.student_id = grades.student_id;

--这个是加了FULL关键字的方式
SELECT Students.student_name, Grades.math_grade
FROM Students
FULL OUTER JOIN Grades
ON Students.student_id = Grades.student_id;

上述两种方式均可表示全外连接

这种方式可以获得包括所有学生信息和他们的数学成绩在内的结果集,就算某些学生没有数学成绩的记录也能显示出来。


3.多表连接

就是有两张或者两张以上的表的查询,不过一般多使用两张表,原则上无限制。

SELECT s.name 
AS student_name, c.course_name
FROM student s
JOIN courses_registered cr 
ON s.student_id = cr.student_id
JOIN courses c 
ON cr.course_id = c.course_id;

上述这串代码两个表student和courses,student表包含了学生的信息,包括学生ID(student_id)、姓名(name)、专业(major)等字段,courses表包含了课程的信息,包括课程ID(course_id)、课程名称(course_name)等字段。

使用students表、courses_registered表和courses表进行连接,通过学生ID和课程ID这两列连接三个表。

这样便可以获取选修了课程的学生的姓名以及所选课程的名称的信息。


这是本人在学习过程中整理的,由于学习能力有限,还有很多知识还需要进一步理解,无法做到面面聚到,还请谅解!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值