00:00
好同学们,咱们关于这个查询语句啊,目前呢,是3453个章节呢,咱们已经讲完了,对吧,已经讲完了,那讲完这三个章节之后啊,咱们呢,其实针对于这个查询操作呢,诶感觉说呢,诶常见的一些操作基本上是可以来做到的了啊来我们这块呢,做一个小的一个回忆,大家看。比如我们现在呢,想做一个查询,那咱们就写这个select了,对吧,对应的就是你想查看哪些相关的这个字段是不是就在后边呢,写出这些字段啊,然后紧跟着的话呢,你就告诉我这些字段啊来自于哪一张表,那我们这块呢,就是放在from的后边。那要这样下去的话呢,我们会查出你这个表中的是不是所有的数据啊,那咱们知道呢,My circle呢,它是一个大型的数据库,它里边呢,存储的这个数据量啊,可以达到几千万条,那如果这样去做的话呢,那显然的话呢,呃,效率很低啊,因为呢,你像咱们一般呢,都是通过客户端也好,这个我们去访问这个,呃,我们外部服务器,外部服务器台访问数据库服务器,然后呢,诶查询这个数据库,你把这个数据呢,要反问给用户几千万条数据,那太恐怖了。
01:09
对吧,诶,而且一般呢,咱们做这个思后查询的时候呢,通常呢,也会都会加上一些条件,哎,加上一些条件,比如想查询一下最近一个月的呀,呃,这个订单的情况是吧,查询一下这个最高的,呃,这个部门的一些相关的信息,那相应的我们都会有一些是不是条件呀,啊或者我们叫过滤的语句,那我们在circle当中呢,就可以使用这个叫where。目前呢,咱们只讲过这个where,还没有讲其他的讲having啊,咱们讲到聚合函数的时候呢,再说啊,那where的话呢,就可以实现我们这个表中这个数据的一个过滤了。那么从大的方向上来讲呢,我们这块写的这个过滤条件呢,比如说可以写这个叫and,那这就相当于是叫逻辑运算符了,对吧,就是谁且谁啊,或者说呢,谁or谁,那也行,那当然我们还有个叫叫做not是吧,哎,这样的一些相关的一些情况啊,这是这个where里边这个信息,那么where后边的话呢,回忆一下我们可以写什么呀。
02:07
啊,这呢,也是我们说比较重要的一个需求,就是我们查到了满足这个条件的这个数据以后啊,咱们通常呢,会按照一定的顺序呢,返回给用户,那这就是我们提到的叫order by order by,那么我们可以呢,具体使用叫asc的这种排序方式,升序也可以呢,是不是降序啊,而且呢,你是不是可以这个多级排序,或者叫多列排序都行。OK,那么这样的情况下呢,我们有可能还是查询到的数据啊比较多,那咱们呢,可以按照用户的要求,诶,以分页的方式呢,返回给客户,这呢,我们又提到这个limit来实现分页操作的,对吧?那limit的话呢,我们说是在这个有限的几个数据库下,我们去使用的啊,My circle啊,PG circle啊,还有这个Maria DB啊,还有circle呀,是吧,可以用这个limit,像Oracle啊,DB To Circle server啊这块我们说就不用它了。
03:00
行,那OK,这呢是我们说到目前为止呢,写的这个长兴语序啊,各位呢,是不是感觉呢,体验还不错是吧,那到目前为止呢,其实这个难度啊也不算大。啊也不算大,那么咱们这一章的话呢,讲比较重要的一个章节,这个章节呢,我们称为叫多表查询。啊,多表查询从我们讲这个查询开始,咱们一直是从第三章讲到这个第九章,那么这些章节当中呢,呃,应该说呢,比如说有一些难度的,或者说比较重要的章节,一个是多表查询,一个呢,就是这个叫子查询了,这两个章节呢比较重要。啊,也相对来说难度呢,也会大一些,像咱们真正在开发当中,子查询多半查询这都离不了的,这就是体现它的重要的,对吧,那么体验它这块又比较难是在哪儿的呢?一方面呢,就是像包含子查询以后呢,尤其还包括了这个多表查询了,我们这个SQ啊。啊,当然这块SQ说的就是查询了,对吧,这个写的这个代码量呢,就会比较大,那代码量一旦大了,自然而然大家这个驾驭的能力呢,就有限了,所以呢,它体现了就会比较难一些,对吧?哎,比较难一些,好,这是一个,然后另外一个啊,我们讲到这个SQ话呢,咱们在下天的时候呢,重点给大家说的是不是就SQ优化呀。
04:15
啊,那S后优化的时候呢,我们想想,如果数据量比较大,又是多张表之间进行一个连接,连接查询很多时候呢,它类似于我们像学编程语言里边这种嵌套for一样,那你像for要多了以后呢,是不是这个呃,这个这个嗯,那达到这个复杂度呢,是这个N的三次方的这样的一个程度,效率就比较低了,所以呢,我们需要呢,在多表查询当中,乃至于这个子查询当中啊,是要做一些优化的。啊,也就是说呢,诶,你首先写这个周边查询或者子查询呢,写出来呢就不容易了,但是你写完以后呢,一执行到那倒确实不错是吧,是对的,但是效率呢又很差,还得考虑这个优化的问题,还得通过一些这个我们相关的一些工具和这个指标呢,去检测你这个SQ呢是不是。
05:02
诶这个效率高,诶这块呢,就是高级的一些内容了,所以说呢,第六章第九章啊是吧,从两个不同的角度呢去说明,一个是本身呢它就难,第二个还得考虑优化是吧,诶这块呢给大家呢抛出来。好,那么我说这么多的目的呢,是为了引出咱们这个叫多表的查询是吧?诶引出这个多表查询,那我还有一个引入方式,还有引入方式这个讲课呀,这个怎么讲怎么试是吧,就是把课程设计好的话呢,这个诶方便大家理解,那我们呢,诶就可以这样去说,诶刚才呢,提出来我们说多表查询的一个重要性了,那另外一个角度呢,还可以去谈,就是咱们在讲这个第一章数据库概述的时候啊,我提到一个,提到过一个是不是咱们讲表记录跟表记录之间的这种关系是吧,提到过叫一对一的关联关系啊,一对多的关联关系和多对多的关联关系啊,啊这个呢,在咱咱们到时候再单独说啊,这个难度倒不大,就是自自己引用自己啊,那么一对一呢,咱们说通常的时候呢,也嗯,当时从优化的角度来讲,我们诶是可以把常用的字段呢,放在一个表,这个不常用字段放在另外一张表,这个是是对的是吧,但是我们在诶不考虑优化考虑设计的话呢,完全可以把它就建成一张表。
06:12
啊,就好比是这个学生的这两段的信息都设计成一个表,叫做学生表一样,对吧?诶这个呢,咱们诶不多说,比如像员工表呢,那咱们就完全可以把所有的资料是不是都放到一个员工表里了,对吧?好,那我们现在呢,想给大家说的是这个一对多。一对多,比如说呢员工表,咱们员工呢,也讲过employees里边呢,是不是有很多字段啊,那么关于这个部门的话呢,咱们有专门的把这个部门的相关信息呢,放到一个表里了,那么现在我们想查询这个,比如说一个部门当中有多少个员工,那其实就是一对多的一种关系,那我们现在呢,就需要呢,诶讲咱们现在提到的什么呀,叫多表的查询。那那我们就要引入这个叫多表查询,这呢是咱们从这个表中记录跟记录之间的关系的方式呢,咱们引进来的啊,咱们引进来的,呃,那么在咱们实际的项目开发当中啊,像咱们一个后台的项目呢,这个呃,上百张表,这个也都算是比较正常的,那项目要大一点的话呢,几百张表也是很正常的,那么我们在进行这个表之间写这个SQ的话呢,你能够想象到,那我们也不会说呢,就是每一个查询语句都是针对一张表来进行的。
07:23
啊,多表之间的一个查询呢,是非常常见的啊,所以大家哎,务必需要掌握这个多表的查询。好,那我们这块呢,通过一个案例呢,来引入。首先呢,在讲这个案例之前呢,需要大家呢,比较熟悉的就是因为我们讲多表查询了嘛,前面咱们更多的呢,是集中在这个员工表中,那现在的话呢,我们需要大家呢,再去至少熟悉两个表,一个呢叫做部门表,一个呢叫做诶这叫呃所做的这个所坐落的这个位置是吧?啊叫locations这张表,那简单的来我们这块过来啊,咱们这叫多表查询了,对吧。好,我把这个呢,先CTRLC。
08:01
啊,刚才我一不自觉的老师来去点那个CTRLS啊这块去保存我们这个文件,咱们先把这个文件呢,先保存一下那第六章多表查询CTRLS。哎,先到这儿啊好,那这里边儿呢,我们首先呢,诶首先呢,我们说这个第一个问题啊,需要大家呢去熟悉。哎,熟悉,那我们说这个常见的几个表,咱们这个,呃,这个教学当中啊,常见的几个表。那这边呢,首先DA我们说呢叫employees是吧,还有呢,DA,那我们说叫哎departments,还有呢,哎DA我们的locations,我们这里边呢,提供的表其实比较多,咱们有一些表呢,在课后题当中呢,诶会大家呢去体现,咱们暂且呢在授课的时候呢,目前这三张表需要大家去熟悉一下,这个员工表呢,咱们用的比较多了,这算是11个字段,每个字段的意思呢,也都还相对清楚,然后呢,关于这个部门表。由部门ID啊,部门的名称,这个每个部门呢,有个管理者是吧,管理者的ID,还有呢,这个部门呢,所坐落的位置叫做location ID,然后另外呢,关于这个locations表呢,我们来也看一下,那这个表里边儿呢,比如说location ID啊,这个街道的在哪一条街道,在这个邮编是多少是吧?然后哪个城市,哪个省,哪个国家,哎,国家的ID。
09:22
那这样的一些字段信息。那这块呢,我就把它呢,相当于截了个图,那就是咱们这块呈现的。大体上大家有个印象,那这里边儿呢,再说一下啊,你看我们这个员工表里边有一个叫部门ID,那这呢,是不是也有个部门ID是吧?然后在这个部门表里边呢,有个所做了的这个城市的啊,这个location ID啊,就是所坐落的这个位置,然后这呢,是不是也有个这个location ID,那他们都是有这种相应的这个关联关系的,对吧?那我们也前面呢举过这个例子,咱再说一下啊,比如我们想select兴一下,先from employees。我想查询一下某一个员工,他在哪一个城市工作。
10:00
说一遍啊,我再说一遍,我们想查询一个员工,那这个在哪个城市。工作,那这个咱们就指一个吧,查询这个员工名为啊,这个我就随便起一个了,这个我记得这个表中有一个员工呢,叫做阿贝尔啊,我查询员工名为阿贝尔的,嗯,这个员工。啊,员工名为阿贝尔的人是吧?的人,他在哎哪个城市啊工作,那有这么一个需求,那这个需求呢,抛给我们之后啊,咱们首先呢,诶提到了就是我们在这个员工表里边呢,实际上它是没有说城市的事儿的,是吧,那城市在哪儿呢?是不是在我们这个locations这个表里边有一个叫city啊。那那我们就得想看一看他到底在哪个city怎么办呀?哎,你看我们首先呢,先查询一下来,这块我们加个where。Where啊,Last name啊,等于啊,贝尔是吧?我们先看一下阿贝尔这个人的一个基本情况。
11:07
哎,还真有这个喇贝尔,那这个员工的话呢,我们看到他呢,是不是有个字段叫做department ID,相当于他是不是在80号部门工作,对吧?然后呢,我们是不是从这个部门表里边看一下80号部门啊好,那我们就这样啊,She select,那我来个星from。哎,Depart是吧,然后呢,Where啊叫depart。ID等于那80号部门。那咱们呢,是不是就找到这个部门的一个情况呀。八兆部门的话呢,是一个销售部门啊,相当于阿贝尔呢,他是做销售的是吧,销售部门他的这个部门的这个管理者呢,是145,然后呢,这个这个部门呢,所坐来的坐落的这个位置啊,是2500,那咱们找到这2500了,好,那接下来呢,是不是这个思路就清楚了,那比如select from叫locations。
12:00
诶,我我这块呢,我就不加这个where了,咱们直接呢,就看一下这个location这个表,在这个location这个表里边呢,是不是你看所有的这个location ID,咱们要找的是不是这个2500啊。那么2500是在这一条街道上,这个呃是是叫邮编嘛,呃是这个是吧,然后后边呢,啊,它所坐在城市叫outford哈佛是吧,那省份呢,也叫哈佛,然后是UK的啊是哈佛吧。Oxford。Harford,还不是哈佛是吧,哈佛是哈哈vford哈,哎,这个Oxford是吧,诶这个城市好,那现在呢,我们相当于是不是就知道了,阿贝尔呢,他在是不是就这个Oxford这个城市里边,诶工作呀。那没问题是吧,好,这相当于咱们就找到了,那找到了这个员工他所在的这个城市的,那咱们要是就想查他的话呢,你就呃where叫location ID,咱们刚才是2500是吧,这个呢,就只把这一条记录呢,给我们列出来了,就这个城市。没问题是吧,好,那当然你看咱们现在呢,找艾贝尔他在哪个城市工作的话呢,咱们是不是最后也找到了这个时候呢,确实借助了是不是三张表找的相当于呢,回到这个位置,那就是这样子的,咱们呢是知道他的last name,通过last name呢,找到它所在的底盘的麦地,然后呢,通过这个底盘麦地呢,是不是找到它所在的这个,诶叫什么location ID是吧,然后location ID呢,跟这个location ID对应,是不是找到这个city了,叫Oxford。
13:28
OK,行,就是这样的一个顺序,这儿呢,其实我们就做了一个叫多表的一个查询。有同学想说这个说了半天,这有点简单呀,是吧,有点简单呀,啊,那如果你要这么认为的话呢,嗯,那你就是想简单了,大家看我们现在的这个需求呢,确实通过这三个SQ语句啊,是不是做出来了,但是。啊,我要说但是了。但是的话呢,你想想我们这假设是咱们的这个,诶Java后台啊,我叫web服务器了,咱们发送了一条circle发给这个数据库服务器了,诶数服务器呢,是不是到我们这个数据库里边,诶一顿查,这就咱们第一条啊,我就标个号啊,123,这是三个SQL语句,那第一条SQL语句呢,发过去之后呢,返回给我们的是吧?贝尔呢,它所在的这个叫什么部门ID,咱们查到是80,然后接着呢,这是第一次了啊,你再拿着这个80呢,又去一顿查,查出来这个员工他告诉我们是这个在哪呢。
14:26
这个这个找到了KID了是吧,叫2500吧。那然后呢,你又啊,这是咱们第二次又拿着这个location ID是2500了,又一顿查,查出来之后呢,说在这个叫Oxford啊这个城市工作,那你想想,虽然我们这个目的达到了,但是呢,咱们是不是通过网络这种远程的方式呢,做过三次交互。才把这个事儿给做出来。做过三次交互才做出来,那你想想我们如果是远程的方式呢,这个网络当中是不是耗费的这个时间也会比较长,一次两次,三次才出来了,我们要是一次就能够做到了,是不是就不要用三次再去做呀?
15:06
也就是说我们要是一个SQL语句呢,发给数据库服务器,再去数据库中去查找一下,返回给我们就查到了,那是不是比你三四要强的多的多呀。哎,那我们这时候呢,诶还没正式开始讲多板查询的,多板查询呢,就是我们像讲完之后呢,这三个咱们就能够合成一个词口语句啊去完成这个事儿。没问题。没问题是吧,好说清楚了啊行,那这个说清楚之后呢,这个咱们再回过来啊,有同学说老师你你开始往下讲吧,那我我我再磨叽一下哈,我还想磨一下,我希望呢,大家把这个思路呢去打开,有一些场景呢,你可能你没有想到,那我替你想出来,我替你想出来呢,我再替你答出来,希望呢,你能够对这个circleq,对我们数据库呢,有一个诶更深入啊清晰的一个理解啊呃,这块呢,我们讲这么多一些小点,其实都为了形成大家一个整的一整个的一个思维体系。
16:00
啊叭较全面的,然后呢,我们下偏的时候呢,再往深度的去给大家去扎是吧?哎,形成一个梯形的一个结构,梯呢,就是诶上边这块呢,形成一个呃,这个知识体系啊,就是广度上的啊,然后我们下篇的时候呢,重点扎了一个深度,OK,行,那我再抛一个问题。再抛个问题,有没有同学会想这个问题,说呀,我们这里边儿呢,你看把这个员工明明就是讲公司员工的事儿了,是吧,你为啥非得列成三张表啊?我把这三张表合成一张表,可不可以呢?想想。虽然说你这叫员工表,部门表和这个所在城市表,那不都是员工吗?那我就都合成一张大表不就完了吗?大家想想可不可以?哎,这个把你的这个答案呢,可以打到我们这个屏幕上是吧,可不可以。好,我来解释啊,第一个可不可以可以。没问题,可不可以,可以,那为什么不这样做呢?或者说这样做行不行?哎,还是又回到第一个问题,行是吧?那为什么没这样做呢?
17:08
为什么没这样做?这是个高级问题。哎,我举一些这个场景来做说明啊,比如说啊,比如说那我举很多种场景啊,嗯,比如说咱们说一个部门,假设这个部门啊,就叫做it部门,假设这个部门里边有300。啊,有300人,你像我们如果说现有的这种做法的话呢,你在这里边呢,会列这个300,就是都列出这些员工他们这个部门ID了,然后这块呢,是这个部门的这些详细的信息,那么这三这个这个表里边有三个300个人,我们只是每个里边列了一个这个部门的一个ID,假设呢是幺零,幺零这个部门是吧?啊对应的是我们的it部门,然后这个部门里边呢,有好多的字段啊,就关于it的,其实就只有一条数据了,因为1010呢去刻画它呢,就一条数据就可以,对吧,你要是把这两个表要合成一张表的话呢,你想想是不是说我们就会有300个人,然后每个人原来呢,可能只需要在这儿写个1010就可以了。
18:03
1010就可以了,现在呢,你非得在1010后边是不是又补上这12344个字段啊,啊是it部门的,哎,这个manage ID是谁locald谁,每一个是不是都要写上300个数据,是不是都得去填这么多,那么我问大家,你是不是感觉这一块是不是有点冗余啊?想想是不是有点冗余?没问题对吧,诶有点荣誉,好,那我再说一些场景假设呢,咱们现在还有好多员工啊,他根本就没有部门。没有部门在我们这儿呢,是不是直接在这就体现是一个闹就完了,而你要在这块呢,很多员工没有部门,是不是因为我们这块呢,好多这个字段都是空的呀。那你是不是又浪费一些空间?好,这只是说员工,那我们同样的话呢,是不是也会有一些部门有这个部门,但部门里边没有人呢,那要在这里边儿的话呢,在员工表根本不用体现你这里边有个部门啊,这个没有人,没有人就没有人呗,但是你要放到一张表的话呢,这块就这一部分呢,是有字段的,但是前面这块呢,是不是有大量的这个nor字段的出现。
19:04
到目前为止,我还都没有去提这张表,你要再加一张表,那是不是这块冗余的字段就会更多呀?对吧,就更多了。好,这儿呢,我还仅仅呢是谈了一个冗余的问题,还有什么问题呢?大家想我们现在要做这个查询,我这是谈这个优化了啊,虽然我们还没有讲下篇正式优化,但是这块呢,已经给大家去渗透这样的思想,你想我们在查询的时候呢,要把这些数据,比如说这个表呢,这个上百万条数据,我们想查查询其中一部分范围的数据,需要把这个数据的从这个什么呀,磁盘当中,或者叫硬盘当中,把它加载到这个内存当中啊,加载到内存当中的时候呢,你像我们原本的这个表中,假设只有十个字段啊,那你内存中一次加载就是这这这要一说就复杂了啊,就咱们就涉及到数据页结构,我就不多那么多复那么复杂的事儿了,咱就简单一点,就是我们要是这一个里边只有十条数据的话,诶这个十个字段话呢,我可以一次性比如说咱们加载这个。
20:02
呃,加载1万条吧。对吧,加载1万条进来,诶就进行一次L啊,我就加载了1万条,但是你想想你要是有这个100个字段的话,那是不是我这块呢,只能一次性加载,加载1000个,诶就是一次性L啊,加载1000个字段了,那你要是需要很多的数据的话,我是不是得反复的加载十次L才能达到你这个1万个是吧。相当于什么意思啊,就是你这个字段要特别多的话呢,我们就会加载特别多的冗余字段到我们的内存当中啊,那你这个字段多,我们IO的次数就会多,诶那咱们跟IO啊硬盘去交互的话呢,IO次数多了,那这个效率是非常差的。行,我刚才呢,呃,仅仅是从两个这个角度呢,去给大家来解释的,那想必呢,很多同学呢,也理解这个事儿了,那其实还有很多其他的问题,比如说你这一张大表,我们再去维护的时候呢,实际上也是非常的复杂的。那维护这个时候也很复杂,再者说的话呢,原来比如说咱们只想查这张表,我就没有查这两个表,我们就不涉及,不涉及到这两个表的锁定问题,那一个事物啊,或者咱别说一个事物了,那事物大家没讲过,就说一个人吧,呃,一个人呢查这个表,那另外一个人呢,是不是就可以同时查这个表啊,但是你要现在把他俩合成一张表的话呢?呃,一个人查这个表,那这个表呢,就可能处在锁定的状态,那另外一个人呢,就诶没方便,没法去查。
21:21
相当于我们这个表呢,你力度越小的话呢,是不是大家都可以同时去做,这个效率也会更高一些是吧?诶可以更高的去并发嘛。OK啊,我谈了好几个角度,大家捋一下,那总之的话呢,就是我们肯定会根据具体的你这个,呃,实际情况啊,我们把单这个单位的一块这个操作呢,或者一些字段呢,放在一个表中,另外的一些呢,放到字段放在其他的表中,然后表跟表之间呢,使用这种连连接关系啊,我们叫这个多表查询也行,叫这种关联查询也可以,然后呢,实现咱们的诉求啊,比如说咱们这里边儿这个,呃,阿贝尔到底在哪个城市工作是吧,这样的一个诉求。
22:01
好,我刚才磨叽了这么多啊,我觉得我说的这个呢是有意义的啊,大家呢,希望呢,你也能够听进去,就是为什么啊,要有多表的查询操作。
我来说两句