Explication des valeurs SQL NULL : IS NULL, COALESCE, NULLIF et les pièges à éviter

  1. Accueil
  2. Blog
  3. Bases de données et SQL

Bases de données et SQL

Explication des valeurs SQL NULL : IS NULL, COALESCE, NULLIF et les pièges à éviter

NULL provoque certains des bogues les plus silencieux de SQL, avec des requêtes qui s’exécutent sans erreur mais perdent des lignes ou faussent les moyennes. Découvrez comment NULL se comporte réellement, avec des exemples testés, et comment le gérer en toute sécurité.

9 min de lecture
Explication des valeurs SQL NULL : IS NULL, COALESCE, NULLIF et les pièges à éviter

À retenir

  • NULL signifie une valeur manquante ou inconnue. Ce n’est pas zéro et ce n’est pas une chaîne vide.
  • Testez-le avec IS NULL, car = NULL ne correspond jamais à rien.
  • La plupart des calculs avec NULL donnent NULL, et WHERE ne conserve que les lignes qui sont définitivement vraies.
  • Les agrégats ignorent les valeurs NULL, ce qui peut modifier discrètement une moyenne.

Une requête s’exécute sans erreur et renvoie un nombre qui semble raisonnable, mais des lignes manquent et la moyenne est fausse. Les valeurs SQL NULL en sont très souvent la cause. NULL ne se comporte pas comme n’importe quelle valeur normale, ce qui surprend aussi bien les développeurs débutants que expérimentés.

Ce guide montre exactement comment NULL se comporte. Nous avons exécuté chaque requête dans SQLite 3.50 et les résultats affichés proviennent de cette exécution. La plupart de ce comportement est du SQL standard, et nous notons les différences entre les bases de données, comme l’ordre de tri NULL et le traitement des chaînes vides par Oracle.

Qu’est-ce que NULL ?

NULL est un marqueur signifiant qu’une valeur est manquante ou inconnue. Ce n’est pas une valeur au sens habituel du terme, ce sont donc toutes des choses différentes :

Valeur Signification Exemple pour une colonne téléphonique
NULL Inconnu ou non fourni Nous ne connaissons pas le numéro
'' Une valeur de texte connue et vide Soumis vide
0 Le chiffre zéro Non pertinent pour le texte, mais réel pour les montants

La différence est particulièrement importante pour les montants. Un bonus de 0 signifie que la personne n’a rien reçu. Un bonus NULL signifie que personne ne le sait encore.

Le tableau exemple

CREATE TABLE employees (
  id INT, name TEXT, phone TEXT, bonus INT, manager_id INT
);

INSERT INTO employees VALUES
 (1,'Meera','555-0101',500,NULL),
 (2,'Arjun',NULL,300,1),
 (3,'Sara','',NULL,1),
 (4,'Ravi',NULL,NULL,2);

Notez que Sara a une chaîne vide pour le téléphone, alors qu’Arjun et Ravi ont NULL. Les deux sont traités très différemment.

Test pour NULL

Voici l’erreur que presque tout le monde fait au début :

SELECT name FROM employees WHERE phone = NULL;
-- (no rows)

SELECT name FROM employees WHERE phone IS NULL;
-- Arjun
-- Ravi

SELECT name FROM employees WHERE phone IS NOT NULL;
-- Meera
-- Sara

La première requête est du SQL valide et ne donne aucune erreur. Cela ne renvoie tout simplement rien, car comparer quoi que ce soit avec NULL n’est jamais vrai. Sara apparaît sous IS NOT NULL, puisqu’une chaîne vide est une valeur réelle. Dans Oracle, cependant, une chaîne vide est traitée comme NULL, ce qui constitue une exception notable.

Logique à trois valeurs

Dans la plupart des langages de programmation, une condition est vraie ou fausse. SQL ajoute un troisième résultat : inconnu. Si vous ne connaissez pas une valeur, vous ne pouvez pas dire si elle est égale à 5. Et on ne sait pas que deux valeurs inconnues sont égales, c’est pourquoi NULL = NULL n’est pas vrai. Lors de notre test, tous ces éléments ont renvoyé NULL :

SELECT NULL = NULL, NULL <> 1, 1 + NULL, 'a' || NULL;

-- NULL | NULL | NULL | NULL

La combinaison des conditions suit des règles rigoureuses. Voici les résultats de notre analyse, où 1 est vrai et 0 est faux :

Expression Résultat Pourquoi
VRAI ET NULL NULL Cela dépend de la partie inconnue
FAUX ET NUL Faux Faux quelle que soit l’inconnue
VRAI OU NULL Vrai Vrai quelle que soit l’inconnue
FAUX OU NUL NULL Cela dépend de la partie inconnue
PAS NUL NULL Le contraire d’inconnu est inconnu

Lignes qui disparaissent de OÙ

WHERE conserve une ligne uniquement si sa condition est true. Les lignes dont le résultat est inconnu sont supprimées, ainsi que celles qui sont fausses. Cela conduit à des résultats surprenants :

SELECT name FROM employees WHERE phone <> '555-0101';

-- Sara

Vous pourriez vous attendre à ce qu’Arjun et Ravi apparaissent, puisque leur téléphone n’est certainement pas ce numéro. Mais leur téléphone est inconnu, donc le résultat est inconnu, et ils disparaissent. Pour les inclure, dites-le explicitement : WHERE phone <> '555-0101' OR phone IS NULL. La négation n’aide pas non plus :

SELECT name FROM employees WHERE NOT (bonus > 400);

-- Arjun

Sara et Ravi n’ont aucun bonus, ils n’apparaissent donc ni dans bonus > 400 ni dans son contraire. C’est un élément clé à retenir : une condition et sa négation ne couvrent pas toujours chaque ligne.

COALESCE : fournir une solution de repli

COALESCE renvoie la première valeur non NULL de sa liste et fonctionne sur toutes les principales bases de données :

SELECT COALESCE(NULL, NULL, 'third', 'fourth');
-- third

SELECT name, COALESCE(phone, 'no phone') FROM employees;
-- Meera | 555-0101
-- Arjun | no phone
-- Sara  |
-- Ravi  | no phone

Sara apparaît toujours vide, car une chaîne vide n’est pas NULL. Des fonctions similaires existent, telles que IFNULL dans MySQL et SQLite, ISNULL dans SQL Server et NVL dans Oracle. COALESCE est le choix portable. Notre point précédent sur les calculs s’applique également ici. bonus + 100 donne NULL pour toute personne sans bonus, alors écrivez COALESCE(bonus, 0) + 100 si traiter un bonus manquant comme zéro est correct pour votre entreprise.

NULLIF : transforme une valeur en NULL

NULLIF(a, b) renvoie NULL si les deux valeurs sont égales, et sinon renvoie a. Deux utilisations sont particulièrement utiles. Il peut nettoyer les valeurs d’espace réservé :

SELECT name, NULLIF(phone, '') FROM employees WHERE id = 3;
-- Sara | NULL

SELECT name FROM employees
WHERE COALESCE(NULLIF(phone, ''), '') = '';
-- Arjun
-- Sara
-- Ravi

Cette deuxième requête est un moyen pratique de rechercher des valeurs « manquantes ou vides ». Il peut également se prémunir contre la division par zéro, qui génère une erreur dans de nombreuses bases de données :

SELECT total / NULLIF(quantity, 0) FROM sales;

Lorsque quantity vaut 0, cela donne NULL plutôt que d’échouer. Dans notre test, SELECT 100 / NULLIF(0, 0) a renvoyé NULL.

Les agrégats ignorent NULL

C’est ici que NULL cause le plus de dégâts aux rapports :

SELECT COUNT(*), COUNT(bonus), SUM(bonus), AVG(bonus),
       AVG(COALESCE(bonus, 0))
FROM employees;

-- 4 | 2 | 800 | 400.0 | 200.0
Expression Résultat Ce que cela signifie
COUNT(*) 4 Toutes les lignes
COUNT(bonus) 2 Seules les lignes avec un bonus
SUM(bonus) 800 Les NULL sont ignorés
AVG(bonus) 400 800 divisé par 2, pas par 4
MOYENNE(COALESCE(bonus, 0)) 200 800 divisé par 4

Alors, quel est le bonus moyen, 400 ou 200 ? Cela dépend de ce que NULL signifie dans vos données. Si NULL signifie “aucun bonus n’a été payé”, alors 200 est correct. Si cela signifie « pas encore décidé », alors 400 pourrait être correct. La base de données ne peut pas prendre cette décision à votre place, la question doit donc être adressée à quelqu’un qui connaît l’entreprise.

Un piège associé : SUM sans valeur est NULL plutôt que 0. Lorsque nous avons additionné uniquement les lignes sans bonus, nous avons obtenu NULL, tandis que COUNT a renvoyé 0. Le code d’application attendant un nombre peut planter là-dessus, alors enveloppez-le : COALESCE(SUM(bonus), 0).

Conseil : Lorsqu’un total de rapport semble erroné, comparez COUNT(*) avec COUNT(column). Tout écart entre eux vous indique immédiatement le nombre de NULL de cette colonne.

GROUP BY, tri et DISTINCT

Bien que les valeurs NULL ne soient « pas égales » dans les comparaisons, ces opérations les traitent comme un seul groupe :

SELECT bonus, COUNT(*) FROM employees GROUP BY bonus ORDER BY bonus;
-- NULL | 2
--  300 | 1
--  500 | 1

SELECT DISTINCT bonus FROM employees;
-- 500, 300, NULL

Voir SQL GROUP BY et HAVING pour en savoir plus sur le regroupement. L’ordre de tri est l’endroit où les bases de données diffèrent vraiment. SQLite et MySQL traitent NULL comme la plus petite valeur, tandis que PostgreSQL et Oracle la traitent comme la plus grande. Ainsi, le même ORDER BY bonus DESC peut mettre les NULL en dernier dans l’un et en premier dans un autre. PostgreSQL, Oracle et SQLite moderne vous permettent de l’indiquer directement, en utilisant NULLS FIRST ou NULLS LAST.

Rejoint

Une condition de jointure utilisant = ne correspond jamais à NULL, donc les lignes avec une clé NULL sont supprimées d’une jointure interne :

SELECT e.name FROM employees e
JOIN employees m ON m.id = e.manager_id;
-- Arjun, Sara, Ravi    (Meera is gone)

SELECT e.name, m.name FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;
-- Meera | NULL
-- Arjun | Meera
-- Sara  | Meera
-- Ravi  | Arjun

Meera n’a pas de gestionnaire, donc une jointure interne supprime silencieusement cette ligne. Un LEFT JOIN le conserve et crée également ses propres NULL pour le côté manquant. Pour en savoir plus, consultez Explication des jointures SQL.

Le piège NOT IN

Un seul NULL dans une liste NOT IN efface tous les résultats :

SELECT name FROM employees WHERE manager_id NOT IN (1);
-- Ravi

SELECT name FROM employees WHERE manager_id NOT IN (1, NULL);
-- (no rows)

La deuxième forme signifie manager_id <> 1 AND manager_id <> NULL, et cette dernière partie ne peut jamais être vraie. Ceci est particulièrement dangereux avec les sous-requêtes, où un NULL peut arriver inaperçu. Utilisez plutôt NOT EXISTS, comme expliqué dans notre Tutoriel sur les sous-requêtes SQL. Meera est également absent du premier résultat, puisque le manager_id de cette ligne est NULL.

Concevoir avec NULL

  • Utilisez NOT NULL par défaut. Autorisez NULL uniquement lorsqu’une valeur peut vraiment manquer.
  • Ajoutez des valeurs par défaut raisonnables. Par exemple, quantity INT NOT NULL DEFAULT 0.
  • N’utilisez pas de valeurs magiques. Une date du 01/01/1900 ou un âge de -1 remplaçant “inconnu” corrompt vos calculs.
  • Connaître le comportement UNIQUE. La plupart des bases de données autorisent plusieurs NULL dans une colonne UNIQUE, et notre test en a inséré deux sans erreur. SQL Server est une exception, car il en autorise normalement une.
  • N’oubliez pas qu’une clé primaire ne peut pas être NULL. Voir clé primaire vs clé étrangère.
  • Test avec des NULL. Les données de test sans NULL masquent ces bugs. Incluez-les volontairement, comme vous le feriez pour d’autres cas extrêmes.

Pour conclure

Traitez NULL comme “inconnu”, et la plupart de son comportement commence à avoir un sens : inconnu plus un est inconnu, et inconnu égal inconnu n’est pas connu pour être vrai. Auditez l’un de vos propres rapports cette semaine. Vérifiez les colonnes nullables en utilisant COUNT(*) par rapport à COUNT(column), recherchez n’importe quel NOT IN et décidez ce que NULL devrait signifier dans chaque moyenne.

Questions fréquentes

