精华内容
下载资源
问答
  • 2021-04-05 11:29:18

    嵌套查询

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

    上层的查询块称为外层查询或父查询,下层查询块称为内层查询或子查询

    SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询。需要特别指出的是,子查询的SELECT语句中不能使用ORDER BY子句,ORDER BY子句只能对最终查询结果排序。

    嵌套查询使用户可以用多个简单查询构成复杂的查询,从而增强SQL的查询能力。以层层嵌套的方式来构造程序正是SQL中“结构化”的含义所在

    1、带有IN谓词的子查询

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

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

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

    也可用自身连接:

    SELECT First.Sno,First.Sname,First.Sdept
    FROM Student First,Student Second
    WHERE First.Sdept=Second.Sdept AND Second.Sname='刘晨';
    

    查询结果:
    在这里插入图片描述
    例2:查询选修了课程名为“数据库”的学生学号和姓名
    代码:

    SELECT Sname,Sno
    FROM Student
    WHERE Sno IN 
    (SELECT Sno
    FROM SC
    WHERE Cno IN
    (SELECT Cno
    FROM Course
    WHERE Cname='数据库'
    )
    );
    

    也可用连接查询:

    SELECT Sname,Student.Sno
    FROM Student,SC,Course
    WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Cname='数据库';
    

    查询结果:
    在这里插入图片描述
    由此可见,实现一个查询请求可以有多种方法。

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

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

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

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

    查询结果:
    在这里插入图片描述
    例2:找出每个学生超过他自己选修课程平均成绩的课程号
    代码:

    SELECT Cno,Sno
    FROM SC x
    WHERE Grade>
    (SELECT AVG(Grade)
    FROM SC y
    WHERE y.Sno=x.Sno
    ); --相关嵌套查询
    

    查询结果:
    在这里插入图片描述

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

    语句功能
    > ANY大于子查询结果中的某个值
    > ALL大于子查询结果中的所有值
    < ANY小于子查询结果中的某个值
    < ALL小于子查询结果中的所有值
    >= ANY大于等于子查询结果中的某个值
    >= ALL大于等于子查询结果中的所有值
    <= ANY小于等于子查询结果中的某个值
    <= ALL小于等于子查询结果中的所有值
    = ANY等于子查询结果中的某个值
    = ALL等于子查询结果中的所有值(通常没有实际意义)
    != (<>) ANY不等于子查询结果中的某个值
    != (<>) AL L不等于子查询结果中的任何一个值

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

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

    可使用聚集函数查询:

    SELECT Sname,Sage
    FROM Student x
    WHERE Sdept !='CS' AND Sage<
    (SELECT MAX(Sage)
    FROM Student
    WHERE Sdept='CS'
    );
    

    查询结果:
    在这里插入图片描述

    例:查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名及年龄。
    代码:

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

    可使用聚集函数查询:

    SELECT Sname,Sage
    FROM Student x
    WHERE Sdept !='CS' AND Sage<
    (SELECT MIN(Sage)
    FROM Student
    WHERE Sdept='CS'
    );
    

    查询结果:
    在这里插入图片描述

    使用聚集函数实现子查询一般比直接用ANY或ALL查询效率高
    转换关系:

    =<> (!=)<<=>>=
    ANYIN- -<MAX<=MAX>MIN>=MIN
    ALL- -NOT IN<MIN<=MIN>MAX>=MAX

    4、带有EXISTS谓词的子查询

    EXISTS谓词

    EXISTS代表存在量词∃。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑价值“false”。

    例1:查询所有选修了1号课程的学生姓名。
    代码:

    SELECT Sname
    FROM Student
    WHERE EXISTS
    (SELECT *   --子查询目标列表达式通常都用*
    FROM SC
    WHERE Cno=1 AND Student.Sno=SC.Sno
    );
    

    可用连接运算实现查询:

    SELECT Sname
    FROM Student,SC
    WHERE Cno=1 AND Student.Sno=SC.Sno;
    

    查询结果:
    在这里插入图片描述
    例2:查询没有选修1号课程的学生姓名
    代码:

    SELECT Sname
    FROM Student
    WHERE NOT EXISTS
    (SELECT *   --子查询目标列表达式通常都用*
    FROM SC
    WHERE Cno=1 AND Student.Sno=SC.Sno
    );
    

    不可用连接运算实现查询:

    SELECT Sname
    FROM Student,SC
    WHERE Cno!=1 AND Student.Sno=SC.Sno;
    

    对比查询结果:
    在这里插入图片描述
    由此可见:一些带有存在谓词的子查询不能被其他形式的子查询等价替换,但是所有带IN、ANY、ALL、比较运算符的子查询都能被用带EXISTS谓词的子查询等价替换。

    EXISTS谓词将存在量词转换为全称量词

    (∀)P≡┐(∃(┐P))
    例:查询选修了全部课程的学生姓名
    代码:

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

    查询结果:
    在这里插入图片描述

    EXISTS谓词表达逻辑蕴涵

    例:查询至少选修了学生002选修的全部课程的学生号码
    分析:
    (∀y)p→q ≡ ┐(∃y(┐(p→q))) ≡ ┐(∃y(┐(┐p∨q))) ≡ ┐∃y(p ∧┐q)
    代码:

    SELECT DISTINCT Sno
    FROM SC x
    WHERE NOT EXISTS
    (SELECT *
    FROM SC y
    WHERE Sno='002' AND NOT EXISTS
    (SELECT *
    FROM SC z
    WHERE z.Sno=x.Sno AND
    z.Cno=y.Cno));
    

    查询结果:
    在这里插入图片描述

    不相关子查询与相关子查询

    查询的查询条件不依赖于父查询,这类子查询称为不相关子查询,不相关子查询是较简单的一类子查询。如果子查询的查询条件依赖于父查询,这类子查询称为相关子查询,整个查询语句称为相关嵌套查询语句。

    OVER!!不过存在量词转换成全称量词和蕴含式还是有一些难懂,可以先写出表达式进行表达式转换后,再来写代码会好理解一些。

    更多相关内容
  • 嵌套查询语法格式带有IN谓词的子查询IN谓词实现交运算IN谓词实现差运算带有比较运算符的子查询带有ANY谓词的子查询带有ALL谓词的子查询相关子查询引用子查询的值不引用子查询的值(EXISTS)基于派生表的查询 ...
  • 本文实例分析了MySQL嵌套查询。分享给大家供大家参考,具体如下: MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual): 1. SELECT语句的子查询 语法: ...
  • 嵌套查询糟糕的优化在上面我提到过,不考虑特殊的情况,联表查询要比嵌套查询更有效。尽管两条查询表达的是同样的意思,尽管你的计划是告诉服务器要做什么,然后让它决定怎么做,但有时候你非得告诉它改怎么做。否则...
  • SQL嵌套查询总结

    2020-09-14 14:27:09
    是我写的一个结合UINON的嵌套查询. 将五个方面的报表放到一个临时表里,再从临时表里,将所要的数据查询出来.
  • 嵌套查询 接着上一篇说 带有EXISTS谓词的查询 EXISTS:存在 带有EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 如果返回true,主查询会执行,返回false,主查询就不再执行。 因为...
  • 摘要:VC/C++源码,数据库应用,嵌套查询 VC++ SQL语句嵌套查询实例,嵌套的SQL 语句可以执行比较复杂的数据库操作,本源码介绍在INSERT 语句中嵌套使用SELECT语句。测试前请通过控制面板注册Access 数据源students,...
  • 查询嵌套在其他查询中的查询。 子查询的作用: 1、进行过滤: 实例1:检索订购物品TNT2的所有客户的ID = + 一般,在WHERE子句中对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能...
  • 查询游戏历史成绩最高分前100 Sql代码 SELECT ps.* FROM cdb_playsgame ps WHERE ps.credits=(select MAX(credits) FROM cdb_playsgame ps1 where ps.uid=ps1.uid AND ps.gametag=ps1.gametag) AND ps.gametag='...
  • 查询学生的选修课程情况 首先引入知识点:连接查询其实就是对于多个表进行笛卡尔积。 select Student.*,Sc.* from TEST.Student,TEST.SC where Student.Sno=Sc.Sno 上面的例子是等值查询,where的条件是‘=’ ,也...
  • 今天小编就为大家分享一篇laravel多条件查询方法(and,or嵌套查询),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 一、连接查询 连接查询:同时涉及两个以上的表的查询 [.] [.] 连接字段:连接条件中的列名称 如:Sno为上面例子中的连接字段 注意:连接字段类型必须是可比的,但名字不必相同 1.等值与非等值连接查询 (等值连接:...
  • 下午上次课学到了嵌套查询-3 今天我们来看一下 带有EXISTS谓词的子查询 3/20 15:30 EXISTS谓词: 存在量词 ∃ 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 若内层查询结果...
  • 学习了连接查询和嵌套查询。 今天启动SQL server,显示无法连接到服务器,重新打开软件还是一样,后来通过搜索重新启动了SQL server的服务,就可以了。 此电脑右键-管理-展开服务与应用程序,点击服务,右侧找到SQL ...
  • 摘要:C#源码,数据库应用,嵌套查询 C#实现SQLSERVER数据库的嵌套查询功能,快速的嵌套查询程序,数据库文件在Database文件夹中,测试前请先附加数据库文件,然后设置数据库连接信息,怎么附加和设置这里就不说了。
  • 数据查询2—连接查询:同时涉及两个以上的表的查询 连接条件:用来连接两个表的条件 [.] [.] 连接字段:连接条件中的列名称(注意:连接字段类型必须是可比的,但名字不必相同) 连接查询—(1)等值与非等值连接查询:...
  • 以下是课本上关于多表查询 操作的一些试题 老规矩,先写总结: 多表连接中注意事项和小结: 多表连接时候,当属性列在查询的多个表里面是唯一的就可以省略表名前缀,否则必须加上表名前缀; 一张表进行自身连接时,...
  • 包含多个数据实例,由简入繁,涉及各种函数的应用,多重完整嵌套查询。适合入门小白,面试知识点契合度高。
  • 数据库嵌套查询总结

    2017-12-14 13:12:32
    数据库嵌套查询总结 还有其他数据库使用总结,稍后上传
  • 1.作者是在校学生,利用课余时间精心整理平时数据库实验报告,希望能记录数据库的学习进展。 2. 本资源内容为:(1)熟练掌握...(2)掌握多表的连接查询与嵌套查询语句的正确写法和实验操作方法。 3. 欢迎参考交流!
  • 嵌套查询和集合查询

    2018-08-06 09:29:37
    数据库嵌套查询和集合查询,数据库嵌套查询和集合查询
  • MyBatis的嵌套查询解析

    2020-08-30 13:55:49
    本篇文章主要介绍了MyBatis的嵌套查询解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • HBU数据库 实验4 嵌套查询和数据更新 实验目的: 1.熟练掌握SQL Server查询分析器的使用方法,加深对标准SQL查询语句的理解。 2.熟练掌握简单表的数据嵌套查询和数据更新的操作方法。 实验内容: 创建教学管理...
  • 嵌套查询在数据库查询统计中的应用示例,Vb数据库嵌套查询操作实例源码。在本示例中可设置查询运算符,指定名称,指定条件选项,也就是可运用上部分的SQL操作符,比如“>”以及any等查询关键字,有VB6的用户,可打开...
  • 【3.60】查询所有选修了1号课程的学生姓名。 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno='1'); 带有EXIST谓词的子查询。带IN谓词,ANY和ALL 谓词的子...
  • 由EXISTS引出的子查询,其目标列表达式通常都用 * ,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义。 NOT EXISTS谓词: 若内层查询结果非空,则外层的WHERE子句返回假值 若内层查询结果为空,则外层的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 237,054
精华内容 94,821
关键字:

嵌套查询