J'ai essayé avec des requêtes ci-dessous et peu confus au sujet du fonctionnement de la clause EXISTS
, bien que je sache qu'elle évalue TRUE/FALSE
.
La sous-requête SQL n ° 1 ci-dessous renvoie de toute façon 0, mais le résultat de la requête combinée est toujours 1.
1. SELECT 1 WHERE EXISTS ( SELECT 0 WHERE 1 = 1 ) 2. SELECT 1 WHERE EXISTS ( SELECT 0 WHERE 1 = 0 )
En outre, si la clause EXISTS
évalue TRUE/FALSE
, alors pourquoi le paramètre ci-dessous ne fonctionne-t-il pas?
SELECT 1 WHERE EXISTS ( 1 )
S'il vous plaît, aidez-moi à comprendre cette situation.
EDIT: La clause EXISTS
évaluée sur TRUE/FALSE
. La condition est TRUE
si une sous-requête renvoie un résultat. Alors pourquoi EXISTS ( 1 )
ne fonctionne pas? C'est une condition TRUE
.
De la documentation EXISTS :
Spécifie une sous-requête à tester pour l'existence de lignes.
SELECT 1 WHERE EXISTS ( SELECT 0 WHERE 1 = 1 ) -- there is row SELECT 1 WHERE EXISTS ( SELECT 0 WHERE 1 = 0 ) -- no row returned by subquery SELECT 1 WHERE EXISTS ( 1 ) -- not even valid query `1` is not subquery
Gardez à l'esprit qu'il vérifie les lignes et non les valeurs:
SELECT 1 WHERE EXISTS ( SELECT NULL WHERE 1 = 1 ) -- will return 1
LiveDemo
MODIFIER:
Cela semble contradictoire avec la phrase "EXISTS clause evalue for TRUE / FALSE"?
EXISTS
opérateur EXISTS
teste l'existence de lignes et renvoie TRUE/FALSE
.
Donc, si la sous-requête returnne:
╔══════════╗ ╔══════════╗ ╔══════════╗ ╔══════════╗ ║ subquery ║ ║ subquery ║ ║ subquery ║ ║ subquery ║ ╠══════════╣ ╠══════════╣ ╠══════════╣ ╠══════════╣ ║ NULL ║ ║ 1 ║ ║ 0 ║ ║anything ║ ╚══════════╝ ╚══════════╝ ╚══════════╝ ╚══════════╝
Alors EXISTS (subquery)
-> TRUE
.
Si la sous-requête renvoie (pas de ligne):
╔══════════╗ ║ subquery ║ ╚══════════╝
Alors EXISTS (subquery)
-> FALSE
.
EXISTS renvoie true lorsque la sous-requête à l'intérieur de celle-ci contient des lignes. Une manière logiquement équivalente (mais non recommandée) de réécrire une expression EXISTS est:
SELECT 1 WHERE (SELECT COUNT(*) FROM (SELECT 0 WHERE 1 = 1)) > 0
Dans cette réécriture, votre dernière requête ressemble à:
SELECT 1 WHERE (SELECT COUNT(*) FROM 1) > 0
que vous devriez voir n'a pas de sens.
Comportement:
Condition Is true if ... ---------- ------------------ EXISTS the subquery returns at least one row NOT EXISTS the subquery returns no data
Usage:
WHERE EXISTS ( subquery ); WHERE NOT EXISTS ( subquery );