数据查询(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
时间: 2024-11-25 21:22:11

数据查询(3)-复杂查询(芮)的相关文章

各式结构化数据 动态 接入-存储-查询 的处理办法 (第二部分)

各式结构化数据的动态接入存储查询,这一需求相信有很多人都遇到过,随着实现技术路线选择的不同,遇到的问题出入大了,其解决办法也是大相径庭.数据存储在哪儿,是关系型数据库,还是NoSQL数据库,是MySQL还是Oracle,怎么建立索引,建立什么类型的索引,都是大学问.下面,我要把我对这一解决办法的思考总结一下,有成熟的也有不成熟的,希望大家一起共同探讨. 关键词:结构化数据, 动态, 接入, 存储, 查询 首先,我们得定义一下在本文中什么是结构化数据,这里的结构化数据主要是指扁平化的.可以由基础数

非结构化数据的存储与查询

当今信息化时代充斥着大量的数据.海量数据存储是一个必然的趋势.然而数据如何的存储和查询,尤其是当今非结构化数据的快速增长,对其数据的存储,处理,查询.使得如今的 关系数据库存储带来了巨大的挑战.分布存储技术是云计算的基础,主要研究如何存储.组织和管理数据中心上的大规模海量数据.由于面临的数据规模和用户规模更加庞大,在可扩展性.容错性以及成本控制方面面临着更加严峻的挑战[1]. 对于大量的半结构化数据(semi-structure data)和非结构化数据,对其存储和并发计算以及扩展能力而设计出了

查询总共要查询的数据量

CREATE TABLE #tablespaceinfo ( nameinfo VARCHAR(50) , rowsinfo BIGINT , reserved VARCHAR(20) , datainfo VARCHAR(20) , index_size VARCHAR(20) , unused VARCHAR(20) ) DECLARE @tablename VARCHAR(255); DECLARE Info_cursor CURSOR FOR SELECT '[' + [name] +

大数据江湖之即席查询与分析(下篇)--手把手教你搭建即席查询与分析Demo

上篇小弟分享了几个"即席查询与分析"的典型案例,引起了不少共鸣,好多小伙伴迫不及待地追问我们:说好的"手把手教你搭建即席查询与分析Demo"啥时候能出?说到就得做到,差啥不能差人品,本篇只分享技术干货,目的只有一个,就是让每一个伙伴都能根据本篇向导搭建出一个"即席查询与分析Demo". 为了让各位伙伴能够尽快上手体验,所选案例就以上一篇中的"机动车缉查布控即席查询与分析"为例,上篇我们已经比较详尽的分析了用户需求,没好好听课的

MySQL对数据表进行分组查询(GROUP BY)

MySQL对数据表进行分组查询(GROUP BY) GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组.字段中值相等的为一组.基本的语法格式如下: GROUP BY 属性名 [HAVING 条件表达式] [WITH ROLLUP] 属性名:是指按照该字段的值进行分组. HAVING 条件表达式:用来限制分组后的显示,符合条件表达式的结果将被显示. WITH ROLLUP:将会在所有记录的最后加上一条记录.加上的这一条记录是上面所有记录的总和. GROUP BY关键字可以和GROU

数据查询,简单查询及高级查询

查询所有列1.select * from info查特定列2.select code,name from info查出列后加别名,再查姓名3.select code as '代号',name as '姓名' from info条件查询,单条件查询4.select * from info where code='p001'两个条件,并且的关系5.select * from info where code='p001' and nation='n001'范围查询6.select * from car

如何应付表数据过大的查询问题?(如何尽量避免大表关联)

原文:如何应付表数据过大的查询问题?(如何尽量避免大表关联) 一般来说,对于做B/S架构的朋友来说,更有机会遇到高并发的数据库访问情况,因为现在WEB的普及速度就像火箭升空,同时就会因为高访问量带来一系列性能问题,而数据库一直是用户与商人之间交流的重要平台.用户是没有耐心忍受一个查询需要用上10秒以上的,或者更少些,如果经常出现服务器死机或者是报查询超时,我想那将是失败的项目.做了几年的WEB工作,不才,一直没有遇到过大访问量或者是海量数据的情况.这里并不是说没有海量数据的项目就不是好项目,要看

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

1.mysql简单的查询:select 字段1,字段2...  from tablename; 如果字段那里写一个*,代表查询所有的字段,等同于指定出所有的字段名,因此如果要查询所有字段的数据,一般都是用*. 2.去重查询:select distinct 字段1,字段2... form tablename: 可以结合上一张图的结果来对比. 3.直接在查询时做数学四则运算,加减乘除余: 4.查询时给查询结果字段重命名:select 字段1 as 名称1,字段2 as 名称2 ... from ta

Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据

原文:Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据 XQuery 是一个浏览/返回XML实例的标准语言. 它比老的只能简单处理节点的XPath表达式更丰富. 你可以同XPath一样使用.或是遍历所有节点,塑造XML实例的返回等. 作为一个查询语言, 你需要一个查询处理引擎. SQL Server 数据库通过XML数据类型方法的T-SQL 语句来处理XQuery. SQL Server 并不支持所有的X

ASP.NET网站权限设计实现(三)——套用JQuery EasyUI列表显示数据、分页、查询

一.说明: JQuery EasyUI下载地址:http://jquery-easyui.wikidot.com/download,最新版本1.2.2. 首先预览一下界面: 本例实现的功能: 1.多标签 2.分页列表显示数据 3.获取选中行的标识值,删除选中行 实现以上功能主要使用了: 1.layout:布局 2.tabs:多标签 3.datagrid:表格显示数据,并可以分页 4.messager:消息框 5.window:窗口 要了解用法,下载之后,参阅demo文件夹下的demo和官方文档.