SQL数据查询之——嵌套查询

一、概念描述

在SQL语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块。将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为 嵌套查询。例如:

SELECT Sname  /*外层查询或父查询*/
FROM Student
WHERE Sno IN
    (SELECT Sno  /*内层查询或子查询*/
     FROM SC
     WHERE Cno=‘2‘);

SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询。

注意:子查询的SELECT语句中不能使用 ORDER BY 子句,因为 ORDER BY 子句只能对最终查询结果排序。

二、带有IN谓词的子查询

在嵌套查询中,子查询的结果往往是一个集合,所以谓词 IN 是嵌套查询中最经常使用的谓词。

查询与“刘晨”在同一个系学习的学生

SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
    (SELECT Sdept
     FROM Student
     WHERE Sname=‘刘晨‘);

查询选修了课程名为“信息系统”的学生学号和姓名

SELECT Sno,Sname /*最后在Student关系中取出Sno和Sname*/
FROM Student
WHERE Sno IN
    (SELECT Sno  /*然后在SC关系中找出选修了3号课程的学生学号*/
     FROM SC
     WHERE Cno IN
        (SELECT Cno  /*首先在Course关系中找出“信息系统”的课程号,结果为3号*/
         FROM Course
         WHERE Cname=‘信息系统‘
        )
    );

本查询同样可以用连接查询实现:

SELECT Student.Sno,Sname
FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND
    SC.Cno=Course.Cno AND
    Course.Cname=‘信息系统‘;

三、带有比较运算符的子查询

带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。当用户能确切知道内层查询返回的是单个值时,可以用 >、<、=、>=、<=、!=、或<>等比较运算符。

找出每个学生超过他自己选修课程平均成绩的课程号

SELECT Sno,Cno
FROM SC X
WHERE Grade >=(SELECT AVG(Grade)
               FROM SC y
               WHERE y.Sno=x.Sno);

四、带有ANY(SOME)或ALL谓词的子查询

子查询返回单值时可以用比较运算符,但返回多值时要用ANY(有的系统用SOME)或ALL谓词修饰符。而使用ANY或ALL谓词时则必须同时使用比较运算符。其语义如下:


>ANY


大于子查询结果中的某个值


>ALL


大于子查询结果中的所有值


<ANY


小于子查询结果中的某个值


<ALL


小于子查询结果中的所有值


>=ANY


大于等于子查询结果中的某个值


>=ALL


大于等于子查询结果中的所有值


<=ALL


小于等于子查询结果中的所有值


<=ANY


大于等于子查询结果中的某个值


=ANY


等于子查询结果中的某个值


=ALL


等于子查询结果中的所有值(通常没有实际意义)


!=(或<>)ANY


不等于子查询结果中的某个值


!=(或<>)ALL


不等于子查询结果中的任何一个值

查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄

SELECT Sname,Sage
FROM Student
WHERE Sage<ANY (SELECT Sage
                FROM Student
                WHERE Sdept=‘CS‘)
AND Sdept <> ‘CS‘;

查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名和年龄

SELECT Sname,Sage
FROM Student
WHERE Sage<ALL
          (SELECT Sage
           FROM Student
           WHERE Sdept=‘CS‘)
AND Sdept <> ‘CS‘;

提示:本查询同样可以用聚集函数实现

SELECT Sname,Sage
FROM Student
WHERE Sage <
    (SELECT MIN(Sage)
     FROM Student
     WHERE Sdept=‘CS‘)
AND Sdept <>‘CS‘;

在此把ANY、ALL与聚集函数的对应关系表示如下

四、带有 EXISTS 谓词的子查询

带有EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。

查询所有选修了1号课程的学生姓名

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

使用存在量词EXISTS后,若内层查询结果为空,则外层的WHERE子句返回真值,否则返回假值。

查询没有选修1号课程的学生姓名

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

查询选修了全部课程的学生姓名

由于没有全称量词,可将题目的意思转换成等价的用存在量词的形式:查询这样的学生,没有一门课程是他不选修的。

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

查询至少选修了学生201215122选修的全部课程的学生号码

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));

五、总结

此次学习和整理了有关SQL与嵌套查询相关的程序

  • 带有IN谓词
  • 带有比较运算符
  • 带有ANY或ALL
  • 带有EXISTS谓词

