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);
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);
select * from user where userId = 1 or userId = 2 or userId = 3;
select * from user where userId not in (1, 2, 3);
select * from user where userId != 1 and userId != 2 and userId != 3;
select * from user where userId in (select id from B);
select * from user where userId in (select id, age from B);
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!