什么是子查询

问题:

编写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)-复杂查询相关推荐

  1. MySQL 学习笔记(4)— 组合查询、子查询、插入数据、更新/删除表数据、增加/删除表中的列以及重命名表

    1. 组合查询 1.表的加减法 表的加法,即求 product 和 product2 的并集,UNION 运算会除去重复的记录 SELECT product_id, product_name FROM ...

  2. Database之SQLSever:SQL命令实现查询之多表查询、嵌套查询、分页复杂查询,删除表内重复记录数据、连接(join、left join和right join简介及其区别)等案例之详细攻略

    Database之SQLSever:SQL命令实现查询之多表查询.嵌套查询.分页复杂查询,删除表内重复记录数据.连接(join.left join和right join简介及其区别)等案例之详细攻略 ...

  3. 查询性能优化(使用 Explain 进行分析、优化数据访问、重构查询方式)、存储引擎(InnoDB/MyISAM)

    1.查询性能优化 1.1 使用 Explain 进行分析 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 比较重要的字段有: select ...

  4. sqlserver导入向导时提示外部表不是预期格式_Excel办公实操,导入本地数据,创建参数查询,就是简单...

    导入数据创建参数查询 在技巧73中已经介绍了使用Excel的"来自Microsoft Query"功能有选择地导入数据的方法,该功能使用了Microsoft Query技术,该技术 ...

  5. MySQL数据高级查询之连接查询、联合查询、子查询

    2019独角兽企业重金招聘Python工程师标准>>> 一.连接查询 连接查询: 将多张表(>=2)进行记录的连接(按照某个指定的条件进行数据拼接). 连接查询的意义: 在用户 ...

  6. Mybatis-plus 大数据量数据流式查询通用接口

    文章目录 一.案例需求 二.使用案例: 2.1. 自定义查询接口 2.2. 逻辑处理类 2.3. 调用案例 2.4. 具体逻辑处理案例 三.企业案例 3.1. key名称获取 3.2. 逻辑类测试 3 ...

  7. mysql怎样查表的模式_mysql常用基础操作语法(四)--对数据的简单无条件查询及库和表查询【命令行模式】...

    1.mysql简单的查询:select 字段1,字段2... from tablename; 如果字段那里写一个*,代表查询所有的字段,等同于指定出所有的字段名,因此如果要查询所有字段的数据,一般都是 ...

  8. excel统计行数_百万到亿级数据,快速统计查询

    大家好,我是dk.这是Excel神器PowerQuery实战入门系列的第3篇.往后,我会更新更多关于PQ的相关内容,有兴趣的小伙伴可以关注下. 众所周知,Excel2003版最大行数是65536行,到 ...

  9. java mongodb 模糊查询_Java操作MongoDB插入数据进行模糊查询与in查询功能的方法

    Java操作MongoDB插入数据进行模糊查询与in查询功能 由于需要用MongoDB缓存数据,所以自己写了一套公共的存放和读取方法 具体如下: 存放mongodb: /** * 公共方法:设置Obj ...

  10. 需求 新建数据表用于演练查询 2128

    需求 新建数据表用于演练查询 2128 建表 插入数据

最新文章

  1. LeetCode week252
  2. arduino开发ESP8266配置方法,入门必看,esp8266开发板库离线安装包package2.7.1
  3. 多车调度问题(大疆Robot Master)——ROS键盘控制失灵,小车无法收敛定位,路径规划出错
  4. mysql集合与集合的子集_大集合List分为多个子集合
  5. In-Loop Filters in HEVC
  6. 通通玩blend美工(6)下——仿iPhone滚动选择器的ListBox(交互逻辑)
  7. iOS应用内付费(IAP)开发步骤列表
  8. php layui 上传文件,laravel使用layui 上传文件 支持pdf上传
  9. 建立唯一索引后mysql策略_【MySQL】MySQL索引背后的之使用策略及优化【转】
  10. Vue源码:抽象语法树
  11. 大脑网络结构、功能和控制的物理学
  12. 图表制作办公首选--实用图表工具Echars
  13. 软件授权License的区别
  14. C#安装包安装提示:已安装了该产品的另一个版本解决方法
  15. 如何用intellij生成全英文javadoc
  16. Java实现 LeetCode 400 第N个数字
  17. python音频降噪处理_Python | 简单的扩音,音频去噪,静音剪切
  18. viewsets.ModelViewSet
  19. solidworks中加入参考图纸图片
  20. Java建立长链接的方式_java http长链接(keep-alive)导致的问题

热门文章

  1. 解决SQL Server 无法连接127.0.0.1的问题
  2. vue圆环进度条_vue圆环形进度条组件
  3. 【python自动化】02. pywin32库自动操作键鼠(保姆级代码注释)
  4. php 获取客户端版本,PHP获取客户端操作系统,游览器类型及版本号
  5. Android Bmob的注册与登录案例
  6. Spring拦截器实现登录拦截
  7. mongo中批量字段类型修改,string转double类型
  8. 10个爬虫工程师必备的工具了解一哈
  9. java file文件读取文件内容_java中的File文件读写操作
  10. 牛牛的装球游戏 (计算几何