SQL练习5 - SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询)

一、带有EXISTS谓词的子查询
EXISTS谓词:存在量词

带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
①、若内层查询结果非空,则外层的WHERE子句返回真值
②、若内层查询结果为空,则外层的WHERE子句返回假值

由EXISTS引出的子查询,其目标列表达式通常都用 * ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。
NOT EXISTS谓词:
①、若内层查询结果非空,则外层的WHERE子句返回假值
②、若内层查询结果为空,则外层的WHERE子句返回真值
(同EXISTS谓词相反)

[例 3.60]查询所有选修了1号课程的学生姓名。

 SELECT Sname
     FROM Student
     WHERE EXISTS
                   (SELECT *
                    FROM SC
                    WHERE Sno=Student.Sno AND Cno= ' 1 ');

这段代码的意思是,在SC表中是否存在选修了课程号为1的学生学号,如果存在,则在Student表中找到与该学号对应的学生姓名。
在这里插入图片描述
[例 3.61] 查询没有选修1号课程的学生姓名。

SELECT Sname
     FROM     Student
     WHERE NOT EXISTS
                   (SELECT *
                    FROM SC
                    WHERE Sno = Student.Sno AND Cno='1');

如果存在选修了1 号课的学生学号,因为是NOT EXISTS,所以返回假值;如果没有选修1 号课,返回真值,同时显示出与没有选修1号课的学生学号对应的学生姓名。
在这里插入图片描述
一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换
所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带EXISTS谓词的子查询等价替换,就是说,EXSTS 更高级一些。
[例 3.62] 查询选修了全部课程的学生姓名

SELECT Sname
        FROM Student
        WHERE NOT EXISTS
                      (SELECT *
                        FROM Course
                        WHERE NOT EXISTS
                                      (SELECT *
                                       FROM SC
                                       WHERE Sno= Student.Sno
                                             AND Cno= Course.Cno
                                      )
                       );

这段代码一层一层来分析,先看第一个学生是否选修了全部的课程,假设全部课程从1到5,如果选修了1 号课,最内层返回F,没有选修返回T,以此类推,如果这5 轮中都返回F,那么说明该学生选修了全部课程,然后是第二名学生…分析方法相同。

用EXISTS/NOT EXISTS实现逻辑蕴涵(难点)

[例 3.63]查询至少选修了学生201215122选修的全部课程的学生号码。
(该题目的意思是学生201215122选的课,某学生都选了,而且还可能选了别的课,也就是说,不存在这样的课程y,学生201215122选修了y,而学生x没有选。)
用NOT EXISTS谓词表示:

SELECT DISTINCT Sno
   FROM SC SCX
   WHERE NOT EXISTS
                 (SELECT *
                  FROM SC SCY
                  WHERE SCY.Sno = ' 201215122 '  AND
                                NOT EXISTS
                                (SELECT *
                                 FROM SC SCZ
                                 WHERE SCZ.Sno=SCX.Sno AND
                                 SCZ.Cno=SCY.Cno));
                                 

在这里插入图片描述
在SCX表中选中第一个学号假定为201215011,在SCY中选择201215122选修的地门课的学号,最内层的意思是,如果201215122选的课程201215011也选了,那么返回F,反之返回T,以此类推,将所得结果取并集如果均为F,那么201215011符合条件,如果有一个T,则不符合条件。
二、集合查询
集合操作的种类
并-UNION
交-INTERSECT
差-EXCEPT
参加集合操作的各查询结果的列数必须相同
对应项的数据类型必须相同

[例 3.64] 查询计算机科学系的学生及年龄不大于19岁的学生。

SELECT *
    FROM Student
    WHERE Sdept= 'CS'
    UNION
    SELECT *
    FROM Student
    WHERE Sage<=19;

在这里插入图片描述
以上二者是或的关系,满足其中之一即可。

UNION:将多个查询结果合并起来时,系统自动去掉重复元组
UNION ALL:将多个查询结果合并起来时,保留重复元组
[例 3.65] 查询选修了课程1或者选修了课程2的学生。

 SELECT Sno
    FROM SC
    WHERE Cno=' 1 '
    UNION
    SELECT Sno
    FROM SC
    WHERE Cno= ' 2 ';

在这里插入图片描述

[例3.66] 查询计算机科学系的学生与年龄不大于19岁的学生 的交集。

SELECT *
FROM Student
WHERE Sdept='CS' 
INTERSECT
SELECT *
FROM Student
WHERE Sage<=19 

[例 3.67]查询既选修了课程1又选修了课程2的学生。

 SELECT Sno
    FROM SC
    WHERE Cno=' 1 ' 
    INTERSECT
    SELECT Sno
    FROM SC
    WHERE Cno='2 ';

