Maison > Article > base de données > Quoi utiliser à la place de dans MySQL
Dans Mysql, exist est utilisé à la place de in ; la condition est vraie et la boucle actuelle vers cet enregistrement.
L'environnement d'exploitation de ce tutoriel : système windows7, version mysql8, ordinateur Dell G3.
exists utilise une boucle pour interroger la table externe une par une. Chaque requête vérifiera l'instruction conditionnelle d'existe lorsque l'instruction conditionnelle existe peut renvoyer la ligne d'enregistrement (quel que soit le nombre de lignes d'enregistrement, comme). tant qu'il peut être renvoyé), la condition est Si vrai, l'enregistrement dans la boucle actuelle est renvoyé. Sinon, si l'instruction conditionnelle dans exist ne peut pas renvoyer la ligne d'enregistrement, l'enregistrement dans la boucle actuelle est ignoré. est comme une condition booléenne Lorsque l'ensemble de résultats peut être renvoyé, est vrai, si l'ensemble de résultats ne peut pas être renvoyé, il est faux
comme suit :
select * from user where exists (select 1);
supprime les enregistrements du. table utilisateur un par un. Puisque select 1 dans la sous-condition peut toujours renvoyer des lignes d'enregistrement, alors la table utilisateur Tous les enregistrements seront ajoutés à l'ensemble de résultats, c'est donc la même chose que select * from user
et comme suitselect * from user where exists (select * from user where userId = 0);Vous pouvez savoir que lors de la boucle de la table utilisateur, vérifiez l'instruction conditionnelle (sélectionnez * from user où userId = 0), puisque userId n'est jamais 0, l'instruction conditionnelle renverra toujours le vide défini, et la condition sera toujours fausse, alors tous les enregistrements de la table utilisateur seront supprimés ne pas exister est l'opposé de existe, et aussi Autrement dit, lorsque la condition existe renvoie un ensemble de résultats, la boucle les enregistrements seront supprimés, sinon les enregistrements en boucle seront ajoutés à l'ensemble de résultats En général, si la table A a n enregistrements, alors la requête existe est Supprimez ces n enregistrements un par un, puis jugez le existe une condition n fois
dans la requête qui équivaut à la superposition de plusieurs ou conditions C'est plus facile à comprendre, comme la requête suivante
select * from user where userId in (1, 2, 3);est équivalente à.
select * from user where userId = 1 or userId = 2 or userId = 3;not in est l'opposé de in, comme suit Tous les enregistrements de Le résultat de retour de la sous-condition ne doivent avoir qu'un seul champ, tel que
select * from user where userId not in (1, 2, 3);mais pas
select * from user where userId != 1 and userId != 2 and userId != 3;, tandis que l'existe n'a pas cette restriction Considérons les performances de l'existe et ci-dessousConsidérons les instructions SQL suivantes1 : sélectionnez * depuis A où existe (sélectionnez * à partir de B où B.id = A.id);2 : sélectionnez * à partir de A où A.id dans (sélectionnez l'identifiant à partir de B);Requête 1. Vous peut convertir le pseudo-code suivant pour faciliter la compréhension.
select * from user where userId in (select id from B);signifie probablement cela. En fait, vous pouvez voir que la requête 1 est principalement utilisée. L'index de la table A devrait avoir peu d'impact sur l'efficacité. de la requête Supposons que tous les identifiants de la table B soient 1, 2, 3, la requête 2 peut être convertie en
select * from user where userId in (select id, age from B);ceci C'est facile à comprendre L'index de A est principalement utilisé. ici. Comment la table B a peu d'impact sur la requêteRegardons not exist et not in1
2.
En regardant la requête 1, c'est toujours la même chose que ci-dessus, en utilisant l'index de B Pour la requête 2, elle peut être convertie en l'instruction suivantefor ($i = 0; $i < count(A); $i++) { $a = get_record(A, $i); #从A表逐条获取记录 if (B.id = $a[id]) #如果子条件成立 $result[] = $a; } return $result;
select * from A where not exists (select * from B where B.id = A.id);
Vous pouvez savoir. that not in est une requête de plage. Cette requête de plage != ne peut utiliser aucun index. Cela signifie que chaque enregistrement de la table A doit être parcouru une fois dans la table B pour vérifier si cet enregistrement existe dans la table B Par conséquent, not exist est plus efficace que not inselect * from A where A.id not in (select id from B);
.
Si l'une des deux tables est plus petite et l'autre est une grande table, une utilisation existe pour la plus grande table de sous-requête et pour la plus petite table de sous-requête :
Par exemple : Table A (petite table ), Table B (grande table)
select * from A où cc in (select cc from B) est inefficace et utilise l'index de la colonne cc sur la table A ;
select * from A Where Existe (select cc from B Where cc=A.cc) est efficace et utilise l'index de la colonne cc du tableau B. Le contraire2 : select * from B which cc in (select cc from A) est très efficace et utilise l'index de la colonne cc du tableau B ; select * from B Where Existe (select cc from A Where cc=B.cc) est inefficace et utilise l'index de la colonne cc du tableau A. not in et not exist. Si l'instruction de requête utilise not in, alors la table entière sera analysée à la fois sur les tables internes et externes sans utiliser l'index et la sous-requête de not extsts peut toujours utiliser l'index ; sur la table.Donc, quelle que soit la taille de la table, utiliser not exist est plus rapide que not in
. La différence entre in et = sélectionnez le nom de l'élève où le nom est dans ('zhang','wang','li','zhao' etsélectionnez le nom de l'élève où name='zhang' ou name='li' ou name='wang' ou name='zhao'
Les résultats sont les mêmes.Tutoriel recommandé : Tutoriel vidéo MySQL
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!