Qu’est-ce que NULL en SQL ?

NULL est un marqueur d’une valeur manquante ou inconnue. Il est différent de zéro et d’une chaîne vide, et nécessite un traitement spécial dans les comparaisons.

Pourquoi = NULL ne fonctionne-t-il pas ?

Comparer quoi que ce soit avec NULL donne inconnu plutôt que vrai, donc WHERE supprime la ligne. Utilisez IS NULL ou IS NOT NULL pour le tester.

Quelle est la différence entre COALESCE et ISNULL ?

COALESCE est du SQL standard et accepte de nombreux arguments. ISNULL est spécifique à SQL Server et en prend deux. Pour du code portable, préférez COALESCE.

COUNT inclut-il des valeurs NULL ?

COUNT(*) compte toutes les lignes, y compris celles contenant des valeurs NULL. COUNT(column) ne compte que les lignes où cette colonne n’est pas NULL, ce qui peut donner un nombre plus petit.

NULL est-il identique à une chaîne vide ?

Non, dans la plupart des bases de données. Une chaîne vide est une valeur connue sans caractères et NULL signifie inconnu. Oracle est une exception notable, car il traite les chaînes vides comme NULL.

Continuez à apprendre

Travailler avec Stack Quora

Besoin d’aide pour les tests, WordPress ou le référencement ?

Nous aidons les équipes à proposer de meilleurs logiciels et à développer leurs sites. Dites-nous sur quoi vous travaillez et nous vous proposerons une prochaine étape claire.

Continuez à lire

Plus de guides sur tests, IA et développement moderne

Vous avez apprécié cet article ? Choisissez un sujet et accédez directement à nos nouveaux didacticiels.

Intelligence artificielle

Les hallucinations de l'IA expliquées : pourquoi les modèles de langage inventent les choses et comment les réduire

Les hallucinations de l'IA ont expliqué : ce qu'elles sont, pourquoi les modèles de langage les produisent, les types courants, comment les réduire …

Lire l'article →
DevOps

Variables d'environnement expliquées : fichiers .env, secrets et configuration correctement effectués

Variables d'environnement expliquées avec des exemples Python que nous avons exécutés : lecture et définition, pourquoi chaque valeur est une chaîne…

Lire l'article →
Développement logiciel

Limitation du débit de l'API expliquée : algorithmes, en-têtes et gestion des erreurs 429

Limitation du débit de l'API expliquée avec une simulation que nous avons exécutée : compartiment de jetons, fenêtre fixe, fenêtre glissante, 429 ré…

Lire l'article →
Automatisation des tests

Se moquer en Python : unittest.mock, patch et les erreurs qui font mentir les tests

Moquerie en Python avec unittest.mock, testée : Mock et return_value, side_effect, correctifs où un nom est utilisé, spec et autospec, dates moqueus…

Lire l'article →
Tests logiciels

Couverture du code expliquée : couverture des lignes par rapport aux branches et ce que signifie réellement 100 %

Couverture du code expliquée avec une véritable exécution de cover.py : couverture des lignes, des branches et des conditions, lecture d'un rapport,…

Lire l'article →
Bases de données et SQL

DELETE vs TRUNCATE vs DROP dans SQL : différences, restauration et quand les utiliser

DELETE vs TRUNCATE vs DROP expliqué avec SQL testé : ce que chacun supprime, restauration, déclencheurs, réinitialisation d'identité, vitesse et en …

Lire l'article →
Bases de données et SQL

Vues SQL expliquées : créez, utilisez et évitez les pièges, avec des exemples

Vues SQL expliquées avec les requêtes que nous avons exécutées : création d'une vue, résultats en direct, masquage des colonnes, performances, vues …

Lire l'article →
Développement logiciel

Interface TypeScript vs Type : différences réelles, testées avec le compilateur

Interface TypeScript vs type, vérifiée avec le vrai compilateur : ce que les deux peuvent faire, ce qu'un seul peut faire, la fusion des déclaration…

Lire l'article →
Développement logiciel

Python *args et **kwargs expliqués : fonctions flexibles avec des exemples clairs

Python *args et **kwargs expliqués avec le code que nous avons exécuté : emballage et déballage, ordre des paramètres, arguments de mot-clé uniqueme…

Lire l'article →
Développement logiciel

Fonctions Python Lambda : syntaxe, utilisations réelles et quand ne pas les utiliser

