00:00
好,那么为什么需要多表查询,咱们说清楚之后啊,咱们下边呢,开始来正式的实现这个多表的查询操作,比如说我们现在提一个需求,咱们想查询具体的员工,他的employd啊,他这个department ID啊,以及它所在的部门的名称。诶,需要查询三个字段,那么这三个字段呢,显然是不是不存在于不唯一存在一张表中呢,而是在两个表里边儿呢,那我们就需要呢,进行多表的一个,哎,多表的一个查询是吧?好,我们下边来去实现,好,那下边我们来说这个多表的哎查询。那如何这个实现?好,我们把刚才这个问题呢再描述一下,我们想查询呢,叫employee ID,然后诶这个不是lastname了,这个department。ID是吧,还有一个呢,叫做department name,哎,注意我们是这样的,1233个字段。行为了这个方便起见的话呢,就是大家可能刚开始对这三个表呢,还不太熟悉,诶我这样啊,先把这块呢去盯一下,目前呢,咱们还用不着这个这张表啊,先看一下左边这两张表,我呢就稍微的往左边放一放,好我们现在呢想查询这三个字段,接下来呢,是不是from呀,Employ employs哎或者这样吧,我先把这个字段先去掉啊,一会儿咱们咱们再说那个字段,他那稍微的有点特别啊,哎,为什么特别一会说我们现在想查询这个employd和这个department name,那你会发现呢,这个呃,Employd呢在这个表里边,然后department name呢,是不是在这个表里边啊好,所以说呢,现在我们写from的时候呢,它对应的是这个表,然后你得是不是得逗号一下啊啊,因为还有一张表叫做诶departends。
01:47
是不是这这个字段来自于这个表。那这样写完之后的话呢,说有没有什么过滤条件呀,也没有,咱们就是说让把所有的员工是不是都查出来呀,OK,那有的同学可能就想说,哦,那还挺简单的,那我们就这样写一下不就完事了吗?好,那现在呢,我们就想去执行了啊,来走一把。
02:06
你看诶没有报错,诶这这么简单是吧,好那么你去细看的话呢,觉得这个事儿啊就不太妙了,为啥呢,大家你看有多条记录啊。这显示了1000条,是因为我们这儿呢,就一页呢,也就显示1000条,我们再换个页吧,你看再来一下,这是不是又是1000条,然后再来一下。啊,889相当于呢,咱们这样的一个操作呢,查询出来了多少条数据啊,是不是2889条啊,九条记录啊。条条记录对吧?显然呢是不太对的,咱们员工呢,总共才107个人,怎么会有这么多条记录呢?你每个员工所在的部门名称,那不也就是应该有107条记录对吧?那你要去看一下我们这个查询结果的话呢,大家就会发现问题了,你看这个174这个员工他所在的部门怎么这么多呢?175也是,是吧。
03:00
感觉像这个员工是不是在每个部门都工作过一个,呃一一遍,那成了一个管培生啊是吧,显然呢,我们这个写法呢,是有问题的。啊,是有问题的,那么这个数据是从哪儿来的呢?为什么是2889条记录啊。哎,咱们首先说这个事儿,这是错的。错误的实现方式是吧?来先明确这个事,那么这个2889从这来的呢?来我们先把这个呢给大家解释一下,首先呢,你看我写了from employees这个员工表呢,咱们都比较清楚了,是不是一共只有107条记录对吧?好,我们这呢是107行记录,行,那么接着呢,大家你看我select谁呀,这个2889除以107,咱们看能不能除尽from一个到是吧。来选中执行,OK,能够除尽,这个除尽的结果呢,就是27。就是27,那这个27又是谁呢?你看我起来这个星from。
04:04
Departments。Departments,那我们看下这个部门表,因为咱们现在不是两张表吗?这个部门表里边有多少条记录呢?走一下又原来看到了他呢,恰好是27条记录。那从这个角度呢,是不是就印证了我们刚才说的这个事儿,什么事儿啊,就是每一个员工我们发现呢,似乎都在每一个部门啊,都干过,那事实上呢,还真是,哎,我们这儿画了一个图啊,可能会更形象一点啊,大家看。比如说呢,我们这个,呃,这个100这个员工他所在的部门呢,是90,实际上我们发现呢,让他是不是给每一个部门都匹配过呀,咱们这儿呢,有107条记录,这儿呢有27条记录,那一共匹配多少条,是不是一乘就是2889条记录啊。没有问题是吧,诶我们这时候呢,就知道哦,是什么原因导致我们这块出错的了,诶每个员工都跟每一个部门呢匹配过,所以呢出错了,我在这写一下。
05:04
每个员工哎,都与每个部门啊匹配了一点。所以呢,出错了。那么我们把这种错误起了个名字。把这种错误呢,我们起了个名字,这是咱们大方向的实现啊,我把这个改一下,哎,把这个实现,把这个错误的方式呢,我们称为呢,叫做出现。啊,笛卡尔。啊,笛卡尔基的这个错误。就是我们什么叫T2接触呢,就是每一个员工和每一个部门呢,都匹配过一遍啊,导致呢,最后出现了这个啊,107乘以27这样一种场景,我们把这种场景就称为呢,叫做笛卡尔机的一个错误。那首先注意笛卡耳机本身不是它跟错误不是说必然联系的啊,就笛耳机呢,它是一种,呃,满足某种运算的话呢,叫做笛卡耳基,是我们这个错误方式呢,诶跟这个笛卡尔基是一样的,那那这块呢,咱们就拉回来,诶给大家拓展一下什么叫笛卡尔基是吧。
06:05
这个笛卡尔基啊,又称为呢,叫交叉连接。哎,又称为呢叫交叉连接,什么意思,你看我我一说大家能明白,比如说有两个集合啊,一个叫X集合,一个叫Y集合,X集合和Y集合,把它们呃,这个在一起搭配的所有可能都列出来,那就称为呢叫笛卡尔集啊,这个还是有点抽象,比如说我现在这个X集合呢,有三个数叫ABC,这个Y集合呢,我有这个两个数,比如说就叫做XY。从这里边呢,挑一个数,从这里边挑个数,让他两两个两两组合,问一共有多少种组合方式,那是不是就是三乘二的组合方式啊,比如说你这个A的话呢,可以跟xa呢,可以跟Y啊,B呢跟XB跟Y。然后C跟X。诶,这个C跟Y是不是就这六种情况,那么这呢就成为呢叫笛卡尔基。或者呢,也可以称为呢,叫交叉连接啊,你不就是他跟他连,他跟他连,他跟他连,他跟连,就是所有的情况都交叉一遍,就叫交叉连接。
07:05
哎,你看我下边还列了一个例子,这是我们这张表呢,两条记录,这是他这两条记录,然后呢,都都匹配一遍是吧。啊,这个A。啊,这这是前面这个表,它跟我们后边这个第一行记录,第二行记录都匹配一下,然后这个BB呢,也是第一行第二行再配一个CC呢,那这块呢,这是有四条,这呢有两条,那四乘二是不是就八条啊啊1234啊,1234啊都匹配一遍。啊,这叫做笛卡尔基的这个情况啊,呃,这个笛卡尔基前面呢,这叫笛卡尔,笛卡尔又是啥呢?它不是一个数学概念,它是一个人名。啊,这个笛卡尔是一个人名,是法国的一个大数学家啊叫笛卡尔,大家以前上学的时候呢,应该应该听说过吧,学这个世界史的时候是吧,法国的大数学家笛卡尔,这个笛卡尔的话呢,因为本身像我本科呢,还是这个就是数学专业的啊对这个人还是比较。
08:01
呃,怎么说呢,崇拜的啊,这个当然数学界呢,有很多的这个大师啊,像高斯啊,高斯这个数于数学王子是吧?呃,而且是高龄的啊,这个笛卡尔的话呢,它有一个比较大的贡献,那大家呢,都听说过,只不过呢,你可能不知道是他发明的啊,叫什么呀,你看我列出来了。这是这是什么呀?是不是坐标系啊,而且呢叫直角坐标系是吧,那我们叫X轴,这叫Y轴,咱们呢,上学的时候我就说这叫这个直角坐标系啊,实际上这个坐标系在国外的话呢,它叫做笛卡尔坐标系,用笛卡尔名字来命名的,是因为它是笛卡尔发明的。诶同学这个有什么了不起啊,不就是一横一竖,这就坐标系吗?诶其实这个里边学问可大了,那像在数学的这个发展史上的话呢,诶,比如说比较早期的话呢,我们有这个代数啊,就是咱们学的这个方程啊,一元二次函数啊,还有这个抛物线啊等等,这都属于这种代数,那我们就通过这个算术的方式上去研究数学,对吧。
09:03
呃,那么当然这个数学呢,一开始来源呢,实际上是基于物理的需求哈,那物理上的话,我们更多的是不是一些实打实存在的东西啊,那相当于是不是都是一些几何的图形,圆形啊,正方形,矩形,后来还有立体的这个图形啊,立体几何对吧?那么几何跟数学呢,本来是两个不同的分支。但是就是由于笛卡尔坐标系的出现,我们把这个几何跟代数呢,给它们能够啊融合在一起了,相当于可以实现几何问题的代数化和代数问题的几何化,比如说我们写一个Y等于X方,这你看似呢,它是一个代数的是吧,一个问题,但是实际上呢,我们在坐标系当中,是不是可以把这个Y等于X方的这样一个。曲线完美的绘制出来啊,那其实就相当于它有了几何上的一个表述,那么同样的,我们假设是一个正方形,那么这个正方形也好,或者我们是一个椭圆也好啊,咱们讲过来解析几何是吧,对吧?呃,那么这个呃图形的话呢,我们在图形上表示完以后,我们就会有相应的坐标,我们就可以使用相应的这个一个呃叫什么一个关系式来去刻画这个几何图形。
10:12
啊,那么就是相当于把几何问题给代数化了,哎,大家高中学的那个解析几何,不就是通过代数的方式呢,去解释这个几何问题嘛。啊,那这就是笛卡尔坐标器是吧,那其实从这个角度上来讲的话呢,呃,这个笛卡尔的话呢,首先它的贡献很大,其次的话呢,大家你想想,一般人能想出这个东西吗。一般人是不是想不出这个东西啊,所以呢,我当时我就在想,这个笛卡尔呢,他绝对不不单单的是一个这个数学家。我这网怎么了?出不来了是吧。百度啊,哎,闲扯两句啊,这个笛卡尔。啊,所以呢,我印证自己观点呢,百度了一下,果真呢,发现他是数学家,仅排名第二位,排名第一位的他是哲学家。
11:02
啊,我觉得我的想法是对的,你想想,如果没有这个很好的这种哲学思想的话呢,谁能够想出这么个问题呢,来解决我们的几何和代数的问题呢?对吧,诶是一个哲学家啊,那在数学这个历史上呢,其实有很多的这个,诶一些数学家,大家有兴趣的话呢,可以去搜索一家,那么这里边儿呢,其实呃,从我的理解上来讲呢,比较可惜的一个人啊,诶是谁呢?是这个叫哎加罗华啊。哎,就是现当于给大家普及一下啊,就是嗯,你可以感兴趣的话去搜一搜这个加罗华呢,或者加罗娃,这是咱们翻译过来的,哎,这个人也是法国的一个数学家啊,很可惜啊很可惜,但是你看他活了多少岁啊。这个21岁是吧,哎,21岁就死了啊,这是他这个后来给他画的一个肖像画啊,嗯,这个伽罗华呢,在数学上的这个贡献呢,是非常大的啊,像我们像大家学的这个,呃,今日代数啊,或者叫抽象代数里边涉及到这个群论啊,加罗华群,呃,其实可以说呢,呃,这个人呢,以一己之力呢,开辟这个新的一个方向。
12:04
啊,新的个方向,然后呢,这个呃,非常早的话呢,这个展现出他这个非常不同一般的这个这个这个叫什么学术的能力哈,然后他把他的这个论文呢,发给像高斯啊,当时这个相当于欧洲的这个数学界的泰斗啊,结果呢,这些人根本都看不懂,就把他这个论文给打回来了啊说写的这都是什么样的东西是吧,然后呢,他后来这个一气之下呢,后来就这个从事政治了啊,然后呢,就是参加革命啊,就干这个去了,然后后来呢,说是这个决斗啊,这个因为一个一个一个女人啊,这个好像跟普希金有点像哈啊,为了一个女人呢去决斗,然后呢就死了,在此前的晚上的话呢,他呃能够预感到自己可能要死了哈,因为太弱小了,他就把他的这个所有的这个叫什么呀,呃,发现还有这个数学的这些东西呢,就写到呃,这个算草纸上了,然后诶交给他的朋友了。在几十年之后啊,人们才发现他的手稿,然后呢,他觉得他这个东西呢,是对的啊,直到今天的话呢,他原来写的有很多东西呢,还有人这个不能够完全的去,这个正确的能够翻译出来啊,这个人是非常伟大的,但是呢,年纪非常小就去世了啊,非常的可惜啊。
13:14
行,这个咱们就闲扯两句啊,再拉回来,那首先呢,明确一点,咱们把这种现象呢,称为叫笛卡尔基的错误啊,但是笛卡耳基本身不是错的啊,啊对这个笛卡尔基的话呢,也没有说非是笛卡尔发明的,呃,还是说呢,是这个叫七木笛卡尔的这个人给命名的,这个我没有找到这样的一个记录啊,呃,总之呢,我们把这个刚才说的这种情况称为笛卡耳,笛卡耳基啊,那我们这里边呢,诶,把它称为出现笛卡尔基的错误,就是本身呢,不应该让每一个员工和每一个部门去匹配的,但是你却这样匹配了啊,所以说呢,我们这是一个错误。啊,笛卡耳机本身没有错啊,好,那么这个错误我们怎么解释呢?就是因为咱们缺少了连接条件。啊,这个我在这写一下这个错误的原因啊。
14:01
哎,缺少了连接的,哎,我们准确的讲就是哎多表的连接条件。OK,就是说我们现在呢,让这两个表去连的时候呢,我们告诉数据库服务器呢,就是你这个字段,这个字段来自于这两个表,你你整去吧,那这个数据库呢,服务器呢就懵了,说那我就给你匹配呗,它默认的话呢,就是用这种匹配方式,咱要迪卡耳机的,或者说呢,是不是叫cross呢?哎,我们说叫交叉连接,这个交叉连接呢,它有一个连接的方式,就叫做cross draw啊,就是交叉连接的方式,也就是说我们这是一种错误的,这呢也是一个错误的啊。哎,就是我这样写,哎哎我这样啊,为了体现呢,他俩的变化,我就原封不动的把它粘过来,在这个位置呢,大家加上一个叫。诶cross哎找诶这样写的啊,然后把这个呢,我们选中之后呢,来一个执行,你看也是1000啊,再来一页还是1000,再来2889啊这个8892889是吧?诶这个呢,也是查询出来这么多条记录,就这俩呢一样。
15:05
啊呃,都是呢,就是缺少连接条件啊,都成为呢叫笛卡尔机的错误。哎,底卡机的错误行,呃,那这个错误呢,我们说呢,原因是因为它缺少连接条件,那么正确的方式呢,是不是就应该加上连接条件啊,哎,我们这里边写一下啊,多表这个,哎,查询的。啊,这个正确的方式,哎,我们呢,就是需要有啊连接。调节啊好,那我们这块呢,还把这个,那我把它CTRLC拿过来。哎,拿过来好,我们在后边呢,去写这个,哎,多表的连接条件在咱们这里边是不是两个表啊,哎,那么我就写哎两个表的。来连接条件。来连接条件好,那么我们得告诉这个数据库服务器说我们去查询这两个表中的各自这个字段,那其中的话呢,咱们要求什么呀,员工表里边的这个什么呀,叫department ID,他需要跟我们,就比如说我们某个员工,他呢是在这个,嗯,20号部门的,你去这里边找,是不是就只找那个20号部门就行了,你别找30是吧,也不找,也也别都找,就找那个20,那个我们刚才说的那个部门就行,在这里边呢,我们就where。
16:20
员工的部门ID需要,诶去等于咱们这个部门表里的。诶,它的这个底盘代这样呢,就是咱们所说的这个编辑条件啊,这个符号呢,咱们前面讲过叫着重号是吧?诶在咱们这里边呢,你可加可不加啊,这个是我刚才自动它给我提示了就加上了,加上就加上了,没关系啊好,那么这样的话呢,连接条件呢,咱们就给它加上了,此时呢,咱们再查询一下。好,大家看这个时候的话呢,是不是就没有那么多条记录了,咱们查询多少条啊,106条记录。哎,有同学说不对吧,老师不是有要啊,这个有印象啊,我们这个表中是不是有107条记录吧,你看我这还写了是吧,那少一条怎么解释呢。
17:04
为什么少了呢?诶大家呢,如果你对咱们前面讲这个查询的时候有点敏感的话呢,可能有个印象啊,咱们这个表里边儿啊,有一个员工啊,他没有部门。你看这呢,咱们是107,大家你看这个底盘麦地就行往下走。哎,178这个人是吧,再往下。就他自己就是没有把这个人给查出来,那么为什么没查出来呢?因为他是一个闹,咱们这个部门表里边儿呢,你哪有一个字段ID是闹的呀,没有吧。没有,所以说呢,我们在找关系的时候呢,说这是个no,这个跟谁去等是不是它结果都不是返回一啊,所以说呢,这个呢,就没有把它查出来。那么有同学想说,那老师我就想查出每个员工所在的部门的这个情况,那那个人得出来呀,哎,这个问题咱们先埋一下,咱们这一章后边呢,讲到外连接的时候,咱们就说这个事儿,或者叫外查询的时候说这个事儿,咱们先忽略掉啊,来忽略掉刚才说的那个人啊。
18:11
行,那么这里呢,咱们就把这个呢,正确的给实现出来了,那就这样来去解决啊,那我们把这种方式呢,就成为多表的一个查询,或者呢,也称为呢,叫做关联的一个查询,因为我们是不是把这个表中跟这个表使用这个字段呢,给关联在一起了,这叫关联查询。啊,两个表或者更多的表一起来完成的查询操作,诶比如说我们这个员工表和部门表呢,就是靠这个部门的ID是吧,进行关联的,行,那么这呢,咱们就把这个哎小问题呢给解决了。行,这呢就是我们提到了,诶比较简单,由一个案例呢,引发出来的叫多表的查询。那咱们接着说,咱们刚才呢,有一个多表查询的一个情况呢,引出了这个笛卡耳机的错误啊,然后呢,咱们还把这个多表连接条件加上之后,解决了这个笛卡机的错误,来咱们看下这个课件,课件里边呢,这块提到说笛卡机的错误呢,在哪些情况下呢会产生呢?来大家看一看,第一个说省略多个表的连接条件啊,像咱们刚才呢,就是典型的没有加那个where是吧?好,下一个呢,说连接条件无效。
19:19
啊,这个相当于你写了一个不对的连接条件,那跟没写其实一样吗?那下一个呢,就是所有表中的所有行呢,互相连接了,那我们没写连接条件呢,实现的效果不就是它吗?哎,所以这块呢,其实本质上来讲说的是一个就是你这个连接条件呢,没起作用。啊,连接条件没起作用,那为了避免出现问题呢,咱们在这个V2当中啊,加入这个连接条件啊就可以了,行,那么基于咱们刚才讲这个问题呢,咱们再深入的去谈一谈。好,再深入的去谈一谈,那我们相当于在,哎多做一个题目是吧,大家看我们现在查询的呢,是不是说这个表中的这两个字段是吧?哎,查询这个表中的这两个字段,那么结合着这个呢,咱们再往里边去这个延伸啊,谈一下更深入的一些问题,这两个字段之外呢,大家看我现在呢,加入一个字段叫做department ID。
20:10
我们想查询一下部门的ID号,不过分吧?好,那大家说呢,这没毛病,来查旗一执行错了。挂了是吧,说诶,Column department in field list在我们这个字段的列表当中啊,Is ambiguous。啊,Ambiguous这个单词呢,不知道大家不知道大家熟不熟不熟悉啊,是不是叫不明确的呀。不明确的,就是说你这个字段到底来自于哪一张表是不确定的。什么意思呀?为什么我们写这两个字段就没问题,因为我们这个两个字段啊,他也好,或者是他也好,是不是他们只存在于这张表或者是这张表啊。而我们这个底盘ID呢,是不是既在这张表又在这张表,所以说呢,就会出现了,说不知道你我该去哪个表里边儿去找是吧?诶所以呢,就出现这样的问题了,那怎么解决呀,那你得告诉我们的数据库服务器呢,说你应该从哪个表里边去找啊,大家想说你这俩都相等了,那你从哪个不都行吗?啊对于这道问题来讲,确实如此是吧?比如我们这个位置呢,就写这个,呃,员工表的这个。
21:18
呃,底盘卖地啊,或者你写了部门表的底盘卖其实都行是吧,好我们选中走一下。你看是不是就正确了,还是106条记录。啊,100条记录没问题是吧,那这块呢,我们想给大家强调的这个点,我就写个四啊,大家你注意听说如果查询语句中出现了多个表中。哎,都存在的,这个字段则必须指明。哎,此字段。啊,所在的这个表。哎,这呢,我说的是这个字段是必须要指明的,那么这两个字段呃,是不是就可以不指明了呢?咱们通过运行结果来看呢,确实是可以不指明的了,是吧?哎,但是那我又要说但是了啊,我们这有个建议。
22:07
建议什么呀,从这个叫SQL优化的角度啊,建议啊这个查询啊,建议这个多表查询时。啊,建议多表查询的每个字段钱。字段前或者叫列前是吧,都指明其所在的。表。建议在坐表长期时,每个字段前都是名企所在的表,那也就是说这两个字段呢,建议大家呢,你也加上,比如我们这个呢,是不是来自于叫诶叫员工表中的员工ID和后边这叫部门表中的这个部门的个名字是吧?哎就是这个意思,哎你看我们选中这个执行一下。那结果还是对的,你看这个执行花的这个时间呢,是0SECOND0秒,因为咱这个表中的数据啊,一个呢是实在是太少了,第二的话呢,就是咱们呃,也没有通过这种远程连接去体现,就是本地连本地啊,所以这个连接的这个时间呢,也给省了,所以你看到这个速度非常快,就是以至于呢,咱们也看不出来就是加跟不加的这个区别了,那但是呢,大家应该能理解这个事儿啊,理解这个事儿,你想想我们这个要查询这两个字段,如果说咱们要没有指明是哪张表的话呢,相当于呢,他会去找,诶这张表里边有没有,那个表里边有没有,诶找的话呢,实际上得花点时间。
23:24
啊,包括呢,找完之后呢,他得看另外一个表里是不是也有一样的,像我们这个字段在员工表里边找到了,但是另外一个表中也找到了,他就会说叫MB格斯,当我们要是指明来自于哪个表的话呢,是不是直接就去这个表中找这个字段,就会避免出现刚才出现的那个错误了,是吧。诶这个呢,就是我们想强调的点,就是大家在开发当中的时候呢,建议你加上这样呢,就不会使得数据库服务器呢,去各个表中去找这个字段了啊,省去了这个时间,所以它是一个优化啊一个优化。行,那我后边呢,我在写咱们这个多表查询的时候呢,有可能我就呃把这个给这个,呃没注意啊,我可能就有时候就没有写来自于哪个表了,大家知道的意思,大家在写的时候呢,可以尽量的规范一下是吧?哎,记得都加上就可以了啊好,这呢是我们强调的这个问题啊,尤其是这个,哎,多个表共有的字段的话呢,一定要加上它。
24:16
啊,一定要加上来自于那个表,好,这个说完之后呢,我们再说这个,呃,下一个第五个问题哈,那基于咱们刚才说的这个问题展开的,我得把它拿过来,大家会发现呢,我们现在的这个思后一句呢,你看一页长得特别长啊,在这里边儿呢,出现了这个呃,Employees,其实我们下边这块,你看where当中是不是也出现了呀,导致呢,就是这两个表的这个名字啊,出现的位置特别多,那我们这表面要是特别长的话呢,整个这个circle,你会发现它的可读性呢,就差了。对吧,可读性就差了,那怎么办呀,哎,我们这时候呢,需要说一下就是呃,可以给表。来起别名。哎,可以给表起别名,然后呢,呃,在咱们的这个select。
25:02
和啊像看select和咱们这个where中。和。嗯,Where where1是吧,哎中啊,使用咱们这个表的别名。诶好,那怎么起别名啊,类似于咱们前面讲的这个,给这个字段起别名啊,直接用空格的方式对吧,所以我们就可以在这个位置啊,这个表呢,我们就比如说叫这个,哎哎,咱们叫emp吧,然后后边这表呢,我叫哎dept。诶,这是这个起的这个别名啊,起的这别名,那有的这个,呃,一些公司的规范当中,像这些大控司的通常都有一些规范,他有时候会建议说你第一个表你就要提一,你第二表你就要提二就完了啊也有这样的一些要求啊,都可以啊呃,有的时候呢,你就起一个这样的一个别别称,就一看是他的缩写也行,好,那这个起完别名以后,这块呢,来我们CTRLC一下,咱们就可以把这个呢,是不是诶改一下啊,诶就是原来呢,用这个表的全名的地方,我们都可以改成它的一个别名了。
26:03
哎,可以在select当中和这个where当中去使用好,我改完了,然后呢,我们再去做一个执行,你看是一样的。哎,是一样的,这个就没有问题,那就这样来写好,那么以后的话呢,大家在实现这个多表查询的时候呢,你就可以给这个表呢,起上这个别名了啊。好,我再说一句,那写上边名呢,刚才做的是对的,那我们如果有的同学呢,在刚才写的时候呢,你看比如说这个位置呢,就没有使用这个表的别名是吧,没有用。没有使用这边的话呢,你看我们这时候按说呢。是不是得是对的呀,但是呢,发现报错了。诶发现报错了,就是呃,咱们这儿呢,没有在where中去用这个表的别名,而是呢,用的它的原名,你看它这不行,我再去演示哈,这是一个,那我们把这个这个位置咱也改成他的一个,呃全名,那这样行不行?哎,我找一下那也不行。啊,大家理解我要说的事吧,就是说呢,呃,我刚才其实在写这时候我犹豫了一下哈,哎,我想,哎,那咱们还是分成两条来说吧,就是一方面呢,说你起了别名之后呢,可以在select select和where中呢去使用,那另外一方面呢,就是你起了别名以后呢,哎,在select和where中如果出现你这个表名呢,还真必须得用别名啊,这是我们要说的这个事儿。
27:22
啊,如果给表起了别名。啊,一旦。在咱们这个select或这个where中。来使用的话。啊,使用这个表的表明的话,哎则啊必须就使用。这个表的别名。呃,使用这个哎表的这个别名而。那不能在。那使用咱们这个表名啊,表的这个原名啊,那这要注意一下。这个凭啥呢?还是那个意思啊,咱们from的from的时候呢,我先呢,就是咱们这个搜ho局,它有一个执行的一个顺序是吧,它先是执行的这个叫from啊,我先from的话呢,就挑出这两个表来,但是你这块起了别名了,相当于我们就拿这个别名呢,覆盖了你原有的这个表名了,一旦覆盖之后的话呢,你在外二中,外二中完了以后,下边有没有这个order by啊什么的是吧?外二完了以后呢,紧跟着是不是有这个select呀,那么在之后使用这个表明的时候呢,因为它数据库服务器已经拿别名覆盖了你原表的名字了,他就只认这个表的别名。
28:34
啊,所以说你在用的时候呢,你就不要再出现这个表的别名了,那一旦出现之后呢,它就报错了。啊,这个我们在这写一下啊,如下的操作。该是这个错误的是吧,哎,一个是这个位置错了,另外呢,就是我们要是把这个别名放,哎,这个表名放在这儿,这儿也是错的。啊,小心一点。小心一点啊好,但是你看我们现在呢,是上边的错,它在这个说说你上面name这块,我要把这个选中呢,呃,这块呢,其实上边有个错,这有个错是吧,哎,我把它选中呢,都执行。
29:06
哎,你看这是不是还是报这个错误,他这块呢,就显示这一个了,就啊行,你把这个改完之后呢,这块他还会报啊行这呢就是我们说的这个情况啊,这个情况大家需要去关注一下。那这个问题说完之后呢,咱们再看这个下一个点啊,层层的深入进去,那我们这块呢,看到了这个员工和部门表,问题解决之后呢,我们再引入一个表,叫做locations表,那现在呢,我们就可以做一个这个练习。哎,这个练习呢,就是查询,哎,我们说叫员工的啊,这个employee。ID啊,还有他的last name,还有他的department name,再加上他的city。啊1234这四个字段是吧?好,那我们查询的话呢,那首先呢,就直接啊select看后边呢,是不是就我们这四个字段啊啊CTRLC啊转过来接着呢,From我们需要看一下这四个字段分别来自于哪张表,这两张字段呢?哎,这两个字段来自于这个叫employees表逗号一下,然后这个字段呢,来自于咱们的depart。
30:13
Main表,嗯。然后呢,这个city字段呢,是不是说它只在于我们这个location表里啊,所以我们这块呢,还得加一个叫locations是吧?哎,那你想想,为了我们下边方便的话呢,咱们就起别名吧,这叫E,这叫D啊,这个呢叫L,那以后呢,大家做这个多把查询的时候呢,你就别犹豫了,因为我们在起来中也好,在VR中也好,肯定是需要用到这个别名的,呃,需要用到这个表名的,那你就直接呢,就把别名在在后边定义的时候呢,就以后就都直接写上就完了啊,然后Y2的时候呢,你想想。我们现在呢,有三个表,大家注意,你说我现在这个连接条件怎么写啊。是不是这仨表就跟三个人一样,这三个人呢,是不是他们相互之间得能够诶拉起手来,比如说你这俩拉下手,这俩拉下手是吧,或者的话呢,就是这俩拉下手,这俩拉下手,保证他们三者之间呢,是不是得能够关联起来呀。
31:02
哎,没问题,像有一些这种,呃国际上或者咱们国内也有一些啊,呃所谓的那样一些什么什么什么协会什么什么组织一样,说这个组织的话呢,诶就是你要想进来必须呢,得让这个呃协会里边这个人呢,诶这个呃介绍啊给你拉进来才行,也就是说呢,你进来的这个人呢,一定得跟这个组织当中呢,至少一个人呢是认识的啊,他才能够拉你进来,你要谁也不认识你,你就进不来。啊,有好多这种神秘的这种组织是吧?好,那这个呢,也是一样,那我们现在两张表,这俩拉起手来了,现在你又来了个表,说你你也让我进来呗,那你至少呢,要么跟这个表连,要么是跟这个表连好,那就意味着你看我们现在呢,首先呢,让他俩联系起来,我们就是员工的是不是department ID跟我们这个部门的department ID呢,是诶相等的是吧。并且啊,现在你要不连的话呢,这哥们儿还在外边游荡着呢啊呃,这两个表呢,哎,这个表呢,也得连起来,我们发现是不是它可以跟我们的部门表它俩字段呢,是不是关联在一起啊。
32:04
没问题的好,我们这块就这样写,这个and是一个企业的关系,这个部门的叫location ID,和咱们这个locations表的这个location ID呢,它哥俩呢连一起。诶,他哥俩练一起行,那写完之后的话呢,再回过去看我们这个表,这个你别着急呢,就直接运行了,你看一下这个时候呢,我们还得需要保证上面咱们不是出过这个问题吗。嗯,在哪这个是吧,出过这个问题,就是我们看一下你这几个字段是不是只是唯一存在于咱们说各自的表啊,其实呢,发现呢,确实如此是吧,那我们这块呢,一执行,哎,其实就出来了。啊,1000那条那条记录是吧,就出来了,呃,那么呃,如果呢,我们如果说你要出现又查询像啥叫department。这个ID是吧,或者叫location,这个ID要出现这俩字段的话呢,我们要执行是不是就错了。因为呢,他们不只是存在于某一张表了啊,所以它就错了,所以呢,不管说有没有这俩字段的话,咱们都建议大家呢,是不是在前面呢,都把这个字段都加上是吧?哎,来自于哪个表都加上。
33:11
那这个是D点的。那这个呢,是我们L点的是吧?诶然后后边这块呢,诶你你可以去选择是L的也行。啊,这个也是L的是吧,诶这个这个不对了,这个呢是部门的或者员工的是吧?哎,你得给他加上才可以,哎,走一下。啊,跟刚才一样,行,这呢就是我们说的这个题目,通过这个题目呢,我们想强调一个问题是什么呢?就是呃,如果。哎,如果,哎,大家看啊,如果有N个表。啊实现啊多表的查询。那么我问咱们得需要几个连接条件啊?哎,是不是则需要。哎,你看我们有需要啊,咱们有两个表的话呢,需要有一个连接条件,三个表的话呢,是不是得有俩啊,那现在有N个表呢,是不是需要有N。
34:00
An减一个。哎,连接条件对吧。哎,就是这个意思。得有N减一个,那么这里边儿呢,N减一啊,我还想再进一步刻画,是至少有N减一,还是至多有N减一。是至少还是至多呀。哎,那大家呢,反应快的应该能知道了,那肯定是要写也得写个至少,为啥呀,如果你要是至多有N减一的,那至多减一,那我是不是可以有零个连接条件极限的嘛,那要零个的话,那不就成低卡尔基错误了。啊,咱们说有N减一,那其实就说得至少那什么意思啊,就比如说我们这仨表的话,哎,这哥俩连起来了啊,这哥俩起来,那有可能他俩还连呢,他俩一连,这是不是三个表就三个连接条件是吧,那两个表可不可以呢?还真可以,你看我这里边设计的这些表啊,还是非常完美的啊,但是你看我们这是员工表里边有一个部门ID,跟这个部门ID呢,他哥俩呢就联系起了。同时的话呢,我们这儿还有一个呢,叫manager ID,诶跟这个manager ID呢,它俩其实也可以关联。
35:04
如果我们要是两张表,是不是我们就可以有两个连接条件呀,那两个表至少有一个连接条件,咱们这块呢,是不是也可以有俩,所以这块呢,加一个至少是吧,哎,这个呢是正确的啊,这个我们写成这是一个结论啊,大家把这个结论呢,需要记一下。你记住这个结论的话呢,以后咱们在这个创建表的做个表连接的时候呢,诶你心里边有数,至少得N减一个啊,你要是少于减一个的话呢,肯定是不是肯定会出现笛卡尔级的错误呀。毫无疑问是吧,毫无疑问啊行,那这呢,就是我们把这个多宝的这个,哎,查询这块呢,咱们就还先说清楚了啊。
我来说两句