当前课程知识点:数据库技术应用 >  学习情境三、银行存取款机数据操纵 >  模块4、银行存取款机子查询 >  3.4子查询

返回《数据库技术应用》慕课在线视频课程列表

3.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、数据库的基础知识

--1.1.1数据库设计-数据库的基本概念

--1.1.2数据管理的发展和数据库体系结构

--数据库的基础知识

-模块2、MYSQL介绍与安装

--MYSQL介绍与安装

--MYSQL介绍与安装

-模块3、银行存取款机数据库的创建与维护

--1.3数据库的创建与维护

--银行存取款机数据库的创建与维护

-模块4、银行存取款机数据库的设计

--1.4.1数据库的概念模型设计

--1.4.2数据库的数据模型设计

--1.4.3数据库的关系规范化

--银行存取款机数据库的设计

学习情境二、创建和管理银行存取款机数据表

-模块1、表的创建

--2.1表的创建

--任务实施:银行存取款机表的创建

--表的创建

-模块2、表的管理

--2.2表的管理

--任务实施:银行存取款机表的管理

--表的管理

-模块3、索引

--2.3索引

--任务实施:银行存取款机索引

--索引

-实践小课堂:宠物电商管理平台数据库和表的创建

--实践小课堂:宠物电商管理平台数据库和表的创建

学习情境三、银行存取款机数据操纵

-模块1、银行存取款机数据插入、修改和删除

--3.1.1数据插入

--任务实施:银行存取款机数据插入

--3.1.2数据修改和删除

--任务实施:银行存取款机数据修改和删除

--实践小课堂:宠物电商管理平台数据插入

--银行存取款机数据插入、修改和删除

-模块2、银行存取款机简单查询

--3.2.1简单查询

--任务实施:银行存取款机简单查询

--实践小课堂:宠物电商管理平台简单查询

--3.2.2统计查询

--任务实施:银行存取款机统计查询

--实践小课堂:宠物电商管理平台条件查询

--银行存取款机简单查询和统计查询

-模块3、银行存取款机连接查询

--3.3连接查询

--任务实施:银行存取款机连接查询

--银行存取款机连接查询

-模块4、银行存取款机子查询

--3.4子查询

--任务实施:银行存取款机子查询

--实践小课堂:宠物电商管理平台多表查询

--银行存取款机子查询

-模块5、银行存取款机分类汇总与排序

--3.5分类汇总与排序

--任务实施:银行存取款机分类汇总与排序

--实践小课堂:宠物电商管理平台分类汇总和排序

--银行存取款机分类汇总与排序

-模块6、银行存取款机视图

--3.6.1视图的创建与管理

--任务实施:银行存取款机视图的创建与管理

--3.6.2视图的更新

--任务实施:银行存取款机视图的更新

--实践小课堂:宠物电商管理平台视图

--银行存取款机视图

学习情境四、银行存取款机数据库编程

-模块1、银行存取款机存储过程

--4.1.1创建和执行存储过程

--任务实施:银行存取款机创建和执行存储过程

--实践小课堂:宠物电商管理平台存储过程

--4.1.2事务

--任务实施:银行存取款机事务

--实践小课堂:宠物电商管理平台存储函数

--银行存取款机存储过程

-模块2、银行存取款机触发器

--4.2.1INSERT触发器

--任务实施:银行存取款机INSERT触发器

--实践小课堂:宠物电商管理平台INSERT触发器

--4.2.2UPDATE触发器

--任务实施:银行存取款机UPDATE触发器

--实践小课堂:宠物电商管理平台UPDATE触发器

--4.2.3DELETE触发器

--任务实施:银行存取款机DELETE触发器

--实践小课堂:宠物电商管理平台DELETE触发器

--银行存取款机触发器

教学情境五、银行存取款机数据库安全性

-模块1、MYSQL用户管理

--模块1、MYSQL用户管理

--MYSQL用户管理

-模块2、MYSQL权限管理

--模块2、MYSQL权限管理

--MYSQL权限管理

-模块3、MYSQL数据库的锁机制

--MYSQL数据库的锁机制

--MYSQL数据库的锁机制

-模块4、MYSQL备份和恢复

--模块4、MYSQL备份和恢复

--MYSQL备份和恢复

3.4子查询笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。