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 条件句防止插入重复记录。

  • 相关阅读:
    POJ 3140 Contestants Division (树dp)
    POJ 3107 Godfather (树重心)
    POJ 1655 Balancing Act (树的重心)
    HDU 3534 Tree (经典树形dp)
    HDU 1561 The more, The Better (树形dp)
    HDU 1011 Starship Troopers (树dp)
    Light oj 1085
    Light oj 1013
    Light oj 1134
    FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869
  • 原文地址:https://www.cnblogs.com/zhihow/p/9059570.html
Copyright © 2011-2022 走看看