Maison  >  Article  >  base de données  >  Quoi utiliser à la place de dans MySQL

Quoi utiliser à la place de dans MySQL

青灯夜游
青灯夜游original
2020-10-05 10:04:189059parcourir

Dans Mysql, exist est utilisé à la place de in ; la condition est vraie et la boucle actuelle vers cet enregistrement.

Quoi utiliser à la place de dans MySQL

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 suit

select * 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-dessous

Considérons les instructions SQL suivantes

1 : 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ête

Regardons not exist et not in

1

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 suivante

for ($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);

L'instruction in dans mysql est une connexion de hachage entre la table externe et la table interne, tandis que l'instruction exist est une boucle en boucle sur la table externe, et à chaque fois la boucle boucles, la table interne est Faire une enquête. Tout le monde a toujours cru que l'existence était plus efficace que l'affirmation in. Cette affirmation est en réalité inexacte. Cela dépend de l'environnement.

Si les deux tables interrogées sont de même taille, il n'y a pas beaucoup de différence entre utiliser dans et existe

.

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)

1 :

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 contraire

2 :

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'

et

sé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!

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