Fonctions Python lambda expliquées avec le code que nous avons exécuté : syntaxe, tri avec clé, carte et filtre, fermetures, piège de liaison tardiv…

Lire l'article →
Intelligence artificielle

Que sont les agents IA ? Comment ils fonctionnent, avec une simple boucle d'agent que vous pouvez exécuter

Que sont les agents IA ? Un guide simple sur la boucle d'agent, les outils, la mémoire et les garde-fous, avec une petite boucle Python que nous avo…

Lire l'article →
DevOps

Surveillance vs observabilité : la vraie différence, avec les journaux, les métriques et les traces

Surveillance et observabilité expliquées : échecs connus et inconnus, journaux, métriques et traces, présentation pas à pas des incidents de paiemen…

Lire l'article →
DevOps

Volumes Docker vs montages Bind : conserver les données du conteneur de la bonne manière

Volumes Docker et montages de liaison expliqués : pourquoi les données du conteneur disparaissent, volumes nommés, montages de liaison, tmpfs, exemp…

Lire l'article →
Automatisation des tests

TDD vs BDD : principales différences, une fonctionnalité conçue dans les deux sens et quand les utiliser

TDD vs BDD expliqué avec une fonctionnalité de remise construite dans les deux sens : refactor rouge-vert avec le code que nous avons exécuté, scéna…

Lire l'article →
Tests logiciels

Tests d'acceptation utilisateur (UAT) : processus, liste de contrôle et exemples réels

Les tests d'acceptation des utilisateurs sont expliqués : qui les exécute, en quoi ils diffèrent du contrôle qualité, un processus en sept étapes, u…

Lire l'article →
Bases de données et SQL

Explication des valeurs SQL NULL : IS NULL, COALESCE, NULLIF et les pièges à éviter

Les valeurs SQL NULL expliquées avec les requêtes que nous avons exécutées : logique à trois valeurs, IS NULL, COALESCE, NULLIF, comment les agrégat…

Lire l'article →
Bases de données et SQL

Instruction SQL CASE WHEN : syntaxe, exemples réels et erreurs courantes

SQL CASE WHEN expliqué avec les requêtes que nous avons exécutées : formulaires simples et recherchés, ordre des conditions, pivots avec SUM, astuce…

Lire l'article →
Développement logiciel

Qu'est-ce que JWT ? Les jetons Web JSON expliqués avec un exemple fonctionnel

Qu’est-ce que JWT ? JSON Web Tokens expliqué : les trois parties, un jeton construit et falsifié dans le code que nous avons exécuté, JWT vs session…

Lire l'article →
Développement logiciel

Boucle d'événements JavaScript expliquée : pile d'appels, microtâches et minuteries avec des exemples

La boucle d'événements JavaScript expliquée avec le code que nous avons exécuté : pile d'appels, files d'attente de tâches et de microtâches, pourqu…

Lire l'article →
Développement logiciel

Générateurs Python et rendement expliqués : économisez de la mémoire avec des exemples réels

Les générateurs Python et le rendement expliqués avec le code que nous avons exécuté : comment ils s'arrêtent et reprennent, les économies de mémoir…

Lire l'article →
Intelligence artificielle

Que sont les intégrations ? Vecteurs et similarité cosinus expliqués simplement

Que sont les intégrations ? Un guide en langage simple sur les vecteurs, la similarité cosinus et la recherche sémantique, avec un petit exemple que…

Lire l'article →
DevOps

Déploiement Bleu-Vert vs Canary : différences, compromis et comment choisir

Explication du déploiement bleu-vert ou canari : comment chacun fonctionne, coût, risque et restauration, regroupement d'utilisateurs stable que nou…

Lire l'article →
Automatisation des tests

Tests instables : quelles sont leurs causes et comment les corriger définitivement

Des tests irréguliers expliqués avec des démos que nous avons exécutées : les principales causes, comment en confirmer et en diagnostiquer une, les …

Lire l'article →
Tests logiciels

Tests de charge vs tests de contrainte : différences, métriques et exemples k6

Explication des tests de charge et des tests de stress : ce que chacun prouve, les tests de pointe et de trempage, les métriques qui comptent, pourq…

Lire l'article →
Tests logiciels

Scénario de test et scénario de test : principales différences, exemples et quand les utiliser

Scénario de test et scénario de test expliqués : des définitions claires, un tableau côte à côte, une fonctionnalité de réinitialisation de mot de p…

