00:00
这一节呢,我们叫高级子查询,也是我们讲这个思扣这些课程里边的最后一节,这些内容呢,也稍微比较难一些啊,在上一节当中啊,大家回忆一下,我们讲了叫set运算符。涉及到几个关键字啊,UN UN all intersect和manners。呃,相应的表示的是什么意思,那大家你要熟悉一下,实际上呀,我们也说了,它跟我们高中学习过的集合是对应的啊unit unit就相当于是集合的并集,Intersec呢,就是集合的交集,Manners,你看成是集合的差集也好,或者或者你看到这个一个集合当中,哎,这个。相较于它们相同的这一部分的一个普及这个概念也行。这是我们讲的上一节的内容,这一节叫高级子查询,子查询前面加了两个字叫高级,对吧,大家回忆一下,我们在讲这个前边这13节的时候,第六节我们讲过一些词查询。
01:08
相应的也有很多的练习,对吧,那么这一节呢,我们叫高级查询,相较于上一节的子查询这一节内容啊,呃,要稍微难一些。呃,需要大家你这个反复的下来来练一练啊,这里边儿的一些问题,那我们分别来讲这一节的内容,呃,涉及到哪些呢。第一个叫多列子查询,这是我们今天要讲的第一个点,多列子查询。那我们说子查询分为外查询和内查询,对吧,相当于这个内查询给你返回的是多个列啊,这叫多列子查询,之前我们接触更多的是单列的啊,单列的紫查询。那么第二个内容叫在from子句当中使用子查询,这个实际上我们在这个第六节当中接触过。啊,接触过这样的例子,比如说这个,呃,查询员工比本部门平均工资高的这个员工的信息,我们在这个课后题当中第六题当中做过,啊,实际上它就是一个在from子句中使用子查询的一个例子。
02:13
下面在SQL中使用单列子查询,哎,单列子查询实际上我们前面接触的都是单列的,只不过呢,都是在外当中添加的是吧?在过滤条件中添加的单列子查询。比如说哎,查询哎比阿贝尔工资高的员工的这些信息,哎,就是where salary大于哎一个小括号内查询提供的是阿贝尔的工资。对吧?这是在where词句中,那么在这我们又明确出来的在SQ中使用它单列词查询,除了where,还可以在像这个条件表达式中啊,或者这个order by中啊等等都可以来使用单列子查询。啊,就相当于这个范围,我们给了一个扩展。哎,要求你会写,叫相关子查询。
03:00
这是讲这个的一个难点啊,这里边一难点子查询我们都知道了,相关子查询,也就是内层跟外层啊,他们这个结果,内层子查询的结果返回给外层,它俩之间这个相关性比较高,所以明确出来叫相关子查询,这个呢,刚开始大家得需要你理解一下。最后呢,还有这样几部分,一个叫使用east。啊,East啊,Not it这个两个操作符,哎,分别表示的什么意思,我们会给大家来说,嗯,使用子查询更新和删除数据,这个呢,不是什么多新的内容,哎,大家呢,会了,更新和删除数据以后,这里呢,只不过是使用子查询来实现而已。最后呢,还有一个叫位子子句使用它有什么作用,我们最后说一下。哎,相当于这里边儿的这两点啊,是我们这个就完全新的关键字啊,前面这些关键字实际上我们都接触过,只是说在呃,实现上,或者做一些问题的时候,复杂性上。
04:05
更难一些,那我们需要讲解我们要说的这几个内容。啊,就是没有过多的新的关键字,新的知识,只是说在查询和这个进行一些数据库操作当中,我们会用到一些更为操作的这个SQL语句,就是我们刚才讲颜色的这几个部分。呃,剩下的这两个是我们今天要讲这个新的内容。好,那我们就开始来讲今天的这叫高级查询。大家先看这个图。这个图应该并不陌生,对吧?诶,子查询是嵌套在SQL语句中的另一个select语句,这个就叫子查询,我们在这第六节当中都反复的使用到了,这是一个标准的子查询的模板。那么这个呢叫主查询或者叫外查询,这个叫子查询或者叫内查询,内查询的结果返回给外层的主查询。
05:02
对吧,这是一个标准的一个模板,嗯,然后说他在子查询之前执行,然后使用子查询的结果,我们当时也讲过这个典型的这个题目是吧,我们举个例子啊。这里呢,我以SC的用户来登录,因为SC用户下面有我自己创建的很多的表,是吧是吧,大家还记不记得我们写过这样一个题目。这里呢,是一个复习啊,查询last name喂。陈的manager的信息查询,Last name为陈的manage的信息,我们说这是一个子查询,我首先应该查询到是不是陈这个人的manage ID是吧?然后对应的看看哪个员工的employd等于他的manager ID,将那个employ ID的信息给输入出来。
06:10
是吧,所以我们先有的是select,哎,叫嗯,Manager,海底from employees where,嗯,这个叫lastname,等于陈。哎,这个人的manager ID。他的manager ID找到以后,我们说啊,是不是就应该找这个事,你不是想输出的他的信息吗?哎,拉的employee ID last name。啊,就输这两个信息,From employees,然后where。嗯,什么where这个叫employee ID,等于你那层查询到的这个陈的这个man ID是吧,他的man ID。
07:11
那么这个题目就是我们所要查询到的它的manager的信息。哎,把它得得删掉是吧。啊,就是这个人,这就是这个我们要查询的这个结果,我们查询到了查询的这个结果,将它返回给外层的这个查询,在外当中来使用的这个子查询的一个效果是吧?好,这是我们之前复习的这个内容。那我们来看这就是另外的一个举例啊,查询工资大于149号员工的工资的员工的信息,这个不难,你先找到149号这个员工的salary,然后呢,将它返回给外层的主查询,哎,工资大于他的就这样来实现,对吧?好了,这是我们之前复习的这个内容,那么下面就开始我们今天讲的第一个叫多列子查询。
08:05
那今天第一个我们一共讲几个,就都在这儿是吧,12345677个,哎,大家你脑子得清楚啊,七个内容,那我们先看第一个叫多列子查询。哎,多列子查询它这个格式呢,你可以这样来看,我们刚才在V当中,你看是不是只返回了一个列呀。是吧,这个只返回了一个列,这呢就叫单列,那多列呢就返回多个列,就这意思啊,形式呢就是这样子的,这呢返回的是两个列,哎,用的是in in就是你里边会返回多个结果,我们就用in来表示,我们先看这个题目再说啊。查询与141号或174号员工的manage ID department ID相同的其他员工的三个信息,来我们做一下这个问题,以他作为一个典型的实现,大家来理解一下多列子查询。
09:09
这个呢,实际上不难。来看一下与他这俩人的,他俩一样的。那是不是我们,哎,如果要写这个框的话,应该是这样吧,Select最终要查询的是这三个信息是吧?然后from,这很显然是employees表。你我写写个一一吧,对,从这个表当中,然后有一些条件是吧,哎,什么条件呀,要求必须得跟这两个人的他俩的兴趣是一样的,那就要求where叫manager ID是怎么怎么着吧,那and,同时你是不是这个depend ID也得怎么怎么着啊?
10:05
是这意思吧?哎,这两个条件完了以后,大家你需要注意是不是相同的其他员工的这个这个信息,那还得是不是再加上一个and,叫employee ID not in。这个141174加上这个限制是吧,那这个题目我们才是完整的哈,这是我们这个题目整个这个框。大家捋一下,我要查询这三个信息,从这个表当中要求manage ID跟这个都满足一个条件,同时呢,这个员工不能够是他俩满足什么条件呀,跟这俩人的这个他俩是一样的。那你得看,如果是manage ID,它俩是一样的,那就用等于如果它俩还是不一样的manage ID,那得用in是这意思吧,所以为了保险起见,我们给给给它改成is好了,现在我们来填充这个括号的内容。
11:05
来,我们来写这个括号内容啊。哎,Manage ID应该跟他俩的一样好,Select many ID from employees where。Y in是吧,141174是不是这样写啊。这查询到他俩的manage ID,要求他跟他俩的其中一个的一样,然后呢,这个也是同样的道理,Select department ID from employees where。这样。是吧,然后同时要求不满足这个条件,这不就是我们这道题的一个实现是吧?这呢,我们并没有用到叫多列子查询,这就是我们传统的之前讲这个子查询的时候用到的这个知识,大家呢应该自己能够写出来。
12:12
哎,应该能够写出来,那么运行一下这个效果,哎,一共是有11条数据,这11条数据里边,哎不含着刚才说的141174,并且部门那就是从这来看的话,应该一个是50号部门,一个是八号部门,对吧?诶然后看老板也就这两个。好,这是我们这个题的答案,这个题答案,然后如果我使用多列子查询,怎么来实现呀。你看我们之前讲的那个子查询啊,内层就返回这一个值给了他,这也返回一个值给了他,那我现在就让你返回,既然你这两个值,你实际上大家看一下是不是主要就是返回的这个信息不一样,其他的都一样呀。既然如此,我就让你成对返回不就完了吗?我让你成对返回怎么写啊,那就是要求where,我加一个小括号,大家你看啊,成对的话,相当于你理解成是一个点对也行,这是一个点,这是一个点,然后他俩成对不就点对吗?哎,Manager ID,然后department ID是不是这样啊?
13:18
哎,In起select的,那你这个也应该是一个对是吧,这应该是对这样呢,他俩这样一一对应起来,哎外二它这个是不是就不要了呀。对吧,这个不要了,然后这个括号跟他过,然后这个。行了,这题就这样。嗯。把这个给他去了。是这样是吧,哎,我们这个题就这样写。你看跟刚才这个效果是一样的。哎,结果也都一样。哎,那这个就是我们这个事件,这就叫多列查询。
14:05
多列子查询不难吧,就是我们之前进行子查询的时候,内存查询返回就是一个列,现在呢,返回的是多个列,那就是多列,你先相应的还可以再多写几个是吧,不管你这个manage ID一样,几ID一样,要求你这个job ID也得一样,那你就在这后面是不是给它补上一个叫哎,ID,那你这逗号job ID就这样呗。是吧,那这有七个,那就说明剩下的有四个人,哎,他们这个招白力是不同的了。那这个题就这样,就叫多列子查询,这里边刚才我们写的第一个方式是不是就是叫不成对的呀。哎,不成,对的,也就这样。是吧,这是刚才我们这样实现的,或者说利用旧知识我们是这样来实现的,那成对那呢,就是作为一个点对的这样形式啊,像是个点对一样,这是两个是吧,哎,这样的形式来实现的,这个叫成对的,哎。
15:08
比较叫成对的多列。最大距。这就是我们要讲的这个多列查询,以它为一个例子就过了,它不难啊,那么第二个我们这要说的叫在from子集中使用子查询。这里边儿也有一个题目,实际上这个题目我们在之前的时候讲过,当时呢,大家可能听起来还稍微吃力一点,那我们把这个题目再拿过来说一说。哎,这个呢,也就是我们这节要讲的,哎,这这这个小内容要讲的叫弗词句。在。在中使用子查询。来看一看返回比本部门平均工资高的员工的这个信息。
16:01
哎,我们是不是当时确实写过这个题是吧?有同学可能忘了啊,你看一下我们在讲这个第六节叫子查询的时候,这个word的这个练习。哎,大家看,这是查询各部门中工资比本部门平均工资高的员工的一个信息,是不是就我们做的这个题嘛,是吧,好,我们现在把它拿出来再说一说。好。写吧,Select要查询last name department ID salary及平均工资。平均工资这块稍微恶心一点,我们先放一放。然后我们先把这个话写出来,查询这三个列,From employees是吧?你先几个叫一比本部门平均工资高。
17:08
Where?Salary,哎,我们这呢,现在还没有用到这个from词句查询啊,我们先用我们的旧知识看如何来实现,是不是where要求这个salary得大于一个值是吧?这个值呢,我是使用的叫子查询,这个值什么呀,是一个平均工资,然后呢,应该是这个人的部门的平均工资是吧?那你在这儿就是select的avg。Salary from employees几个叫一。本部门的,那你要求这个salary,你跟这个比的话,是不是应该有点关系啊,你不能是这边随便拿出一个值,或者说哎,所有的这个员工的值都一样,然后比不一样不行对吧,他不是,哎公司中的平均工资,它是本部门的平工资,所以我得加上一个where条件,哎,要求E1的department ID得等于一二的department ID。
18:18
是吧,然后我得有一个,既然你是分组的嘛,本部门是吧,就是分组的,按照你他的那个ID进行分组。你看这是我们查询到的。哎,工资比本部门平均工资高的员工的这三个信息。运行一下。哎,就是这样啊,然后大家你看他这还写了一个,你得把平均工资也给写出来,要求你把这个值是不是也得给他写出来呀。这个值也得写出来,那怎么办啊,这是我们说的,又稍微麻烦一点,我得在这儿是不是再加上一个信息,这个信息呢,我是这样写的,Select的,你不是要查询哎,AG salary嘛,是吧,From employees,我写一个叫哎E3。
19:09
嗯。相当于我是不是在这重新给查询一遍呀,对吧,Where e一点department ID等于E。三的一看哪一题。那同时你是不是得来一个萝卜半是吧?我写的稍微长一点。多半这个,嗯。停不下了啊。给他买的。哎,能看懂吧,这是相当于我又重新写了一遍。重新又写了一个啊,要求外层的这个一一跟内层这个一三他俩的这个部门一样,然后呢,查询到这个所在部门的底薪工资。
20:07
OK。哎,大家你看这是这个人的平均工资,然后这是它所在部门的平均工资,那一定前边这个值是比后边这个值大的。对吧。好了,这是我们讲的这个题目,这是我通过旧的知识来实现的,现在我们想我能否实现这个,通过这个叫新的内容,叫在form子句中使用子查询实现同样的这个效果。至少说我们通过旧的知识是可以解决的,对吧,那我看新知识如何来解决,实际上我们我们写这个内容啊,大家应该能注意到是不是存在一些冗余啊。冗余是吧。冗余,什么叫冗余啊?就是你这个写的太繁琐了,里边有些东西你已经写重了,大家比如说你看我们这个内容在这儿是不是相当于又重新给写了一遍,这就是冗余啊,存在冗余,那么我们现在考虑使用福尔子句来实现这个效果。
21:07
查询的是不是还是这个呀。对吧,123以及平均工资,平均工资我们来等一下再写也行,然后from employees,这个叫一,叫一啊,是这个内容,大家你回忆一下,我们之前写这个多表连接的时候,你看我们当时怎么写的,比如说我现在要查询员工的last name department salary,以及这个叫。Department department name,我们是不是这样写的,From employees e1,然后呢,Department d加一个连接条件E1.departmentid等于哎,D第2DEPARTMENT ID,然后这个呢?因为它俩列里都有你指明其其中一个的。我们讲多表连接,大家回忆一下,是不是就这样来实现的呀?
22:04
这三个啊,我都可以认为是一一的,然后这个是一二的,它们的连接条件是它。哎,必须要有这个连接条件,没有的话就有笛卡尔级的错误了。这样写完以后,我一运行它就出来,哎。Departure。哎,这就出来了这个效果了是吧,这是这个题目啊,这个里边大家你看啊,我这是不是一个表啊。这也是一个表。只不过这两个表现在都是现成的,所以我在那只使用这个表名来表示了。这两个表明写好以后,我必须要给出这个表,两个表的一个连接条件,就是它的这个列跟这个列是一样的,而这个列一定是存在着相应的这个表中的。大家理解是吧,好了,那么基于这样一种想法,我们来写这个题目,同样使用叫from子句,相当于我在这个位置的时候用的是一个子查询的理解吧,好了,我们这个框呢,我先把它给删了。
23:08
嗯,这个没让你写他啊,他也不要了,然后我们写这个题目你看。返回比本部门平均工资高的这三个信息,那我找到了这个部门的员工,我再给你提供一个表,这个表就是各个部门含着各个部门平均工资的一个表。含着各个部门平均工资这个表你看怎么写啊,Select department idg salary from employees。嗯,然后呢,叫嗯,Group by department的ID,我这个表起个名字,嗯,比如我叫这个128教大家你看能不能看懂,刚才你看我们那写的是个department的表,是现成的,我这儿呢,只不过是我又自己通过子查询的形式创建的一个新的表,这个表啊,含有department ID和平均工资这两项,按照部门ID来进行的分组。
24:15
这个表有了以后,我现在这两个表放在一起,应该有他们的连接条件是吧,连接条件就是一一的department ID,应该跟你这个一二的department ID是一样的。他俩的这个ID是一样对吧,同时呢,你看这个题目还让你输出平均工资,这个平均工资是不是就是你这个一二的。嗯,AG salary吧。是吧,就是你这个表中的一个列呗,刚才我们用的是department表里的department name,这是这个表里的这个列。这就完事了是吧?
25:06
一二。这样我给大家起一个别名。好,那这个题目我们就做完了,跟我们刚才这个实现效果是一样,但是我这里边儿没有冗余,哎,你看我这个。这个这个信息是不是就写了一份啊,这就是我们叫这个from子句中使用查询,实际上啥意思啊,就是我在这哎from表的时候,我这个表是我现生成的,那怎么生成,就用使用select select的这个语句来生成的,那这个呢,也叫子查询,相当于在这里边实现。这是我们讲的这个题目。以它为一个典型的代表,我们说完了,下一个呢,叫单列子查询。
26:00
哎,单列子查询,表达式单列子查询,相较于我们前面刚才讲的这个叫,哎,是不是叫多列子查询。相当于我们以前实际上讲的都是单列子查学啊,然后今天讲的多列,然后我们现在回过来再来说一下这个单列自然式表达式啊。嗯,单列子查询这个表达式的意思呢,就是在一行当中只返回一个列的子查询,以前我们讲的都是啊,嗯,ORACLE8A当中,呃,允许在如下情况中使用单列词查询select语句,比如from和where中啊insert中的values可以,然后ORACLE9I当中又增加了叫decode和case条件表达式当中可以使用单列查询。除了这个select中grow by之外,哎,都可以使用,你就这样,你不用刻意的去记这些东西你就知道啊,基本上现在就你能够想到的。需要能够用到这个单列加询的这个地方,我们都能够用到,你就这样来理解就行,来我们举个例子。
27:00
这个。好了,我们看下这个题目怎么来写,嗯,你不要过多的去想这个,呃,是哪一节的内容,哪个框框是什么,那样就太限制你的思路了,你就直接我们想这个题目,哎,如果我拿到这个题目,我应该怎么去考虑,你就这样就可以了啊,Select显示员工的123是不是三个信息,是吧?那我们就先写上employee ID lastname和location。Location我们没有这个列,你看它后边怎么说的,其中若员工的department ID与location ID为一千八的department ID一样,则location为它,哦,这相当于是我们它重新给你定义了一下,这是一个别名。
28:04
其余的为USA,是这意思吧,好,那相当于我们在这儿呢,你得写个东西,这个东西啊,给它现在命名为location from,哪个表呢?当然是employ这个表了。是这个意思吧。好,我们现在来写这个,主要写谁,就写这个括号里的。查询他他他从这个表主要是这个东西写写什么,若员工的department ID与这个是这个的一样,这是不是一弱,这就成了一个条件了。所以。我得使用这个叫条件表达式,条件表达式条件表达式我们讲两个,一个叫decode是吧,一个叫case,问Z,问Z我这里case举例case谁case department ID是吧?然后问当你这个department的ID等于谁的时候,然后then怎样处理是吧?然后再问Z,问Z最后是end的,那这个问怎么写?
29:10
这是不是应该提供这个值啊,也就是说当你这个值等于问是谁的时候,怎如何来处理,那你现在问是不是就应该是这个location ID为它的这个底盘ID。相当于在这你是不是得承担一个查询了呀,查询谁查询department ID from。嗯,那就是from department列表了,Where location ID等于1800。是吧,查询1800这个老根ID的department ID,当这个department ID等于这个的时候Z。
30:05
这是不是就是Canada?然后呢,再来一个问Z,问Z,只不过这个里边没那么复杂了,直接是不是就else了呀,Else USA。最后呢,End结束,给他起个别名。就是叫location,是不是这个题目就这样写。嗯。我们运行一下。哎,大家看到啊,相应的location跟那个1800那个department一样的话就叫Canada,不一样的就叫USA。就是这样来实现的。只不过这个时候有点区别,就是在这个问这一块使用这个子查询而已啊,子查询而已,你要不使用子查询,比如说department ID是嗯,这个这个。哎,120的,哎是看着点,不是120的叫USA,那现在写的不是120,只是给你改成,哎,是不是一个紫砂群的呀。
31:06
这儿呢,因为也是一个单列的,所以叫单列自查区。嗯,这是我们这个题目,大家看下一个。在order by当中使用单列子查询,就是你现在就知道这个子查询啊,在基本上你现在能够想象的这几个语句当中都能够来实现什么from啊,Where啊,条件表达式啊,Order by啊都可以。主要呢,就是你现在你得去试着。去写写,熟悉一下,当你再遇到这样的问题的话,你就知道该怎么去考虑了。大家看这个题,查询员工的employee ID last name要求按照员工的department name排序。来select employee ID last name from employ,意思要求按员工的department department name排,这一写是不是就心里边嘀咕了?
32:11
如果说让我按照department ID排,那我就department ID就行,因为employees表中含有department ID这个列。现在啊,不是让你按照ID排,按你按照让你按照这个name排,显然department name不在这个表当中。而是在什么department表中啊?这肯定是涉及到子查询了,或者叫多表连接了,是吧,然后这样我先给你起个别名叫E1ORDER buy在这儿是不是得写一个子查询啊奥buy谁拉的?Department name不就是让你按照它排吗?所以你得order by它是吧?Order by它,它这怎么写啊?那你是不是应该找到不同的部门的?
33:00
其他的内吗?那你就是from depart单词d where第1DEPARTMENT ID等于d.department ID。是这意思吧,就是你每次查询一个员工的时候,都会找到它对应的一个name,然后跟已有排好序的这个name去对比一下,如果它的这个靠前你往前排,如果靠后就往后排。哎,这就我们这个题目啊,查询一下它必须要有这个连接条件的,嗯,默认的按照AA顺序结构来排序。那最后排出的效果就是这样。哎,就是这样的效果,嗯,好,这是我们讲的这个叫单列查询。啊,单列加菌,你就知道我们以前讲的都是单列的啊,这一节讲到多列的啊,以前讲单列,只不过这这在这儿呢,把这个位置上给你扩充了一下,那扩充从到这么多这个位置当中都可以来使用单列磁。
34:15
那下面我们讲的叫相关查询,这个呢,哎,稍微有点难度,我们休息一下再讲这个题。
我来说两句