当前课程知识点:数据库技术应用 > 学习情境三、银行存取款机数据操纵 > 模块4、银行存取款机子查询 > 3.4子查询
大家好
欢迎来到数据库技术应用在线开放课程
今天我们要完成的任务是BankDB数据库子查询
在子查询当中
我们分成三个子任务
查询交易信息低于五百元的客户编号
第二查询余额不足两千元的客户姓名
第三查看银行卡表
如果不存在挂失的银行卡
则显示所有银行卡的卡号和余额
对于这三个子任务来说
可能有的同学在想
能不能用之前我们学的连接查询能做呢
我们的连接查询也可以实现部分功能
但是从逻辑上来讲
用嵌套子查询来做它的逻辑性更强
才是效果更好一些
所以今天我们来共同学习一下
怎么通过子查询来完成相应的三个子任务
所以本节课的目标呢
就是要求大家掌握子查询的方法
我们一起进入知识技能的学习
首先我们来看比较子查询
子查询的结果不止一个
而且父查询和子查询之间
又需要用比较运算符进行连接
这时候需要在子查询前面
再加上all 或者any那这样的谓词
这里面提到了父查询
提到了子查询
他是一种父子嵌套关系
那在执行的时候
我们是先执行子查询
然后再执行父查询
那如果用谓词连接的话
any谓词会使用指定的比较运算符
将一个表达式的值或者列值
与子查询返回值当中的每一个进行比较
只要有一次比较结果为真
那么整个表达式的结果就为真
否则为假
那你用到all谓词的时候
会使用指定的比较运算符
将一个表达式的值与或列值
与子查询返回值当中的每一个进行比较
只有当所有的比较结果都为真的时候
整个表达式的值才为真
否则为否
所以any和all说
一个是只要一个就可以
第二个是必须全部满足才可以
那么在子查询当中
还有一个连接词是in
也可以连接父查询和子查询
父查询与子查询之间用in或者not in来连接
判断的是某个属性列的值是否在子查询
查找的集合当中
跟我们前面所用的in括号集合里是一个道理
只不过说这个括号的集合变成了一个子查询
第三个连接词是exist
他也可以连接父查询和子查询
子查询前面如果加上exist或者是not exist运算符
exist运算符和后面的子查询就构成了exist表达式
如果子查询找到满足条件的数据行
那么exist表达式返回的就是真
否则就是假
也就是说
在用exist进行连接的时候
其实验证的就是存在与否
那我们来看第一个子任务
在实施第一个子任务的时候
我们来仔细读下题
查询交易信息低于五百元的客户编号在里面
这个问题虽然说很短
但是他比较复杂
交易信息低于五百元的客户编号
那么一定用到了一个表叫transinfo交易信息表
在交易信息表里面
我们完全可以实现transMoney让她小于500
也就是交易信息低于五百元的
但是这样做完之后
你能查到的只是transinfo表当中的各个字段
但是在众多的transinfo表单当中输入字段当中
并没有一个叫客户编号的字段
但是我们能找到一个字段叫cardID
而且这个cardID貌似和我们的客户编号还有一些联系
所以我的第一步操作
先查询交易信息低于五百元的银行卡号
用到的方法就是
select cardID from transinfo where transMoney小于五百
那接下来我拿着满足条件的银行卡号
再去找对应的客户
编号的时候大家可以想象一下
又有银行卡号
又有客户编号
我们可以用到哪个表呢
我们可以用到cardinfo表
也就是我们的银行卡信息表
在银行卡信息表
我只要写一条语句
select客户编号
customerID from cardinfo where cardID就是银行卡号
正好等于刚刚你查询出来的低于五百元的银行卡号
那这个结果不就出来了吗
但是低于五百元的银行卡号
我也不知道都是什么
所以这个时候我们把cardID等于这个位置就可以
用我们刚才说的
select cardID from transinfo where trnasmoney小于五百
这样一个子查询来代替了
那当你用这个子查询来代替的时候
那外面这个求客户编号的就变成了父查询
里面这个求银行卡号的就变成了子查询
把他俩合在一起就变成了我们的嵌套子查询
在这个嵌套子查询当中
我需要有一个连接父子关系的一个谓词
也就是说父查询当中
where cardID等于一个什么样的谓词
然后是子查询
那我们需要分析一下
刚刚我们第一步做的查询交易信息低于五百元的银行卡号
是能查出了一条记录呢还是可能有多条记录
大家都知道可能是有多条记录的对吧
那不管是一条还是多条
我们要在对应的找他对应的客户编号的时候
只要是有是不是就应该出现客户编号
那我们想想
刚才两个谓词一个any一个all
any只满足一个就为真
all是都满足才为真
所以这时候我们就用到了any
只要有一个满足低于五百元的
就把他的客户编号显示出来
所以整个代码就变成了大家屏幕上看到的这样
一个嵌套子查询的代码
大家下去可以在我们的环境当中验证一下
接下来我们来看第二个子任务
查询余额不足两千元的客户姓名
这个子任务同样跟刚才的子任务也一样
看起来题目很短
但是我们分析一下啊
余额不足两千元的客户姓名
首先查询余额不足两千元的
我们应该在哪一个表当中来查呢
余额在cardinfo银行卡信息表当中是有的
那么我可以通过where balance小于两千
得到相应的银行卡信息表当中的数据
那么银行卡当中的数据我用哪一条呢
最后落脚点是姓名
那大家想姓名紧跟的的或者说跟姓名关系最近的
当然是我们的客户编号了
所以这个问题我先查出来
select customerID from cardinfo where balance 小于两千
先拿着余额不足两千的去找到
找到他的客户编号
然后我再拿着客户编号
对应他有哪些名字
那我拿着客户编号去哪个表里对应
去我们的客户信息表里也就是userinfo
所以父查询变成了什么
Select customername from userinfo where customerID
和我们刚才子查询有什么关系
是用等号 还是用in还是用exist
换句话来说
我们刚才查询出来的不足两千元的客户编号
是一个还是多个
可能有多个对吧
那就是123罗列起来
是不是像一个集合
那如果像一个集合的话
我们在父查询和子查询连接的时候
完全就可以用in来进行连接
所以我们整个子任务二实现的代码就变成了
select customername from userinfo where customerID in 括号
子查询select customerID from cardinfo where balance小一两千
所以要想完成嵌套子查询
大家需要有个很清楚的逻辑关系
我先做什么后做什么
先做的放在子查询里
后做的放在父查询当中
那么子查询和父查询
还要去寻找一种连接方式
是用我们的比较运算符还是用in还是用exist
还是用他们的相反的一种方式not来实现
这样的话子查询就做完了
也就是我们的第二个子任务我就完成了
大家下去可以验证一下
接下来我们看第三个子任务
查看银行卡表
如果不存在挂失的银行卡
则显示所有银行卡的卡号和余额
这个问题对于大家来说可能稍微有些陌生
因为这里面涉及到了一个挂失的问题
那么大家可以仔细想一下
在我们哪个表里有是否挂失这个字段
一共就三个表
cardinfo userinfo和我们的transinfo
那很显然
在cardinfo当中是有一个字段
叫isrepostlose这样一个是否挂失的一个字段的
那如果我把条件设置成它等于yes
那就是挂失了
那么在挂失的这些数据当中
我就可以找到相应的满足条件的行
那有了这些数据
大家看题目查看银行表
如果不存在挂失的银行卡
则显示所有银行卡的卡号和余额
换句话来说
他想要的是另外一种情况
不是挂失的
不存在挂失的
那怎么办呢
我们就可以用到我们刚才的知识储备
有一个叫什么not exist
not exist
那这样的话
我把刚才做的第一步也就是查询是否有挂失的银行卡
作为一个子查询
然后父查询呢select cardID balance也就是
客户让我们查的卡号和余额
from哪个表呢
既有卡号又有余额
那么from是cardinfo表
where条件就是not exist子查询
那么得到的结果就是不存在挂失的银行卡
就把他所有的银行卡的卡号和余额显示出来了
大家可以看一下我们具体的代码
然后下去之后
在我们的mysql环境当中去测试一下
好今天的任务已经完成了
我们的拓展任务是员工管理数据库的子查询
那么在做子查询的时候
大家要注意那几个连接词
感谢大家的聆听
-模块1、数据库的基础知识
--数据库的基础知识
-模块2、MYSQL介绍与安装
--MYSQL介绍与安装
-模块3、银行存取款机数据库的创建与维护
--银行存取款机数据库的创建与维护
-模块4、银行存取款机数据库的设计
--银行存取款机数据库的设计
-模块1、表的创建
--2.1表的创建
--表的创建
-模块2、表的管理
--2.2表的管理
--表的管理
-模块3、索引
--2.3索引
--索引
-实践小课堂:宠物电商管理平台数据库和表的创建
-模块1、银行存取款机数据插入、修改和删除
--银行存取款机数据插入、修改和删除
-模块2、银行存取款机简单查询
--银行存取款机简单查询和统计查询
-模块3、银行存取款机连接查询
--3.3连接查询
--银行存取款机连接查询
-模块4、银行存取款机子查询
--3.4子查询
--银行存取款机子查询
-模块5、银行存取款机分类汇总与排序
--银行存取款机分类汇总与排序
-模块6、银行存取款机视图
--银行存取款机视图
-模块1、银行存取款机存储过程
--4.1.2事务
--银行存取款机存储过程
-模块2、银行存取款机触发器
--银行存取款机触发器
-模块1、MYSQL用户管理
--MYSQL用户管理
-模块2、MYSQL权限管理
--MYSQL权限管理
-模块3、MYSQL数据库的锁机制
--MYSQL数据库的锁机制
-模块4、MYSQL备份和恢复
--MYSQL备份和恢复