Maison  >  Article  >  base de données  >  Explication détaillée des exemples d'utilisation de Existe dans SQL

Explication détaillée des exemples d'utilisation de Existe dans SQL

零下一度
零下一度original
2018-05-15 17:48:573040parcourir

Cet article présente principalement l'utilisation d'Exists en SQL. Il est très bon et a une valeur de référence. Les amis qui en ont besoin peuvent s'y référer

Par exemple, il y a une requête dans la base de données Northwind comme

. 🎜>
SELECT c.CustomerId,CompanyName FROM Customers c
WHERE EXISTS(
SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID)

Comment fonctionne EXISTS ici ? La sous-requête renvoie le champ OrderId, mais la requête externe recherche les champs CustomerID et CompanyName. Ces deux champs ne sont certainement pas dans OrderID. Comment correspondent-ils ?

EXISTS est utilisé pour vérifier si la sous-requête renverra au moins une ligne de données. La sous-requête ne renvoie réellement aucune donnée, mais renvoie True ou False.

EXISTS spécifie une sous-requête à détecter. existence de la ligne.

Syntaxe : sous-requête EXISTS

Paramètres : la sous-requête est une instruction SELECT restreinte (la clause COMPUTE et le mot-clé INTO ne sont pas autorisés).

Type de résultat : Booléen Renvoie VRAI si la sous-requête contient des lignes, FLASE sinon.

Exemple de table A : TableIn Exemple de table B : TableEx

(1) L'utilisation de NULL dans la sous-requête renvoie toujours le résultat. L'ensemble

select * from TableIn where exists(select null)

est équivalent à : select * from TableIn


(2). Notez que les deux requêtes renvoient les mêmes résultats.

select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME in(select BNAME from TableEx)

(3). Comparez les requêtes en utilisant EXISTS et = ANY. Notez que les deux requêtes renvoient les mêmes résultats.

select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME=ANY(select BNAME from TableEx)

NOT EXISTS fait exactement le contraire d'EXISTS. Si la sous-requête ne renvoie aucune ligne, la clause WHERE dans NOT EXISTS est satisfaite.

Conclusion :

La valeur de retour de la clause EXISTS (y compris NOT EXISTS) est une valeur BOOL. Il existe une instruction de sous-requête (SELECT ... FROM...) dans EXISTS, que j'appelle l'instruction de requête interne d'EXIST. L'instruction de requête qu'il contient renvoie un ensemble de résultats. La clause EXISTS renvoie une valeur booléenne selon que le jeu de résultats de l'instruction de requête qu'elle contient est vide ou non vide.

Une façon courante de le comprendre est la suivante : remplacez chaque ligne de la table de requête externe par la requête interne en tant que test. Si le résultat renvoyé par la requête interne est une valeur non nulle, la clause EXISTS renvoie TRUE. .Cette ligne peut être la ligne de résultat de la requête externe, sinon elle ne peut pas être utilisée comme résultat.

L'analyseur examinera d'abord le premier mot de l'instruction. Lorsqu'il constatera que le premier mot est le mot-clé SELECT, il passera au mot-clé FROM, puis trouvera le nom de la table via le mot-clé FROM et le mettra. La table est chargée en mémoire. L'étape suivante consiste à rechercher le mot-clé WHERE. S'il ne peut pas être trouvé, il reviendra à SELECT pour trouver l'analyse du champ. Si WHERE est trouvé, il analysera les conditions qu'il contient. Une fois terminé, il reviendra à SELECT pour. analyser le terrain. Enfin, une table virtuelle est formée.

Ce qui suit le mot clé WHERE est une expression conditionnelle. Une fois l'expression conditionnelle calculée, il y aura une valeur de retour, qui est différente de zéro ou 0. Non nulle signifie vrai (vrai) et 0 signifie faux (faux). De la même manière, la condition après WHERE a également une valeur de retour, vraie ou fausse, pour déterminer s'il faut exécuter SELECT ensuite.

L'analyseur trouve d'abord le mot-clé SELECT, puis passe au mot-clé FROM pour importer la table STUDENT dans la mémoire, et trouve le premier enregistrement via le pointeur, puis trouve le mot-clé WHERE pour calculer son expression conditionnelle, si c'est vrai, chargez ensuite cet enregistrement dans une table virtuelle et le pointeur pointe vers l'enregistrement suivant. Si faux, le pointeur pointe directement vers l’enregistrement suivant sans effectuer d’autres opérations. Récupérez toujours la table entière et renvoyez la table virtuelle récupérée à l'utilisateur. EXISTS fait partie d'une expression conditionnelle, qui a également une valeur de retour (vrai ou faux).

Avant d'insérer un enregistrement, vous devez vérifier si l'enregistrement existe déjà. L'opération d'insertion ne sera effectuée que lorsque l'enregistrement n'existe pas. Vous pouvez empêcher l'insertion d'enregistrements en double en utilisant l'instruction conditionnelle EXISTS.

INSERT INTO TableIn (ANAME,ASEX) 
SELECT top 1 '张三', '男' FROM TableIn
WHERE not exists (select * from TableIn where TableIn.AID = 7)

Concernant l'efficacité d'utilisation de EXISTS et IN, il est généralement plus efficace d'utiliser exist que in, car IN n'utilise pas d'indexation, mais l'utilisation spécifique dépend de la situation réelle :

IN Convient aux situations où l'apparence est grande mais la surface intérieure est petite ; EXISTS convient aux situations où l'apparence est petite mais la surface intérieure est grande.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn