SQL复杂查询和视图
子查询
现实中,很多情况下需要进行下述条件判断
- 某一元素是否是某一集合成员
- 某一集合是否包含另一集合
- 测试集合是否为空
- 测试集合是否存在另一元组
子查询是出现在WHERE子句中的SELECT语句被称为子查询,子查询返回了一个集合。
IN子查询
基本语法:查询语句 [NOT] IN 子查询
语义:查询语句产生的结果是否在子查询当中
- 列出选修了001号课程的学生学号和姓名
SELECT sn, sname
FROM student
WHERE sn IN (SELECT sn FROM sc WHERE cn="001");
括号中产生的结果是一个集合(这里称为子集合),集合中的元素是学过001课程的学生的学号。前半部分的查询语句是从student中每取一条记录来查看记录中的sn是否在子集合中。如果是则将该记录进行标记,否则取出下一条继续比较。最后将被标记的记录中sn和snames属性值输出。

- 查询既学过001课程又学过002课程的同学学号
SELECT sn
FROM sc
WHERE cn="001" AND sn IN (SELECT sn FROM sc WHERE cn="002");

非相关子查询
查询分为外层查询和内层查询

外层查询的参数可以被带入到内层查询中,而内层查询的参数不能在外层查询中使用,这和高级编程中的循环一个道理。
当内层查询没有使用到外查询的参数时,我们可以内层查询是非相关子查询。上图中就是非相关子查询。判断是否相关最简单的方式就是内层查询是否能独立执行。
相关子查询

上图的例子中内层子查询使用到了外层的变量(Stud),这样内层查询就不能独立执行
SOME与ALL子查询
基本语法:查询语句 Θ SOME 子查询
查询语句 Θ ALL 子查询
Θ 是运算符:<,>,<=,>=,<>
Θ SOME表示前面的记录需要与子查询结果中某个记录做运算,如果为TRUE则该记录被接受
Θ ALL表示前面的记录需要与子查询结果中所有记录做运算,如果全为TRUE则该记录才被接受
- 找出工资最低的教师姓名
SELECT tname
FROM teacher
WHERE salary <= ALL(
SELECT salary
FROM teacher)

- 找出001号课成绩不是最高的所有学生的学号
SELECT sn
FROM sc
WHERE cn="001" AND score < SOME(
SELECT score
FROM sc
WHERE cn = "001")

- 找出所有成绩都不及格的学生姓名(相关查询)
SELECT sname
FROM student
WHERE 60 > ALL(
SELECT score
FROM sc
WHERE sc.sn = student.sn)

- 找出张三同学成绩最低的课程号
SELECT cn
FROM sc,student
WHERE sname="张三" AND sc.sn=student.sn AND score <=ALL(
SELECT score
FROM sc
WHERE sn=student.sn)

EXISTS查询
基本语法: [NOT] EXISTS (子查询)
含义:判断子查询结果集是否为空,当子查询为空时,EXISTS判断为false,而NOT EXISTS判断为true。NOT EXISTS使用情况比较多
- 检索学过001号教师主讲的所有课程的同学姓名
等价转换为不存在这样一门课程,该课程由001教师主讲并且该课程该同学没学过
SELECT sname
FROM student
WHERE NOT EXISTS(
SELECT *
FROM course
WHERE tn="001" AND NOT EXISTS(
SELECT *
FROM sc
WHERE sn=student.sn AND cn=course.cn)
)
- 列出没有学过李明老师课的学生姓名
等价于不存在这样的学生,他学过李明老师的课
SELECT sname
FROM student
WHERE NOT EXISTS(
SELECT *
FROM course,sc,teacher
WHERE course.cn=sc.cn AND teacher.tn=course.tn AND tname="李明" AND student.sn=sc.sn)
- 列出至少学过98030101号同学学过所有课程的同学学号
等价于不存在98030101同学学过的课程,该同学没有学过
SELECT sn
FROM sc AS sc1
WHERE sn !="98030101" AND NOT EXISTS(
SELECT *
FROM sc AS sc2
WHERE sn="98030101" NOT EXISTS(
SELECT *
FROM sc AS sc3
WHERE sc2.cn=cn AND sn=sc1.sn)
)

结果计算与聚类计算
结果计算和聚类计算是对查询结果集中的一些数据进行计算
- 求任意两名教师的薪水差额(差额>0)
SELECT t1.tname AS teacher1, t2.tname AS teacher2,t1.salary-t2.salary
FROM teacher AS t1, teacher AS t2
WHERE t1.salary >t2.salary

聚类计算

- 求教师工资总和
SELECT SUM(salary)
FROM teacher

- 求数据库课程的平均成绩
SELECT AVG(score)
FROM sc,course
WHERE sc.cn=course.cn AND course.cname="数据库"

