00:01
好了,咱们继续啊。呃,我们上节课主要是说了什么东西啊。哎,对,就是这个啊,说了一下一个frame sad啊。啊,算了,就我这儿还有广播呀。又出这个问题了。有了吗?行了啊,咱们接着看啊,上节课呢,咱们主要是说了一个那个frame set啊,还有一个就是咱们解释一下这个逻辑分页,但是我没有实施啊,就是没有开发。啊,就是理论上讲了讲啊,大家再来回顾一下啊。逻辑分页呢,这边包括呃,分页查询,包括咱们的逻辑和物理逻辑分页,其实就是从三里边取啊,所有数据都在session里边,就这么一个意思,这么理解就行了,它的优点是不需要频繁连接数据库啊,缺点是没有办法保证数据是最新的,而且数据量庞大的话。
01:11
我们这个可能会耗费大量的内存啊。什么情况选用逻辑分页,这看着吧,啊行,咱们一起来看一看逻辑分析怎么去实现,而且呢,这个图呢,我也画了,来一起看一看,呃,入手点在哪呢?刚才已经说了的入手点应该在这个左边啊,这个页面叫left吧,还有里边有个用户管理吧,这个时候找吧,嗯。呃。最后吧,做一个用户管理。这边的是吧,这个路径不要了吧。将来呢,咱们一定是点那个用户管理一定会执行ex。啊,但是那个一定要记住啊,执行结束之后。它会跳到这力。将来这个H前面就变成什么了JB了,明白吧,行了,那我就开始写了,接下来把这个咱们改一改斜杠吧,Serve light啊写的叫page quary Yoga啊,Page quary Yoga啊叫分页查询用户信息。
02:10
行吧,啊就这样,这边我说了啊,是需要加项目名的啊,但是我们现在这个项目比较特殊,它是放在那个叫什么root的目录下的,所以这个就不用写了吧啊删掉吧啊那么这边呢,咱们问号加上去啊,就加一个page number把等于一吧。我们点击这个用户管理,我们要向服务器传送那个页码是等于几啊,等于一吧啊,这个单词什么意思呢?叫page number吗?就是页码吗,页码。你点这个用户管理肯定是传一个一过去或者这样吧,咱们可不可以不传啊,这也可以不传,如果我们在底层写一段程序啊,如果没有传的话,我们就认为是第几页,第一页行不行,你是不是也行啊,也可以啊行就是这样,那行了,把这个路径复制一下啊。
03:05
录像复制一下之后呢,咱们审肯定得去执行一个程序了啊,这个程序呢,咱们一起来写一写,打开它。叫逻辑分页查询用户信息,来,我把这个布置一下。不把它剪了。然后放到这儿。好,这个改成配。分页查询用户信息,来这个包呢,咱们已经建了啊,直接建一个类吧。复制一下,接下来呢,我就直接写一个类了啊来咱们。就在这写啊。接过来继承一个类,还记得吧,叫什么?对对对对,就是它啊。
04:01
这边呢,咱们写上这叫分页查询用户信息,写上属于逻辑分页,我们这边呢,重写一个督盖的方法来。重写盖。好,OK。来这边呢,改成request,这改成response,好,谢谢,这边这个怎么写呢,这边一样吗。这个吧。从三中啊去大力子及格。然后返回那的话就干什么,连接数据库吧,执行查询信息返回结果集电力封装对象。存储的大力子尼河中。实际上大理石第一个再存到什么三点中啊。
05:13
转发啊。先获取页码,获取session,从三获取大列的这个如果。返回list子集合为nu,连接数据库,执行产品句,返回结果及编辑同量对象,将用户对象存储到历史的集合中,再将大类子存到session里面,根据页码从大集合再取出小粒子集合,将小粒子就算说吧,没问题啊,这边呢,咱们加上去啊这个公式。那么接下来呢,咱们一起看一看,这个就用着了啊,这个就关了。行这边呢一起看一下,首先咱们在这呢,获取页码应该是。一会应该是类型是吧,His number啊类型它等于一,咱们应该是在这啊过取一下啊request get什么parater吧,加什么page number吧,以后咱们记得page number啊获去它,但是它有可能感觉那吧。
06:16
啊,如果它要是等于等于那的话怎么办。一吧。其他情况呢?in.pass吧,这写谁呀?是这个吗?这个应该能看懂吧,就是取页码,如果要是等于空的话,就是几啊一啊,如果要是不等于空的话,咱们是不是就是request该旁就调这个点pass in这个方法,把这个字符串转成int类型啊,需要in类型能看懂啊行就这么写了啊来继续这个呢。拿一会拿到了,然后呢,看session section那个第三吧,啊来session session等于request,第2GET session这写一个什么呢?这写一个,这不写了吧,这么着了啊,拿到session之后呢,Session呢。
07:13
要一个方法吧,什么方法呀,该打C6的吧。Session叫get atribute叫什么叫big list吧?行吧,叫big list啊,那这样的话,他会取一个的集合,对吧,这个list的集合啊,叫big list,好了,那我问你啊,这个big list这个集合里面存储的什么对象,是一个对象吧,好,那这个优乐对象咱们得。这个优势对象呢,咱们类还没有写,咱们看一看,这没有写B吧,写个B啊。又错了。去掉它啊。
08:05
行,这边呢,我们建一个类啊,这个类叫userr吧,好,这个userr呢,里面有哪些属性呢?这个不能随便写,咱们要打开数据库了啊,打开它这边不是有一个U吗?嗯,把这个U呢复制一下,接下来呢,咱们直接贴过来放到这,然后这边呢,咱们缩进一下,然后呢,咱们这边呢,给它删了,写上去private是吧,然后这边呢,咱们就写上去一个分号就行了吧。好,这边呢,咱们写完了啊,然后我们在这边呢,生成一个塞盖的方法,来生成塞盖的方法,OK就行了啊,这样的话咱们这个类就写完了,来这个呢地方咱们写yo来把这个删掉,这个导错包重新导啊这个啊上点北京框的eguv.u好,那接下来呢,咱们就看啊,拿页码拿session从30面取例子的及格,但是这个例子有没有可能等于空啊,如果叫big list等于等于那怎么办?要不要把它谬出来。
09:07
需要吧,啊扭出来你一个什么every类似吧,哎,就是这样啊,扭完之后呢,这个集合里边是不是没有元素,没有元素我们得连数据库吧,啊连接数据库。接下来执行查询语句,来,就是connection connection吧,来,继续prepared statement来,继续盖来我们这边打包打包,打包好了,这边等于什么点get是吧,来。这边啊,加上去TRY开,再加上去finally吧,Did you.close吧,好,这边呢,咱们写完了啊,这个思路句应该很简单吧,就直接写select user name user code user nameme user,诶,这个密码需要吗?不需要是吧,这这需要代码姓名和机构类型。
10:03
代码姓名和记录类型or type?哈,不知道你提吧,Where条件是什么没有啊,因为是查所有嘛排序啊,Order by按照什么?Re date。降序升序。按日期降序排列。是不是最后的录入的一定是在最上面的。所以你想清楚啊,这不是随便写的,来就编译吧,编译是不是就执行了,执行完是不是编译啊,来咱们执行查询语句,返回查询结果集,来便利结果集封装用户对象。
11:05
将用户对象存储到list集合。再将list集合存储session来。将大力的集合冲到30中。好好,大家想一想,现在呢,我们在这应该是unit吧,You吧,好,用了一个unit之后呢,咱们记下来unit two size啊,User code一个,Side user nameme一个,还有side or type一个吧。好了,那么接下来咱们继续啊,这边呢,Yo,嗯。对吧,结果集里边取出来给它附上值啊,用户对象有了之后呢,这个历史的集合就不能闲着了啊,你一旦定出来对象之后,那个历史的集合必须得叫爱的方法,把我们这个用户对象是不是存进去,大家想这个循环,如果数据库里边有100条记录,这个循环就循环100次吧,创建100个对象是不是放进去了,等循环结束之后,你想一想这个历史的集合是不是得放到session里面,所以你session调get垂是不是才能取出值。
12:17
你调用这个session的一个方法,这个方法叫get,什么attribute,这个name不能随便写这个value,它一定是这个例子的集合,这个name是谁,因为你知道调盖的是他嘛,所以这个时候你把name写过来放到这。我们捋捋啊,假如说用户第几次啊,第一次访问,第一次访问首先获取的页码是几啊,这边是一吧,拿到一之后呢,咱们这边是不是拿session啊,拿到session之后session就要get,是不是取构是none啊,那如果是none的话,你会尿出来了,接下来下边是不是就创连接数据库查询所有记录放到历史集合里边,把这个历史记录放到30里边了吧?好,那我问你下次用户再来访问的话,第二次访问三是拿到,三是要get吹的方法,这个方法拿到这个,这个值就不等于空了吧,不等于空,这个if语句不成立吧,不成立是不是里边就不会走了,那就直接往下走出就可以了。
13:06
是不是直接往下走就行了,大概这个思路大家理解了,嗯,就是这样啊,好了,那么大家看一看,这个思路还是比较清晰的,往下走这边呢,是根据页码从大粒子集合中取出小粒子集合。实际上在这边有一个例子的集合叫u list吧,是不是又list子呀,来这个例子是不是就是小例子的集合呀?好,那么这个子的集合里边有数据,接下来我们request就set,是不是存一个u list,是把your list存进去啊,存进之后呢,request.get request开吧,点什么forward是吧。关了呢?这是8.68.5。不点六不应该。八月五可能会出这个问题,八月六月初。
14:09
等一下啊。Quitest that attribute吧,User list哈,User list呀,那必须得存啊,你想一想这个小的例子的积分你已经有了,你存进去就跳就行了,跳到这嘛,request.get get request Dis time。哎,怎么写到这句话就出问题了?
15:04
不能吧,这是怎么老出问题?看看啊,是不是又丢了。丢了再重新写,哎呀,这工具呀。嗯。这样我看看是不是这个问题。这个啊。GRE里边的啊。一除一下。稍等啊,我调一下。
16:06
嗯,这边看啊。稍等片刻啊。我把所有的Java do呢都给它剔除掉。可能是这个问题。我删一下,如果还出这个问题的话,其实我也没辙了。行,OK。关了打开。来下点右键关闭。再打开。打开之后呢,再看一下啊。这是一个。这个。写一写啊,看会不会出问题K吧啊写了好几遍了,这个啊,request.get respect写over啊,这边改成request response,这边咱们写怎么写啊,斜杠system,斜杠用点吧,这可以了啊。
17:27
但是呢,你这个例子集合是不是没有数据,是不是得将上面那个叫什么大例子集合里边数据根据这个叫什么页码是吧,是不是整出一个小的例子集合出来,怎么怎么解这个。肯定是开始下标,肯定是结束下标啊,叫in index,开始下标和结束下标都有了。然后开始循环,这循环吧,一呢行I等于零,I小于big list的点SA加加,你肯定是从这个BB的list的集合里边调钙的方法,把这个下标为I的元素取出来,你放到这个list的集合里边吧,这个意思叫爱的方法吧,添加吗?添加是那个元素啊,是这个元素吗?
18:19
好,这个地方写什么。Begin that。那从零,那这个怎么解啊,这个这个是不是零,这个这个是不是三啊,是零三吗?那这个是零的话,这个就是几啊。这是不是那个inex啊,你想一想,这个是零,这个是三,你看啊,这个是零零的话,这个是几啊三,那这个零三的话,它是012了,012从这个集合里边是不是取出012呀,然后是不是放到。这个及格里边,那这个时候如果这个是几啊,三是吧,345366吧,那这样的话,这个是几啊。
19:04
这是不是三啊,这是不是变成六了,那这样话是不是又放进去了,这一页上显示几条记录啊,三条记录来,每页显示三条记录,所以page size啊,写上几啊三。每页显示三条吗?那这这个这个这个这个这个怎么写,这个开始怎么写结,你只要能把这个跟这个给我写出来,那这个就就就结束了,开始下单,你找到了结束下降你找到了,肯定是从这个大的粒子的题里面找出这个这个元素之后呢,放到这个小离子一共是循环,最多循环几次啊。三次。因为每页显示几条记录啊,三条记录。你只要放进去我就可以存进去可以跳了,不过现在呢,不耽误写这个吧,这个是不是也可以写了。
20:04
U点点did能写了吗?可以了,来,我们找到U点点did,找到谁啊?这个吧。这个吧,来把它复制一下啊,我先给大家演示一下,放在桌面上,在桌面上有这么一个文件吧,我把它改成什么接好会不会出现乱码。来把它复制一下,然后咱们给它放到这。放在这正策打开啊,把这个U点点B打开,你看是乱码吧,乱码,所以说H界面呢,改成DB会出现乱码也动加上这不就行了吗?来加一下。保存了吧,嗯,回去了吗?永远回不去了。明白吧,所以大家一定要谨慎。千万别这么干啊,顺序错了。应该先在HT里面加上这句话再改名,能记住吗?要不然你会后悔来加上这句话之后呢,你再点中它,再把它改成什么C。
21:14
啊,这个时候就不会出问题了。如果你要是反过来,先把它改成GB再加,再进化没有用。明白吧,所以这个事呢,我提一提啊,你就按我这个做就行了啊,你不要这个先改,先改成D啊,改的话就会出问题了。行了,那这样的话,咱们就就就就写吧,啊,这这这里边有有一个循环是吧,哪哪一部分开始循环是这个吧,看啊这是个TRTR。完了之后呢,下面这是个TRTR这是个TR吧,行都删了吧,啊删了得了,留几个,留一个得了,我没删多吧。我就留一个啊,是这吧,好,就是这啊嗯,这边呢,我把这个集合取出来,怎么取,大家还记得吧,request.get attribute取吧,因为你当时在存的时候,你是不是这么存的,然后接下来你到这你不得这么取吗?取出来之后呢,List集合U吧,U list吧,好了,这边有个list来强转一下行给上好打包来这边拐包好这边打包啊赶过来,那这样的话,这个历史的额就有了啊,有了历史的积额之后,你循环吧,怎么循环,在这边有一个循环,怎么写for循环,对不对,嗯,好,怎么写user user user please吧,现在看懂了,好分开了,那怎么分开啊,这样吧,这样吧,是不是这样就分开了,分开了啊看好了这个符号的话,你要成对写啊,你看我编成的时候一般都是成对写,我怕忘了。
22:51
啊,你也这么成对写了啊,那么这个TR是不是减了,是不是放进去啊,放进就行了,来这个缩进一下,来缩进一下,这边呢,咱们再缩进一下,行了,就这么着了啊,这个循环应该差不多了,那么接下来只不这是动态的吧,这个序号怎么办?加一个什么,哎,等于零完了之后呢,这就下标就行了啊这边的话咱们直接写个什么这个呗,这叫I吗?哎,这是谁啊,扣扣吧,点扣吧,Get build code啊这个那个叫user.get这个叫什么user nameme是吧?这边继续这个外汇管理局这个user.get or type机构类型。
23:34
但是现在呢,它肯定显示不出来,显示不出来那个外汇局啊,它显示的结果是一或者显示零吧,啊是这样啊,所以你要注意一个问题,行了,这是这个啊,嗯,想想行了,咱们这个页面上是搞定了,但是这个类比还没搞定,这个比begin和index的下标到底怎么算。你肯定把begin啊放到这儿,你肯定把in的放到这儿,你的begin和in怎么放?
24:01
怎么计算?嗯,这个。你这就是数学题,这个数学题吗?你看啊,每页显示三条记录是吧?啊,每页选三,第一页是几到几第二页。没事啊,隔壁修呢,别看了,第三页是几到几。第一页几到几啊,零到二吧,012嘛,那这样的话就是345呗,678呗,是吧,六到八,那这样咱们看看啊,零零到三行吗。
25:07
零到三这会开吧,行吗?开区间不包括行吗开。三到几啊,三到六吧,六到几啊,六到九吧,你看这样行吗?因为你看这不是小于等于明白吗?这是不是小于。如果你要是小于等于的话,那那那那肯定是0012吧,那你要是小于的话,那肯定这个值三吧,就是零三啊零到三三到六六到九,那如果是每页显示配置三条记录上面每显示三条是这么做。那这样的话,第page number应该是什么样的?D page number应该是多少到多少?
26:18
啊。你都看出来了,这个值永远是一乘三,这个值永远都是二乘三,这个值永远是三乘三嘛,嗯,三三得九吗。二三得六嘛,一三得三嘛。所以这个值就出来了,这个值不就是那个叫page size永远都乘以page number是吧,改成波浪线吧,啊改成波浪线这个呢。你没发现这个值永远都是这个值吗?这个值永远都是这个值吗?而这个值不就是后边这个值吗?这个后边这个值就是这个值的,而这个值呢,跟这个值是一样的,那么这个值你已经算出来是k size乘以k number,那前面这个值应该是上亿,你想第一条记录是不是上一页的最后最后一条记录?
27:13
那最后一条记录是这个吧,只不过是上页是吧,你让配上面减一就行了吗?数学题嘛。来算算靠近平。第一页吧,一减一得几啊,零零乘任何数得零吧,零三还用算吗?不用了吧,来往下。第二页呢,二减一得一吧,一乘三得三嘛,三到六吗。所以这个东西你就复制一下得了啊,放到哪啊。放这行吗?这个复制一下吧,放哪啊。行吧你。
28:00
是不是begin和end嘛。但是这么做肯定会有问题啊。如果这个大粒子的集合就是B个粒子,这里边正好是三的倍数的话,肯定不会出问题。什么时候会出问题?好好想想啊,这个还是还是挺有意思的。你好,我我我我我我举个例子啊,比如说吧,现在数据库里边一共几条啊,一共四条。假如说啊,一共四条,好,咱们分析一下一共四条,也就是这个这个这个这个B的例子里边一共四条记录。最高下边是几?那最高下格肯定是300是吧,开始了啊,开始来这个第一页是几到几啊是这是零嘛,这是几啊三,所以这个时候呢,零到三它不会出问题,零到三的话是012嘛,因为这是三嘛,是不是012啊,那第一次这个肯定没问题,但是第二页你想一想,我要是访问第二页的话是几到几啊三到六吧,那这样的话,它的下标应该是三到六的话是应该是345吧,是不是这个for循环会循环三下标会循环四下标也会循环这个五下标吧,但是呢,我说过了,这个历史的集合里边一共是四条记录,最高下边是几三,所以第二页的时候,第一条记录循环的时候没有问题,但是再往下循环,因为这个下边结束是几啊,一定是死的就是几六。
29:39
三到六吗?是不是六啊,但是呢,下标超了没有。大家没捋清啊,我再来一遍,第一页是零到几,同志们,零到三对不对?底层一共四条记录是吗?最高下焦是几?最高下焦是不是三?那么我问你这个时候如果负循环是不是不会出问题,012嘛,但是你别忘了人家会不会翻一页往下翻一页是不是变成第二页了,变成第二页的话,你想一想第二页是不是三到六,那这样的话,这个变成几了三,这个变成几了六了吧?那三到六循环是不是345,那最高才下边才几啊三,所以会不会下降越界?
30:27
怎么做才能保证它下边不越界?这个还是begin,这个还是什么in,只不过这个in呢,有的时候呢,不是这个值,如果什么in。大于小于。啊,还能小于小于你管他干嘛呀。
31:03
大什么这个list表size条件成立,必须把in的index改一改,这个in the index这个值呢?它用它就行了。你想结束的下标他都抄谁了?抄总记录条数了吧,那这个时候那你还不赶紧的吗?结束下标你还能用这个index吗?不能用它了,你得用第在作为最后的假标吗?所以这个时候连起来其实是怎么写这个啊。它大于第一个list的点什么带。条件成立的话。怎么办?其他情况是什么?
32:02
还是他吧。三元运算吗?PE size乘以P大于B格离的点size,条件成立了,差谁大于谁?大于实际的选实际的吧,如果不大于的话,咱们选这个吧就行了啊好,就这样就可以了啊处理一下,嗯,大家呢,会算这个数就行了啊,下一周好好琢磨一下,可能我讲的时候呢,比较快啊,下一周候你再具体算一下,反正下周拿出来之后呢,这个时候就取出来了,取出来之后呢,就放进去之后呢,放到这个request范围内跳就行了,那么既然这个就行了啊。来咱们这个就写完了。关了它啊,咱们把它部署一下。来部署好了,OK,把它启动一下。
33:01
好了,那么接下来呢,咱们把它打开。打开之后呢,咱们这边呢,点一下登录,点它点它。这是什么呀,这是。行吧,我自己查得了。这一定是显示第几页,是第一页吗?来,要想显示第二页,得传一个什么等于二对吗?问号number等于二,因为我们底层成绩是不是这么写的,是不是这个request get是不是可以获取页码,拿页来传个二啊,来回车。这是第二页是吧,以后数据还不少啊,第三页啊,这是第三页吧,大家呀,说一下啊。你最好不要往我数据库里边放东西啊,因为我讲课的话,我心里可能有数的啊,这个数据到时候我可能要通过这个数据讲一些东西,所以最好呢,不要往我这儿啊,可能你是下载我程序失败,IP没改。
34:05
这个东西得改一下啊,IP地址改成你自己的IP吧,啊,用户名密码改成你自己啊,你不要在这我操操操作我数据库啊,行吧,这样啊,咱们把数据库删一下看看起不起作用,我说了这个数据库删了之后呢,它就不起作用。你看看试试来。因为它在30里面的吧,我现在登上去之后呢。我把这个用户啊,这边呢,我查一下啊,来就是这个Yoga啊点右键。我这不是有数据吗?我就删几条啊,我就从最后删吧来删删删删删删了吧,提交提交查询,提交叶子查询好了,只有一条吧,但你好好看看啊。第一页。刷新啊,你看第二页那数据是不是还在啊,这根本不是数据库里边数据,这是不是30里边的,不是缓存啊,是30里边,我从这已经刷新了。
35:07
啊,不是走浏览器缓存啊。我在刷新一遍,你看见了吗?来刷新啊,这个数据有没有啊,有,因为我没有关浏览器对吧,浏览器关你再打开。这回这个数据你再看一看,走走走啊。是不是只有一条啊,只有一条。所以这个逻辑分析存在问题啊,这个问题还不小啊,这个。就没有办法保证数据是最新的啊,但是它人家也有优点啊,它的优点就在于啊,这东西呢,不用频繁,连数据库也是不错的啊,那有的时候我们也会用一下,但是用的比较少,多数情况下我们都是使用物理专业。啊,所以这个呢,我就不再给时间了啊,下一周你愿意写的就写一写,不愿意写就无所谓了啊,这个东西用的比较少。
36:02
好,知道这个思路啊,是这样走的就可以了。行了,这样的话,逻辑分析我们就讲完了。逻辑翻译好,咱们重点讲物理翻译,嗯,这个关了吧,啊这边关掉,关掉之后呢,咱们看一下,打开这边呢,我看一下啊。这是一个逻辑分页是吧,好,嗯,行。来,我把这个复制一下,咱们直接讲了啊不等。来,我把这个005改成006,然后呢。005的这边我看一下啊。行吧,这个呢,咱们点它点它,然后把这个路径呢复制一下,然后呢,咱们OK了啊,点它点它添加还是这个啊,直接把这个贴过来还是删除OK就行了,行,那么咱们把它的关了就行了,好了,这边呢,我看一看,讲一讲物理分页啊。
37:09
这个呢,主要是物理分页啊,物理分页来说一下,第一个就是物理分页的原理啊,还有一个是物理分页的优点和缺点,还有一个就是什么时候不这个这个就不写了啊,就主要分析一下咱们物理分页的原理,还有物理分页的优点和缺点。物理分析原理是这样的啊,编写数据库特有的什么词语句啊,例如Oracle中使用什么?例如二中使用。Row number啊啊,例如MY中使用limit等吧啊。
38:05
编写数据库特有的思考语句。啊,例如Oracle的remember my circle使用的limit啊,每一次都去连接什么数据库,执行思后语句啊,执行思后L语句查询出。页面上需要的什么数据?所以说这个物理分页呢,它的优点是什么什么的,每一次都去连接什么数据库啊,所以可以保证数据是最新的,缺点呢,缺点一是什么?每一次都去连接数据库啊,每一次都去连接数据库。
39:02
并发性。降并发性降低啊,或者是效率吧啊,访问效率较低啊。访问效率较低,但啊,这不是缺点啊,这不是缺点啊,因为以后我们获取连接对象的时候。不会啊,每一次新建会使用连接池啊,会使用连接池提高访问效率,明白吧,这不是缺点,就现在把这缺点说一下啊,每一次都去连接数据库,实际上你每一次是不是都会新建connection connection新建这个对象,我们其实称叫重量级对象,重量级啊,重量级对象这个对象connection它的创建很耗时。其实你在debug调试的时候,你要注意了,调试的时候走到那个叫什么db.get connection那个方法的时候,它会耗费很长时间,它程序执行十秒钟,可能九秒钟都在干什么,创建连接对象明白吧,所以每次都去连接数据库,都需要什么呢?新建什么连接访问效率较低,但这不是缺点啊。
40:23
因为以后我们获取连接的时候,不会每一次新建会使用连接时提高访问效率。第二个缺点是什么?由于搜索语句使用了数据库特定的啊,数据库内置的特殊语法啊,特殊语法,所以思后语句不能移植。对吧,因为so语专用的嘛,因为词语句啊,词语句是专用,但还是什么呀,但这不是缺点啊,因为以后会啊,使用高级框架啊,高级框架be啊,这样circle语句可以写在哪了,写在配置文件中啊,将来circle语句。
41:12
是可以修改的吧,是可以修改,可移植,明白吧,可移植,所以一切问题都是被解决的,所以这个结论你就清楚了吧,这个结论是什么?就是物理分页啊。比较常用。物理分也比较常用,每一次呢都去编辑搜索语句,去连都都是去连接数据库执行查询,查询最新的数据啊,呃,注意他俩的缺点啊,缺点是其实这个缺点有的时候你要是不用连接词,它确实效率比较低啊,不用连接词的话,还有词后语句,你想一想,写死在加法程序中会有很大的问题,词有语句将来会变的。是吧,今天我不想连连Oracle了,我想连谁呀,我先连这个mysle。是吧,那这就不行了啊,所以要注意这个问题。
42:06
行了,那这样的话,咱们是不是应该先讲一讲number啊。对吧,讲完咱们再回来做这个项目啊,行了,这个还得等一会儿呢啊。来讲一讲,回去打开来,咱们这边写上去。零四啊,来,我把这写上零四,Oracle通用啊,三页思考number。我们先把这个讲一讲,然后回头我们再来看行吧,来把这个打开。No number是什么?这ID是什么?Number和D什么关系?首先第一个什么是容量法啊。
43:08
是行号啊,是Oracle首先说这个事吧,啊,首先呢,是这个有number是Oracle数据库特有的啊,其他数据库中没有,其他数据都没有,Number是Oracle数据特有的。其他数据没有,Number是一个表的隐含字段啊,隐含字段我们表面上是看不见的啊,就是DSC命令查询中,查询结果中没有吧,咱结果中没有这个字段啊,没有这个字段REMEMBER2特有的number这个表的隐含字段,表面是看不见的,再往下number的是为啊,为每一个DQL语句准备的啊,DQ语句准备的。
44:06
是为查询结果集准备的啊,准备的是查询结果集的临时行号啊,是查询结果集的临时编号,编号从几开始啊?从一开始以多少递增啊?以一递增看见吧,这就是number number是二数据库特有的,其他数据库中没有。number是每个表的,是一个表的隐含字段,表面上是看不见的。number是为每一个D去准备的啊,是为查询查询结果集准备的,是查询结果集的临时编号,编号从一开始一一递增。UID是什么?UID呢?是数据库表中的每一条记录在硬盘上存储的物理地址。如果ID是数据库表中每一条记录在硬盘上的。硬盘上的真实。
45:06
物理地址。使用UID查询数据库表中的数据。Oracle数据库啊,Oracle数据库不会做全表扫描啊,不会做全表扫描扫描啊直接通过什么呢?物理地址定位该数据查询效率提高啊,查询效率是最高的啊,是最高的索引中啊使用了什么UID。所以呢,使用D,然后再把说下row number的D到底什么关系,没关系。这个可能面试官会迷惑你啊,Or考里面有ID啊,有个road number,他俩什么关系啊,都带着row啊是吧?
46:05
没关系啊,没关系就行了,他俩是没关系的,根本不沾边啊,你不要把它他俩往一块凑了啊,扔number的其实就是一个伪列,或者叫一个隐含字段,它其实是为我们查询结果及准备的,查询出十条记录,它行行就是一二三四五六七八九十,明白吗?肉ID是什么呢?肉ID这个东西,你其实就是这张这张表里边的每一条记录,这条记录在硬盘上的真实存储物理地址。你可以看一下啊,这块呢,有的来circle来进去好了,Select,行,From,呃,Select。嗯,DMC number啊,呃,Row ID from d。这是外地啊。是外地。啊。来,我们查一下这条记录吧,Select,什么select e number吧,En吧,Ary吧,啊,From叫吧,我全是什么柔ID,等于这个值,哪个值啊,这个值啊。
47:09
那么这个传算是最高的。这个查询效率是最高的,为什么?因为它这张表都不会扫描,它是直接通过这个物理地址定位的,这条数据直接从硬盘上拿出来的,明白我意思吧,它是个地址啊,所以这个呢,查询效率是最高的,来,我们把这个公式一下,直接放到这吧,啊,这是个外地。这么一个结果。含效率最高的,所以能使用了啊,以能使用了number是没有关系,他们没有关系啊,接下来继续,呃,还有什么number和什么关系这一块的话,咱们没有关系啊,还有吗。没什么了是吧?来具体说一下number啊,具体说一下number来,Number和表中的记录之间是绑定关系吗?
48:05
Number和表上的记录之间是广定管理的,这个很重要啊。来,你看啊,Select number name number from,好,我们一起把这个找出来,把它复制一下。我给它贴过来放到这儿啊,放到这儿大家看一看。这就是吧啊,Number和表中的记录之间是绑定关系吗?这个一和史密斯是绑死的吗?这个六和black是绑死的吗?不是啊,这个和这个没有关系吧,没有关系,就是这个啊,和前面那个没有关系。怎么验证?来,我尝一尝。外条件啊,是salary大于3000的。哎,这个结果。看见了吧,接过来,接过来之后大家看一看原先的king,哪个king啊,往上找king看见了吧,King是几啊九,但是现在是几啊一,所以这个结论呢,我们希望大家能够记住啊,这个结论是row number和表中的记录啊,没有任何关系啊,没有任何关系,没有绑定关系啊,没有绑定关系是临时的一个行号,明白吧,是临时的一个行号啊,是查询结果集的临时行号,来接下来继续。
49:31
继续啊。Oracle中的row number都支持哪些操作呢?我们试试啊,大家看一看select e number name吧,直接写en吧,啊,En name,呃,From e what,实件是the number等于一。或者这样吧,大于二行不行。这个能查出结果吗?
50:01
就是现在呢,我们不是查询出来了吗?那这样我我我再再来一下啊,那这个我拉大一点吗。来,我这个往上点啊,让大家看清楚select en name啊,Name直接查name吧,呃,Number from,大家看一到13是吧,啊一到13行就这样,那接下来呢,Select什么呢?En name,然后呢,From emp关沉淀是no number大于二,这个能查询出结果吗?为什么不能?这个我说一下A是怎么设计的啊,A文档中是这么设计的,注意啊,这是原理,我要讲一下对根的本质啊,是这样的,我们答一个问题,Select en name from emmp where,条件是row number大于二,这个结果为什么查询不出任何记录来?原因很简单啊,是这样的,假如说。这个要能查询出结果,这样吧,我先不说大于了,我先说等于,先先说简单的等于二行不行。
51:08
行吗?那么。啊。来我来说一个原理啊,原理是它底层用的数,呃,咱们原先最最初学的数学里面的反证法啊,首先是这样的啊,我问你这个语句假设结果能够查询出来的话,请问能够查询出几条记录?假设数学里边在高中的时候不都学过反正法吗?假设结果什么成立,然后推出一个矛盾点吗?是吧?来,我问你,假设这条语句能查询出结果,能查询出结果的话,这个结果一定一定是几条,是不是一定是一条,那我问你啊,这一条结果查询出来之后,它是有那等于几。一吧。一和二相等吗?
52:04
一和二不相等矛盾了吗?行了,所以这个查询不出任何记录来。啊,这个未选定糖。这个位选继续。等于一行吗?假设这条语句能查询出结果的话,他一定会查询出一条结果,并且这一条结果最后的行号是几啊,是一。所以一和一不矛盾对吗?他让你查吗?让。嗯,有意思吧,二不行一行。来,再来一个。大于一行吗?
53:03
你只要能查出结果的结果行号第一行一定是几啊一。大于一和一矛盾吗?能吗,不行。大于等于一行吗?大于等于等于这个条件没有。大于等于一,是不是全部都查出来了?你只要查出结果的行号几是一吧,那你这个条件满足吗?满足吧,所以大于等于一,它允许你看。但是我问你啊,你要是这么做还有意义吗?你就加他干什么呀,你删了不就行了吗?不都都出来了吗,是吧啊。可以查明的。再继续。小于呢?小于二行吗?
54:03
不是,大家怎么还没有领领会呢?我的意思就是说,你只要能够假设结果成立,给我推出矛盾点,如果那个矛盾点出来了,这个结果是肯定不行的,你只要掌握这个窍门就行了。你就推吧,他查出来结果是几啊,那这是一啊,一旦满足这个条件吗?马上咱能查出来这个能这个允许的,因什么小于三,小于四,小于五,这都行,那你就查嘛,小于它是可以的。所以你就拿过来就行了,这个结论我希望大家能够推出一个结论来啊,扔number和表中进术时间绑定观点,这个不是绑定观点往下啊,这个number都可以哪些操作?这个结论是什么?Or中的number只支持什么?等于一小于等于小于大于等于一。
55:06
其实你是说这么多都没有用啊,怎么着呢,就一句话,这个是不是没有意义。这个等于一就可以忽略了啊,这个等于一肯定是可以的,你要记住一个小于是就可以了啊,这个结论其实是article数据库中的number机制啊,只支持小于操作。这个没有意义,你就别写了。这俩一样不?这不都小于吗?等于一吗?是等于小于操作啊,这写上吧,小于等于啊,我这写写的全角啊,小于等于,再写个大于等于一啊,这个没有意义,这个没有意义啊,主要是这个。
56:02
这个你下一步看我这个文档就行了啊,我这文档给你写的很清楚,第一个number是什么,第二个ID是什么?Number ID什么关系,还有number和表中的记录之间是绑定关系吗?你验证一下它不是绑定关系。还有一个问题,其实就是我们2NUMBER支持哪些操作,这个非常重要,其实只支持这么几个操作,等于一小于操作。我再说一下啊,这个大于二为什么不行,或者是等于二为什么不行,等于二的话,如果能查询出结果的话,就查询出一条结果,而这条结果查询出来之后,后边的行号一定是会显示一个一的,而这个一呢和二是冲了矛盾了,这种结果绝对不允许成立,所以呢,他察觉不出任何结果的,明白我的意思吧,这个你得注意啊。这个查询不出来,但是你要说等于一这就行了,这我能查出来,因为这个没有矛盾点,你要说小于,说小于四,那这个可以没有问题,都不会违背我们的一个原理。
57:01
是吧,大于就那就大于二,这怎么查呀,这没法查呀,你查出出之后你显示个一就矛盾了吧,所以这不行啊,所以这点你得知道,来接下来我们做几个练习题,练习一查询啊,查询EP表中的。呃,查询ERP表中的前五条记录。怎么查?超简单的select en en吧啊,Enary把它加上去啊,Salary from enb where,条件是这number直接小于等于五就行了,这个是不是前五条啊?这一定是前五条,我们看一看,这就是前五条吗?来,我们把这前五条拿出来放到这,这就是前五条查询E表中前五条记录。
58:02
前五个来继续。升级了啊,查询啊,EP表中工资排名在前五名的员工。嗯。查询EP表的工资排名在前五名的员工。工资排名在前五名。思路是什么?先按照什么工资的降序排列,第二步呢?我告诉大家一个小窍门啊,这个窍门你一定要克服了,它有很多同学克服不了什么窍门,先按照工资的降序排列,它一定会查询出一个结果。但是你一定要记住,把这个结果看成临时表,你就你就认为这张表是存在的。
59:03
明白吧,你就认为这张表是存在的,在数据库里面是有的。还有好多同学就这这这这,没有办法把它看成是一张有的这张张这张表啊,来,咱们先按照公司的降序牌怎么怎怎么写,那个select name salary from EP order by,按照SD是这么排吧,这是不是就是查询结果啊,按照公司的降级排,查询的记录条数是不是是13条,完了之后这13条这的工资都是降序的呀。好,大家千万要记住了,这个时候别多想了,前面所有东西全忘掉。这都没了,明白吧,你现在就给我认为数据库里边就有这么一张表,而这张表里边就有几个字段,两个字段,听明白了吗?现在要取前五名的还不简单吗?是不是就是取这个这这这这这张表的前五个。就就你听明白了吗?前面都忘掉,都都都没了,这个跟这个没关系了,这就是一张表了,从这张表里边取前五个就行了,所以这个时候你就取吧,将上面的查询结果看作临时表,查询临时表中的前五条。
60:20
是不是前五条啊,或者前五个啊,前五个其中,那怎么写就直接select呗,你我还是那句话啊,你是不是能把它看作一张临时表。这张表有一个一定,那就是呗,这张表有个塞ary,那就是塞ary呗,From就是一张表,在这张表的它就是上面这张表了啊where条件就是number小于等于五嘛,这个这个这个so很简单的,它这这就就是那张表了,是吧?你把这张表放到这,其实就相当于把这个句放到这,你把思语放到这不就行了吗?这就行了。能理解吧,那你看这会儿你再查,这这这你就查出来了。
61:05
这不就前五条吗?所以呢,这个东西我希望大家能够克服一下啊,你别多想了,就是你再难再难,你说你这条思路语义都写的很长很长很长,你管它长那么长干什么呀,总之这条路语句查询的结果就这么一点,你只要面临这个结果去开发,是不是就简单了?能理解我意思吧?好,我来写一个错误的啊,错误的写法是这样啊,有同学这么写,Select in name salary from em啊,我前面是the numbers小于等于用啊,Order by,按照S表面看着这条词后语句还是什么?还是排序取前五个,其实你错了。他是先取前五个后排序。是吧,这个错了啊,这个错误写法,这是,这不能这么写啊,这么写错误原因是先取前五个啊只针对什么?只针对前五个排序吧啊来其实很重要,搜索语句的什么执行顺序很重要吧啊,很重要来怎么写的?Black from where group bying order by是这样吗?哪个是一啊,这个是一吧?哪个是二啊,这个是二吧?这是不是三,这是不是四,这是不是五,这个是五。
62:35
是吧,这是什么呀,六吧,56。那直接顺序很重要。这个你得好好看一下。Order by是最后执行的。你看它其实这么从这张表来查,查完之后经过这个条件过滤吧,过滤完之后分组吧,分完组之后再过滤吧,你看它它给了几个过滤啊,两个过滤,这这两个过滤呢,有点有点区别,这个过滤呢,是没有分组之前的过滤,但是这个过滤呢,是对分完组之后,如果你再不满意的话,我可以。
63:14
再进行一次过滤对不对?所以它有个where,有个having,我们希望大家能够把这两个注意一下,我们有一个条件,能在where中过滤的,绝不放到having中过滤,如果放到having中过滤,就相当于你这个数据呢拿到了,然后你都对人家分组了之后,你就不要人家了,是吧。效率低吧,什么效率比较高?先过滤剩下一堆,之后在这堆数据里边干什么?分组,分完组如果,如果你对这个分组之后的数据不满意,请再过滤。能理解吧,所以我问是不是能在这过滤的,尽量过滤掉。那你肯定是这样的呀。从这张表上查啊,经过条件过滤,然后分组,分完组之后再过滤,过滤完之后查,查完之后再点呗,这个顺序怎么验证一下,为什么是这个是五,这个是六啊,怎么验证。
64:11
很简单啊,Select in salary as salaries from e order by and salaries。排序这条语句能执行吗?这条语句能够执行出结果,这证明什么?一定是as,先执行,再执行order by。因为我把这个字段是不是重命名了,变成这个名字之后呢,我后边是不是写的这么一个名字呀,而这个名字能用这证明是不是已经重命名了,那是不是意味着这句式一定是先执行的,再去执行这个呀。那如果这个语句这你说这写的有问题,这肯定是标志符无效啊,这个标志符是无效啊,你写错了,你删掉写salary行不写这个也可以啊,写salary写写这个都可以,你写别名行不行啊,行salary。
65:08
听听可以。哎,那怎么验证这个和这个的顺序。怎么去验证这个select和这个顺序。和。怎么验证一下?嗯。找出每个部门的平均工资,怎么找?或者找出每个岗位的平均工资,怎么找?找出每个岗位的平均工资?三什么a job吧,这是不是平均工资啊?是每个岗位的平均工资啊,Salary,每个岗位是job吧?From什么em吧,都是five分组嘛,按照工作岗位分组,求平均值一共是几个工种啊?五个每个工种的平均工资是不是都有?
66:02
是吧,好,那么大家现现在看一看啊,查询每个工作岗位的平均工资有一个条件要求显示的是什么?要求显示的是平均工资大于一千一千。大于一千五的怎么写这条语句?要求平均工资大于一千五的,所以加不加海底平均工资是avg什么salary吧,大于多少,一千五吧?好,这个是不是查出来了。人家说是不是先从这张表查,再分组,分完组之后再过滤吧,过滤完之后是不是再查呀,那怎么去验证这个先,还是这个先,我可以干什么,把这个重命名行不行,可以吗?如果重命名之后,我能不能把这个东西放到这。行不行?
67:00
回车标志服务项。大家看好了,这个名字能用吗?不能用,那么也就是说这个having先执行还是select先执行,Having先执行对吗?Having执行的时候他还不认这个东西呢,这证明这个重命名还是没有,是不是还没有执行?所以大家看这个顺序是正确的啊,没问题,先这个from,再经过where条件的过滤,然后再经过group分组之后再进行过滤,过滤之后再查询,查询之后最后排序输出。听明白了吧,这个顺序必须掌握,如果词、口语句的平行顺序都没有掌握的话,那你以后写词口语就麻烦了啊,三张表,四张表,五张表,表连接呢是吧?连接一会懵了,这怎么回事呢?为什么搞不清思路局的执行顺序啊,出了问题。行吧,这是刚才是不是查询公司的排名前五个的呀,这样吧,咱先休息啊。
我来说两句