数据查询(3)-复杂查询
什么是子查询 ?
问题:
编写T-SQL语句,查看年龄比“张三”大的学员,要求显示这些学员的信息 ?
分析:
第一步:求出“张三”的年龄;
第二步:利用WHERE语句,筛选年龄比“张三”大的学员;
实现方法一:采用T-SQL变量实现
DECLARE @age INT --定义变量,存放张三的年龄
SELECT @age=stuAge FROM stuInfo
WHERE stuName=‘张三’ --求出张三的年龄
--筛选比张三年龄大的学员
SELECT * FROM stuInfo WHERE stuAge>@age
GO
有没有更简洁的语句呢?
有,我们可以合并上述两步 。
因为:
1.除了“>”号外,还可以使用其他运算符号,习惯上,外面的查询称为父查询,括号中嵌入的查询称为子查询。
2.SQL Server执行时,先执行子查询部分,求出子查询部分的值,然后再执行整个父查询。它的执行效率比采用SQL变量实现的方案一要高,所以推荐采用子查询。
3.子查询作为WHERE条件的一部分,还可以和UPDATE、INSERT、DELETE一起使用,语法类似于SELECT语句。
实现方法二:采用子查询实现
SELECT * FROM stuInfo
WHERE stuAge>( SELECT stuAge FROM
stuInfo where stuName='张三')
GO
使用子查询替换表连接
问题:查询笔试刚好通过(60分)的学员。
我们可以根据学员信息表和成绩表,查询笔试刚好通过考试的学员。
那么就有两种实现方案:
1.因为涉及到两张表(学员信息表和成绩表,前面我们已经建立好了),所以可以采用曾学过的连接查询。
2. 使用子查询。
实现方法一:采用表连接
SELECT stuName FROM stuInfo
INNER JOIN stuMarks
ON stuInfo.stuNo=stuMarks.stuNo
WHERE writtenExam=60
GO
实现方法二:采用子查询
SELECT stuName FROM stuInfo
WHERE stuNo=(SELECT stuNo FROM
stuMarks WHERE writtenExam=60)
GO
注意:
1.一般来说,表连接都可以用子查询替换,但反过来说就不一定。有的子查询却不能用表连接替换。
2.子查询比较灵活、方便、形式多样,常作为增、删、改、查的筛选条件,适合于操纵一个表的数据。
3. 表连接更适合于查看多表的数据,一般用于SELECT查询语句。
问题:查询笔试刚好通过的学员名单。
提问:
如果笔试成绩中有多个人刚好通过,即都为60分(例如我们再插入一条60分的数据)。使用我们刚才的子查询语句,会出现什么问题呢?(注意等号部分。)
我们演示一下就会发现出现了编译错误。SQL Server要求:“=”,“>”等比较运算符号后的子查询,返回的值不能多于一个,即记录条数不能超过1条。那么如何解决呢?我们可以使用IN子查询。
IN子查询
SELECT stuName FROM stuInfo
WHERE stuNo IN
(SELECT stuNo FROM stuMarks
WHERE writtenExam=60)
GO
1. IN后面的子查询可以返回多条记录
2. 常用IN替换等于(=)的比较子查询
问题:查询参加考试的学员名单
分析:
判断一个学员是否参加考试其实很简单,只需要查看该学员对应的学号是否在考试成绩表stuMarks中出现即可
/*--采用IN子查询参加考试的学员名单--*/
SELECT stuName FROM stuInfo
WHERE stuNo IN (SELECT stuNo FROM stuMarks)
GO
NOT IN子查询
问题:查询未参加考试的学员名单
分析:加上否定的NOT 即可
EXISTS子查询
EXISTS语句我们并不陌生,我们在学习建库和建表语句时曾提前用过,它是一个存在检测的子查询语句 。
IF EXISTS(SELECT * FROM
sysDatabases WHERE name=’stuDB’)
DROP DATABASE stuDB
CREATE DATABASE stuDB
…….—建库代码略
EXISTS子查询的语法:
IF EXISTS (子查询)
语句
1. 如果子查询的结果非空,即记录条数1条以上,则EXISTS (子查询)将返回真(true),否则返回假(false)
2. EXISTS也可以作为WHERE 语句的子查询,但一般都能用IN子查询替换
问题:
检查本次考试,本班如果有人笔试成绩达到80分以上,则每人提2分;否则,每人允许提5分
分析:
是否有人笔试成绩达到80分以上,可以采用EXISTS检测
/*--采用EXISTS子查询,进行酌情加分--*/
IF EXISTS (SELECT * FROM stuMarks WHERE writtenExam>80)
BEGIN
print '本班有人笔试成绩高于80分,每人加2分,加分后的成绩为:'
UPDATE stuMarks SET writtenExam=writtenExam+2
SELECT * FROM stumarks
END
ELSE
BEGIN
print '本班无人笔试成绩高于80分,每人可以加5分,加分后的成绩:'
UPDATE stuMarks SET writtenExam=writtenExam+5
SELECT * FROM stumarks
END
GO
问题:
检查本次考试,本班如果没有一人通过考试(笔试和机试成绩都>60分),则试题偏难,每人加3分,否则,每人只加1分
分析:
没有一人通过考试,即不存在“笔试和机试成绩都>60分”,可以采用NOT EXISTS检测
IF NOT EXISTS (SELECT * FROM stuMarks WHERE
writtenExam>60 AND labExam>60)
BEGIN
print '本班无人通过考试,试题偏难,每人加3分,加分后的成绩为:'
UPDATE stuMarks
SET writtenExam=writtenExam+3,labExam=labExam+3
SELECT * FROM stuMarks
END
ELSE
BEGIN
print '本班考试成绩一般,每人只加1分,加分后的成绩为:'
UPDATE stuMarks
SET writtenExam=writtenExam+1,labExam=labExam+1
SELECT * FROM stuMarks
END
GO
数据查询(3)-复杂查询相关推荐
- MySQL 学习笔记(4)— 组合查询、子查询、插入数据、更新/删除表数据、增加/删除表中的列以及重命名表
1. 组合查询 1.表的加减法 表的加法,即求 product 和 product2 的并集,UNION 运算会除去重复的记录 SELECT product_id, product_name FROM ...
- Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、连接(join、left join和right join简介及其区别)等案例之详细攻略
Database之SQLSever:SQL命令实现查询之多表查询.嵌套查询.分页复杂查询,删除表内重复记录数据.连接(join.left join和right join简介及其区别)等案例之详细攻略 ...
- 查询性能优化(使用 Explain 进行分析、优化数据访问、重构查询方式)、存储引擎(InnoDB/MyISAM)
1.查询性能优化 1.1 使用 Explain 进行分析 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 比较重要的字段有: select ...
- sqlserver导入向导时提示外部表不是预期格式_Excel办公实操,导入本地数据,创建参数查询,就是简单...
导入数据创建参数查询 在技巧73中已经介绍了使用Excel的"来自Microsoft Query"功能有选择地导入数据的方法,该功能使用了Microsoft Query技术,该技术 ...
- MySQL数据高级查询之连接查询、联合查询、子查询
2019独角兽企业重金招聘Python工程师标准>>> 一.连接查询 连接查询: 将多张表(>=2)进行记录的连接(按照某个指定的条件进行数据拼接). 连接查询的意义: 在用户 ...
- Mybatis-plus 大数据量数据流式查询通用接口
文章目录 一.案例需求 二.使用案例: 2.1. 自定义查询接口 2.2. 逻辑处理类 2.3. 调用案例 2.4. 具体逻辑处理案例 三.企业案例 3.1. key名称获取 3.2. 逻辑类测试 3 ...
- mysql怎样查表的模式_mysql常用基础操作语法(四)--对数据的简单无条件查询及库和表查询【命令行模式】...
1.mysql简单的查询:select 字段1,字段2... from tablename; 如果字段那里写一个*,代表查询所有的字段,等同于指定出所有的字段名,因此如果要查询所有字段的数据,一般都是 ...
- excel统计行数_百万到亿级数据,快速统计查询
大家好,我是dk.这是Excel神器PowerQuery实战入门系列的第3篇.往后,我会更新更多关于PQ的相关内容,有兴趣的小伙伴可以关注下. 众所周知,Excel2003版最大行数是65536行,到 ...
- java mongodb 模糊查询_Java操作MongoDB插入数据进行模糊查询与in查询功能的方法
Java操作MongoDB插入数据进行模糊查询与in查询功能 由于需要用MongoDB缓存数据,所以自己写了一套公共的存放和读取方法 具体如下: 存放mongodb: /** * 公共方法:设置Obj ...
- 需求 新建数据表用于演练查询 2128
需求 新建数据表用于演练查询 2128 建表 插入数据
最新文章
- LeetCode week252
- arduino开发ESP8266配置方法,入门必看,esp8266开发板库离线安装包package2.7.1
- 多车调度问题(大疆Robot Master)——ROS键盘控制失灵,小车无法收敛定位,路径规划出错
- mysql集合与集合的子集_大集合List分为多个子集合
- In-Loop Filters in HEVC
- 通通玩blend美工(6)下——仿iPhone滚动选择器的ListBox(交互逻辑)
- iOS应用内付费(IAP)开发步骤列表
- php layui 上传文件,laravel使用layui 上传文件 支持pdf上传
- 建立唯一索引后mysql策略_【MySQL】MySQL索引背后的之使用策略及优化【转】
- Vue源码:抽象语法树
- 大脑网络结构、功能和控制的物理学
- 图表制作办公首选--实用图表工具Echars
- 软件授权License的区别
- C#安装包安装提示:已安装了该产品的另一个版本解决方法
- 如何用intellij生成全英文javadoc
- Java实现 LeetCode 400 第N个数字
- python音频降噪处理_Python | 简单的扩音,音频去噪,静音剪切
- viewsets.ModelViewSet
- solidworks中加入参考图纸图片
- Java建立长链接的方式_java http长链接(keep-alive)导致的问题
热门文章
- 解决SQL Server 无法连接127.0.0.1的问题
- vue圆环进度条_vue圆环形进度条组件
- 【python自动化】02. pywin32库自动操作键鼠(保姆级代码注释)
- php 获取客户端版本,PHP获取客户端操作系统,游览器类型及版本号
- Android Bmob的注册与登录案例
- Spring拦截器实现登录拦截
- mongo中批量字段类型修改,string转double类型
- 10个爬虫工程师必备的工具了解一哈
- java file文件读取文件内容_java中的File文件读写操作
- 牛牛的装球游戏 (计算几何