00:01
好,第三章。第三章。今天呢?呃,不简单。今天的内容并不简单,因为它是查询的一个升级版本。昨上节课咱们一整天都在学习查询是吧?S flag flag又分组又模糊啊,今天一整天呢,还是查询。还是查询。哎,增删改查四个操作,增删改前三个操作咱们用了几十分钟搞定了。而这个查询呢,用了两天的时间是吧。今天的主要内容呢,其实就这三块。子查询表连接和数据完整性。好,回顾一下,看这个语法有没有什么问题。这个这个问题啊,是语法上啊,你不要看这个单词啊,因为这个单词没有办法判定正不正确是吧,怎么着all way,哎。Order by和where子句的次序错误,记住了,只要有order by,我不管你写的多么的复杂。
01:05
Out by永远在语句的后边。对吧,永远。好,看第二个问题,这个查什么?就看这个模糊的条件嘛。这个匹配的是什么呀?六开头的是吧。而前面加了一个什么not,所以查的是什么。不是六开头的是吧,哎,不是六开头的,不是六开头的。聚合函数这个啥,行数,个数条数是不是都是它呀,就是查表中有多少条数据是吧。这个嘞。这叫求和,求和对吧,求和。好,最后一个结果是什么?年龄在50~20岁之间是吧?这个语句。呃,用Java的话说来说的话。
02:01
编译通过,但是没结果。这就是咱们回顾一下啊。文章目标看好了。今天的内容真的很难啊,很难。子查询。表连接。分页查询。日期类型的一个操作,接下来内容应该是咱们这个数据库里边最难的一天。最难的一天。嗯。往后就简单了啊。好,首先看一下啊,什么是子查询。看这个,他说要求编写一个SQL语句,查询年龄比崔金生要小的学生。比崔医生要小的学生。怎么来查呢?下边已经告诉你思路了,你想知道崔先生比他小的,你是不得知道他多大呀?所以第一步啊,应该查找崔新生的出生日期,然后用where条件筛选出出生日期比崔新生大的同学。
03:05
还有同学说,哎,大小怎么回事?这个我这个说的出生日期是大的意思,是不是就是数值上大呀。九零年。大于87年九零是不是。大于八七呀,但是如果是年龄的话,是不是反过来呀。所以这个小和大你别搞混了啊,不要搞混好吧。好,那首先啊,咱们就按照他这个步骤来啊,先找崔金生的出生日期。咱们直接动手写。查询。星from原,呃,这个这个这个学生表,条件是学生的名字等于。崔金生。签名。这这名一般人降不住的话。
04:03
单词写错了哈,一般他报这种错误哈。叫什么标识符无效?他一般都会蹦到这个这个这个地儿。所以注意这个就是。填写错误是吧?哎,懒得看了,直接重写一遍,多快呀。OK,这个是崔金生的,是不是星啊?代表全部信息吧,而我要的是什么呀?出生日期就够了吧。所以我变星,我要不。State。好了,那么有点像那个Java中的哈,整个这个语句最终的返回值是不是就是一个生日啊。OKOK啊,好了,这是第一步,咱完成了。咱们来看第二步要干嘛?第二步的话,他说用where语句筛选出生日期,比直接上大的同学。OK。看到啊,我把崔金生的这个值啊,我给他copy过来。
05:03
这是崔先生的生日,好,我要找比他小的了。学生斯维尔不。That超过。这个是。一只行。哎,什么毛病?啥来着,你看啊,哎,再来一遍,再来一遍,看这个错哈。他说文字和字,文字与各式字符串不匹配,这个问题说的就是你不date啥类型啊?日期是吧,他是日期啊,咱来瞅一眼啊。它是日期类型。哪去了?找到表表这个这个这个student。看这个列。不带。OK,什么类型?日期类型吧,哎,它是日期类型啊。好,如果它是日期类型的话,大家看你前边用的是日期,后边用字符串。
06:05
两个无法做比较啊。所以咱们应该咋办嘞?是不是学过了一个函数啊,叫to date,干嘛使的?将字符串转成日期呀。YYYYYY等于三四个MMDD是吧?这样的话,他是不是有日期,它也是日期,应该可以做比较了吧。走,你。看对不对啊。崔先生九一年的这儿呢,啊,来看看金蝶,他是九一年的。没问题吧,九一年是不是比九零年要小啊?对吧,好,你看这个第二个呢,哎,九零年都九零年的,但是你的生日是多少,1月5号,然后我的生日多少。2月7号我这边仍然比你小啊啊,所以剩下的你就不用看了。
07:01
那肯定比他小是吧?肯定比他小。好了,那么这个咱们这个语句,第二通过两个的circle语句,是不是咱们把这个结果查出来了。通过了两条,OK。往后看啊。实现方法刚才咱们都写过了,写过了就是这么写的。OK。然后呢,第二种方案,咱们刚才用的第一种方案是两条circle,那么有第二种方案使用子查询。子查询OK,用子查询应该怎么做呢?你会发现。加了个括号,把他俩合成一个整体了是吧。看好了啊,你先等会儿回头看他看,我怎么给他改成紫查询呢?看清了啊。我把这两个copy一遍,不用copy了,书上有这个四口语句是吧,一模一样的啊,大家看我上面这个四口语句。
08:01
整个查询的结果是不是就是咱们要的生日啊?我看。而下边这个SQ语句,你比较的后边要的这个参数是不是正好就是上边这个值啊。所以利用咱们上学时的等价代换看好了啊,后边我需要用到崔金生的生日。然而你这条语句就是崔先生的生日,所以咋办嘞,把它剪切过来放在这儿。怎么放,注意了,你不能直接放,应该用小括号包起来,然后我这个回个车啊,因为格式好看一些,把语句放在这。看清了。其实整个后边这个就是。那个生日吧。只不过用了等价代换的一个原理,把它替换了过来。
09:00
这样呢,一句两句合成了一个整体,在一执行。OK,没有任何问题。没有任何问题。所以这样的查询就叫子查询。啊,说白了子查询,什么叫子查询呢?OK子查询。其实就是查询。套查询是吧。是不是查询里边套一个有点类似于咱们的。负循环里边再套个负循环是吧。OK,这就叫紫杀菌。那对于这样的语句来说,咱们来回头看一下PPT。他是这个。里边的这层啊,里边的这层咱们称之为叫子查询,而外边儿这层称之为叫父查询。负差距。哎,这是他们两个之间给他合成二合一版本。那下面这句话一定要记住。这个可能也是一条考试或者说面试题哈。
10:02
帮助以后大家写查询啊,必须要知道的。他这个两个查询他先执行谁。并不是说自上而下先碰到它就执行它,不是啊。子查询先执行里边的。比如说先执行这个。然后把这个语句最终是不是得到一个变量是吧,或者说一个值,然后拿到这个值再执行负查询。OK,仙子。后附啊,一定要记住子查询的查询顺序,先子后附好,这就是子查询往后来看。咱们来应用一下子查询啊,来他说查询Java SE这个课程等于100分的学生信息,来看看他要的是什么,对吧。首先呢,咱们来看这个这个查询啊,涉及到了三张表。你看啊,我要找考100分的同学,那首先是不是这个列应该等于100啊。
11:00
对吧。然后又来条件了,说你等于100分还不行,你必须是Java SE这门课等于100分了。所以又限定了一个条件,是不是Java SE啊?那Java SE跟这两张表有什么关联呢?看啊。这个加入SE,它的科目ID是一,而在咱们这个查询分数的时候,应用的就是用科目ID是吧。这个一表示的就是加入SSE都是SESE,而这个二呢,表示的是A。OK。所以是这样的。然后这样的话呢,通过这两张表,咱们来完成了一件什么事呢?查询就是Java SE考试100分的信息,但是我要的是什么,我要的是学生的信息,学生信息包含。这个姓名电话地址对吧。
12:01
所以这个查询经过的是三条三个表啊。来,咱们来写一遍。看看这个怎么写的。好,看我的啊,查询成绩。Result表。查询成绩好什么成绩啊,是100分的条件为。学生的结果成绩是吧,等于100的。我天呐,100的可不少哈。是不少。哎,所以呢,咱们再加一个条件叫Java SE,诶那我怎么我知道这个课程名,但是我不知道加va SE代表的是1284还是三呀,是不知道啊,所以咱们得去查一下。Java SE这门课的课程编号吧。所以我要查询。Java SE的课程编号。
13:02
那么就在课程表里。条件先别写条件,让大家瞅一眼先。对吧,我要根据这个名查询这个值。对吧。来。条件为,科目的名称是Java SE。哎,加C。根据科目查询出我这个科目的编号是不是一呀,然后我下边这个查询100分,后边我就能再加条件了。并且科目ID是不是等于一啊。OK,再去执行,是不是就这条数据了。这就是Java SE考100分的信息了,然而我要知道它叫什么。怎么知道他叫什么呀?查询学生表。先别写条件一直行,我想知道它叫什么,那么学号是唯一的,正好用这个值求吧,所以条件是。
14:05
学号等于。一个值。那学校等于什么呢?你上边查询出。第一科,第一科100分来执行。他是不是得到一个序号了。OK,那把这个学号一复制过来是不是就行了?哎,这样的。好,最后再一执行,咱们的结果就出来了,就是它。就是这个哥们儿,他呢,第一科考了100分。这就是咱们最重要的这个结果了。对吧,但是现在咱们使查询的这个结果啊,是用了三条语句。一句一句查出来的。类似于咱们写,原先写数学的时候,第一步第二步,第三步是吧,已知条件设未知数X,它这个步骤很清晰,但是咱们不要这样啊,不是这样的,咱目的是把这三句话搞成一个结果。
15:03
就是一条搞定。好。等价再换呗。对吧。省下再换。首先等下再换的时候,你看清啊,这里边儿的已知条件是什么。已知条件只有两个值,一个是加入SE,一个是100分吧。所以第一条语句没毛病。没毛病,它就是用的已知条件求出来的一个值。单是来看第二个。第二个语句执行的时候,这里边儿有已知,这个是已知条件。对吧,这个是什么呀。这个你不知道哪来的吧。啊,这个应该是上一句来的吧,好,有同学说,那么按照咱们刚才的写法,我可以把上一句。放到这儿啊,把上一句放到这儿看好了啊,看好了我怎么放的。把它删掉。看到了吗?用一个括号包起来,我这个加括号回车的目的就是格式。
16:03
好,把上一个语句直接粘下来边来。二合一了吧。那你再看这个语句。再看这个语句,已知条件是不是就是咱们提供的100个加入SE啊。好了,执行报错。他说值过多啥意思嘞,因为你看啊,我拿ID我要等于一或者二或者三对吧。而你这个里边得到的是个什么结果啊。是不是得到是一个星啊。好,你在执行里边看这个。就是说我这个位置应该要一个数字一就行了,就一个一,啥都不需要,就一个一,而你下面这个语句查出什么鬼,这是阐出几个值啊。四个值吧,而我其实要的目的是不是就是这个玩意儿?所以里边这个紫查询不需要星应该是什么呀。
17:02
OK,这样的话,你看我要的就是它,你正好往这一拼,咱俩就完美了。参与的是不是就是第一科100分的学号了?OK。那么整个这个语句,其实这个子查询就是为最终的这句话做准备,因为最终的这句话我要的是是不是一个序号啊。要的是这个学号。要的是学号。而你这个语句中有没有学号?是不是查出来了?但是我要的是一个学号就够了,而你上面这个查询查出几个值。是不是有好几个呀。所以把这个星改为什么?学号。改为学号。再一执行。是不是就学号了,好了,完美接下来的过程就是把它把它就当成学号。
18:00
放在哪儿?放在这儿。格式格式,这是一个三层的嵌套。好,最后一次行,完美。要的就是结果。要的就是这个结果。好,看结果怎么把这个写出来了吧,一步一步进行分析是吧,一步一步分析。
我来说两句