尤其应格外重视 ANY、ALL与聚集函数的对应关系,还有带EXISTS时逻辑上的判断。

原文地址:https://www.cnblogs.com/OctoptusLian/p/8183241.html

时间: 2024-10-26 09:13:05

SQL数据查询之——嵌套查询的相关文章

sql子查询和嵌套查询

子查询和嵌套查询 标签: it   嵌套查询就是在外部还有一个查询. 子查询是在select 内部还有一个select 查询常常也被称为内查询 下面的错误示例: select name from [user] where age <= (select age from [user] where id>1 ) 子查询返回的值多于一个.当子查询跟随在 =.!=.<.<=.>.>= 之后,或子查询用作表达式时,这种情况是不允许的. 1.语法 子查询的句法如下: (SELECT

Sql Server系列:嵌套查询

嵌套查询是指一个查询语句嵌套在另一个查询语句内部的查询.嵌套查询也就子查询,在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或多个表.子查询中可以使用比较运算符,如“<”.“<=”.“>”.“>=”等. 子查询中常用的操作符有ANY(SOME).ALL.EXISTS.子查询可以添加到SELECT .UPDATE和DELETE语句中,可以进行多层嵌套. 1. 使用比较运算符

数据库 - 连接查询、嵌套查询、集合查询

连接查询 连接查询:同时涉及多个表的查询 连接条件或连接谓词:用来连接两个表的条件 一般格式: [<表名1>.]<列名1> <比较运算符> [<表名2>.]<列名2> [<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3> 连接字段:连接谓词中的列名称 连接条件中的各连接字段类型必须是可比的,但名字不必是相同的 嵌套循环法(

数据库开发基础-SQl Server 主键、外键、子查询(嵌套查询)

主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值.由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列. 主键的作用 主键的主要作用如下: (1)保证实体的完整性: (2)加快数据库的操作速度: (3) 在表中添加新记录时,数据库会自

mysql_数据查询_嵌套查询

嵌套查询 一个SELECT-FROM-WHERE语句称为一个查询块. 嵌套查询:将一个查询块嵌套在另一个查询块的WHERE子句或者HAVING短语的条件中的查询. 注:子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序. 1.带有IN谓词的子查询: 子查询往往是一个集合. 查询与jason在同一个系的学生: SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM S

mybatis的嵌套查询(嵌套查询nested select和嵌套结果nested results查询)区别

(转自:http://blog.csdn.net/canot/article/details/51485955) Mybatis表现关联关系比hibernate简单,没有分那么细致one-to-many.many-to-one.one-to-one.而是只有两种association(一).collection(多),表现很简洁.下面通过一个实例,来展示一下Mybatis对于常见的一对多和多对一关系复杂映射是怎样处理的. 以最简单的用户表订单表这个最简单的一对多做示例: 对应的JavaBean:

高级查询(嵌套查询)和(相关子查询)

SQL  Server高级子查询 1.子查询概念 (1)就是在查询的where子句中的判断依据是另一个查询的结果,如此就构成了一个外部的查询和一个内部的查询,这个内部的查询就是自查询. (2)自查询的分类 1)独立子查询 (查询的结果用=接收,只有一个值)->独立单值(标量)子查询(=) Select testID,stuID,testBase,testBeyond,testPro from Score where stuID=( select stuID from Student where

Oracle子查询(嵌套查询)

概念: 所谓子查询,即一个select语句中嵌套了另外的一个或者多个select语句 需求:查找和Smith同部门的所有员工的id和last_name 目标: 员工id,last_name from:  s_emp 条件: s_emp.dept_id = Smith所在部门的id? select id,last_name from s_emp where dept_id = ? 阶段目标: Smith所在部门的id 目标: dept_id from : s_emp 条件: last_name =

数据库的创建,插入,查询,平均数,连接查询,嵌套查询,组合查询等

创建表:CREATE TABLE Student( SNO VARCHAR(20), Name VARCHAR(10), Age INTEGER, College VARCHAR(30));CREATE TABLE Course( CourseID VARCHAR(15), CourseName VARCHAR(30), CourseBeforeID VARCHAR(15) );CREATE TABLE Choose( SNO VARCHAR(20), CourseID VARCHAR(30),