00:00
这一节呢,我们带着大家一块儿来学习视图。视图我们之前没有接触过对吧?之前九节当中我们一直都在讲表,表也是我们最常用的一类数据库对象,它是哎数基本的数据存储的集合,由行和列组成。前面几节当中我们涉及到了对表中数据的增删改查。还讲了如何来创建、管理和修改表,同时呢,我们还可以在表上加一些约束,对吧?这是我们前九节讲的内容,那么这一节我们讲另一个比较重要的数据库对象叫视图。那视图是从表中抽取出来的逻辑上相关的数据集合,它也是一个存储数据的一种方式。那么第11节当中,我们还会带着大家一块来学习其他的三个,包括序列索引和同义词。相应的是什么意思,我们到第11节当中再给大家来讲解,这一节呢,我们讲视图。
01:05
表的话,我们说表叫table,那视图呢就叫做view。啊,就是这个意思叫view,那么我们是不是就可以在这里边看一下哈,这是my objects。这里边tables是我们这些表文件,那后边有一个叫views,这呢就是我们讲的视图,它是存储在这的。哎,那目前我还没有创建任何的view,所以这是一个空的。好了,那么我们这一节讲视图都要学哪些内容?学习这个目标是什么?我们来看。首先呢,你要能够描述视图,就是说我们为什么要讲视图,那视图有哪些好处是吧,就像我们前面讲表一样,为什么我们要讲表啊,因为你数据库中存这些文件的时候,数据的时候,嗯,我们就用一个表格来存,有行有列,一行呢是一条数据,嗯,一条数据有好多的不同的属性,用列来表示。
02:02
那么我们这一节同样的要问,为什么我们要讲视图它有哪些好处,对吧,这是视图。既然知道它有这样一些作用,以后我们下一步就要学如何创建、修改、删除视图。正好对应我们讲表里边儿的第七节,叫创建和管理表。那然后呢,有了视图以后,我可以从视图当中查询数据,或者说插入修改和删除数据,这样一些就是对应着我们表里边儿的增删改查对吧,相当于针对这个视图来讲,我们也会有这样的一些操作。这是我们讲的这节的第一个重点,那第二个重点就叫做top n分析,这个一听名字貌似还挺高深是吧,实际上不是太难,我们后边Java web里边要讲Oracle分页的时候,会要用到这样一个知识,所以我们在这一节给大家来一个讲解。
03:04
相当于我们这一节有两个重点,一个是跟视图相关的操作,一个呢是如何你自己能够写top n分析。好,这是这两节的两个重点。然后呢,我们回来讲说一下这个视图是吧,大家呢,先看一个这个表。先看这个表。后边这个呢,叫employees表,我们已经非常熟悉了,前边几页当中一直都在用这个表。那么这是一个表,这个前边我是从后边这个表当中抽取出来了几个列,叫employee ID lastname和呃,这个salary。这几个呢,如果大家仅仅是要查询一下如何用代码实现,肯定大家已经非常熟悉的,我就SELECT123,然后from employees是不是就可以了。就是这样来写。
04:02
Select employee ID last nameme salary from employees,甚至你还可以说我只要某一个部门的就是department ID等于80,那这呢,就将80号部门的这三个信息给它抽取出来了。那这个信息跟这个还不一样,前边这个呢,我们是个视图怎么不一样了,你看这里边儿的这些查询的这个信息有点像,是不是仅仅存在于内存中啊,我一断电再一出来,这个文件是没有的。对吧,它仅仅是一个查询。而这个view啊,跟我们表一样,它是真正的物理文件,是存储起来的,当你断电以后再一开机,这个view还在是这意思吧,所以它首先不同于你一般的这样一个select的操作。但是它肯定跟这个select是有关的哈,我们一会再说,那这个呢,你说是一个视图,那有的同学还说我是不是这个也可以用一个表来表示啊。
05:08
是吧,我还可以用个表来表示,怎么表示啊,我就可以创建一个表啊。我们前面都讲过,叫create表的话,叫create table呗。嗯,比如说这个emp,嗯,随便来一个啊,MP10,然后as select,刚才我们写的这个语句。啊,已经有这个了,换一个名。创建好了,创建好以后我就可以来查看一下select from ep11。
06:01
这不就我们刚才创建了一个是吧,这个呢,你看是不是真正存在的一个物理文件呀。11就在这儿是吧,有点跟这个有点类似,那么有的同学就说,那我们讲这个视图好像没啥用,讲视图干什么呀,我这不是你这个想让他的物理存在,那我就造一个表不就完了吗?是吧,让那个表是从in s表里边抽取出来的。那还不一样,试图跟你创建那个表还是不一样的啊。哎,我们下面呢,就来说一下这个不一样,然后我们再说如何来创建这个视频,怎么不一样,我们这样结合一个实际问题给大家来说。嗯,来,我画一个简易的一个图,我们这呢,把这个employees表,我先假设放在这儿,就是这个表有这是一个实际问题,就是我们常用的这个in employ意表,这个表里边有很多的列。
07:00
整个公司的员工全在这样一个表里边儿,包括老板。对吧,包括老板在内,那么这个表里边都有哪些信息啊,就是我们用的比较熟悉的,像ID呀,嗯,这个,呃,Last name呀,T呀,工资啊等等这样一些信息。还有一些信息,比如说这个员工,这个年终的时候,这个老板都要发一些这个这个奖金是吧,除了奖金之外,还有对这个员工的一个一个评价。那有些员工感觉比较好,然后呢,考虑说要给他升职,有的员工表现比较差,那考虑说年后的话不行呢,我们就辞职,呃,这个这个解聘是吧,相应的这样一些非常隐私的信息,这样一些信息的话。我们正常的话,是不是不应该让每一个人都看到呀?对吧,不应该让每个人看到,那么这个表相应的就让别人来进行操作的时候,就应该有一些权限上的限制。都有哪些人可以来操作这个表啊,首先这个公司里边是不是有CEO啊。
08:04
我们假设CEO是个权限比较大的CEO,应该可以来访问这个表,那也应该能让他是不是看到这一列的信息。对吧,那么除了CEO之外,平时还有日常的一个维护,比如说我们就有个DBA。那么这个DBA也应该能够看到这样一个表,他需要维护表嘛,对吧,那你DBA的话,按说他是不是就不应该看到这样一个信息。因为他也属于这里边一份子是吧,或者你这样来理解,假设呢,那个年终老板要考虑给不同的员工发奖金,这个gba可以对这个进行操作,他自己把他的奖金后边给你加上一个零,那是不是一下翻了十倍啊,奖金这个事肯定不能让他来干,对吧?也就是说有呀,有的一些列啊,我们不应该让这个DB看到,相应的还有其他的一些员工,我这里就不去去举例了。就是还有一些员工,有可能他们也能够来操作这个表,但是我不希望他是不是也访问一些不必要的或者非常重要的一些列,这个大家理解吧。
09:10
那么要满足这样一个情况的话,我怎么来办呀?我们是不是应该这样的,就是这个CEO他呢,假设就是公司的老板,那我就让你是不是访问所有的这个表的完整的一个信息啊。他可以来对这个表里边的这样一些列来进行评价是吧?那这个gba呢?这个gba我不想让他看到关于员工评价这一列,那我们怎么来实现这个功能,有同学就想到了,哎,我们是不是可以创建一个子表啊?就像我们刚才创建一个这个employee,这个EP11一样,我创建一个子表,把你这个想让这个DV看到的这样一系列给他扔进来。那你gba访问的时候,我不让你去直接访问这个employees表,而是访问这个由它基础之上创建了一个子表。
10:03
同样的道理,这个也是一样是吧,哪些让你看到,我就给你造一个子表。你就来这看就完了,也不让你看这个大表了,因为大表里边儿的信息太多了,不该让你看到是吧,那我们下一步来想,我创建这个子表,让相应的他去这样访问的话,有没有问题?我说问题还很大。怎么就有问题了,比如说我们现在这公司里边有一个员工,他现在不干了。就是相当于辞职了,那按说我是不是应该从这个数据库当中把这个人给他干掉,就是delete了一下是吧,再或者公司里边某些员工的这个salary工资延后了,现在这个物价都通货膨胀是吧,这个工资都要往上涨,还有一些员工可能一开始登记的时候,这个信息登记的就不对,他也需要进行一个修改。那么这些操作的话,很繁琐的操作,你不能让CEO来做吧,那你要dva干什么?
11:03
对吧,那肯定这个工作要DBA来干,但是你DBA做的时候,你既然不让他来访问这个employees表了,那你只改这个表,那你改的这个表跟我这个。本身的这个employ表,它俩之间是不是完全脱离的关系啊,你改的话是仅能在这个表中改,它根本不会改这个表是吧,因为你改完以后,这个CEO再去看是不是还是旧表啊,这个人一看也是旧表,那你这个更改我们说是一点意义也没有的。根本没有意义。那这就是说我们想通过创建子表的形式来达到我们刚才说的这样一些效果,发现非常的不现实。因为你创建的这个子表跟原表是完全分离开的,就一点关系也没有了,我希望是怎么着啊,你看我现在这个目的有两个,第一个我希望针对于公司不同的人。他们能访问这个表的信息是不一样的,有一些隐私的加起来,呃,有一些隐私我不希望让每个人都看到,所以呢,就达到第一个效果是这样的,我们可以通过创建子表,实际上也可以到创建视图,那第二种第二个这个要求就是当我DBA对这个表的数据进行修改的时候,其他的人也都能够看到修改以后的这个效果。
12:24
有这样一个要求,而这个要求的话,通过子表的形式就没法达到。那就是我们讲到了今天必须要讲的视图,那视图就可以来做这个事儿。视图你现在理解的话,他也有点像这个子表一样,但是它当你DBA对这里边的视图中的一条数据进行修改的时候,它会直接将原表中的这个数据也进行一个更新。这是不是就达到了我们刚才说的这两条一个需求啊。这就是非常实际的一个问题,那好了,那我们就来讲今天的这个非常重要的这个视图的概念。
13:04
说了这么多,非常的这个重要哈,但大家你需要来理解,我们先看这样一个解释,视图是一个虚表,就它本身,它本身并不是一个表啊,它有它赖以存在的一个表,它赖以存在这个表就叫做基表,就比如说我们刚才的这个employees表。这呢是视图,有点像我们Java当中的这个父类和子类一样,对吧?父类呢也叫做基类,这呢叫做基表,像试图提供数据的数据内容的语句为select的,可以理解为存储起来的select语句,这就如何来创建了。那么试图是提供用户。向用户提供这个数据的另一种表现形式,这我们都知道了。那么它的好处刚才我们已经说了,它可以控制数据访问,对吧?这个表当中有些隐私的数据不想让每个人都看到,我就给你造一个视图,让你访问视图,而不是访问表内的表。
14:04
然后还说可以简化查询,避免访问重复相同的数据,这个怎么来理解?就是我们在查询表的时候,你是不是也仅能看到一张表啊,但是这个视图我可以进行,这个像多表连接一样,我创建一个视图,可以基于已经存在的多个表。造一个视图,那就是说它可以用来简化查询,那么我一会儿带着大家一块儿来写一写,大家就明白了。行,那我们就下面来讲如何创建一个视图,我开一个on the window。创建视图创建表,如果大家熟悉了创建表是不是用叫create table啊?那创建视图就是create view create view,然后起个名字view。它怎么来创建,就只有这样一种方式,As,它是哎使用这个sta语句的后边呢,跟我们创建一个这个或者说进行一个查询都一样的employe ID。
15:10
Does'name salary from it employ,好意思,你可以再加上一个部门,Where department ID等于80,把80号部门的这些信息,诶,这个查询到,然后给它放在这个视图当中。OK。嗯。好,我们看这里出现这样一个问题叫权限不足,意味着就是我现在没有创建视图的权限,对吧?这个用户权限不足,那我们就需要在企业管理的这个控制台上来给他增加这样一个权限。在这来选。这呢,我就以DBA的这个权这个这个角色来进入安全性,我们找到高的用户。
16:07
然后这有个系统权限,我们在安装完Oracle以后都给大家讲过,那么系统权限里边有一个叫create any view。在这。然后我给他加下来,然后确定,那么此时这个人他就具有了创建视图的权限。是吧,我已经创建好了,然后我可以在这来看一下view,这不是有我们刚才创建的,你可以查询select星from emp6,哎,这就是我们这个创建的刚才的这个。六。跟我们创建这个子表都有点像是吧,这是我们创建了一个view。那么创建这个view以后,我们刚才说了,它不同于创建子表怎么不同了,是不是说我对这个视图里边假设啊,我让这个视图让DBA去看,DBA如果对这个视图进行修改的话,它会更改原来的赖存在的影调一次表。
17:13
这就是他相较于子表的一个我们称为叫子表了的一个好处。来我们试图进行这样一个操作,也就是我们讲的如何对试图进行一个数据的增删改的操作,对吧?对数据一个增删改操作,假设我们就把这条数据给他更改一下。179这个人叫约翰逊,他的工资呢是1万,来,我给他进行一个修改修改。跟表的修改是类似的,叫update e view set。叫salary,等于我给它改成2万。
18:00
改了改了以后,当你再进行这个视图的一个查询的时候,那肯定它现在就变成2万了,对吧,那关键是我们看看这个,我看看表。来的。Employee ID salary from employees where。我就查他吧,我看82部门,大家看是不是这个179这个人现在已经变成2万了,说明我刚才对视图的修改确实影响到了这个表employees。那他俩确实是有关系的,而你要是再造一个表,是不可能达到这样一个效果的,这就是我们讲视图的一个主要作用,这呢我进行的是一个叫做。是不是update操作?同样的,如果我要是在视图中删除一条数据,原表中的数据是不是也就不存在了?来,我们试一下,Delete from EP view。
19:09
Where department where。这个。Employee ID等于176,我把176这个人啊,这个找到子记录了。对,这还不能删,明白是什么意思吗?就是我们这里边是不是有一个上一节讲过约束了,它还是一个many ID,所以不能删它,嗯,那我们就不删了,但是你大家你要明白。我在这儿删除这个视图是不是跟我们在直接删除表是一样的,仍然是有这样一个限制是吧?而这个限制就是来源于那个表中的说明他俩是完全对等的,当你对视图进行增删改的操作的时候,它会完全的对等到这个基表当中。
20:01
这是我们要说的这个概念,好,这是我们创建了一个视图,我们还可以对视图进行这样一个创建,来我们举个例子。刚才是他对吧,我还可以再创建一个EP view1如果说你想对这个试出里边拿过来的这三列进行一个别名的别名的话,那你就在这相应的加上你新命名的名。还是80部门OK,然后呢,你可以拉的星from ep61,此时你看就是你刚才命名的这样。是新新命名的别名,以别名来成为,当你在对这个will这个表当中进行一个修改的时候,你就用这个新的这个名字就可以了。这是我们说的这一点,然后呢,刚才提到了一个说可以简化查询。就是相当于我们可以基于多个已经存在的表来创建一个视图。我们写一下create view EP view2as select ID叫做ID last name叫name。
21:20
行加上一个salary department name。Employee where?就这样子吧,我们将这个表里边儿的所有员工都拷过来。
22:04
大家你看。这是不是就是我们前面讲的一个多表连接呀,基于多表的一个查询,或者说我呢,现在创建了一个视图,这个视图可以使用多个表。那么多个,基于多个这个表创建了一个视图,OK,创建好了,然后select星from ep62。大家看到这个时候,我们这个视图里边就都含有,原来是两个表里边有的数据。没错吧?那么非常的方便,当你进行查询的这个view的时候,它实际上是一个看似是一个对吧,是基于原来的,不用你原来再去进行多表的一个连接,很复杂的查询,你甚至还在后边可以加上一个location类。基于三个表创建一个视图。嗯,这就是这个意思好吧,然后呢,还有一个信息,我们在这后边有讲。
23:09
在这啊,叫修改视图,使用create or replace view来修改视图。怎么修改它是什么意思,我们说一下,我们刚才是不是创建了一个这个叫呃EP2对吧,那如果我现在再去进行一个。这个执行的话,他会说名称已经有现有的对象使用了,就是你不能够再造这个东西了。那怎么就能造了,我就create a加上一个A。Replace will,它那么一开始的我们创建了一个这样一个视图,我在这样写的话,当然你这个内容需要修改修改了。是吧,比如说我现在不要你这个salary了。那么此时我再执行一下这个命令,他就将原来的这个视图给覆盖了,OK。
24:01
这个时候你再进行一个其他星from emp6。这就是你新的这个视图,原来那个就不存在了。这是我们说的这样一个内容啊,就可以对视图进行一个修改,那么下边呢,还有一个操作。在这叫with read only。我们刚才对这个视图进行了一个update,还进行这个delete操作,相当于对视图进行一个增删改,那我们假设有一些人就是还不如DBA呢,DBA还能进行一个修改,那就是一般的人,我只能让你看到一小部分这个数据,造一个视图,然后呢,我也只能让你看,不能够让你来修改这个视图。相当于不能让你来进行增删改的操作,那怎么办呀,比如说这个还是刚才我们创建的这个,我不想让这个用户来进行一个增删改,那你只需要在后边加上一个叫哎,Read read only。
25:12
这就创建好了,创建好以后,这还是我们刚才那个那个数据是吧,当你试图进行一个修改,比如说update e pv2set。Set,这个时候你不能叫lastname了,我已经给它改成name了,Set这个name等于abcd where。ID等于206,我把206这个人的名字给它改成abcd和运行你看。说此处不允许这个虚拟店。虚拟列用的它是吧,就是因为我们这时候你你啊没有这个权限来对它进行一个修改,它呢是用的叫with read only,假设你要是把它给去掉,但是你看。
26:07
这是已经去掉了,然后我再运行,那么这是一个新的,将原来的这个employ e view2覆盖了,然后呢,我再进行一个update。大家看是不是这时候就能修改啊。这我们就说了如何来拒绝让这个view进行增删改的操作。我们这个概念说清楚以后我们再回来。嗯。再回来我们看这样的这个内容。叫简单视图和复杂视图,刚才我们创建这个视图,实际上都是简单视图。那么还有叫复杂视图,简单视图跟复杂视图有什么区别?我们这里有一个表格,大家可以看一下表的数量只有一个,这一个或多个,和函数是否有分组函数,是否可以进行DML的操作,有这样一些区别。
27:04
那么,我们如何来区分简单视图和复杂视图啊?我们说直接看这。我说如果在你创建一个视图的时候,使用到了分组函数,那么它创建的这个视图就是复杂视图,如果创建的视图当中没有使用到分组函数,它就是一个简单视图。大家你看我们刚才创建的这些都没有用到任何的分组函数是吧,所以他们都是简单式。那么怎么叫复杂视图?我们写一个。Create or replace view ep3。As select,我们写一个什么内容呢?我想造一个这样的视图,将各个部门的平均工资给他都输出出来,就是有部门有平均工资是这个意思,相当于把各个部门的平均工资得给他找到也得啊,那就是得select department name。
28:12
这我们用的department name没有找ID啊,然后呢,ABG salary。平均工资。From employees and department。Department,然后D。有这样一个连接条件。那我就按这个department name进行一个group by操作,我们说过说你只要在这个查询当中出现了非组函数的这个列,都将它应该放在格当中。
29:04
OK。哎,这个不用按的逗号。哎,这个呢,是要求我们必须得给它起一个别名。哎,为什么?因为实际当中是不是不存在这个列,所以你一定给它加上个别名,Avgel,前面这个你可加可不加,因为本身存在这样一个力,对吧,加上的话你就写上这个,可以这样de PT name。好,我创建了这个view了,我查询一下select的星啊e view。他。这是我们刚才创建的这样一个view,每个部门以及这个部门的平均工资,这呢就是一个复杂视图,用到了组函数,大家注意,这个时候你创建视图,这个组函数要求你必须得给大家起一个名字,因为实际当中不存在这样一个列,对吧?是我们进行一个查询找到的。
30:15
后边呢,有这样一个操作需要大家注意。在这在视图中关于DML操作的一个规定,你看是不是相应的有group by啊,呃,这这这个我们等一会要说在delete操作当中不能用group by。在这也不能用,在这也不能用,就是跟隔派相关的,不就是我们要讲的组函数吗?是吧?而复杂视图当中是使用的组函数,也就是说在复杂视图当中,你进行增删改的操作的时候,很多时候是不可以的。也就是说在复杂视图当中,我不能够使用这个,呃,增删改的操作,也就DML的操作,为什么?
31:00
那我们先假设去试图进行一个修改,比如说嗯,这个叫我找一个这个吧,这个dependent name叫it这样一个部门,他的平均工资是5760,我试图给他增加update。EP view3set avg s CL等于它原来呢是5760,我给它改成1万。Where是这样写吧?回车,大家看此视图的数据操纵是非法的,它不允许我进行一个修改。为什么我这儿呢?是不是没有用with read only啊,为什么他还不让我进行修改?大家你想,你看这个刚才我们给它创建的时候说本身不存在这个列,我还得起一个显示的一个别名。
32:07
如果不挤的话就错了。从这证明这一列本身不存在,那现在的话,你如果对这个里边的IG这样一列进行修改,那是不是他首先就会去改原来表当中的相应的一些列的值,让它等于你要改的这个心值是吧?但是你真实当中并没有存在表当中的这样一个列。这个列是不是基于现现实当中的很多这个这个列多条信息,最后平均了一下算出来的是吧,就像这个里边还有小数点呢。那你如果把它给改成一个1万的话,那我是不是这个程序也不知道,你到底是应该改哪些人的工资最后平均了一下,等于这个1万根本是不确定的,它相当于是个虚拟的是吧,你没法把这个虚拟的值给它更改。这说明哎,关于复杂视图里边进行DML操作的时候是有这样一个信息的,这个需要大家注意,我们这里是用这个哎,Update来举例的,同样的这个delete和insert也是同样的道理。
33:11
你在这里边隐塞了一条数据,某一个部门平均工资是多少,那你这个部门里边有几个人,分别的工资大概是多少,最后算出来是你给定的平均工资啊,都没法确定。所以是不可以来进行这样的操作的。嗯,大家你注意了啊。那么关于这个视图的操作,我们基本上就讲这些就可以了,最后呢,我们这个视图创建了这么多,最后还可以对他进行一个删除,删除视图的话就像删除表一样,我们用的是叫drop。哎,Job view EP view3这就删除了。哎,这样的方式我们都可以把我们创建的视图删除掉。
34:00
那么关于视图的这个操作,就这些总结一下大家你需要知道的内容,第一,为什么要有视图?它跟你基于现有的表创建的这个新表,它俩之间有什么不同?这个是需要大家明白,那么第二个呢,我如何来创建视图,如何来进行对创对视图进行修改,我们用的是a replace,还可以删除视图。啊,然后呢,对视图中的这些信息数据进行增删改的操作的时候,我们说简单视图进行增删改都没问题,而且他改完以后会把相应的你机表当中的数据也进行一个增删改。只要你基表允许我改,我这在视图中改也行,他们俩是完全一致的,但对于复杂视图来讲,由于它使用了主函数,在进行增删改的操作的时候,诶。是不可以的。好,那么关于视图我们就讲到这儿。后边就是我们要说的这个叫top n分析。
35:03
Top n分析,这个N呢,相当于一个变量一样,你要说TOP10,那就是TOP10分析,20呢就是TOP20分析,它是这个意思。泡泡呢?表示的是前多少个是吧?泡泡N分析查询一个列中最大或最小的N个值,比如说销售量最高的十种产品,销售量最差的十种产品。就像是什么呀,我们大家你经常去上网学累的时候听听歌,你一听歌的时候,有时候经常说这个最近最流行的十首金曲。嗯,这个最新的十首金曲都是前多少前多少,但是你真正打开一看,更多的时候,他一下能给你列出来是不是几百首歌啊。哎,是这样的,相当于它显示的时候只给你显示前面几个。啊,那么我们放在这一块的话,怎么来理解,就比如说我们这个表employees employees表现在呢,这个老板找到你了,说你把咱们公司员工当中工资最高的十个人给我找到。
36:14
工资最高的十个人都是谁?你告诉我,相当于你给老板得给他发一个这个单子过去,那你就可以进行个查询,我就select的employee ID,然后呢,诶,Lastname salary from employees,你得排个序是吧,All the by salary deca,从大到小,你这样写的话,是不是把公司中的所有员工都给他算上来呀?所有员工都算上了,那么从高往低是这样的,老板说要前十个,相当于就要这十个人,从前往后数十个人。那你前面这十个人怎么把它。
37:01
你不能一个个抄下来哈,我就想通过一个查询就得到十个人的信息。就得到十个人群的信息,怎么来搞定,就是我们这里要讲的top盘分析,或者再来说一下,我现在不想要前十个了,我要后十个,或者说我要第40到第50个这一个段的。就是这个就是这个内容,那我们讲的分页什么意思啊,就是当你这个有一页一页的数据,比如说大家你进行这个百度查询的时候,它实际上一查有几百条数据。那你第一页它就显示的是前十个。然后你再点一个下一页,它就把你下一段这个十到20的数据给你拿到,再下一页就是20~30的,它是一段一段的分页的一个效果。那么进行了一个查询,那怎么来做呀,这儿呢,给大家首先引入一个概念。假设我们先把它给去掉啊,先不考虑这个order by了,我们每一个列,这个employees表当中,除了我们讲的这几个列之外,我说呀,还有一个列叫伪列number。
38:11
什么叫伪劣呀?大家你这个。用这个Excel用的比较多了。有点像什么呀,你看我们Excel这个表当中,它是有表格的哈,这个表格你看这边是不是有一个这样一个列啊,这个列就有点像我们现在说的这个伪列,你像你这个A就叫employee ID,这个叫last name,这个叫salary,这个her data等等等,这里边还有一个列一样,这个呢,像它的一个伪列就是用。这里边儿这个叫number。那我们看一下。你看确实现在有105条数据,然后这些数据前面都有一个文章的。那这个有同学说啊,你早说呀,有了这个我就能搞定了,怎么搞定啊,那他想这样做,我是不是现在select一下他们。
39:05
然后from他,我在这个order一下。奥拜完了以后,它是不是就有一个排序啊。排序完以后,我说我加上一个where,我只需要让你这个room number是不是小于等于十,我就能够找到你前十条数据了呗,那小等于20我就大于十,小于等于20不就是十到11~20的这条数据。想是这样想的是吧,我们看可不可以。Circle命令未结束,这个呢,我们得给他俩倒一下序。不然我们跟外得挨着啊,确实出来了十条是吧,确实出来十条,然后你细细看一下啊,这个顺序还挺还还反了。
40:01
Order by salary。这个公司是从大到小,但是貌似好像不是前十个最高的,这个没有问题。我们刚才那会儿,你看前十个。在这吧,你看前十个都肯定是1万多了,这毫无疑问,但是你看你刚才这个表里边列出来的竟然还有4000多。这肯定是不对的是吧,那说明我们这个查询有问题,那问题在哪。我说实际上这个role number它是虽然是一个伪列,但是它默认也有一个数值,也有一个排序,它是跟你这个employee ID是对应的。不信你看,我们这里查询的叫number小于等于十,它确实查询的都是。嗯,一到十的,而且呢,你看一就是100这个人二呢就是101,那十呢就是109,相当于你查number小于等于十,是不是就相当于查询了employee小于等于九啊。
41:11
跟没排序好像关系不大,他仅仅是把这个employd前十这个员工的工资从上到低排了一下,而不是真正我要的整个公司的工资。那说明它有一个默认的排序,那我们怎么来进行一个修改,怎么修改就行了呀。它本身跟这个呢。是有点儿关系是吧,那我假设让你失去这种关系。不是跟它相关联的,你看我是不是可以这样。这个如果我这样去查的话。那就是整个把这个表现在给查出来了,前边有一个number。那前面有个no number的话,大家你看一下。前面有个序列是吧,前面有个序列,然后是从高往低,然后这个如果我当成一个新的表的话,这个新的表是不是还有一个中number这个相当于是它的这个这一列了,是吧?也就是说我这个我先不要。
42:14
先不要它,然后我把这个排序好的这个。表当成一个新的表,或者当成我们要查询的一个表,那么就是select。嗯,这个select employee ID last nameme salary from,我们刚才写的这个表。就是这个表,然后这个表我找你这个是是rule number小于等于十的,所以我们在这加上一个room number。
43:03
我这个呢,就是我们查询完了以后的这个新的表来放在这儿,请做V。我说这个时候我们查询的。就真正的是工资前十的。看一下。一到十,然后呢,看确实是前十的对吧,这个呢,就是这样的意思啊,就是你本身如果这样去刚才那样去查询的话,就刚才。这样来查,这样来查的话,它俩本身是有关系的,那默认的它俩是一一对应的,那我现在不让你一一对应,我就呢。先把你这个排序好以后的这个当成一个表,那排序好以后的这个新的容number就是跟你那个工资从高往低是对应的,我找这个时候小点十。执行了是吧,那这个就查询到了啊,然后呢,哎,我们想我查询工资这个,比如说40~50的。
44:07
怎么查呀?那你where number应该让它小于等于50AND number大于40。我们是这样想的是吧,哎,一运行没有结果。这肯定是我们操作有误了,因为肯定是有值的啊,那原因在哪?原因我们看一下。大家看这个数据啊。说,针对于这个number,我们只能够进行小于或小于等于,而不能够用等于大于或大于等于的操作。这个一旦你这样操作了,返回结果就哎是为空了,就像我们刚才这个操作一样,说明这个number还是比较矫情的是吧,它只能够用小于等于,不能够用这个符号。所以出错了。
45:01
出错了以后,那么我们怎么来进行一个修改啊。怎么进行一个修改。这呢,也没有什么新技术的,那只能是我们开动自己的大脑来思考,怎么就能够让他没错。你看我们这样想,这个number它是一个伪列,这个伪列说只能够进行小于等于的,不能够进行大于的操作,如果它不再是一个伪列。而是真实存在的一列。它是不是就能够进行这个大于的符号,就像我们的salary工资,我可以说找工资大于6000的。可以进行大于,因为它是真实的一列是吧,那我如果让你这个也变成真实的一列了,它不就可以使用大于符号了。怎么就能变是变成真实的一列了,就是它不是这个后边表的一个伪列,而是一个新的表的里边的一个新列,那么就是跟刚才这个想法一样,我再把你这个是不是当成一个新的表啊。
46:05
那么查询的时候,就从你这个表里边来查,查你这个列它不就是一个。真实的一个列是吧,所以我们这个先先把它给拿掉,怎么查select。Select,你肯定还是要查询这几列吧,是吧,查询这几列,但是你这几列如果往这一放的话,这就以为是你这个新表当中的,你看我们是这样想的啊,From一个什么,我把这一堆数据。给它扔到这里边,那你从这个表里边查这个信息的话,这个有可能又它给你当成是这个伪列的信息,所以我在这儿干脆起一个别名叫RN,那你这个用边名肯定就不会跟你这个。外边这个它的伟力冲突了是吧。那我说。
47:02
我这样给他扔过来。大家能不能看懂啊,这是我现在一个新的表。我从这个表当中来查询你RN,你的employd last name和salary,这个RN已经不是外边这个表里边的一个伪列了,哎,那么就这个时候,既然不是伪列了,我就可以用R让它来。这个大于40AND r,让它小于等于50。来我们进行一个查询。哎,那么这个呢。就是我们要查的40~50之间这个工资区间的这些人。那这这不是不是就是一个相应的分页啊,比如说我们要查询第一页的话,那你就是零到十,查询第二页就是这个大于十小于等于20,第三页大于20小于等于30,就是始终的这样去循环,这样一个情况就出来。
48:04
是吧?这就是我们讲这个套盘分析啊,这个是需要大家你掌握的,后边呢我们会用到啊。嗯。你不能说这个工工作的时候是吧,老板说你把公这个公司里边前十的这个人的这个工资给我拿过来,你就把这个呃整个给他说,都把整个公司的员工的这个工资都查了一遍,然后夸张扔给老板,说老板你数前十个就是公司里边的最高工资。后边的这个我不知道该怎么去去掉啊。那或者说老板说我要公司里边第40~50人的,你说老板你数一下40~50那一段就是你想要的,老板可能做的第一件事情就是明天不要来。对吧,这个事就办不好。那你是不是只需要学一个,嗯,套盘分析,你就能够做好这个工作呀。嗯。那这个讲完以后,我们这节的内容实际上就说完了。
49:01
大家你尤其把这个套盘分析里边,40~50之间的这个事儿,你给大家搞清楚。这页呢,我们讲了两个内容,一个跟视图相关的,一个呢叫陶盆分析。好,这节我们就到这。
我来说两句