00:01
这一节呢,我们讲叫子查询,子查询还是叫查询说明还是select的,这一节也是我们讲。查询的最后一节一到六,相当于我们全部都是在讲查询,我们说大家你学学过或者了解过,听说过数据库操作的话,大家常称作叫增删改查。就像你去剪头发的时候,一条龙叫洗剪吹对吧?增删改查,我们用茶的操作实际上是最多的,所以我们用了较大的篇幅来给大家讲解查询。后边呢,关于增删改,我们在第八节中讲,第七节叫创建并管理表,还有其他的一些内容,我们再往后讲。这是我们讲拉的最后一个。大家你学习知识的时候,一定要有一个呃,叫什么大处着眼,小处着手的这样一个想法,你具体去学某某个知识的时候,那肯定要具体去操作,去实施,然后呢,你也要知道你现在所学的这个知识,出于你整个知识框架的哪一部分,它到底是重要的还是不重要的,是需要你了解的,还是需要你认真掌握的。
01:13
需要明白子查询,我们来看一下。这一节我们达到的一个目标呢,就是我们要知道什么叫子查询,然后通过子查询,我们要学会解决具体的问题。在子查询这一块,我们又分为叫单行子查询和多行子查询这样两个概念。那么具体在什么时候使用单行,什么时候使用多行,这我们根据实际问题来决定。好了,那我们来看一下子查询能解决什么样的问题。这有一个题目叫谁的工资比阿贝尔的高?我们在查询这个employees表的时候,想得到这样一个结果,看看在employees表当中,谁的工资比阿贝尔的工资要高。来,我们把这个题目拿出来。
02:12
谁的工资比阿贝尔的高?这个问题用我们今天讲的子查询就可以来解决。但是用此查询之前,你想一想,我可不可以通过旧的知识解决这个问题?哎,就是这如果是一个实际问题的话,有的同学应该会想,谁的工资比他高?你把这个employ表咔嚓往那一放,我是不是第一步先应该把阿贝尔的工资先找到,看看他是挣多少钱吧。然后我再看看这个表当中谁的钱比他们多,是这样吧,好了,相当于我们就有一个思路来解决他。第一步呢,我先查询到阿贝尔的工资是多少。
03:11
好,阿贝的工资是11000,然后呢,我们想找到他的工资以后,我再看谁的比他的高,那我只需要查询一下谁对吧?那就是select last nameme,我再输出一下他们的工资也行,From employees where,他们的工资要求是不是得大于一万一呀,一万一是贝尔的比他的工资高,就这样一些人。看到一共是有十个人,有十个人满足我们的题面要求。那么下面我们就想了啊,我们刚才实现呢,是通过两个查询语句来实现的,我现在能不能给它合成一个。合成一个的话,我们看这个这是最终效果了,这里边儿是不是只有这个一,万一来自于上一个查询啊,那上一个查询就是它,我能不能把这个查询作为一个结果返回给我这个查询呢。
04:14
那如果要是那样想的话,是不是相当于这个右端我得放一下,放上刚才查询那个结果吧,但结果有很多条语句,我用一个括号来括起来,表明是不是有小号的,我要先算小括号里的,对吧?好了,我把它放进来。在这个题目当中,我们看到有一个小括号,有小括号先问它这里边儿是不是就得到了11000,然后把这个结果返回给外层查询,得到一个值。不能叫一个值的得到多个值,我们看一下可不可以哈,没问题,也是十条记录,那么这个就是我们今天要讲的子查询。子查询啊,大家其实不不难是吧,诶怎么叫子查询,就是我们之前写查询的时候,就是一层查询条件啊,或者分组啊,只是不同的这个约束条件而已,那么在这个里边,我们相当于是进行了多次查询。
05:13
而且习惯上我们把这个查询子查询的这个内,或者叫内部查询对应的这叫外部查询,把内部查询作为条件写在这个等号不等号的右端。作为一个过滤条件进行一个筛选啊,那么也就是说什么时候当你一定要用到子查询,就是当你需要进行过滤的时候,这里边儿这个条件还是一个未知的,我就再需要进行一次查询,这个时候就需要我们用到查询。那这个题目我们就这样解决了。那么这个题目解决以后,大家回忆一下,我们讲前边应该是第四节叫多表连接吧,多表连接的时候讲到一个字连接,那会儿我们做了一个练习题,大家想想是哪个叫,嗯。
06:01
查询员工员工名为陈的manager的信息还记得吧?查询员工名为的manager的信息。这个当时我们用了两种方式,第一种也是分布,第二种呢叫自连接,我们把一个表当成员工表,一个表当成manager表,实现一个自连接的查询,那么当时我们也提到说在讲到子查询的时候,还有另一种更通用的方法,就是我们今天要说的。我们把两个查询合成一个,那第一步呢,是不是还是得查询员工名为陈,你看他的manager ID是多少,然后manager ID同时也是一个employd,看看谁的employd。是等于manage ID,那么你ID找到了信息是不是就找着了,好了,所以我们就可以这样来写,当然你写的时候这里边子查询啊,给大家说一下子查询,你在实现的时候,你可以从外到内,也可以从内到外。
07:11
就是看你对这个知识的一个熟悉程度了。假设我们要是从内到外的话,是不是还是应该先查询一下陈这个人的minor的ID好了,Select manager ID from employees where叫last name last nameme等于陈。嗯。这个人的MID。我们运行下结果是它是108,然后我们看看谁的employed是不是等于many ID啊,把它作为一个查询的一个条件返回给外层select,我看一下拉内。再看一下他的。
08:01
嗯,Salary from employees where employee ID等于是不是刚才我们的这个结果呀?就这样操作,我们看看这个人是谁,叫格林伯格对吧?当时我们查询到的也是这个人,这样呢,我们就通过子查询来实现的。我们是从内到外,你先把内部搞定了,再到外部你也可以,如果你特别熟了以后啊,也可以直接从外到内,你最后要查的不就要查询它吗?要查询它我得需要依托于一个过滤条件,这过滤条件又需要依托于这个式子,那ID等于。一会儿我们还有题目,大家可以体会一下两种写这个紫杀菌的方式。好了,我们接着往后看。
09:03
那就说子查询或者叫内查询,在主查询之前一次执行完成,然后子查询的结果被主查询所使用。这是我们刚才这个题目。这有一个注意事项,子查询要包含在括号内,通常写在右侧。啊,单行子查询,对应的单行的单行操作图,对应的单行子查询,多行对应的多行子查询。这是这个什么叫多样子查询,说白了就是你内部这个查询的结果返回的是多条记录。多条记录反馈给外层了,或者叫主查询了,那就是要多行的单行就只返回一个结果,那我们先看单行的有哪些可以使用的操作服务。就是我们最常用的等于大于大于等于小于小于等于不等于,就这几个符号。那那我们在这这就练一些题目就可以了啊。看这个。
10:09
嗯。返回job ID与141号员工相同,Salary比143号员工多的员工的姓名ID和工资,这个呢,我们就从外层给大家来演示,你看它返回这个这个这个这个是是不是都是一些条件呀。然后最终是不是还是要返回这样三个信息,所以呢,我就直接从外层到name返回last name。Job ID salary from employees where,他想有哪些条件呀?说照白ID跟141号员工的相比,你得是不是查询到141号员工,你看他的照白ID是多少吧,所以呢,就是job ID等于某一个东西。
11:03
Salary怎么着?那就是and salary得比它多大于某一个东西。这个题目是不是就写了呢?然后需要进行此查询的,就是我们这里边儿这个。你把这个括号给它填充好。来,我们来写第一个。141号员工的告白地。这样吧。他等于他,然后呢,Salary比143号员工的多,你要查询一下143号员工的salary。
12:01
这查询的salary,这查询是照白地相应的满足条件。OK,是不是就是这样一些人,你看招牌ID都是他这个部门里边的,工资比他高。是查询好了,这叫子查询,那我们再看一下这个题目。返回公司,公司最少的员工的1233个信息,最后是不是还是要输入这三个信息啊,所以我还可以考虑从外层到内层。返回公司工资最少的员工,那你是不是得需要查一下,看看工资最少的那个员工是谁吧?
13:03
那应该怎么办呀,是不是我得看一下,我现在是不是需要查询,你看看谁的工资是不是等于工资里边那个工资最少了吧。再说一遍,这里边儿也有一个不确定因素,你现在像查这几个信息,那查这个信息,查谁的信息啊,公司最工资最少的那个人。工资最少的,那你是不是得需要告诉我公司里边最少的工资是多少吧?然后你再看看谁的工资等于那个最少的。所以说是个子查询,那内部呢,就需要返回一下公司当中的最少的工资。然后你看谁的工资是这个最少的。然后返回他的信息对吧。就这个人2100。行。再往后。刚才我们使用的这个查询条件呀,或怎么样,Where用的过滤都没有涉及到。
14:05
主函数吧,那如果要是涉及到此函主函数呢,那你就用having,这个没什么多说的,这属于旧知识的,那我们拿这个题目来给大家说明一下。查询最低工资大于50号部门最低工资的部门ID和其最低工资,一听还有点绕。最低工资大于52部门,他最后你先看看让你查什么,是不是查部门ID和他的最低工资啊好了,查询或就是这个题,就是你做此查询都是从内到外,或者从外到内,看你熟练程度了,你要熟练的话,你把这个条件先给它剥离了,先看让你查什么,先select出来,然后在这个条件剥离条件这一块。你再考虑是不是需要内层的,然后内层需要几层。
15:02
那就这个意思,我要这个还从外层的话,那就是希拉克的。Department ID,然后呢和其最低工资,那就是mean salary呗,这样一写,你要有个意识,得加上group啊,Employ意思。对吧,然后我们看它这个条件叫。查询最低工资大于50号部门最低工资的。你是不是得先做出来52部门最低工资是多少,然后看看其他部门当中谁的最低工资比52这个部门的最低工资大,对吧,勾他,然后谁的最低工资比他大大平均工资得啊,最低工资得用having啊,因为是个组函数,它要大于我,这需要提供一下50号部门的最低工资吧。
16:11
好了,Where,你查他的ID等于50,我这里边内层子查询返回的是52部分最低工资,然后看看谁的工资,最低工资比他的还大。是这样吗?有这样一些。那这个题目就这样来操作。使用了having,这叫非法使用子查询,他怎么就非法了?我们看一下select的最低工资,From他都若拜他一个,若败的话。然后实际上这里边儿我们看到内查询返回的是不是各个部门的最低工资呀。各个部门最低工资,这有多少条记录?
17:03
肯定不止一个了,这不止一个呢,前面用一个等号就错了,这叫多行子查询,使用单行比较弧就错了,我们刚才讲单行呢,你只能用大于等于这个符号,多行的这个结果就不能用他们了,在后边我们再说,所以这是错的。还有一个情况叫子查询中的空值问题,这个查询的结果没有任何的返回。原因在哪啊?我们看看他是不是找这个人的赵白地,然后看看,哎,跟他一样的这个赵白地都有哪些人?是这意思吧,没有任何结果。没有任何结果的原因,我们看看是不是因为这个呀。这是内层查询,内查询我一返回是不是空了,相当于是内层这个查询的没有返回任何结果给我外层,所以job ID等相当于是不是等于空了,那自然查询的话也找不到任何的结果。
18:03
哎,大家要注意啊,这个题目是不不报错的,它没有任何错,只是说查询的时候是空的而已了。就这样。下面就是我们要说的多行子杀菌。刚才都叫单行,也就是说内层只返回一个值给我,外层调用叫单行的,当内层如果返回是多个值的时候,就对应的叫多行。子查询使用的符号不是大于等于了,哎,大于小于那些符号了,叫in any和O。In,我们在讲前面的时候说过,这个概念叫in等于列表中的任意一个any呢和子查询返回的某一个值进行比较,这呢叫所有值进比较,尤其是any和all,大家一定要了解它的区别是什么,我们后边有练习,大家大家一块说一说。看这个题目。
19:00
嗯。这个题目大家捋一捋啊,返回其他部门当中。比job ID为这个部门的任一。任意工资低的员工的员工号姓名,赵白丽和salary,其他部门的你这样一断句的话,这个相当于你得这个题目一长的话,你得给他断一段,返回其他部门等等等等等等,对吧,员工号姓名招ID和他是不是这是我们最后要返回的这个信息啊,好吧,所以我们先把它操作上,员工号employee ID lastname job ID salary from employees。
20:07
其他部门的是不是你不能够包含这个部门啊,行,我们先把这个条件给它加上,就是department ID,它得不等于刚才列的it这个部门。其他部门怎么着啊,是不是比job ID为job ID,是不是这个department ID了job ID。比这个部门的任意工资低,我是不是应该把这个部门的所有的工资,你看都有多少比他任意一个低的。员工的信息,那就是一个是赵白地,不等于他,然后呢按的。And and salary比它的任意工资低小于吧,小于这个部门里边有多个,所以我们要用到。
21:02
嗯,多行子查询是任意一个用any any什么,这里边是不是需要我们提供一下这个部门的工资的?呃,公司这个部门中的员工的工资的select salary where角job ID等于啊。这个部门的有多少个工资,然后比这里边的任意一个小就行,同时呢,还不是这个部门是这样吧。有这样这么这么多段记录,也是我们这个题目就这样来写的。跟这个是一样的,然后下边还有一个,我们结合着这两个,哎,或者我们先把这个说清楚吧,我们看这个题目啊,我们查询的时候是先返回这个部门的工资,假设呢,我们这里边儿只有四个。
22:05
比它的任意一个D就行,那就是说你最后这个返回的结果当中,比9000小可以,比6000小也行,比四千八小一点也行。或者比四千二小一点也行。就是只要比他们这里边任意一个小就行,任意不是任意啊,任意就成了所有的了,比其中的任意一个小就行,那在这个题目是不是就相当于是不是只要比9000小就行。大家你想一想,比如说你看我这个最后结果是不是有五千八呀,五千八你跟四千二比,肯定5800比4200大了,但是呢,我是不是还比9000小。这个最后的效果就是我只要找到一个比你这里比你这里边儿任意一个小就行,那就相当于比最大的这个小。是这意思吧,那如果我要这个小于号给改成一个大于号呢?
23:01
大于任意一个是不是我比你第一个大也行,比第二个大也行,比第三个大或者最后最小的这个大也行,相当于我只要比你是不是最小的这个大就可以了,我只要找到一个比你这大就行。对吧,这个大家你要体会一下啊,这是叫任一,那么现在改了,改成叫任意或者叫所有。其他的位置没有变,就只需要把那个安妮改成哦就可以了,刚才我们这有75条记录,我给它改一下。改成二。你看是不是就明显少了呀,那因为他这个要求更严格了,叫所有。这个怎么理解,你不光比我9000小,还得比6000小,还得比四千八小,那最后的效果是不是我比你最小的这个小就行,所以说最后返回结果就必须得比这个里边最小的要小。
24:01
这是要低的,那要是改成这个是所有工资都高呢,都高是不是就大于号比这个高,比这个高,比这个高比这个比每一个是不是都高,是比所有的都高,所以得高于最大的吧。哎,这个大家你理解的去记忆,不要死记硬背。这是我们讲多行子查询中的any和all,这个in比较简单是吧?In我们在以前的时候都接触过。那么关于多行子查询里边也有这样几个问题,第一个呢,叫空值问题。通知问题。大家看一下啊,跟单行那个实际上效果是一样的,就是你里边这个查询的时候,它没有任何的啊,这个结果很多,然后再来一个note音,就是不在这里边的。最后导致空了,空了那就空呗。他是不会出错的啊,不会报错,只是说你没有查询结果而已,就这样子。其他的问题在跟单行子查询是一样的了。
25:03
那么这一节我们就讲完了,相当于大家你要知道如何来实现查询,这里边儿的题目也比较多,在我们这个TS里边都有。在这里边。查询是吧,这是我们刚才讲的这个阿贝尔这个问题,下面41~49有这样几个题目,我们一会儿再带着大家一块来说,你先熟悉一下。
我来说两句