MySQL Gestion des valeurs NULL

Nous savons déjà que MySQL utilise la commandeSELECTet la clauseWHEREpour lire les données dans la table de données, mais lorsque le champ de condition de requête fourni est NULL, la commande peut ne pas fonctionner correctement.

Dans MySQL, NULL est utilisé pour représenter des données manquantes ou inconnues. La gestion des valeurs NULL nécessite une attention particulière car dans la base de données, elle peut produire des résultats différents de ceux attendus.

Pour gérer cette situation, MySQL fournit trois opérateurs principaux:

  • IS NULL:Lorsque la valeur de la colonne est NULL, cet opérateur renvoie true.
  • IS NOT NULL:Lorsque la valeur de la colonne n'est pas NULL, l'opérateur renvoie true.
  • <=>:Opérateur de comparaison (contrairement à l'opérateur =), qui renvoie vrai lorsque les deux valeurs comparées sont égales ou lorsque les deux sont NULL.

L'opération de comparaison conditionnelle pour NULL est spéciale. Vous ne pouvez pas utiliser = NULL ou != NULL pour trouver des valeurs NULL dans une colonne.

Dans MySQL, comparer NULL avec toute autre valeur (même NULL) renvoie toujours NULL, c'est-à-dire que NULL = NULL renvoie NULL.

Dans MySQL, utilisez les opérateurs IS NULL et IS NOT NULL pour gérer NULL.

Remarque :

select * , columnName1+ifnull(columnName2,0) from tableName;

columnName1 et columnName2 sont de type int. Lorsque columnName2 a une valeur NULL, columnName1 + columnName2 = NULL. ifnull(columnName2,0) convertit la valeur NULL dans columnName2 en 0.

Considérations et conseils courants pour gérer les valeurs NULL dans MySQL

1. Vérifier si c'est NULL :

Pour vérifier si une colonne est NULL, vous pouvez utiliser les conditions IS NULL ou IS NOT NULL.

SELECT * FROM employees WHERE department_id IS NULL;
SELECT * FROM employees WHERE department_id IS NOT NULL;

2. Utiliser la fonction COALESCE pour gérer NULL :

La fonction COALESCE peut être utilisée pour remplacer les valeurs NULL. Elle accepte plusieurs arguments et renvoie la première valeur non NULL dans la liste d'arguments :

SELECT product_name, COALESCE(stock_quantity, 0) AS actual_quantity
FROM products;

Dans l'instruction SQL ci-dessus, si la colonne stock_quantity est NULL, COALESCE renverra 0.

3. Utiliser la fonction IFNULL pour gérer NULL :

La fonction IFNULL est la version spécifique de COALESCE dans MySQL. Elle accepte deux arguments ; si le premier argument est NULL, elle renvoie le second argument.

SELECT product_name, IFNULL(stock_quantity, 0) AS actual_quantity
FROM products;

4. Tri des valeurs NULL :

Lors d'un tri avec la clause ORDER BY, les valeurs NULL sont placées à la fin du tri par défaut. Si vous souhaitez placer les valeurs NULL en premier, utilisez ORDER BY column_name ASC NULLS FIRST ; inversement, utilisez ORDER BY column_name DESC NULLS LAST.

SELECT product_name, price
FROM products
ORDER BY price ASC NULLS FIRST;

5. Utilisez l'opérateur <=> pour la comparaison avec NULL :

L'opérateur <=> est un opérateur spécial dans MySQL utilisé pour comparer si deux expressions sont égales. Il renvoie également TRUE pour les comparaisons impliquant des valeurs NULL. Il peut être utilisé pour les comparaisons d'égalité avec des valeurs NULL.

SELECT * FROM employees WHERE commission <=> NULL;

6. Remarquez comment les fonctions d'agrégation gèrent NULL :

Lors de l'utilisation de fonctions d'agrégation (telles que COUNT, SUM, AVG), elles ignorent les valeurs NULL, ce qui peut conduire à des résultats inattendus. Si vous souhaitez traiter NULL comme 0, vous pouvez utiliser COALESCE ou IFNULL.

SELECT AVG(COALESCE(salary, 0)) AS avg_salary FROM employees;

Ainsi, même si salary est NULL, la fonction d'agrégation le traitera comme 0.

Lors du traitement des valeurs NULL, soyez particulièrement prudent pour vous assurer que la sémantique des requêtes et des opérations correspond aux attentes. Lors de la conception de structures de table, vous devez également tenir compte des scénarios d'utilisation et de la pertinence des valeurs NULL.


Utilisation des valeurs NULL dans l'invite de commandes

Dans l'exemple suivant, supposez que la table example_test_tbl de la base de données EXAMPLE possède deux colonnes, example_author et example_count, et que des valeurs NULL sont insérées dans example_count.

Exemple

Essayez l'exemple suivant :

Créer la table de données example_test_tbl

root@host# mysql -u root -p password; Entrez mot de passe:******* mysql> use EXAMPLE; Base de données modifiée mysql> create table example_test_tbl -> ( -> example_author varchar(40) NOT NULL, -> example_count INT -> ); Requête OK, 0 lignes affectées (0.05 sec) mysql> INSERT INTO example_test_tbl (example_author, example_count) values ('EXAMPLE', 20); mysql> INSERT INTO example_test_tbl (example_author, example_count) values ('Tutoriel d'exemple', NULL); mysql> INSERT INTO example_test_tbl (example_author, example_count) values ('Google', NULL); mysql> INSERT INTO example_test_tbl (example_author, example_count) values ('FK', 20); mysql> SELECT * from example_test_tbl; +---------------+--------------+ | example_author | example_count | +---------------+--------------+ | EXEMPLE | 20| | Tutoriel d'exemple |NULL | | Google | NULL | | FK | 20 | +---------------+--------------+ 4 lignes dans le jeu (0.01 sec)

Dans l'exemple suivant, vous pouvez voir que les opérateurs = et != ne sont pas efficaces :

mysql> SELECT * FROM example_test_tbl WHERE example_count = NULL; Ensemble vide (0.00 sec) mysql> SELECT * FROM example_test_tbl WHERE example_count != NULL; Ensemble vide (0.01 sec)

Pour déterminer si la colonne example_test_tbl de la table de données est NULL, vous devez utiliserIS NULLetIS NOT NULL, comme dans l'exemple suivant :

mysql> SELECT * FROM example_test_tbl WHERE example_count IS NULL; +---------------+--------------+ | example_author | example_count| +---------------+--------------+ | Tutoriel d'exemple |NULL | | Google | NULL | +---------------+--------------+ 2 lignes dans le jeu (0.01 sec) mysql> SELECT * from example_test_tbl WHERE example_count IS NOT NULL; +---------------+--------------+ | example_author | example_count | +---------------+--------------+ | EXAMPLE | 20 | | FK | 20 | +---------------+--------------+ 2 lignes dans le jeu (0.01 sec)

Utilisation de scripts PHP pour gérer les valeurs NULL

Dans les scripts PHP, vous pouvez utiliser des instructions if...else pour déterminer si une variable est vide, et générer les instructions conditionnelles correspondantes.

Dans l'exemple suivant, PHP définit la variable $example_count, puis utilise cette variable pour comparer avec le champ example_count dans la table de données :

Test de MySQL ORDER BY :

<?php $dbhost = 'localhost'; //adresse de l'hôte du serveur MySQL $dbuser = 'root'; //nom d'utilisateur MySQL $dbpass = '123456'; //mot de passe de l'utilisateur MySQL $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Connexion échouée :' . mysqli_error($conn)); } //Définir l'encodage pour éviter les caractères chinois corrompus mysqli_query($conn , "set names utf8"); if( isset($example_count )) { $sql = "SELECT example_author, example_count FROM example_test_tbl WHERE example_count = $example_count"; } else { $sql = "SELECT example_author, example_count FROM example_test_tbl WHERE example_count IS NULL"; } mysqli_select_db( $conn, 'EXAMPLE' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('Impossible de lire les données :' . mysqli_error($conn)); } echo '<h2>Exemple de tutoriel sur le test IS NULL<h2>'; echo '<table border="1"><tr><td>Auteur</td><td>Nombre de connexions</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQL_ASSOC)) { echo "<tr>". "<td>{$row['example_author']} </td> ". "<td>{$row['example_count']} </td> ". "</tr>"; } echo '</table>'; mysqli_close($conn); ?>

Le résultat de sortie est présenté dans la figure suivante :

Autres extensions