[例 3.68] 查询计算机科学系的学生与年龄不大于19岁的学生的差集。

 SELECT *
    FROM Student
    WHERE Sdept='CS'
    EXCEPT
    SELECT  *
    FROM Student
    WHERE Sage <=19;

在这里插入图片描述
三、基于派生表的查询
子查询不仅可以出现在WHERE子句中,
还可以出现在FROM子句中,
这时子查询生成的临时派生表成为主查询的查询对象。
[例3.57]找出每个学生超过他自己选修课程平均成绩的课程号

  SELECT Sno, Cno
    FROM SC, (SELECT  Sno, Avg(Grade) 
                        FROM   SC 
    		           GROUP BY   Sno)
                        AS   Avg_sc(avg_sno,avg_grade)
    WHERE SC.Sno = Avg_sc.avg_sno
                        and SC.Grade >=Avg_sc.avg_grade

将每个学生的平均成绩放在一个新形成的临时表中,重新命名,然后再把SC表中的每个学生的成绩和平均成绩进行比较,如果比平均成绩大,符合条件显示出来该同学的学号以及该门课的课程号。
在这里插入图片描述
如果子查询中没有聚集函数,派生表可以不指定属性列,子查询SELECT子句后面的列名为其缺省属性。
[例]查询所有选修了1号课程的学生姓名,可以用如下查询完成:

 SELECT Sname
    FROM     Student,  
                   (SELECT Sno FROM SC WHERE Cno=' 1 ') AS SC1
    WHERE  Student.Sno=SC1.Sno;

