为了能快速并且高效学习MySQL的相关复杂查询,查阅资料之后自己动手记录学习过程,加强记忆。第一天来学习MySQL的连接查询。
一、MySQL的连接查询
连接查询主要包括内连接与外连接等,是一种数据库中表与表之间是否关系的手段。
我们先准备建立两个表,分别为student与Grade,如下图所示:
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;
结果如下:
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。
2.2.右连接(right outer jion)
-- RIGHT JOIN
SELECT * FROM student RIGHT JOIN course ON student.sID = course.gID;
结果如下:以右表(course)为主,右表中的数据行都会显示,左表没有的都会显示NULL。
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;
3、自然连接(natural jion)
当我们需要将有相同列的两个表联结时,在查询结果中会出现至少两次相同的列,如下的例子。而我们要自动将表中相同的列进行匹配,同时排除掉重复出现的列,保证相同的列只出现一次。这就是自然连接的作用。
假如我们需要学生的具体信心,那么我们再添加这样一个表
(1)当使用下列语句:
SELECT * FROM student,student_info WHERE student.sID=student_info.sID;
则会在查询结果中出现sID两个相同的列,而这是我们所不需要的
(2)我们接下来要做的事,同样将将student表与student_info联立,但是得到该学生的ID、Name、Major、Age、Sex(排除掉重复的sID),即查询以ID为主键的学生的基本信息,那么将会用到自然连接(natural jion)。
SELECT * FROM student natural join student_info;
(3)自然连接的处理过程
比如我们有两个表R与S在,则:
首先先得到:R X S(笛卡尔积)表
之后select出相同列完全相同的结果。即相同列sID,相同的结果:
sID=sID1=1;
sID=sID1=2;
sID=sID1=3;
sID=sID1=4;
最后排除掉相同重复的列,即可得到最后的结果
二、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);
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);
4、关键字EXISTS查询:表示在EXISTS后面的查询结果是否有结果,而不在乎子查询返回什么样的结果。若子查询的结果至少有一行,则为True,若子查询结果为NULL,则返回False,外层查询不再进行。
三、MySQL的合并查询
合并查询主要是UNION与UNION ALL 两个,是将查询结果合并,但是必须满足:合并的列的数据与数据类型必须相同。
(1)UNION ALL:合并时, 不删除重复的行
SELECT * FROM student
UNION ALL
SELECT *FROM student;
结果如下:
(2)UNION:合并时候,删除重复相同的行
SELECT * FROM student
UNION
SELECT *FROM student;
结果如下: