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

Quoi utiliser à la place de dans MySQL

青灯夜游
Libérer: 2022-06-16 17:03:57
original
9136 Les gens l'ont consulté

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);
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion

est équivalente à.

select * from user where userId = 1 or userId = 2 or userId = 3;
Copier après la connexion

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);
Copier après la connexion

mais pas

select * from user where userId != 1 and userId != 2 and userId != 3;
Copier après la connexion

, 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);
Copier après la connexion

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);
Copier après la connexion

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;
Copier après la connexion
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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal