zoukankan      html  css  js  c++  java
  • SQL语句之EXSITS谓词

    SQL语句十分重要,然而在我SQL语句的学习过程中始终有一篇雷区--EXSITS谓词。一直没有理解到EXISTS谓词的使用方法。今天终于弄懂了一点,所以记在了这里。

    先来看一看教材上的说法:带有EXISTS谓词的子查询不反回任何数据,只产生逻辑真值“true”或逻辑假值“false”。使用存在量词EXISTS后,若内层查询结果非空,则外层的WHERE子句返回真值,否则返回假值。

    看完后还是不懂,究竟这个返回的真值假值对于我外层的查询有个什么约束呢?

    举个例子:

    现在有一个学生表,和一个选课表。非常常见的表了,所以表里面的字段就不一一赘述了。

    来看需求:查询所有选修了1号课程的学生姓名。

    这个需求平时我会很快地想到连接查询很快搞定:

    SELECT student.name

    FROM student,sc

    WHERE stu.sno=sc.sno

    AND sc.cno='1'; 

    还可以用嵌套查询:

    SELECT name 

    FROM student

    WHERE sno IN(

    SELECT sno FROM sc WHERE cno='1'

    )

    这样写确实也能查出结果,但是我们都知道连接查询在性能上来说是很差的,会给数据库带来很大的压力。

    而使用EXISTS效率比IN要好,它门的作用都差不多:

    SELECT student.name

    FROM student

    WHERE ESXITS(

    SELECT * FROM sc WHERE

    sno=student.sno AND cno='1'

    )

    EXISTS的作用是什么呢?

    可以将sql查询理解成一条一条地查询的,对于每一条记录的查询,只要EXISTS字句有结果返回,那么这一个条件就成立了。

    以上纯属个人理解,欢迎指正!

    参考了 https://www.cnblogs.com/xuanhai/p/5810918.html的博客内容:

    EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT ... FROM...), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

    一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。


    分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,指针再指向下一条记录。如果为假那么指针直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把检索出来的虚拟表返回给用户。EXISTS是条件表达式的一部分,它也有一个返回值(true或false)。

    在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。

  • 相关阅读:
    Cf的一些总结
    Goodbye 2019
    牛客多校第8场 A题
    19牛客多校第二场 H题
    Hihocoder1673
    记一次根据图片原尺寸设置样式,并进行缩放和拖拽
    鱼骨时间轴案例(转自CSDN,原文链接附于文中)
    jQuery横向上下排列鱼骨图形式信息展示代码时光轴样式(转自CSDN,原文链接附于文中)
    mxGraph实现鱼骨图(因果图)(转自CSDN,链接附于文中)
    erlang win64位包下载链接
  • 原文地址:https://www.cnblogs.com/zhihow/p/9059570.html
Copyright © 2011-2022 走看看