学习MySQL复杂查询——day01

为了能快速并且高效学习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;

结果如下:
这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中,可以使用CASE WHEN语句结合子查询来解决一些问题。CASE WHEN语句是MySQL中的控制流语句,类似于其他编程工具中的IF…THEN…的分支判断逻辑。而子查询是将查询出来的结果作为一张表,在这个表上继续作查询的操作,可以用于进行更加复杂的数据筛选和计算。在使用CASE WHEN语句结合子查询时,需要给需要使用的字段或者表起个别名,避免命名冲突。子查询可以在SELECT语句的字段列表、FROM语句的表列表和WHERE语句中使用,甚至可以在HAVING语句中使用。通过使用子查询,可以在CASE WHEN语句中使用更复杂的条件和逻辑,实现更灵活的数据处理和筛选。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MySQL——基于CASE WHEN的常用查询](https://blog.csdn.net/Grateful_Dead424/article/details/122816278)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【大数据开发】MySQL数据库——子查询、自连接、集合操作(union)、条件判断(case-when)、行转列day25](https://blog.csdn.net/weixin_37090394/article/details/107707370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值