SQL复杂查询和视图的更多相关文章
- 第二天,导出文件sql,查询,视图view,聚合函数,反模式,字符串处理函数
//把数据库导出到脚本文件mysqldump -uroot -p1234 --databases abc > d:/a/abc.sql CREATE TABLE stud( id INT PRI ...
- SQL复杂查询和视图(2)
分组查询 SQL可以将检索到的元组按某一条件进行分组,分组是属性值相同的为一组 求每个学生的平均成绩 SELECT sn,AVG(score)FROM scGROUP BY sn 先按sn进行分组,即 ...
- SHELL中执行Oracle SQL语句查询性能视图
数据库日志是否报错信息 vi check_log.sh #!/bin/bash # Created : 2019.10.10 # Updated : # Author : # Description ...
- SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)
前言 上一节我们简单讲述了表表达式的4种类型,这一系列我们来讲讲使用视图的限制,简短的内容,深入的理解,Always to review the basics. 避免在视图中使用ORDER BY 上一 ...
- 转发:使用sql命令查询视图中所有引用的基础表
转自:使用sql命令查询视图中所有引用的基础表 使用sql命令查询视图中所有引用的基础表 之前有写过如何利用sql查询视图中所有引用的表发现这个方法并不能查出视图中所有的基础表,如果视图中有嵌套视图就 ...
- SQL语句查询数据库的触发器、存储过程、视图以及表的SQL语句
Sql Server数据库用SQL语句查询方法如下: select name from sysobjects where xtype='TR' --所有触发器 select name from sys ...
- Sql Server的艺术(六) SQL 子查询,创建使用返回多行的子查询,子查询创建视图
子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中. 子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据. 子查询可以在SELECT,INSERT,UPDA ...
- SQL Server -- 回忆笔记(四):case函数,索引,子查询,分页查询,视图,存储过程
SQL Server知识点回忆篇(四):case函数,索引,子查询,分页查询,视图,存储过程 1. CASE函数(相当于C#中的Switch) then '未成年人' else '成年人' end f ...
- 数据库系统学习(七)-SQL语言之复杂查询与视图
第七讲 SQL语言之复杂查询与视图 基本内容 子查询 IN与NOT IN谓词子查询 判断某一表达式的值是否在子查询的结构中 非相关子查询 相关子查询 theta some /theta all谓词子查 ...
随机推荐
- Python基础-day2
1.Python模块python 中导入模块使用import语法格式:import module_name示例1: 导入os模块system('dir')列出当前目录下的所有文件 # _*_ codi ...
- x01.Lab.StreetApp: MVVM
Store App 特别适用于 MVVM 模式.由于要用到 SQLite,Bing Maps,所以第一步从网上搜索并安装这两个扩展.很难想象在智能手机上运行 SQL Server 这种巨无霸型数据库, ...
- C语言链表中数组实现数据选择排序,升序、降序功能主要难点
链表排序讲解: head指针指向链表的头结点,是找到整个链表的唯一依据,如果head指针丢失,整个链表就找不到了. head存储的是第一个节点的地址,head->next存储的是第二个节点的地址 ...
- ios移动端切图及前端规范
移动端IOS知识普及:IOS标准分辨率:1242px * 2208px 切片要求: 1. 设计稿是按标准分辨率1242X2208设计,图片资源尺寸则是3倍图尺寸,将整个设计图压缩成750X133 ...
- 搭建PHP官方框架zend framework 2(LINUX)
在五花八门的语言里,PHP作为我第一个觉得欣赏的理由,就是它的简单和快捷,因为它封装了许多的常用函数.PHP作为网站中一种算作比较流行的语言,也产生各种优秀的框架.我所接触过的有zend framew ...
- Linux Philosophy
These days I read the book Linux and the Unix Philosophy. Here are some principles: Little is gracef ...
- (六)责任链模式-C++实现
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 责任链模式是使用多个对象处理用户请求的成熟模式,它的关键 ...
- 第29章 跨战区大PK
29.1 策略模式 VS 桥梁模式 29.1.1 策略模式 [编程实验]用策略模式实现邮件发送 (1)有文本和超文本两种格式的邮件,将这两种格式封装成两种不同的发送策略. (2)文本邮件和超文本邮件分 ...
- Svn Patch 中文乱码
关于Patch svn打patch的介绍:巧用svn create patch(打补丁)方案解决定制版需求 svn创建patch 1.在SVN的提交列表中,右键选择“创建补丁” 2.选择保存位置,保存 ...
- Maven学习(七)仓库
* Maven仓库 在项目开发中, 项目目录下往往会有一个lib目录,用来存放第三方依赖jar文件, 如spring log4j jar等文件, Maven仓库就是放置JAR文件(WAR,ZIP,P ...