7
votes

Mysql pas dans et n'existe pas la même chose?

J'ai parfois interchangé l'utilisation de pas dans et n'existe pas dans mes requêtes SQL et que les deux donnent le même résultat. La logique derrière le n'existe pas identique que pas dans ? Parce que je pense que pas dans ... (est évalué comme "ou" à l'intérieur des sous-requêtes) est égal à n'existe pas (qui est également évalué comme "ou") ? Ou est-ce que je manque quelque chose?


1 commentaires

4 Réponses :


16
votes

Cet article peut vous intéresser:

  • pas dans vs non pas existant vs rejoindre / est null: mysql

    en un mot, pas dans est légèrement différent de n'existe pas dans la manière dont les deux poignées null sont renvoyées par la sous-requête. < / p>

    S'il n'y a pas de valeur NULL , ils effectuent tous les deux une sorte de type sur LOOP NETHED ANTIC Joindre , mais pas dans est un peu plus efficace.


0 commentaires

5
votes

Non, ils ne sont pas les mêmes. La fonction dans la fonction se traduit par une série de ou des déclarations. En règle générale, cela déclenche des gens lorsqu'ils utilisent une sous-requête dans la fonction dans la fonction et que la requête renvoie au moins une valeur null. Par exemple. Col ​​non dans (Sélectionnez FOO à partir de la barre) Code>. Cela compare col foo code> pour chaque ligne. Si l'une des valeurs de FOO est null, vous obtenez col null code> et la déclaration complète renvoie false résultant en aucune ligne.

existe simplement détermine si des lignes de la sous-requête sont retournées (non Existe d'être qu'aucune ligne de rangée ne peut être retournée). La clause SELECT est entièrement ignorée. p>


Exemple: p>

Select Id
From Test
Where Not Exists( Select 1 From Bar Where Foo = Id )


4 commentaires

Mais pourquoi le résultat est-il toujours le même?


Quand le résultat n'est-il pas le même?


@newbie - Non. Ils ne sont pas toujours les mêmes. Si dans notre exemple ci-dessus, il y a une valeur de FOO NULL, notre pas d'expression n'entraînera pas la requête externe qui ne renvoie aucune ligne de lignes. Toutefois, si nous utilisons une sous-requête corrélée à l'exist (par exemple, existe (sélectionnez * à partir de la barre où FOO = OUTERTABLECOL) ), et l'une des valeurs de FOO est null et aucune valeur ne correspond à notre OUTERTABLECOL, La requête extérieure retournera des rangées.


@Newbie - J'ai élargi ma réponse pour illustrer la manière dont vous pourriez obtenir un résultat différent.



2
votes

Les deux vous donneront les mêmes résultats. Il n'existe pas d'une sous-requête corrélée, elle est jointe à la requête principale. Dans l'exemple ci-dessous, il ne doit pas exister de fonctionner plus rapidement sur un grand jeu de données.

Rechercher des produits sans commandes. P>

select *
  from Products
 where ProductId NOT IN (select ProductId FROM Orders)

select *
  from Products
 where NOT EXISTS (select 1 FROM Orders WHERE orders.ProductId = Products.Id)


2 commentaires

Pas vrai si le produit contient des nuls.


@THOMAS - Bon point, merci de me rappeler la possibilité de null.



-1
votes

n'existe pas et pas en fonction de la même manière.

Par exemple: P>

SELECT Id
FROM Test
WHERE NOT EXISTS( SELECT foo FROM Bar WHERE Foo = Id ); 


0 commentaires