子查询

现实中,很多情况下需要进行下述条件判断

  • 某一元素是否是某一集合成员
  • 某一集合是否包含另一集合
  • 测试集合是否为空
  • 测试集合是否存在另一元组

子查询是出现在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复杂查询和视图的更多相关文章

  1. 第二天,导出文件sql,查询,视图view,聚合函数,反模式,字符串处理函数

    //把数据库导出到脚本文件mysqldump -uroot -p1234 --databases abc > d:/a/abc.sql CREATE TABLE stud( id INT PRI ...

  2. SQL复杂查询和视图(2)

    分组查询 SQL可以将检索到的元组按某一条件进行分组,分组是属性值相同的为一组 求每个学生的平均成绩 SELECT sn,AVG(score)FROM scGROUP BY sn 先按sn进行分组,即 ...

  3. SHELL中执行Oracle SQL语句查询性能视图

    数据库日志是否报错信息 vi check_log.sh #!/bin/bash # Created : 2019.10.10 # Updated : # Author : # Description ...

  4. SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)

    前言 上一节我们简单讲述了表表达式的4种类型,这一系列我们来讲讲使用视图的限制,简短的内容,深入的理解,Always to review the basics. 避免在视图中使用ORDER BY 上一 ...

  5. 转发:使用sql命令查询视图中所有引用的基础表

    转自:使用sql命令查询视图中所有引用的基础表 使用sql命令查询视图中所有引用的基础表 之前有写过如何利用sql查询视图中所有引用的表发现这个方法并不能查出视图中所有的基础表,如果视图中有嵌套视图就 ...

  6. SQL语句查询数据库的触发器、存储过程、视图以及表的SQL语句

    Sql Server数据库用SQL语句查询方法如下: select name from sysobjects where xtype='TR' --所有触发器 select name from sys ...

  7. Sql Server的艺术(六) SQL 子查询,创建使用返回多行的子查询,子查询创建视图

    子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中. 子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据. 子查询可以在SELECT,INSERT,UPDA ...

  8. SQL Server -- 回忆笔记(四):case函数,索引,子查询,分页查询,视图,存储过程

    SQL Server知识点回忆篇(四):case函数,索引,子查询,分页查询,视图,存储过程 1. CASE函数(相当于C#中的Switch) then '未成年人' else '成年人' end f ...

  9. 数据库系统学习(七)-SQL语言之复杂查询与视图

    第七讲 SQL语言之复杂查询与视图 基本内容 子查询 IN与NOT IN谓词子查询 判断某一表达式的值是否在子查询的结构中 非相关子查询 相关子查询 theta some /theta all谓词子查 ...

随机推荐

  1. asp.net 后台 Http POST请求

    时间忙,简单些,直接贴代码上图 百度站长平台为站长提供链接提交通道,您可以提交想被百度收录的链接,百度搜索引擎会按照标准处理 http://zhanzhang.baidu.com/linksubmit ...

  2. linux enc28j60网卡驱动移植(硬件spi和模拟spi)

    本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是 ...

  3. ELK IIS 日志-->logstash-->ElasticSearch

    NXLOG 配置 #define ROOT C:\Program Files\nxlog define ROOT C:\Program Files (x86)\nxlog Moduledir %ROO ...

  4. URL tailing slash

    Without tailing slash request header GET /snippets HTTP/1.1 User-Agent: Fiddler Host: 192.168.128.13 ...

  5. linux监控命令nc用法

    一.nc命令检测端口的用法 # nc -v -w 10 %IP% -z %PORT% -v 显示指令执行过程. -w <超时秒数> 设置等待连线的时间. -u 表示使用UDP协议 -z 使 ...

  6. 一起来啃书——PHP看书

    形式所迫,不得不开展android的学习,PHP这边也开始了啃书的日子.两部500+的书,45天够不,有点忙有点忙... 早上的胃胀,简直是一记闷棍,长点儿记性吧........ 1.PHP+MYSQ ...

  7. Simple Infinite automaton [C]

    Today I read the book Formal Language and Automaton Theory. And I learnt the infinite automaton. Her ...

  8. 洛谷P2331 [SCOI2005] 最大子矩阵[序列DP]

    题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

  9. 洛谷U4727小L的二叉树[树转序列 LIS]

    题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的 ...

  10. NOIP2006能量项链[环形DP]

    题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...