SQL中EXISTS的使用

news/2024/7/23 10:42:39 标签: EXISTS

exists : 强调的是是否返回结果集

  • 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。
  • 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS 的子查询就是相关子查询
关键词意思返回结果判断
EXISTS若子查询的结果集非空时,返回“True”当为ture时,主查询返回结果
NOT EXISTS若子查询结果为空,返回“True”当为ture时,主查询返回结果

Exists执行的流程

Exists首先执行外层查询,再执行内存查询,与IN相反。 流程为首先取出外层中的第 一元组, 再执行内层查询,将外层表的第一元组代入,若内层查询为真,即有结果时。返回外层表中的第一元组,接着取出第二元组,执行相同的算法。一直到扫描完外层整表

类似java:

for(int i =0;  i<>EOFout;i++) {
    for (int j = 0 ; j<EOFint,j++) {

    }
}

IN 查询和 EXISTS 查询,返回结果相同
in查询,先执行内层查询

SELECT 姓名 
FROM 学生表 
WHERE 学号 IN (SELECT 学号 FROM 选课表 WHERE 课程号 = 'C1'); 

等价于 下面EXISTS 查询(先执行外层查询)

SELECT 姓名
FROM 学生表
WHERE EXISTS    
(
    SELECT * 
    FROM 选课表
    WHERE 学生表.学号 = 选课表.学号 AND 课程号 = 'C1' 
);

在子查询中使用 NULL 仍然返回结果集

select * from table where exists(select null)
等同于: select * from table 

EXISTS 和 = ANY 的查询,返回结果相同

select * from 学生表 where exists(select 选课表.学号 from 选课表 where 选课表.学号=学生表.学号)
select * from 学生表 where 学生表.学号=ANY(select 选课表.学号 from 选课表)

查询年龄最大的学生

SELECT * 
FROM 学生表 user1
    WHERE not EXISTS (
        SELECT 1 
        FROM 学生表 user2
        WHERE
        user1.age < user2.age
    )

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

SELECT 姓名
FROM 学生表
WHERE NOT EXISTS (
    SELECT *
    FROM 课程表
    WHERE NOT EXISTS (
       SELECT *
       FROM 选课表
       WHERE 学生表.学号 = 选课表.学号 AND 课程表.课程号 = 选课表.课程号
    )
);

查询至少选修了S1所选的全部课程的学生名

SELECT 姓名
FROM 学生表
WHERE NOT EXISTS ( 
    SELECT *
    FROM 选课表 AS 选课表X            
    WHERE 选课表X.学号='s1' AND NOT EXISTS  (
        SELECT *
        FROM 选课表 AS 选课表Y
        WHERE  学生表.学号 = 选课表Y.学号 AND 选课表X.课程号 = 选课表Y.课程号
    )
);

在FROM语句中使用子查询,对查询结果定义表名及列名

SELECT 学号, AVG_G
FROM  (
    SELECT 学号, AVG(Grade)
    FROM 选课表
    GROUP BY 学号 
) AS RA(学号, AVG_G)
WHERE AVG_G > 80 

http://www.niftyadmin.cn/n/1066741.html

相关文章

C#学习笔记:结构变量中的作用域

staticvoidmain(){ inti; for(i0;i<10;i) { stringtext"Line"Covert.ToString(i); Console.WriteLine("{0}",text); } Console.WriteLine("Last text output in loop:{0}",text); Console.ReadKey();}字符串常量text是…

Heibernate主键生成策略

1、assigned 主键由外部程序负责生成&#xff0c;在 save() 之前必须指定一个。Hibernate不负责维护主键生成。与Hibernate和底层数据库都无关&#xff0c;可以跨数据库。在存储对象前&#xff0c;必须要使用主键的setter方法给主键赋值&#xff0c;至于这个值怎么生成&#xf…

【windows phone】启动器与选择器之CameraCaptureTask和PhotoChooserTask【转】

一、CameraCaptureTask选择器。 它用于启动照相机&#xff0c;当你拍下照片后&#xff0c;自动把照的字节流返回给调用方应用程序。前文说过&#xff0c;启动器和选择的使用方法和步骤都是一样的。对于CameraCaptureTask组件也如此&#xff0c;不过注意的一点是&#xff0c;处理…

SPring中quartz的配置(可以用实现邮件定时发送,任务定时执行,网站定时更新等)...

http://www.cnblogs.com/kay/archive/2007/11/02/947372.html 邮件或任务多次发送或执行的问题&#xff1a; 1.<property name"concurrent" value"false" />可以用于防止任务多次执行 2.将quartz的配置单独出来&#xff0c;防止tomcat加载spring. 具…

shiro 与 web 的结合

本次使用的jar包为 shiro-core-1.2.4.jar shiro-web-1.2.4.jar 从Shiro 1.2开始引入了Environment/WebEnvironment的概念&#xff0c;即由它们的实现提供相应的SecurityManager及其相应的依赖。ShiroFilter会自动找到Environment然后获取相应的依赖。 <listener> <li…

js实现页面打印

文章目录window.print()document.execCommand("print")iframe中打印JQuery插件HttpPrinter打印控件打印预览js有多种方式实现打印window.print() window.print();会弹出打印对话框&#xff0c;打印的是window.document.body.innerHTML中的内容,但是iframe中无法使用…

在Windows mobile中学习串口编程

点击此处下载源代码编制按&#xff1a;本文学习在Windows Mobile中学习串口编程的基本技术using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms; namespace cha…

poj模拟1013

模拟&#xff0c;定义两个数组&#xff0c;visited[]&#xff0c;用于记录改点时候为真和w[]&#xff0c;用于记录该店被怀疑的次数&#xff0c;或是出现在不相等中的次数&#xff1b;每当出现up或down时&#xff0c;对相比较的两个数组中的点对应的w[]相应的或是--&#xff1b…