Lire l'article →
Bases de données et SQL

Optimisation des requêtes SQL : lire les plans d'exécution et corriger les requêtes lentes, avec des délais

Optimisation des requêtes SQL testée sur un million de lignes : lire les plans d'exécution, ajouter les bons index, corriger les filtres non Sargabl…

Lire l'article →
Bases de données et SQL

SQL UNION vs UNION ALL : différences, exemples et performances testées

SQL UNION vs UNION ALL expliqué avec les requêtes que nous avons exécutées : des doublons, les règles suivent toutes les deux, un véritable bug de d…

Lire l'article →
Développement logiciel

Tutoriel API JavaScript Fetch : GET, POST, gestion des erreurs et délais d'attente

Un didacticiel de l'API JavaScript Fetch testé sur un serveur local : GET et POST, pourquoi 404 ne lance pas, un assistant réutilisable, des chaînes…

Lire l'article →
Développement logiciel

Gestion des fichiers Python : lecture, écriture, CSV, JSON et pathlib avec exemples

Gestion des fichiers Python expliquée avec le code que nous avons exécuté : modes ouverts, avec lecture de fichiers volumineux, CSV, JSON, pathlib, …

Lire l'article →
Développement logiciel

Classes et objets Python : didacticiel POO avec des exemples réels

Classes et objets Python expliqués avec le code que nous avons exécuté : __init__, méthodes, attributs de classe par rapport à l'instance, héritage,…

Lire l'article →
Intelligence artificielle

Qu'est-ce qu'un grand modèle de langage ? Comment fonctionnent les LLM, expliqués sans battage médiatique

Qu’est-ce qu’un grand modèle de langage ? Les LLM expliqués en langage simple : jetons, intégrations, attention, formation, fenêtres de température …

Lire l'article →
DevOps

Commandes Linux pour les débutants : le guide du terminal essentiel avec des exemples

Commandes Linux pour débutants, regroupées par tâche : navigation, fichiers, affichage des journaux, grep, tuyaux, autorisations, processus et archi…

Lire l'article →
Automatisation des tests

Selenium vs Playwright : principales différences, code comparé et lequel choisir

Comparatif Selenium vs Playwright : architecture, attente, support du navigateur et du langage, débogage, même test dans les deux outils, conseils d…

Lire l'article →
Tests logiciels

Partitionnement d'équivalence : technique de conception de tests expliquée avec des exemples concrets

Le partitionnement d'équivalence expliqué : comment trouver des partitions valides et invalides, des exemples concrets d'âges, de mots de passe et d…

Lire l'article →
Tests logiciels

Gravité vs priorité dans les tests logiciels : différences, matrice et exemples réels

Explication de la gravité et de la priorité dans les tests logiciels : des définitions claires, une matrice à quatre voies avec des exemples, des éc…

Lire l'article →
Bases de données et SQL

Tutoriel sur les sous-requêtes SQL : types, sous-requêtes corrélées et EXISTE avec des exemples

Un didacticiel sur les sous-requêtes SQL avec les requêtes que nous avons exécutées : les sous-requêtes scalaires, IN, FROM et SELECT, les sous-requ…

Lire l'article →
Bases de données et SQL

Transactions SQL et ACID expliquées : COMMIT, ROLLBACK et niveaux d'isolement

Transactions SQL et ACID expliquées avec un virement bancaire que nous avons effectué : COMMIT, ROLLBACK, points de sauvegarde, verrous, niveaux d'i…

Lire l'article →
Développement logiciel

Git merge vs rebase : différences, exemples et quand utiliser chacun

Git merge vs rebase expliqué avec de vraies sorties de log, un tableau comparatif, la règle d'or du rebase et un flux de travail sûr pour les équipes.

Lire l'article →
Développement logiciel

List comprehension Python : syntaxe, exemples et cas à éviter

La list comprehension Python expliquée : syntaxe, filtres, if-else, boucles imbriquées, temps mesurés et cas où une boucle for classique est préféra…

Lire l'article →
Bases de données et SQL

Jointures SQL expliquées avec exemples (Inner, Left, Right, Full)

Comprenez les jointures SQL pas à pas avec des tables et requêtes d'exemple : INNER, LEFT, RIGHT, FULL, CROSS et SELF, plus erreurs courantes et con…

Lire l'article →