为了能快速并且高效学习MySQL的相关复杂查询,查阅资料之后自己动手记录学习过程,加强记忆。第一天来学习MySQL的连接查询。

一、MySQL的连接查询

连接查询主要包括内连接与外连接等,是一种数据库中表与表之间是否关系的手段。

我们先准备建立两个表,分别为student与Grade,如下图所示:

mysql create temporary table 复杂查询 springboot mysql的复杂查询_数据库

mysql create temporary table 复杂查询 springboot mysql的复杂查询_mysql_02

1、内连接(inner jion)

个人理解内连接是通过连接表中的相同条件,重新组合成对应的新纪录,进行select查询。
通过sID与gID相等的条件,重新联立成临时的新记录表

-- inner jion
SELECT * FROM student INNER JOIN course ON student.sID = course.gID;
-- 默认为join
SELECT * FROM student JOIN course ON student.sID = course.gID;

其实是等价于:

SELECT *FROM student,course WHERE student.sID=course.gID;

结果如下:

mysql create temporary table 复杂查询 springboot mysql的复杂查询_mysql_03

2、外连接(outer jion)

外连接与内连接不同,外连接的最终结果不会是内连接那样,只有相同的条件才能被列出。而是以左表(left jion)或者右表(right jion)为主,列出所有的数据行。
2.1.左连接(left outer jion)

-- LEFT JOIN
SELECT * FROM student LEFT JOIN course ON student.sID = course.gID;

结果如下:以左表(student)为主,左表中的数据行都会显示,右表没有的都会显示NULL。

mysql create temporary table 复杂查询 springboot mysql的复杂查询_子查询_04

2.2.右连接(right outer jion)

-- RIGHT JOIN
SELECT * FROM student RIGHT JOIN course ON student.sID = course.gID;

结果如下:以右表(course)为主,右表中的数据行都会显示,左表没有的都会显示NULL。

mysql create temporary table 复杂查询 springboot mysql的复杂查询_mysql_05


2.3.全连接(full outer jion)

是结合左连接与右连接的方式,会得到两表都会没有的记录,以NULL的形式显示,但是MySQL不支持。不过可以用UNION关键字来建立左连接与右连接

-- Full JION=UNION
SELECT * FROM student LEFT JOIN course ON student.sID = course.gID
UNION
SELECT * FROM student RIGHT JOIN course ON student.sID = course.gID;

mysql create temporary table 复杂查询 springboot mysql的复杂查询_MySQL查询_06

3、自然连接(natural jion)

当我们需要将有相同列的两个表联结时,在查询结果中会出现至少两次相同的列,如下的例子。而我们要自动将表中相同的列进行匹配,同时排除掉重复出现的列,保证相同的列只出现一次。这就是自然连接的作用。

假如我们需要学生的具体信心,那么我们再添加这样一个表

mysql create temporary table 复杂查询 springboot mysql的复杂查询_MySQL查询_07


(1)当使用下列语句:

SELECT * FROM student,student_info WHERE student.sID=student_info.sID;

则会在查询结果中出现sID两个相同的列,而这是我们所不需要的

mysql create temporary table 复杂查询 springboot mysql的复杂查询_MySQL查询_08

(2)我们接下来要做的事,同样将将student表与student_info联立,但是得到该学生的ID、Name、Major、Age、Sex(排除掉重复的sID),即查询以ID为主键的学生的基本信息,那么将会用到自然连接(natural jion)。

SELECT * FROM student natural join student_info;

mysql create temporary table 复杂查询 springboot mysql的复杂查询_MySQL查询_09

(3)自然连接的处理过程

比如我们有两个表R与S在,则:

首先先得到:R X S(笛卡尔积)表

mysql create temporary table 复杂查询 springboot mysql的复杂查询_子查询_10

之后select出相同列完全相同的结果。即相同列sID,相同的结果:

sID=sID1=1;
sID=sID1=2;
sID=sID1=3;
sID=sID1=4;

mysql create temporary table 复杂查询 springboot mysql的复杂查询_子查询_11

最后排除掉相同重复的列,即可得到最后的结果

mysql create temporary table 复杂查询 springboot mysql的复杂查询_子查询_12

二、MySQL的子查询

子查询是一个查询语句嵌套着另外的查询语句,用来进行一定层次的查询,其中子查询相当于第一步查询过滤,外查询就是最后得到结果的查询。经常会用到关键字:ANY、SOME、ALL、IN、EXISTS

1、关键字ANY、SOME子查询:ANY/SOME都是表示满足其中一个条件即可。

-- 在student表中选择sID大于表course中gID的数据记录
-- sID只需要大于gID中任何一个就满足条件
SELECT * FROM student WHERE sID > ANY(SELECT gID FROM course);

mysql create temporary table 复杂查询 springboot mysql的复杂查询_MySQL_13

2、ALL关键字查询:与ANY/SOME相反,是要满足所有的条件才行。

SELECT col1 FROM t1 WHERE clo1> ALL(SELECT col2 FROM t2);

子查询的结果是查到t2表中的col2列,t1表中的col1都要满足大于col2的条件才能查询。

3、IN关键字查询:若外查询想要查询的结果在子查询中,则返回true,继续查询到结果,否则返回false,查询为NULL。
注意:与ANY类似,但是很不相同,IN后面可是子查询,也可以是给定的集合。ANY后面必须为子查询,且前面必须有运算符(<、>、=)

-- IN关键字,查询在子查询中的数据记录
-- 查询表student在sID在集合(1,2,5,7)中的数据记录行
SELECT * FROM student WHERE sID IN(1,2,5,7);

mysql create temporary table 复杂查询 springboot mysql的复杂查询_mysql_14


4、关键字EXISTS查询:表示在EXISTS后面的查询结果是否有结果,而不在乎子查询返回什么样的结果。若子查询的结果至少有一行,则为True,若子查询结果为NULL,则返回False,外层查询不再进行。

三、MySQL的合并查询

合并查询主要是UNION与UNION ALL 两个,是将查询结果合并,但是必须满足:合并的列的数据与数据类型必须相同。

(1)UNION ALL:合并时, 不删除重复的行

SELECT * FROM student 
UNION ALL
SELECT *FROM student;

结果如下:

mysql create temporary table 复杂查询 springboot mysql的复杂查询_mysql_15

(2)UNION:合并时候,删除重复相同的行

SELECT * FROM student 
UNION 
SELECT *FROM student;

结果如下:

mysql create temporary table 复杂查询 springboot mysql的复杂查询_子查询_16