在这里插入图片描述
通过对嵌套查询(带有EXISTS)、 集合查询、派生表的查询等操作,集合查询比较简单,带有EXISTS的查询比较难理解、可以先从整体理解,再从细节理解,派生表相当于一个中介,相对容易理解,总的来说,还需要多多练习。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原书名: Perl by Example(Third Edition),原出版社: PH PTR,作者: Ellie Quigley,译者: 杜炜,出版社:清华大学出版社,出版日期:2002 年8月,PDF 格式,大小 19 Mb。 内容简介 本书以最新版本的Perl 5.6.1为范本,全面介绍了Perl语言,其内容包含Perl的所有主题。对每个主题都使用了范例说明,从Perl变量、正则达式,到编写报、CGI脚本和网络应用,并对范例序进行了解释。读者可以很容易地通过这些范例掌握Perl语言的语法。附录含有完整的函数和定义、命令行开关、特殊变量、常见模块和Perl调试器的列,全功能的、面向对象的CGI序,一些有用的脚本,以及很有帮助的HTM教。 本书非常适合于Perl语言初学者阅读,对于Perl序员,也有很大的参考价值。 目录 第1章 实用摘要和报语言 1.1 什么是Perl 1.2 Perl用户 1.3 Perl的版本 1.4 如何获得Perl 1.5 什么是CPAN 1.6 Perl文档 第2章 Perl脚本 2.1 从命令行使用Perl 2.1.1 七开关 2.1.2 -n开关 2.1.3 -c开关 2.2 脚本设置 2.3 脚本 2.3.1 开始 2.3.2 注释 2.3.3 Perl语句 2.3.4 执行脚本 2.3.5 脚本范例(UNIX, Windows) 练习1 了解Perl的语法 .第3章 获得打印句柄 3.1 文件句柄 3.2 字 3.2.1 引 3.2.2 实量(常量) 3.3 print函数 3.3.1 打印实量 3.3.2 警告编译指示和-w开关 3.3.3 strict编译指示和字 3.4 printf函数 3.4.1 sprintf函数 3.4.2 无引打印:here document 练习2 编写literals脚本 第4章 变量 4.1 关于Perl变量 4.1.1 类型 4.1.2 作用域和包 4.1.3 命名规范 4.1.4 赋值语句 4.1.5 引规则 4.2 标量、数组和散列 4.2.1 标量变量 4.2.2 数组 4.2.3 散列 4.3 从STDIN读取 4.3.1 把输入赋值给标量变量 4.3.2 chop和chomp函数 4.3.3 read函数 4.3.4 getc函数 4.3.5 将输入赋值给数组 4.3.6 将输入赋值给散列 4.4 数组函数 4.4.1 chop和chomp函数(用于列) 4.4.2 exists函数 4.4.3 delete函数 4.4.4 grep函数 4.4.5 join函数 4.4.6 map函数 4.4.7 pack和unpack函数 4.4.8 pop函数 4.4.9 push函数 4.4.10 shift函数 4.4.11 splice函数 4.4.12 split函数 4. 4.13 sort函数 4.4.14 reverse函数 4.4.15 unshift函数 4.5 散列(关联数组)函数 4.5.1 keys函数 4.5.2 values函数 4.5.3 each函数 4.5.4 delete函数 4.5.5 exists函数 4.6 关于散列的更多内容 4.6.1 从文件加载散列 4.6.2 特殊散列 4.6.3 语境 练习3 特殊字符 第5章 运算符 5.1 关于Perl运算符 5.2 混合数据类型 5.3 优先权与结合性 5.3.1 赋值运算符 5.3.2 关系运算符 5.3.3 等值运算符 5.3.4 逻辑运算符(短路运算符) 5.3.5 逻辑字运算符 5.3.6 算术运算符 5.3.7 自动递增和自动递减运算符 5.3.8 位逻辑运算符 5.3.9 条件运算符 5.3.10 范围运算符 5.3.11 特殊字符串运算符和函数 5.3.12 生成随机数 5.3.13 rand/srand函数 练习4 运算符 第6章 条件 6.1 控制结构,块和复合语句 6.2 决策--条件结构 6.2.1 if和unless语句 6.2.2 unless语句结构 6.3 循环 6.3.1 while循环 6.3.2 until循环 6.3.3 for循环 4.5.2 values函数 4.5.3 each函数 4.5.4 delete函数 4.5.5 exists函数 4.6 关于散列的更多内容 4.6.1 从文件加载散列 4.6.2 特殊散列 4.6.3 语境 练习3 特殊字符 第5章 运算符 5.1 关于Perl运算符 5.2 混合数据类型 5.3 优先权与结合性 5.3.1 赋值运算符 5.3.2 关系运算符 5.3.3 等值运算符 5.3.4 逻辑运算符(短路运算符) 5.3.5 逻辑字运算符 5.3.6 算术运算符 5.3.7 自动递增和自动递减运算符 5.3.8 位逻辑运算符 5.3.9 条件运算符 5.3.10 范围运算符 5.3.11 特殊字符串运算符和函数 5.3.12 生成随机数 5.3.13 rand/srand函数 练习4 运算符 第6章 条件 6.1 控制结构,块和复合语句 6.2 决策--条件结构 6.2.1 if和unless语句 6.2.2 unless语句结构 6.3 循环 6.3.1 while循环 6.3.2 until循环 6.3.3 for循环 6.3.4 foreach循环 6.3.5 循环控制 6.3.6 伪开关语句 练习5 条件是什么 第7章 正则达式--模式匹配 7.1 什么是正则达式 7.2 达式修饰符和简语句 7.2.1 条件修饰符 7.2.2 DATA文件句柄 7.2.3 循环修饰符 7.3 正则达式运算符 7.3.1 m运算符和匹配 7.3.2 s运算符和替换 7.3.3 模式绑定运算符 练习6 它是sed、awk或grep吗?尝试Perl 第8章 获得控制:正则达式元字符 8.1 正则达式元字符 8.1.1 用于单字符的元字符 8.1.2 白空元字符 8.1.3 重复模式匹配的元字符 8.1.4 tr或y函数 8.2 统一字符编码(Unicode) 练习7 是sed、awk或grep吗?给出Perl的另外一个作用 第9章 获得文件句柄 9.1 用户定义文件句柄 9.1.1 打开文件:open函数 9.1.2 打开文件读 9.1.3 打开文件写 9.1.4 Win32文件 9.1.5 打开文件添加 9.1.6 select函数 9.1.7 使用flock锁住文件 9.1.8 seek和tell函数 9.1.9 打开文件读写 9.1.10 管道打开 9.2 传送参数 9.2.1 ARGV数组 9.2.2 ARGV和Null文件句柄 9.2.3 eof函数 9.2.4 -i开关:原位编辑文件 9.3 文件测试 练习8 获得文件句柄 第10章 子序和函数 10.1 子序/函数 10.1.1 定义和调用于序 10.1.2 传送参数 10.1.3 原型 10.1.4 返回值 10.1.5 通过引用调用--别名和Typeglobs 10.1.6 通过指针传送 10.1.7 自动加载 10.1.8 BEGIN和END子序(开始和结束) 10.1.9 subs函数 练习9 子序不可缺少 第11章 模块化、打包并发送到库 11.1 包和模块 11.1.1 类比 11.1.2 定义 11.1.3 符 11.2 标准Perl库 11.2.1 @INC数组 11.2.2 包和.p1文件 11.2.3 模块和.pm文件 11.2.4 来自CPAN的模块 练习10 将所有的Perl都放入包中 练习11 压缩并放入库中 第12章 这个工作要求引用吗 12.1 什么是引用 12.1.1 符引用与硬引用 12.1.2 硬引用 12.1.3 引用和匿名变量 12.1.4 嵌套数据结构 12.1.5 引用和子序 12.1.6 文件句柄引用 12.1.7 ref函数 练习12 指向地址 第13章 面向对象的Perl 13.1 OOP范型 13.1.1 回顾包和模块 13.1.2 一些面向对象的专用术语 13.2 类、对象和方法 13.2.1 类和专用性 13.2.2 对象 13.2.3 bless函数 13.2.4 方法 13.2.5 多态性和动态绑定 13.2.6 析构函数和无用存储单元收集 13.3 继承 13.3.1 @ISA数组和调用方法 13.3.2 $AUTOLOAD,sub AUTOLOAD和UNIVERSAL 13.3.3 派生类 13.3.4 多重继承 13.3.5 面向对象术语--父方法 13.4 公共用户接口:文档编制类 13.4.1 pod文件 13.4.2 pod命令 13.4.3 如何使用pod解释序 13.4.4 将pod文档翻译成文本 13.4.5 将pod文档翻译成HTML 13.5 使用Perl库中的对象 13.5.1 再看标准Perl库 13.5.2 标准Perl库中面向对象的模块 13.5.3 使用标准Perl库中的模块 练习13 这一课的对象是什么 练习14 函数Pod中的Perl 第14章 tie函数,DBM文件和数据库挂钩 14.1 连接变量与类 14.1.1 tie函数 14.1.2 预定义方法 14.1.3 连接标量 14.1.4 连接数组 14.1.5 连接散列 14.2 DBM文件 14.2.1 创建并赋给DBM文件数据 14.2.2 从DBM文件检索数据 14.2.3 从DBM文件中删除项 第15章 Perl数据库 15.1 本章概述 15.2 Perl数据库 15.3 使用RDBMS的Perl编 15.3.1 在Windows系统上安装Perl 15.3.2 使用PPM在Windows系统上安装Perl模块 15.3.3 安装RDBMS 15.3.4 为MMS范例创建DSN 15.4 使用ADO和DBI访问MSS 15.4.1 Microsoft SQL Server--范例15-1和15-3的查询 15.4.2 范例15-1:ex1.p1在MS SQL Server上的ADO简单查询,DSN 15.4.3 执行DDL和DML操作 15.4.4 范例15-2:ex2.p1 MSS上persons.sql的Perl ADO,无DSN 15.4.5 范例15-3:ex3.p1 MS SQL Server上的Perl DBI范例 15.4.6 范例15-4:ex4.p1 MSS上persons.sql的Perl DBl 15.5 使用ADO和DBI访问Oracle 15.5.1 Oracle--范例15-5(ADO)和15-7(DBI)的简单查询 15.5.2 为Oracle范例创建DSN 15.5.3 范例15-5:ex5.p1 Oracle上的ADO简单查询,DSN 15.5.4 在Oracle上执行DDL和DML操作 15.5.5 范例15-6:ex6.pl Oracle上persons.sql的Perl ADO,无DSN 15.5.6 范例15-7:ex7.pl Oracle上的Perl DBI简单查询 15.5.7 范例15-8:ex8.ploracle上persons.sql的Perl DBI 15.6 练习:非编 练习15 使用MSS 练习16 在MSS中执行persons.p1 练习17 使用Oracle 练习18 在Oracle中执行persons.p1 15.7 参考文献 第16章 与系统接口 16.1 系统调用 16.1.1 目录和文件 16.1.2 目录和文件属性 16.1.3 查找目录和文件 16.1.4 创建目录--mkdir函数 16.1.5 删除目录--rmdir函数 16.1.6 更改目录--chdir函数 16.1.7 通过目录文件句柄访问目录 16.1.8 许可和所有权 16.1.9 硬和软链接 16.1.10 更改文件名 16.1.11 更改访问和修改时间 16.12 文件统计量 16.1.13 低级文件I/O 16.1.14 压缩和解压缩数据 16.2 进 16.2.1 UNIX进 16.2.2 Win32进 16.2.3 环境(UNIX和Windows) 16.2.4 进和文件句柄 16.2.5 进优先权和Nice 16.2.6 口令信息 16.2.7 时间和进 16.2.8 UNIX进创建 16.2.9 Win32进创建 16.3 其他与操作系统接口的途径 16.3.1 syscall函数和h2hp脚本 16.3.2 命令替换--备份引 16.3.3 Shell.pm模块(Perl) 16.3.4 system函数 16.3.5 here documents 16.3.6 Globbing(文件名扩展和通配符) 16.4 错误处理 16.4.1 die函数
第1章 窗体与界面设计 1 1.1 菜单应用 2 实例001 在系统菜单中添加菜单项 2 实例002 带历史信息的菜单 3 实例003 菜单动态合并 4 实例004 像“开始”菜单一样漂亮的菜单 5 实例005 多彩的菜单 6 实例006 可以拉伸的菜单界面 8 1.2 工具栏设计 9 实例007 带背景的工具栏 9 实例008 浮动工具栏 10 1.3 状态栏设计 11 实例009 在状态栏中显示检查框 11 实例010 带进度条的状态栏 12 实例011 状态栏中加入图标 13 1.4 导航菜单界面 14 实例012 OutLook界面 14 实例013 带导航菜单的主界面 15 实例014 图形化的导航界面 16 1.5 特色序界面 18 实例015 类QQ的序界面 18 实例016 类似Windows XP的序界面 20 实例017 以图形按钮显示的界面 21 实例018 以树型显示的序界面 23 实例019 以XPManifest组件显示界面 24 实例020 动态按钮的窗体界面 25 1.6 特殊形状的窗体 26 实例021 非矩形窗体 26 实例022 建立字体形状窗体 28 1.7 多媒体光盘 29 实例023 自动启动的多媒体光盘序 29 实例024 为触摸屏序添加虚拟键盘 30 实例025 触摸屏系统 31 1.8 窗体效果 33 实例026 半透明渐显窗体 33 实例027 窗口颜色的渐变 34 实例028 带背景的窗体 35 实例029 为窗体增加边框 36 1.9 窗体动画 37 实例030 窗体中的滚动字幕 37 实例031 动画显示窗体 38 实例032 制作闪烁的窗体 39 实例033 直接在窗体上绘图 40 实例034 动画形式的序界面 41 实例035 以时钟显示界面窗体 42 1.10 标题栏窗体 44 实例036 标题栏上的按钮 45 实例037 使窗体标题栏文字右对齐 47 实例038 没有标题栏但可以改变大小的窗口 48 1.11 设置窗体位置 49 实例039 不可移动的窗体 49 实例040 设置窗体在屏幕中的位置 50 实例041 始终在最上面的窗体 51 1.12 设置窗体大小 52 实例042 限制窗体大小 52 实例043 获取桌面大小 53 实例044 组件大小随窗体的改变而改变 53 实例045 在窗口间移动按钮 54 实例046 如何实现Office助手 55 1.13 窗体控制技术 56 实例047 在关闭窗口前加入确认对话框 56 实例048 序在循环中响应界面操作 57 实例049 使用任意组件拖动窗体 58 实例050 动态创建窗体和释放窗体 59 实例051 修改提示字体及颜色 60 1.14 其他技术 61 实例052 窗口融合技术 61 实例053 给MDI窗体加背景 62 实例054 如何关闭MDI类型窗体中的子窗体 63 实例055 向提示框中添加图标 64 第2章 控件应用 67 2.1 TEdit控件应用典型实例 68 实例056 从右至左输入数据 68 实例057 为TEdit控件添加列选择框 69 实例058 只允许输入数字的TEdit组件 70 2.2 TSpeedButton控件应用典型实例 71 实例059 在TSpeedButton按钮中显示图标 71 实例060 折行显示按钮标题 72 2.3 TMemo控件应用典型实例 73 实例061 设置TMemo组件的边界 73 实例062 TMemo组件的光标定位 74 实例063 得到TMemo中的可见行数 75 2.4 TListBox控件应用典型实例 76 实例064 在TListBox组件间交换数据 76 实例065 为TListBox添加水平滚动条 77 实例066 将数据库数据添加到组合框中 78 实例067 借助绑定控件实现数据选择录入 79 2.5 TListView控件应用典型实例 80 实例068 TListView列拒绝添加重复信息 80 实例069 将数据库数据添加到TListView控件 82 实例070 用TListView控件制作导航界面 83 实例071 在TListView控件中对数据排序或统计 84 实例072 在TListView组件中绘制底纹 86 实例073 在列视图中拖动视图项 87 2.6 TTreeView控件应用典型实例 88 实例074 将数据库数据显示到树视图中 88 实例075 用TTreeView控件制作导航界面 90 实例076 TTreeView组件遍历磁盘目录 91 实例077 TTreeView组件在数据库中的应用 92 2.7 TStringGrid控件应用典型实例 94 实例078 序运行时对

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值