HOWTO · MySQL
Vérifier si une ligne existe dans MySQL avec EXISTS et IF()
Vérifiez si une ligne correspond à une condition dans MySQL avec EXISTS, puis utilisez IF() pour renvoyer un résultat lisible.
Sur cette page
Pour vérifier si une ligne existe dans MySQL, utilisez le prédicat EXISTS avec une sous-requête. Il est vrai lorsque la sous-requête renvoie au moins une ligne. Placez-le dans la fonction IF() de MySQL pour choisir une valeur telle que Yes, exists ou No, does not exist. Ce guide couvre le prédicat EXISTS et la fonction IF() ; IF EXISTS dans une instruction DDL est une syntaxe distincte.
Les exemples MySQL utilisent une petite table student_details. Exécutez ces instructions de préparation dans une session MySQL avant d’essayer les requêtes :
CREATE TABLE student_details (stu_id INT PRIMARY KEY, stu_firstName VARCHAR(255), stu_lastName VARCHAR(255));
INSERT INTO student_details (stu_id, stu_firstName, stu_lastName) VALUES (1, 'Preet', 'Sanghavi'), (2, 'Rich', 'John'), (3, 'Veron', 'Brow'), (4, 'Geo', 'Jos'), (5, 'Hash', 'Shah'), (6, 'Sachin', 'Parker'), (7, 'David', 'Miller');
Cet exemple Python autonome utilise la bibliothèque intégrée de SQLite pour vérifier l’ID 4. La sortie observée est affichée ci-dessous ; les requêtes MySQL de ce guide doivent être exécutées dans MySQL.
import sqlite3
connection = sqlite3.connect(":memory:")
connection.execute("CREATE TABLE student_details (stu_id INTEGER PRIMARY KEY)")
connection.executemany(
"INSERT INTO student_details (stu_id) VALUES (?)",
[(1,), (2,), (3,), (4,)],
)
result = connection.execute(
"SELECT EXISTS (SELECT 1 FROM student_details WHERE stu_id = ?)", (4,)
).fetchone()[0]
print(result)
connection.close()
1
Utilisation de base de l’opérateur EXISTS dans MySQL
EXISTS teste si sa sous-requête renvoie une ligne. Les valeurs sélectionnées dans la sous-requête ne deviennent pas le résultat ; SELECT 1 rend cet objectif clair. Dans MySQL, vérifiez l’ID 4 avec :
SELECT EXISTS (SELECT 1 FROM student_details WHERE stu_id = 4) AS RESULT;
Le résultat est 1 car la table d’exemple contient stu_id = 4. Changez la condition en stu_id = 11 et elle renvoie 0. Ces résultats MySQL attendus découlent des données de préparation ; l’exemple Python ci-dessus démontre le prédicat dans SQLite, et non dans MySQL.
La condition vérifie stu_id, quelle que soit la valeur du prénom. Le même prédicat peut être utilisé dans une instruction SELECT, UPDATE, DELETE ou INSERT plus grande lorsqu’un test d’existence convient à l’opération. Pour un résultat de requête par oui ou par non, SELECT EXISTS (...) renvoie la valeur numérique vrai ou faux de MySQL.
SELECT EXISTS (...) renvoie une ligne contenant 1 ou 0, ce qui est utile lorsque l’application a besoin d’une seule valeur oui ou non. Pour ne renvoyer que les lignes d’une autre table qui ont une correspondance associée, placez EXISTS dans la clause WHERE de la requête externe. Par exemple, SELECT c.customer_id FROM customers AS c WHERE EXISTS (SELECT 1 FROM orders AS o WHERE o.customer_id = c.customer_id); renvoie les clients ayant au moins une commande correspondante. La référence à c.customer_id rend la sous-requête corrélée à chaque ligne de client candidate. Utilisez les noms de tables et de clés de votre propre schéma.
Utilisation de IF() avec EXISTS dans MySQL
IF(condition, value_if_true, value_if_false) de MySQL choisit l’une de deux valeurs. Utilisez EXISTS comme sa condition pour renvoyer un résultat lisible pour l’ID 4 : IF() est utile lorsqu’une requête doit renvoyer directement une étiquette ou une autre valeur ; il ne change pas les lignes sélectionnées, sauf si son résultat est utilisé dans une condition de filtrage. Les deux arguments de résultat peuvent être des chaînes, des nombres ou d’autres expressions compatibles.
SELECT IF(EXISTS (SELECT 1 FROM student_details WHERE stu_id = 4), 'Yes, exists', 'No, does not exist') AS RESULT;
Avec la ligne d’exemple pour l’ID 4, RESULT vaut Yes, exists. Pour un ID manquant tel que 11, changez la condition en stu_id = 11 ; RESULT vaut No, does not exist. Ces valeurs attendues découlent des lignes d’exemple et de la sémantique des expressions de MySQL ; la démonstration SQLite n’exécute pas la fonction IF() de MySQL.
RESULT est un alias de colonne qui étiquette la valeur renvoyée. Modifiez la condition WHERE de la sous-requête pour vérifier un autre ID ou critère, et utilisez des noms de colonnes correspondant à votre table. Pour une requête plus grande, inspectez son plan et mesurez-le avec vos données et vos index. Le coût dépend de la requête et du schéma, il n’existe donc pas de règle générale selon laquelle EXISTS serait toujours lent ou devrait être réexécuté d’une manière fixe pour chaque ligne externe.