Le modèle relationnel
DébutantUnité 1 sur 6 de la formation Formation : SQL : requêtes SELECT, jointures et agrégation
Ce que tu vas apprendre
- Décrire pourquoi les organisations conservent leurs données partagées dans des bases de données relationnelles, le rôle d’un système de gestion de bases de données et la façon dont SQL permet de l’utiliser.
- Expliquer pourquoi les organisations utilisent des bases de donnéesDistinguer les données, une base de données et un système de gestion de bases de données, et expliquer ce qu’une base de données relationnelle fait mieux qu’une feuille de calcul partagée ou des fichiers séparés.
- Reconnaître les systèmes de bases de données et le rôle de SQLNommer les systèmes de bases de données relationnelles courants, décrire comment les applications s’y connectent et expliquer ce qu’est SQL et comment ses instructions sont regroupées.
- Expliquer pourquoi les organisations utilisent des bases de données
- Utiliser le vocabulaire des tables, des lignes et des colonnes pour lire correctement des données et expliquer les règles qui rendent une table relationnelle.
- Décrire les éléments d’une tableIdentifier les tables, les lignes, les colonnes et les valeurs dans des données d’exemple, et associer les termes courants à leurs noms relationnels formels.
- Expliquer les règles qui rendent une table relationnelleAppliquer les règles du modèle relationnel concernant les lignes, les colonnes et les valeurs, et reconnaître les différences de comportement entre les tables SQL et les feuilles de calcul.
- Décrire les éléments d’une table
- Associer chaque colonne à un type de données adapté, éviter les erreurs courantes de type avec les montants, les codes et les dates, et utiliser NULL correctement.
- Reconnaître les principaux types de données SQLIdentifier les types courants pour les nombres, le texte, les dates et les booléens, lire leurs paramètres de taille et de précision et connaître les différences entre les systèmes de bases de données.
- Choisir un type de données adapté à des données réellesChoisir des types adaptés aux montants, aux quantités, aux codes, aux dates et aux noms en se demandant comment les valeurs seront utilisées, et éviter les erreurs dues à des types inadaptés.
- Utiliser NULL correctementExpliquer ce que signifie NULL, le distinguer de zéro et de la chaîne vide, et prévoir son comportement dans les comparaisons, les calculs et les contraintes.
- Reconnaître les principaux types de données SQL
- Utiliser les clés primaires pour identifier chaque ligne, les clés étrangères pour relier les tables et reconnaître les associations un-à-plusieurs, un-à-un et plusieurs-à-plusieurs qu’elles créent.
- Identifier les clés candidates et la clé primaireDéterminer quelles colonnes ou combinaisons de colonnes identifient chaque ligne de façon unique et expliquer les règles que doit respecter une clé primaire.
- Choisir entre clé naturelle et clé de substitutionComparer les identifiants du monde réel à ceux générés par le système, déterminer lesquels font de bonnes clés primaires et protéger les identifiants naturels par des contraintes d’unicité.
- Relier des tables par des clés étrangèresExpliquer comment une clé étrangère fait référence à une ligne d’une autre table, ce que protège l’intégrité référentielle et ce qui se produit lorsque les lignes référencées sont modifiées ou supprimées.
- Reconnaître les associations un-à-plusieurs, un-à-un et plusieurs-à-plusieursDéterminer combien de lignes de chaque côté d’un lien peuvent être associées et montrer comment les clés étrangères et les tables d’association représentent chaque type d’association.
- Identifier les clés candidates et la clé primaire
- Lire un schéma présenté sous forme de définitions de tables ou de diagramme et l’utiliser avec des données d’exemple pour trouver où les informations sont stockées et comment les tables sont reliées.
- Lire un schéma et les définitions de ses tablesDistinguer un schéma des données qu’il décrit, lire la notation d’un schéma et les instructions CREATE TABLE, et interpréter les contraintes qu’elles déclarent.
- Lire un diagramme de schémaInterpréter les boîtes, les marques de clés, les lignes de liaison et les symboles en patte d’oie d’un diagramme de schéma, et formuler chaque association représentée.
- Répondre à des questions à l’aide d’un schéma et de données d’exempleLocaliser le stockage de chaque information, suivre les clés entre les tables à la main et utiliser les contraintes du schéma pour déterminer quelles données sont autorisées.
- Lire un schéma et les définitions de ses tables
Modèle relationnel : cours
1Le rôle d’une base de données
Une boutique peut commencer avec une feuille de calcul, mais les données partagées soulèvent vite des questions plus complexes : quelles coordonnées des clients sont à jour, qui peut les modifier et que se passe-t-il lorsqu’un paiement est interrompu à mi-parcours ? Un système de base de données apporte un cadre commun à ces questions. Distingue les informations stockées du logiciel qui les gère, puis découvre comment les applications utilisent SQL pour demander et modifier des données. Les mêmes principes servent à une petite application sur téléphone et au système de rapport d’une grande entreprise.
1.1 Des informations partagées et des modifications fiables
Un nom de client, une date de commande et un prix sont des données : des faits enregistrés. Une base de données est un ensemble organisé de données liées. Un système de gestion de bases de données, ou SGBD, est le logiciel qui stocke et gère cet ensemble. PostgreSQL est un SGBD ; la base store d’une boutique est un ensemble qu’il gère.
Stocker chaque information à sa place
Supposons qu’une feuille de calcul répète le numéro de téléphone de Maria Garcia pour chacune de ses 14 ventes. Un changement de numéro nécessite 14 modifications. Une cellule oubliée laisse des enregistrements contradictoires. Dans une base relationnelle, customers contient les coordonnées de Maria une seule fois, sous customer_id 1. Chaque vente enregistre cet identifiant. Mettre à jour son numéro dans une seule ligne client permet aux recherches ultérieures de trouver un seul numéro à jour.
Une base de données relationnelle organise les informations en tables. « Relationnel » vient de relation, le nom mathématique d’une table. E. F. Codd a présenté le modèle en 1970. Sa séparation centrale est utile : les utilisateurs décrivent les données voulues au moyen de tables et de valeurs ; le SGBD se charge de les trouver sur disque.
Règles et accès partagé
Une table possède des colonnes nommées, des types de données et des contraintes. Une contrainte est une règle vérifiée par le SGBD, comme « une commande doit faire référence à un client existant ». Ces vérifications protègent les données partagées lorsque plusieurs applications utilisent la même base. Le contrôle des types varie : PostgreSQL rejette un texte comme 'twelve' dans une colonne de prix numérique, tandis que les tables SQLite ordinaires ont des types souples.
Un SGBD gère aussi les utilisateurs simultanés, les autorisations, les sauvegardes et la restauration. Deux membres du personnel peuvent travailler sur des données partagées sans échanger des copies distinctes d’une feuille de calcul. Les autorisations peuvent permettre à un utilisateur chargé des rapports de lire les ventes tout en limitant les personnes qui peuvent les modifier. Un processus de sauvegarde et de restauration aide à récupérer les données après une panne.
Garder un ensemble de modifications groupées
Une transaction traite plusieurs modifications comme une seule unité : elles sont toutes enregistrées ou aucune ne l’est. Transférer 200 € entre des comptes nécessite de les soustraire du compte courant et de les ajouter au compte d’épargne. Si une panne interrompt le transfert avant sa fin, le SGBD peut annuler la transaction inachevée. Enregistrer uniquement la soustraction laisserait un solde incorrect.
Une feuille de calcul reste utile pour les petits calculs et les mises en page souples. Une base de données fournit une structure définie pour les enregistrements partagés et des règles. Une feuille Excel a une limite fixe de 1 048 576 lignes ; les bases de données gèrent couramment des ensembles bien plus grands, dans les limites du stockage, du matériel et du produit utilisé.
Différentes données et différentes tâches
Les données structurées s’inscrivent dans des colonnes nommées communes à chaque ligne. Les données semi-structurées, comme les documents JSON, peuvent avoir des champs différents d’un enregistrement à l’autre. Les données non structurées, comme l’audio ou les courriels en texte libre, n’ont pas cette structure tabulaire fixe. Les organisations combinent souvent des bases relationnelles avec des bases de documents, des systèmes clé-valeur ou des systèmes de stockage de fichiers.
La charge de travail compte aussi. Un système à charge transactionnelle, aussi appelé OLTP, enregistre les événements quotidiens par de nombreuses lectures et écritures de petite taille : une commande, un paiement, un changement d’adresse. Un système à charge analytique, ou OLAP, lit de nombreux enregistrements stockés pour répondre à des questions comme « Comment les ventes mensuelles ont-elles évolué par région ? » Les deux peuvent utiliser des tables et des clés relationnelles.
Points clés
- Une base de données contient des données liées ; un SGBD les gère.
- Les données relationnelles sont organisées en tables, avec des règles vérifiées par le SGBD.
- Une transaction enregistre ou annule ensemble un groupe de modifications.
- Les coordonnées partagées d’un client peuvent être mises à jour à un seul endroit et retrouvées grâce à un identifiant.
- Les tâches transactionnelles enregistrent des événements ; les tâches analytiques synthétisent les données stockées.
1.2 SQL, les produits de bases de données et les applications
SQL est un langage de requête structuré. PostgreSQL, MySQL, SQLite, Microsoft SQL Server et Oracle Database sont des produits qui l’utilisent. SQL Server est un SGBD, et non un autre nom pour SQL lui-même.
Comment une application accède aux données
Dans une architecture client-serveur, un programme serveur gère la base de données. Un client, comme un site web, un outil de rapport ou un éditeur de requêtes, envoie des demandes à ce serveur. PostgreSQL, MySQL, SQL Server et Oracle fonctionnent couramment ainsi. Des outils comme psql, pgAdmin, DBeaver et SQL Server Management Studio permettent d’examiner les bases de données et d’envoyer des demandes.
Un moteur embarqué fonctionne dans une application. SQLite utilise une bibliothèque et un fichier de base de données ordinaire, comme store.db, sans serveur de base de données distinct. Il est courant dans les téléphones, les navigateurs et les applications de bureau. Avec un service cloud géré, comme Azure SQL Database, Amazon RDS ou Google Cloud SQL, un fournisseur exploite les serveurs de base de données. « Géré » indique qui exploite le service ; cela ne remplace pas les tables et les clés par un autre modèle.
Une installation de SGBD peut gérer plusieurs bases de données, comme store et payroll. Une connexion sélectionne la base à utiliser, sous réserve des autorisations.
Indiquer le résultat voulu
SQL est déclaratif : il décrit le résultat demandé tandis que le SGBD choisit comment l’obtenir. Lis cette instruction :
SELECT first_name, city
FROM customers
WHERE state = 'TX';
Elle demande les prénoms et les villes des lignes de clients dont l’État est TX. Elle ne dit rien de la page du disque à lire en premier. Les mots-clés en majuscules facilitent la lecture de l’instruction ; select et SELECT ont le même sens. Un point-virgule termine normalement une instruction.
Reconnaître le rôle de l’instruction
| Groupe | Rôle | Exemples |
|---|---|---|
| Définition de données, LDD | Définir ou modifier la structure | CREATE TABLE, ALTER TABLE, DROP TABLE |
| Manipulation de données, LMD | Lire ou modifier les lignes | SELECT, INSERT, UPDATE, DELETE |
| Contrôle des données | Gérer les autorisations | GRANT, REVOKE |
| Contrôle des transactions | Enregistrer ou annuler une transaction | COMMIT, ROLLBACK |
Certains ouvrages placent SELECT dans un groupe distinct, le langage de requête de données. La distinction utile est le rôle réel de l’instruction : ajouter une colonne modifie la structure ; ajouter un client modifie les données.
SQL est devenu une norme ANSI en 1986 et est normalisé au niveau international sous la référence ISO/IEC 9075. Les produits ajoutent leurs propres dialectes. Une limite de dix lignes s’écrit LIMIT 10 dans SQLite, PostgreSQL et MySQL, TOP 10 dans SQL Server ou FETCH FIRST 10 ROWS ONLY en SQL standard et dans Oracle.
Lire le texte et les autres objets de base de données
Les littéraux textuels utilisent des apostrophes : 'TX'. Le SQL standard utilise des guillemets doubles pour les identifiants, comme les noms de colonnes. Une apostrophe à l’intérieur du texte est doublée : 'O''Brien' représente O'Brien.
Une vue est une requête enregistrée utilisée comme une table ; une vue ordinaire ne possède aucune ligne stockée en propre. Un index est une structure de recherche qui peut aider à trouver rapidement des lignes. La plupart des systèmes indexent automatiquement les clés primaires. Les procédures stockées et les fonctions sont du code enregistré qui peut être exécuté par son nom.
Points clés
- SQL décrit un résultat voulu ; le SGBD choisit comment l’obtenir.
- Les systèmes client-serveur reçoivent les demandes par un serveur ; SQLite est embarqué dans une application.
- Le LDD modifie la structure, tandis que le LMD lit ou modifie les lignes.
- Les apostrophes délimitent le texte ; une apostrophe à l’intérieur du texte est doublée.
- Une vue enregistre une requête ; un index accélère les recherches.
- Les dialectes SQL partagent les principes relationnels, mais diffèrent sur certains points de syntaxe.
2Lire correctement une table
Une table donne une structure claire à chaque type d’enregistrement : les lignes décrivent des éléments individuels et les colonnes décrivent leurs propriétés. Lis cette structure avant d’interpréter une valeur. Distingue ensuite les règles logiques de la table de la disposition d’une feuille de calcul : la position n’identifie pas un enregistrement, une liste de numéros de téléphone contient plusieurs valeurs et une ligne de total n’a pas le même sens qu’une vente. Ces distinctions facilitent grandement la suite du travail sur les clés et les schémas.
2.1 Lignes, colonnes et valeurs
Une table stocke des informations sur un type d’éléments. Chaque ligne de customers décrit un client ; chaque colonne contient une propriété. Leur intersection contient une valeur.
Lire un enregistrement sur toute sa ligne
Voici une sélection de colonnes de clients :
customer_id | first_name | last_name | city | state | zip_code |
|---|---|---|---|---|---|
| 1 | Maria | Garcia | Austin | TX | 78701 |
| 2 | James | Wilson | Denver | CO | 80202 |
| 3 | Aisha | Johnson | Boston | MA | 02108 |
| 4 | Wei | Chen | Seattle | WA | 98101 |
Trouve customer_id 4, puis lis city : la ville de Wei est Seattle. Pour trouver qui habite à Denver, lis le nom sur la ligne de Denver : James Wilson. Une ligne voisine décrit un autre client.
La table complète comporte huit colonnes : customer_id, first_name, last_name, email, phone, city, state et zip_code. Le numéro de téléphone de James est NULL : la valeur est manquante, mais sa ligne possède toujours la colonne de téléphone.
Associer les termes
| Terme courant | Terme relationnel formel | Autre terme courant |
|---|---|---|
| Table | Relation | Aucun |
| Ligne | N-uplet | Enregistrement |
| Colonne | Attribut | Champ |
Un n-uplet est une ligne entière, et non une cellule. Un attribut désigne une propriété commune à toutes les lignes. « Enregistrement 4 » peut désigner un identifiant ou une position à l’affichage ; vérifie lequel, car les positions peuvent changer.
Compter les éléments de la table
Le degré compte les colonnes ; la cardinalité d’une table compte les lignes. La table complète a pour degré 8 et pour cardinalité 4. L’affichage ci-dessus montre six colonnes sans changer le degré de la table.
Ajouter un client porte la cardinalité à 5 ; le degré reste égal à 8. Ajouter birth_date porte le degré à 9 et donne à chaque ligne un emplacement pour cette valeur, même lorsqu’elle est manquante. Un nouveau client ajoute une ligne, et non une colonne.
La cardinalité d’une association, comme un-à-plusieurs, décrit les liens autorisés plutôt que le nombre de lignes d’une table.
Lire les noms qualifiés
Les noms de colonnes sont uniques dans une table. orders.customer_id et customers.customer_id distinguent des colonnes de même nom dans des tables différentes : le point sépare les noms de la table et de la colonne.
La notation snake_case utilise des mots en minuscules séparés par des tirets bas, comme dans zip_code. En SQL, les noms contenant des espaces doivent être placés entre guillemets. Les noms de tables au singulier ou au pluriel conviennent tous deux ; applique une convention cohérente.
Points clés
- Une ligne décrit un élément ; une colonne décrit une propriété.
- Relation, n-uplet et attribut désignent respectivement une table, une ligne et une colonne.
- Le degré compte les colonnes ; la cardinalité d’une table compte les lignes.
- Un nom qualifié par la table indique à quelle table appartient une colonne.
2.2 Les règles derrière la grille
Une table relationnelle possède une structure logique qui dépasse son apparence rectangulaire. Dans le modèle formel, c’est un ensemble de lignes. Un ensemble ne contient pas de doublons et n’a pas d’ordre. Les colonnes sont identifiées par leur nom : déplacer une colonne à l’affichage ne change donc pas l’information qu’elle représente.
L’identité ne vient pas de la position
Un SGBD peut renvoyer les lignes dans un ordre différent après des mises à jour, des suppressions ou un changement dans sa façon de lire le stockage. « La troisième ligne » n’est pas un moyen durable d’identifier un client. customer_id 3 identifie toujours Aisha, même lorsque sa ligne apparaît en premier. Une requête qui exige un ordre précis le demande avec ORDER BY.
Les tables SQL diffèrent des relations formelles : sans clé primaire ou autre contrainte d’unicité adaptée, elles peuvent contenir des lignes identiques. Deux copies de ('Coffee mug', 12.50) ne comportent aucune valeur permettant de les distinguer dans ces colonnes. Une clé primaire donne à chaque ligne un identifiant unique et empêche les lignes entièrement identiques.
Une colonne, un domaine
Un domaine est l’ensemble des valeurs autorisées dans une colonne. Une quantité a un type entier et peut aussi nécessiter une règle imposant qu’elle soit positive. Un code d’État est du texte, mais toute valeur textuelle n’est pas un code d’État valide. Les types de données et les contraintes décrivent les valeurs autorisées au SGBD.
Toutes les lignes partagent les mêmes colonnes. Une commande ne peut pas recevoir une colonne supplémentaire pour un mot de cadeau qui lui soit propre. La table peut avoir une colonne gift_note pour chaque commande, avec NULL lorsqu’aucun mot n’a été enregistré. Les informations facultatives ont elles aussi un emplacement défini.
Séparer les valeurs individuelles
Une valeur atomique est une seule valeur pour l’usage de la colonne. Une cellule de téléphone contenant « 512-555-0147, 512-555-0199 » contient une liste de deux numéros. Il devient difficile de trouver, de vérifier ou de supprimer un seul numéro. Une table customer_phones peut donner à chaque numéro de téléphone sa propre ligne, avec customer_id pour indiquer à qui il appartient.
Atomique ne signifie pas que toute valeur textuelle doit être divisée en ses plus petits éléments. Un nom de ville peut contenir plusieurs mots et rester une seule valeur de ville. La question est de savoir si la cellule stocke une seule information du type représenté par la colonne ou un ensemble qui devrait être traité séparément.
Examiner avec un regard critique un export de feuille de calcul
Une feuille de ventes peut comporter un en-tête répété au milieu, une ligne en bas portant la mention « TOTAL » et un prix écrit « 12,50 (promotion) ». Ces choix de présentation sont utiles à une personne, mais ils mélangent différents types de contenu dans les mêmes colonnes.
Pour la lire comme une table relationnelle :
- Traite les noms de colonnes comme l’en-tête, et non comme des enregistrements de vente.
- Consacre chaque ligne de données à une vente ; calcule le total à partir de ces lignes.
- Stocke le prix numérique séparément d’une note sur la promotion.
- Donne une clé à chaque vente pour que sa ligne puisse être identifiée.
Une ligne de total mêlée aux ventes pourrait être comptée comme une vente supplémentaire ou ajoutée une nouvelle fois au total. Une note mélangée à un prix numérique empêche les opérations numériques ordinaires.
Tables logiques et stockage physique
Une table est la vue logique de l’utilisateur. Le SGBD peut stocker ses données dans des fichiers, des pages et des index organisés pour un accès efficace. L’indépendance des données signifie que des modifications de cette organisation physique n’imposent pas de changer les noms des tables, le sens des colonnes ou les requêtes utilisées par les applications.
Points clés
- Une relation formelle a des lignes distinctes et sans ordre ; SQL a besoin de contraintes pour empêcher les doublons.
- L’ordre des lignes doit être demandé avec
ORDER BY. - Le domaine d’une colonne décrit les valeurs qu’elle autorise.
- Chaque cellule contient une seule valeur pour l’usage de sa colonne.
- Toutes les lignes ont les mêmes colonnes, y compris des emplacements pour les valeurs manquantes.
3Choisir les types et interpréter les données manquantes
Le type d’une colonne influence ce qui peut être stocké, l’ordre de tri des valeurs et les calculs qui ont un sens. Des chiffres peuvent représenter un nombre d’éléments ou un code ; ces usages demandent des types différents. Les montants doivent être stockés exactement, tandis que les mesures peuvent souvent utiliser des valeurs approchées. Les informations manquantes nécessitent un traitement particulier avec NULL. Découvre ces choix et les différences importantes entre produits, notamment le stockage souple de SQLite et la gestion des comparaisons inconnues par SQL.
3.1 Les principaux types de données SQL
Un type de données indique au SGBD quel genre de valeur contient une colonne et comment la traiter. L’addition numérique, la comparaison de textes et le classement des dates sont des opérations différentes. Un nom de type familier peut aussi se comporter différemment selon le produit de base de données.
Nombres entiers, exacts et approchés
| Catégorie | Types courants | Usage adapté |
|---|---|---|
| Nombres entiers | INTEGER, SMALLINT, BIGINT | Comptages, quantités et identifiants entiers |
| Décimaux exacts | DECIMAL(p, s), NUMERIC(p, s) | Montants et autres valeurs décimales exactes |
| Nombres approchés | REAL, FLOAT, DOUBLE PRECISION | Mesures pour lesquelles des écarts d’arrondi sont acceptables |
Dans PostgreSQL, MySQL et SQL Server, INTEGER va de −2 147 483 648 à 2 147 483 647. BIGINT atteint 9 223 372 036 854 775 807 ; le stockage des entiers de SQLite peut aussi atteindre cette plage.
Pour les décimaux, la précision est le nombre total de chiffres et l’échelle est le nombre de chiffres après la virgule. DECIMAL(8, 2) laisse six chiffres avant la virgule : son maximum est de 999 999,99. Le prix 12,50 convient ; 1 234 567,00 ne convient pas. PostgreSQL, MySQL, SQL Server et Oracle stockent les décimaux exactement. SQLite accepte cette déclaration mais n’impose ni sa précision ni son échelle, et peut stocker les fractions en virgule flottante binaire.
La virgule flottante donne une approximation de nombreuses fractions décimales. En double précision, l’addition de 0,1 et de 0,2 donne 0,30000000000000004. SQLite traite ces littéraux décimaux comme des nombres à virgule flottante. PostgreSQL traite les littéraux décimaux écrits sans précision de type comme des nombres exacts : le même calcul écrit peut donc y être exact ; des valeurs explicitement déclarées en double précision montrent l’approximation.
Texte, dates et indicateurs
CHAR(n) est un texte de longueur fixe ; PostgreSQL et SQL Server complètent les valeurs plus courtes avec des espaces. VARCHAR(n) accepte des longueurs variables jusqu’à une limite. SQLite ignore les deux paramètres de longueur et ne complète pas les valeurs. TEXT contient du texte long dans SQLite, PostgreSQL et MySQL. SQL Server utilise VARCHAR(MAX) ou NVARCHAR(MAX) pour cet usage ; son ancien type TEXT est obsolète.
Un DATE contient une date du calendrier, un TIME une heure et un TIMESTAMP du SQL standard une date et une heure. Écris les dates dans l’ordre année-mois-jour, comme '2026-03-02', pour éviter de confondre le 2 mars et le 3 février. Les dates stockées dans un type date ont un format interne ; l’application choisit leur format d’affichage. SQLite n’a pas de type date dédié et stocke couramment les dates sous forme de texte ISO. SQL Server utilise DATETIME2 pour une date et une heure : son TIMESTAMP désigne ROWVERSION, un compteur de version binaire.
Un BOOLEAN représente TRUE ou FALSE, ou NULL lorsque la valeur manque. PostgreSQL possède un type booléen ; SQL Server utilise BIT, MySQL traite BOOLEAN comme un petit entier et SQLite stocke ces indicateurs sous forme de 1 et 0. Les types binaires comme BLOB ou BYTEA de PostgreSQL stockent des octets, notamment de petites images. Les fichiers plus volumineux sont souvent stockés séparément, avec un chemin ou une URL dans une table.
L’affinité de type de SQLite
Dans les tables SQLite ordinaires, un type déclaré est une préférence appelée affinité de type. Une colonne INTEGER convertit '42' en nombre 42, mais peut conserver 'abc' comme texte. Une table SQLite STRICT rejette un texte qui ne peut pas devenir un entier valide.
Points clés
- Les types entiers contiennent des nombres entiers ; les décimaux exacts et la virgule flottante répondent à des besoins différents.
- La précision compte tous les chiffres ; l’échelle compte les chiffres après la virgule.
- Une date ISO sous forme de texte suit l’ordre année-mois-jour.
- Les longueurs de texte, le stockage des booléens et les types de date diffèrent selon les dialectes.
- L’affinité de SQLite est souple ; les tables
STRICTimposent les types qu’elles prennent en charge. - Dans SQL Server,
TIMESTAMPreprésente une version de ligne, et non une date et une heure.
3.2 Choisir un type selon l’usage de la valeur
Pars du sens d’une valeur et de l’usage qui en sera fait. Un code postal américain contient des chiffres, mais personne n’additionne des codes postaux pour obtenir un total qui a un sens. Une quantité contient aussi des chiffres, et additionner des quantités est utile. L’apparence seule guide mal le choix d’un type.
Poser cinq questions
- Quelles sont les valeurs courantes et quelles valeurs extrêmes doivent pouvoir être stockées ?
- Les valeurs serviront-elles à des calculs ?
- Doivent-elles être exactes ou une approximation est-elle acceptable ?
- Comment doivent-elles être triées et comparées ?
- Quelle taille convient aux valeurs futures réalistes ?
Montants et mesures
Les montants doivent être exacts. Dans PostgreSQL, MySQL et SQL Server, un prix peut utiliser DECIMAL(8, 2). Trois articles à 12,50 € coûtent exactement 37,50 €. Le stockage en virgule flottante binaire peut laisser de minuscules erreurs après des additions répétées, ce qui rend les comparaisons exactes peu fiables. Dans SQLite, déclarer DECIMAL ne fournit pas de stockage décimal exact ; utilise des centimes entiers pour les montants exacts : 12,50 € est ainsi stocké sous la forme 1 250.
Une mesure comme un poids peut utiliser REAL lorsque de petits écarts d’arrondi sont acceptables. Choisis l’unité comme élément du sens de la colonne : weight_lb indique les livres dans son nom. Un type numérique seul n’enregistre pas cette unité.
La devise doit aussi être précisée. Si une table mélange des devises, ajoute currency_code, avec des codes comme USD, EUR ou JPY. Le nombre de décimales varie selon la devise et les montants en devises différentes doivent être convertis avant de pouvoir être additionnés.
Les codes et les noms sont du texte
Utilise du texte pour les codes postaux américains, les numéros de téléphone, les numéros de compte et les codes de stock. Le code postal de Boston '02108' perd son zéro initial lorsqu’il est converti en entier. VARCHAR(10) peut aussi contenir un code ZIP+4, comme '02108-1234'. Les numéros de téléphone peuvent contenir un signe plus, des espaces et des tirets. Ces caractères font partie de la représentation d’un identifiant et ne sont pas des signes arithmétiques.
Prévois assez de place pour les noms et les adresses réels. « Christopher Montgomery » comporte 22 caractères : VARCHAR(10) est donc trop court. PostgreSQL et SQL Server le rejettent ; MySQL le rejette en mode strict et peut le tronquer sinon. SQLite le stocke, car les longueurs de texte déclarées sont ignorées. Un champ de longueur variable suffisamment grand évite de rejeter des noms courants sans réserver sa longueur maximale pour chaque ligne.
Le tri révèle un mauvais choix
Le tri de texte compare les caractères. Des nombres stockés sous forme de texte peuvent apparaître dans l’ordre '1', '10', '2', '25', '3'. Une colonne numérique trie ces valeurs selon leur ordre numérique. Choisir le texte pour chaque champ reporte les vérifications et les conversions sur les calculs ultérieurs.
Les dates présentent un piège similaire. Les dates américaines sous forme de texte placent '12/01/2025' après '03/02/2026' dans l’ordre textuel, bien que décembre 2025 soit antérieur. Utilise un type date ou, dans SQLite, du texte ISO mis en forme de façon cohérente afin de préserver l’ordre chronologique.
Examiner ensemble les types d’un produit
Un produit peut utiliser product_id INTEGER, sku VARCHAR(20), name VARCHAR(100), price DECIMAL(8, 2), weight_lb REAL, in_stock BOOLEAN et added_on DATE. Chaque type répond à un usage : identification, stockage d’un code, nom, montant exact, mesure, indicateur ou date. Dans SQLite, stocke le prix en centimes entiers et la date sous forme de texte ISO.
Points clés
- Choisis les types selon le sens, les calculs, l’exactitude, le tri et une taille réaliste.
- Stocke les codes sous forme de texte pour conserver les zéros initiaux et la ponctuation.
- Utilise un type décimal exact pour les montants lorsque le système le permet et des centimes entiers dans SQLite.
- Un montant numérique nécessite une devise et une mesure nécessite une unité.
- Le stockage sous forme de texte entraîne un tri textuel, même lorsque tous les caractères sont des chiffres.
3.3 NULL et les résultats inconnus
NULL marque une valeur manquante. Il diffère de zéro, de la chaîne vide '' et du texte 'NULL'. Une remise connue de 0 signifie qu’il n’y a pas de remise ; une remise NULL signifie que le montant n’est pas enregistré. Une colonne qui autorise NULL accepte les données manquantes, tandis que NOT NULL impose une valeur.
Une valeur manquante peut avoir plusieurs sens
Aucun numéro de téléphone n’est enregistré pour James Wilson. La commande 102 n’a pas de date d’expédition parce qu’elle n’a pas encore été expédiée. Un client qui est une entreprise peut ne pas avoir de nom de famille applicable. Tous ces cas peuvent être représentés par NULL, mais NULL n’indique pas la raison applicable. Un dictionnaire de données devrait préciser le sens pour chaque colonne.
Une chaîne vide est une valeur textuelle présente dans PostgreSQL et SQLite. Oracle traite actuellement la chaîne vide comme NULL. Les outils de requête peuvent afficher les deux sous forme d’une cellule qui semble vide : l’apparence seule ne permet donc pas de les distinguer.
Les comparaisons peuvent être inconnues
Les comparaisons SQL ont trois résultats possibles : TRUE, FALSE et UNKNOWN. Une comparaison faisant intervenir NULL, y compris NULL = NULL, vaut UNKNOWN. On ne sait pas si deux informations manquantes ont la même valeur.
Une clause WHERE ne conserve que les résultats TRUE. Lis ces conditions :
phone IS NULLtrouve les numéros de téléphone manquants.phone IS NOT NULLtrouve les numéros de téléphone enregistrés.phone = NULLdonne UNKNOWN et ne trouve aucune ligne.
La négation d’une comparaison ne récupère pas une valeur manquante. Ajoute Daniel Brown, dont l’État vaut NULL, aux quatre clients de la boutique. La condition state <> 'TX' conserve CO, MA et WA : trois lignes. Daniel est exclu car la comparaison portant sur son État vaut UNKNOWN. Pour inclure aussi les États manquants, la condition est state <> 'TX' OR state IS NULL.
Combiner les conditions avec soin
Considère que UNKNOWN signifie « pourrait être TRUE ou FALSE ». Un résultat n’est déterminé que si les deux possibilités donnent le même résultat.
| Expression | Résultat | Raison |
|---|---|---|
| TRUE AND UNKNOWN | UNKNOWN | La seconde partie détermine si les deux sont vraies. |
| FALSE AND UNKNOWN | FALSE | Une partie fausse suffit déjà à rendre AND faux. |
| TRUE OR UNKNOWN | TRUE | Une partie vraie suffit déjà à rendre OR vrai. |
| FALSE OR UNKNOWN | UNKNOWN | La seconde partie détermine le résultat de OR. |
| NOT UNKNOWN | UNKNOWN | La négation ne peut pas fournir l’information manquante. |
Calculs et synthèses
Un calcul arithmétique ordinaire avec NULL donne NULL : 5 + NULL vaut NULL. Le prix d’une ligne multiplié par une quantité manquante est lui aussi manquant, et non égal à zéro. Concaténer du texte avec || et NULL donne NULL dans PostgreSQL et SQLite ; la concaténation d’Oracle traite NULL comme une chaîne vide.
Les fonctions de synthèse ignorent généralement les entrées NULL. Avec cinq clients, dont James et Daniel sans numéro de téléphone, COUNT(*) compte les cinq lignes. COUNT(phone) compte les trois numéros enregistrés. La moyenne de 4, NULL et 2 est de 3, car la somme des deux nombres connus est divisée par deux ; traiter NULL comme zéro donnerait à tort 2.
Utilise NOT NULL pour les informations qui doivent être présentes, comme une date de commande. Cette contrainte n’impose pas un nombre positif ni un texte non vide : ce sont des règles distinctes. Les clés primaires exigent un identifiant non NULL ; les tables SQLite ordinaires comportent une exception historique pour certaines déclarations de clé primaire, donc NOT NULL explicite y est important.
Points clés
- NULL marque une information manquante ; 0 et la chaîne vide ont des sens différents.
- Teste les valeurs manquantes avec
IS NULLouIS NOT NULL. - Les comparaisons avec NULL produisent UNKNOWN ;
WHEREne conserve que TRUE. - AND, OR et NOT doivent tenir compte de UNKNOWN.
- Un calcul arithmétique ordinaire avec NULL produit NULL.
COUNT(*)compte les lignes ;COUNT(column)compte les entrées non NULL.- Documente pourquoi NULL est autorisé dans chaque colonne.
4Identifier et relier les enregistrements
Les clés répondent à deux questions différentes : « De quelle ligne s’agit-il ? » et « À quelle ligne liée fait-elle référence ? » Une clé primaire donne à une table un identifiant principal, tandis qu’une clé étrangère porte une référence. Évalue les identifiants possibles en tenant compte des données futures, et pas seulement d’un petit échantillon. Lis ensuite les liens dans les deux sens, en déterminant aussi si un lien est facultatif. Les clés composites et les tables d’association étendent ces principes aux enregistrements identifiés par des combinaisons et aux associations plusieurs-à-plusieurs.
4.1 Clés candidates et clés primaires
Une clé identifie une ligne au moyen de ses valeurs. Les noms peuvent se répéter ; les identifiants de client distinguent les enregistrements afin de pouvoir les lire, les modifier ou les relier.
Vérifier l’unicité et la minimalité
Une super-clé est une colonne ou une combinaison de colonnes qui identifie une ligne de façon unique. Une clé candidate est une super-clé minimale : retirer une colonne quelconque fait perdre cette garantie. Choisis une clé candidate comme clé primaire ; les autres sont des clés alternatives.
Supposons que employee_id, ssn et email soient chacun obligatoires et uniques. Chacun est une clé candidate. (employee_id, department) est une super-clé, mais pas une clé candidate : employee_id identifie l’employé à lui seul. Un nom de famille répété échoue au test d’unicité.
| Terme | Test |
|---|---|
| Super-clé | La combinaison identifie-t-elle une ligne ? |
| Clé candidate | Est-elle unique sans colonne superflue ? |
| Clé primaire | Quelle clé candidate est l’identifiant principal ? |
| Clé alternative | Quelle autre clé candidate reste disponible ? |
Quatre clients portant des noms de famille différents ne suffisent pas à établir une clé : un cinquième peut partager un nom. L’unicité doit être vérifiée pour toutes les données futures autorisées. Une répétition réfute une clé proposée ; un échantillon sans répétition nécessite tout de même une règle métier qui la justifie.
Lire la déclaration
Une table possède au maximum une clé primaire. Ses valeurs sont uniques et ses colonnes doivent être non NULL. Des valeurs stables évitent de modifier les références à répétition. Cherche PRIMARY KEY : ni le nom d’une colonne ni sa position ne la déclarent comme clé primaire.
Si le client 1 existe, un autre client avec la clé 1 est rejeté. Une clé omise nécessite une valeur par défaut ou générée. Dans SQLite, INTEGER PRIMARY KEY génère un entier lorsque la valeur est omise ou vaut NULL. Certaines autres déclarations de clé primaire dans les tables SQLite ordinaires autorisent historiquement NULL ; un NOT NULL explicite, une table STRICT ou la forme de clé primaire entière comble cette lacune.
Lire une clé composite
Dans enrollments(student_id, course_id, term, grade), un étudiant peut suivre plusieurs cours et suivre à nouveau un cours lors d’une autre période. (student_id, course_id, term) identifie une inscription : c’est une clé primaire composite, et non trois clés primaires distinctes.
Les éléments individuels peuvent se répéter ; la combinaison complète ne le peut pas. La plupart des SGBD créent un index sur la clé primaire pour les recherches, mais la clé ne garantit pas l’ordre des résultats d’une requête.
Points clés
- Une clé candidate est une super-clé minimale.
- Une clé candidate est la clé primaire ; les autres sont des clés alternatives.
- L’unicité d’une clé doit être vérifiée pour les données futures autorisées.
- Une clé primaire est unique, non NULL et peut couvrir plusieurs colonnes.
- C’est la déclaration qui établit la clé, et non son nom ou sa position.
4.2 Identifiants naturels et générés
Une clé naturelle provient de données du monde réel, comme le VIN d’un véhicule, l’ISBN d’une édition de livre ou un code d’État. Une clé de substitution existe uniquement pour identifier une ligne, souvent sous la forme d’un entier généré ou d’un UUID.
Choisir un identifiant durable
Privilégie des valeurs uniques, présentes, stables, compactes et pouvant être communiquées sans risque. Les noms se répètent ; les numéros de téléphone et les adresses électroniques changent ou sont partagés. Les numéros de sécurité sociale américains sont sensibles et certains clients n’en ont pas ; les utiliser dans les tables qui y font référence diffuse ces informations.
Un customer_id généré permet à Maria de conserver l’identifiant 1 lorsque ses coordonnées changent. Un state_code naturel, comme TX, peut bien convenir car il est compact, normalisé et utile dans les enregistrements d’adresses.
Protéger séparément les identifiants métier
Une même personne peut s’inscrire deux fois et recevoir deux identifiants de substitution. Les identifiants distinguent les lignes ; ils ne détectent pas les personnes en double.
Si l’adresse électronique doit identifier chaque compte, utilise NOT NULL UNIQUE. UNIQUE seul autorise plusieurs NULL dans PostgreSQL, SQLite et MySQL. SQL Server autorise normalement un seul NULL dans une contrainte d’unicité portant sur une colonne. La présence et l’unicité sont deux règles distinctes.
L’adresse électronique obligatoire et unique est une clé alternative. La modifier laisse inchangé le numéro de client de substitution dans les commandes existantes. Modifier une clé primaire référencée exige aussi que les références des lignes enfants restent cohérentes.
Reconnaître la syntaxe des clés générées
| Système | Forme courante pour un entier généré |
|---|---|
| SQL standard, PostgreSQL, Oracle | GENERATED ALWAYS AS IDENTITY |
| MySQL | AUTO_INCREMENT |
| SQL Server | IDENTITY(1,1) |
| SQLite | INTEGER PRIMARY KEY |
PostgreSQL possède aussi l’ancienne forme SERIAL. Les suppressions, les insertions échouées et les opérations annulées peuvent laisser des trous. Les identifiants 1, 2 et 4 désignent trois lignes, et non quatre. Renuméroter pour combler les trous peut rompre des références.
Reconnaître les UUID
Un UUID est un identifiant de 128 bits, généralement écrit sur 36 caractères avec des tirets : 7c9e6679-7425-40de-944b-e07fc1f90ae7. Des ordinateurs peuvent les générer indépendamment avec un très faible risque de collision, ce qui est utile lorsque des enregistrements de plusieurs endroits doivent être combinés.
Les UUID occupent plus d’espace et sont plus difficiles à lire que de petits entiers. Choisis selon la façon dont les enregistrements sont créés et référencés. Dans les deux cas, une clé est un identifiant : sa valeur maximale n’est pas un nombre de lignes et son ordre ne reflète pas nécessairement le moment des événements.
Points clés
- Les clés naturelles proviennent d’identifiants du monde réel ; les clés de substitution servent à identifier les lignes.
- Privilégie des clés primaires stables, compactes, présentes et pouvant être communiquées sans risque.
- Une clé de substitution n’empêche pas les doublons d’enregistrements du monde réel.
NOT NULL UNIQUEpeut protéger un identifiant alternatif obligatoire.- Les trous dans les identifiants générés sont normaux ; les identifiants ne sont pas des nombres de lignes.
- Les UUID permettent de générer indépendamment des identifiants avec un très faible risque de collision.
4.3 Clés étrangères et références valides
Une clé étrangère est une colonne ou un groupe de colonnes qui fait référence à une clé primaire ou à une autre clé unique appropriée. La table qui porte la référence est la table enfant ; celle vers laquelle elle pointe est la table parente. Lorsqu’une contrainte est contrôlée, une clé étrangère non NULL doit correspondre à une clé parente existante.
Suivre une valeur entre les tables
order_id | customer_id | order_date | shipped_date |
|---|---|---|---|
| 101 | 1 | 2026-03-02 | 2026-03-04 |
| 102 | 2 | 2026-03-05 | NULL |
| 103 | 1 | 2026-03-09 | 2026-03-10 |
orders.customer_id fait référence à customers.customer_id. La commande 102 pointe vers le client 2, James Wilson. Les commandes 101 et 103 pointent toutes deux vers le client 1, Maria Garcia. Les répétitions sont autorisées dans la clé étrangère ; la clé parente référencée est unique.
Cette règle est l’intégrité référentielle. Une commande pour le client 99 est rejetée si le client 99 n’existe pas. Sinon, elle serait orpheline : une ligne enfant sans parent correspondant. Un nom seul ne crée aucune contrainte. Une clé étrangère nommée placed_by peut tout de même faire référence à customer_id ; c’est la référence déclarée qui crée le lien, avec des types correspondants pour les colonnes de clé.
Facultatif ou obligatoire
Un coupon_id qui autorise NULL peut valoir NULL lorsqu’une commande n’a pas de coupon. Un customer_id déclaré NOT NULL impose que chaque commande ait une référence à un client, et la clé étrangère impose que ce client existe. Ces deux contraintes agissent ensemble : l’une exige une valeur et l’autre vérifie la référence.
Les clés étrangères ne sont pas obligées de relier des tables distinctes. Dans employees(employee_id, name, manager_id), manager_id peut faire référence à employee_id dans la même table. La référence au responsable de la personne à la direction générale peut être NULL.
Une règle est nécessaire lorsque le parent change
| Action | Effet lorsqu’un parent référencé est supprimé |
|---|---|
NO ACTION ou RESTRICT | Refuse la suppression tant que des références subsistent, selon le moment où la contrainte est vérifiée |
CASCADE | Supprime aussi les lignes enfants qui font référence au parent |
SET NULL | Conserve les lignes enfants et efface leur référence ; la colonne doit autoriser NULL |
Avec l’action par défaut, le client 1 ne peut pas être supprimé tant que les commandes 101 et 103 font référence à ce client. Une suppression en cascade d’une commande vers ses lignes peut avoir un sens, car ces lignes appartiennent à cette commande. ON UPDATE précise le comportement correspondant lorsqu’une clé parente change. La cascade ne signifie pas que la suppression d’un enfant supprime son parent.
Références composites et contrôle
Si une ligne de commande est identifiée par (order_id, product_id), une expédition qui fait référence à cette ligne a besoin des deux colonnes. La combinaison doit correspondre à une ligne existante. Faire correspondre séparément une commande et un produit ne suffit pas : ce produit peut ne jamais avoir figuré dans cette commande. Une référence composite obligatoire déclare toutes ses colonnes NOT NULL.
PostgreSQL, SQL Server, Oracle et le moteur InnoDB habituel de MySQL contrôlent les clés étrangères déclarées. Dans SQLite, active et vérifie le contrôle des clés étrangères pour chaque connexion avec PRAGMA foreign_keys = ON; avant de t’y fier. Une contrainte déclarée mais désactivée ne peut pas protéger les lignes. Les clés étrangères ne combinent pas non plus les résultats de requêtes à elles seules ; une requête doit suivre explicitement le lien, généralement par une jointure.
Points clés
- La valeur non NULL d’une clé étrangère doit correspondre à une clé référencée existante.
- Les valeurs d’une clé étrangère peuvent se répéter ; celles d’une clé parente sont uniques.
NOT NULLrend le lien obligatoire.- Les actions référentielles déterminent ce qui arrive aux lignes enfants lorsqu’un parent change.
- Une référence composite doit correspondre à la combinaison complète de la clé parente.
- Le contrôle des clés étrangères de SQLite doit être activé pour chaque connexion.
4.4 Lire les cardinalités dans les deux sens
Pour identifier une association, pose deux questions : « Pour une ligne ici, combien de lignes là-bas peuvent être liées ? », puis la question inverse. Tiens compte du minimum comme du maximum. L’échantillon actuel montre ce qui s’est produit ; les contraintes décrivent ce qui est autorisé.
Un client, plusieurs commandes
Un client peut passer zéro ou plusieurs commandes. Chaque commande de la boutique appartient à exactement un client, car orders.customer_id est une clé étrangère non NULL. C’est une association un-à-plusieurs. La clé étrangère se trouve dans orders, du côté plusieurs : chaque commande stocke une référence à un client.
Maria a les commandes 101 et 103 ; James a la commande 102. Aisha et Wei n’en ont aucune. Leur absence de orders est valide. Une clé étrangère impose un parent pour chaque enfant, mais n’impose pas que chaque parent ait un enfant.
Une association un-à-un exige aussi l’unicité
Dans user_profiles(user_id, bio, photo_url), supposons que user_id soit à la fois la clé primaire et une clé étrangère vers users. Chaque profil fait référence à un utilisateur et un utilisateur peut avoir au plus un profil, car la clé du profil ne peut pas se répéter. Un utilisateur peut ne pas encore avoir de profil.
Une clé étrangère sans unicité autoriserait plusieurs profils pour le même utilisateur, ce qui donnerait une association un-à-plusieurs. La contrainte d’unicité change le maximum. Ces tables de profils distinctes permettent de séparer des informations facultatives ou sensibles de l’enregistrement principal de l’utilisateur.
Une association plusieurs-à-plusieurs utilise une table de paires
Une commande peut contenir plusieurs produits et un produit peut apparaître dans plusieurs commandes. Une table d’association, aussi appelée table de liaison, enregistre chaque paire :
order_id | product_id | quantity | unit_price |
|---|---|---|---|
| 101 | 11 | 2 | 12,50 |
| 101 | 12 | 1 | 8,99 |
| 102 | 13 | 1 | 34,00 |
| 103 | 11 | 4 | 12,50 |
order_id fait référence à orders ; product_id fait référence à products. La clé primaire composite (order_id, product_id) autorise le même produit dans différentes commandes, mais empêche qu’une même paire apparaisse deux fois. Deux liens un-à-plusieurs mettent en œuvre l’association plusieurs-à-plusieurs.
quantity et unit_price appartiennent à la paire. Ils décrivent la quantité de ce produit vendue dans cette commande et le prix facturé à ce moment-là. Le prix actuel d’un produit peut changer plus tard ; il ne doit pas modifier le prix facturé à l’époque.
Pour la commande 101, les deux montants de ligne correspondent à deux mugs à 12,50 dollars américains, soit 25,00 dollars américains, et à un chargeur à 8,99 dollars américains. Ensemble, ils coûtent 33,99 dollars américains. La quantité indique combien de mugs ont été achetés ; stocker deux lignes identiques pour les mugs entrerait en conflit avec la clé choisie pour cette table.
Éviter les listes et les emplacements fixes
Une cellule product_ids contenant '11,12' cache plusieurs références dans une seule valeur textuelle. Des colonnes comme product1, product2 et product3 imposent une limite fixe et laissent des emplacements inutilisés. Une table d’association ajoute une ligne pour chaque paire supplémentaire et permet au SGBD de vérifier chaque référence séparément.
Une association réflexive utilise le même principe dans une seule table : plusieurs employés peuvent faire référence au même responsable par manager_id. Le responsable est lui aussi une ligne d’employé. Lis chaque lien comme un rôle afin de distinguer l’identifiant de l’employé de la référence à son responsable.
Points clés
- Lis le minimum et le maximum autorisés dans chaque sens.
- Une association un-à-plusieurs stocke la clé étrangère du côté plusieurs.
- Une clé étrangère unique limite une association à au plus un enfant par parent.
- Une table d’association représente les liens plusieurs-à-plusieurs par des lignes de paires.
- Des informations comme la quantité et le prix de vente peuvent appartenir à une paire.
- Une référence à la même table relie des rôles au sein de cette table.
5Lire un schéma et suivre ses liens
Un schéma consigne la structure qui donne leur sens aux tables : types de colonnes, identifiants, références et contraintes. Un diagramme rend ces liens visibles, tandis qu’une définition de table énonce précisément les règles. Utilise les deux formes pour trouver le chemin d’une question à sa réponse, puis utilise les lignes réelles pour obtenir les valeurs. Distingue la structure des données actuelles : savoir que les commandes font référence aux clients ne t’indique pas quels clients ont passé commande aujourd’hui.
5.1 Structure, données actuelles et contraintes
Un schéma décrit les tables, les colonnes, les types de données et les contraintes. Une instance correspond aux données stockées à un instant donné. Ajouter une commande modifie l’instance ; ajouter une colonne modifie le schéma. Le schéma indique ce qui peut être stocké, tandis que les lignes indiquent ce qui est stocké actuellement.
Lire une description abrégée
customers(customer_id, first_name, last_name, email, phone, city, state, zip_code) présente une table et ses colonnes. Les notes peuvent souligner les clés primaires ou les marquer PK, et marquer les références FK. Par exemple, orders(order_id PK, customer_id FK → customers, order_date, shipped_date) identifie la clé principale et le lien vers le client.
Lire une définition complète de table
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers (customer_id),
order_date DATE NOT NULL,
shipped_date DATE
);
Lis une colonne à la fois. order_id est la clé primaire entière. customer_id est obligatoire et doit faire référence à un client. order_date est obligatoire. shipped_date peut être NULL. Cette définition donne la structure autorisée, et non une liste des commandes existantes.
Les contraintes répondent à différentes questions :
| Contrainte | Ce qu’elle vérifie |
|---|---|
PRIMARY KEY | Un identifiant unique de ligne, éventuellement composite |
NOT NULL | Une valeur est présente |
UNIQUE | Les valeurs non NULL répétées sont interdites ; le traitement de NULL varie |
REFERENCES | Une référence correspond à une clé parente |
CHECK | Une condition ne doit pas être FALSE |
DEFAULT | Fournit une valeur lorsqu’elle est omise |
Une valeur par défaut ne remplace pas une valeur invalide fournie. Si status a pour valeur DEFAULT 'pending', omettre le statut fournit 'pending' ; une valeur fournie doit toujours respecter les autres règles de la colonne.
Combiner les règles d’une ligne de commande
CREATE TABLE order_items (
order_id INTEGER NOT NULL REFERENCES orders (order_id),
product_id INTEGER NOT NULL REFERENCES products (product_id),
quantity INTEGER NOT NULL CHECK (quantity > 0),
unit_price DECIMAL(8, 2) NOT NULL,
PRIMARY KEY (order_id, product_id)
);
La clé primaire en bas utilise deux colonnes. Une seconde ligne pour la même commande et le même produit est rejetée. Une quantité de 0 ne satisfait pas la vérification. Une quantité manquante ne satisfait pas NOT NULL : la vérification seule autoriserait NULL, car NULL > 0 vaut UNKNOWN et non FALSE. Un NOT NULL explicite sur les deux parties de la clé évite aussi l’exception historique de SQLite qui autorise NULL dans les clés composites. Dans SQLite, utilise des centimes entiers pour un unit_price exact ; la déclaration décimale seule ne fournit pas un stockage exact.
Trouver le schéma et ses significations
Dans l’interface de SQLite, .schema orders affiche la définition ; dans psql de PostgreSQL, \d orders la décrit. Les vues INFORMATION_SCHEMA répertorient les métadonnées de structure dans PostgreSQL, MySQL et SQL Server. SQLite répertorie les objets dans sqlite_schema et les outils graphiques montrent les tables et les colonnes en arborescence.
« Schéma » désigne aussi un espace de noms dans des systèmes comme PostgreSQL et SQL Server. sales.orders désigne la table des commandes dans le schéma des ventes. Un dictionnaire de données fournit les significations que la structure ne peut pas exprimer, comme la devise du prix ou le fait qu’une date d’expédition manquante signifie « non expédié ». Pour voir les lignes, une requête comme SELECT * FROM orders; lit l’instance actuelle.
Points clés
- Un schéma est une structure ; une instance correspond aux données à un instant donné.
- Lis ensemble le type d’une colonne et toutes ses contraintes.
- Un nombre positif obligatoire nécessite à la fois
NOT NULLet une vérification de valeur positive. - Une clé primaire composite est déclarée sur l’ensemble de la combinaison.
- Un dictionnaire de données consigne des significations et des unités que le schéma ne précise pas.
5.2 Lire les extrémités d’une ligne de schéma
Un diagramme de schéma représente chaque table par une boîte. Le titre nomme la table ; le contenu liste les colonnes et souvent les types. PK marque les clés primaires et FK les clés étrangères. Les lignes d’association indiquent à quelle clé parente chaque clé étrangère fait référence.
Identifier d’abord le type de ligne
Certains diagrammes utilisent une flèche allant d’une clé étrangère à sa clé référencée. Une flèche de orders.customer_id vers customers.customer_id décrit la direction de la référence. D’autres outils utilisent des symboles aux extrémités pour décrire combien de lignes peuvent être liées. Vérifie la légende du diagramme : la direction d’une flèche et la cardinalité d’une association sont des informations différentes.
Lire les symboles en patte d’oie
Dans la notation en patte d’oie, une barre signifie un, un cercle signifie zéro et une patte à trois branches signifie plusieurs. Chaque extrémité de ligne indique un minimum et un maximum. Le symbole le plus proche de la table donne le maximum ; l’autre donne le minimum.
| Symboles à l’extrémité | Nombre de lignes autorisé à cette extrémité |
|---|---|
| Barre et barre | Exactement un |
| Cercle et barre | Zéro ou un |
| Barre et patte d’oie | Un ou plusieurs |
| Cercle et patte d’oie | Zéro ou plusieurs |
Lorsque tu pars d’une table, regarde les symboles à côté de l’autre table. Ils décrivent combien de lignes de cette autre table peuvent correspondre à ta ligne de départ.
Examiner les clients et les commandes
La ligne de la boutique porte les symboles « exactement un » à côté de customers et les symboles « zéro ou plusieurs » à côté de orders.
- Pars d’un client. Regarde l’extrémité des commandes : le client peut avoir zéro ou plusieurs commandes.
- Pars d’une commande. Regarde l’extrémité des clients : la commande appartient à exactement un client.
- Vérifie la définition : la clé étrangère non NULL se trouve dans
orders, qui est donc du côté plusieurs, et chaque commande nécessite un client valide.
La patte d’oie est à côté de la table qui contient la clé étrangère dont les valeurs se répètent. Lire l’extrémité proche en partant de cette même table inverse le sens. Une référence au client qui autorise NULL changerait l’extrémité des clients en « zéro ou un » ; elle ne limiterait pas chaque client à une commande.
Reconnaître une table d’association
La boutique possède des liens un-à-plusieurs de orders vers order_items et de products vers order_items. Les deux extrémités « plusieurs » se rejoignent à order_items. Ses deux clés étrangères forment la clé primaire. Cette structure permet à une commande de contenir plusieurs produits et à un produit d’apparaître dans plusieurs commandes.
Le diagramme décrit les liens autorisés, et non les nombres actuels. Il permet à Maria d’avoir plusieurs commandes et à Aisha de n’en avoir aucune. Pour savoir combien chacune en a réellement, lis les lignes. Un minimum de un du parent vers l’enfant peut exprimer une règle métier supplémentaire ; une clé étrangère seule n’impose pas qu’un parent ait des enfants.
Reconnaître les styles de diagrammes apparentés
Un diagramme entité-association créé pendant la conception peut montrer les entités de l’activité avant que les tables existent. Les diagrammes de style Chen utilisent des ovales pour les attributs et des losanges pour les associations. Un diagramme de schéma montre les tables réelles et leurs clés déclarées. Les deux aident à communiquer la structure, mais leurs symboles doivent être lus selon leur propre légende.
Points clés
- Un diagramme de schéma montre les tables et les liens de clés déclarés.
- À chaque extrémité d’une ligne, lis le minimum et le maximum à l’aide de la légende.
- L’extrémité opposée décrit les lignes liées à une ligne de départ.
- L’extrémité plusieurs d’un lien un-à-plusieurs contient la clé étrangère dont les valeurs se répètent.
- Deux extrémités plusieurs qui se rejoignent à une table peuvent révéler une table d’association.
- Un diagramme indique les liens autorisés ; les lignes donnent les nombres réels.
5.3 Trouver les informations en suivant les clés
Localise chaque information demandée et suis les clés qui la relient à l’enregistrement de départ. Les noms peuvent se répéter ou changer ; fais plutôt correspondre les valeurs des clés.
Trouver le client d’une commande
« Où habite le client qui a passé la commande 102 ? » suit ce chemin :
- Trouve la commande 102 à l’aide de
orders.order_id. - Lis son
customer_id: 2. - Trouve le client 2 à l’aide de
customers.customer_id. - Lis
customers.city: Denver.
Le numéro de commande 102 n’est pas l’identifiant du client. Les jointures SQL automatisent ces correspondances de clés ; les positions à l’affichage ne relient pas les enregistrements.
Trouver les produits et un total historique
La commande 101 possède les lignes order_items suivantes. Suis chaque product_id jusqu’à products pour trouver son nom :
product_id | quantity | unit_price | Nom du produit |
|---|---|---|---|
| 11 | 2 | 12,50 | Mug |
| 12 | 1 | 8,99 | Chargeur de téléphone |
Utilise le prix enregistré sur la ligne pour calculer le montant facturé :
- Deux mugs à 12,50 dollars américains coûtent 25,00 dollars américains.
- Un chargeur à 8,99 dollars américains coûte 8,99 dollars américains.
- Total : 33,99 dollars américains.
Le prix actuel d’un produit pourrait donner un coût erroné pour une ancienne commande. La commande 102 contient une lampe à 34,00 dollars américains ; la commande 103 contient quatre mugs à 12,50 dollars américains, soit un total de 50,00 dollars américains.
Interpréter les valeurs manquantes et les règles
La date d’expédition de la commande 102 est NULL, documenté ici comme « non expédiée ». Teste-la avec IS NULL, et non avec une égalité à NULL.
Lis chaque contrainte pertinente lorsque tu évalues une modification :
- Une ligne pour la commande 104 est rejetée si cette commande n’existe pas.
- Une autre ligne avec la clé (
101,11) est rejetée car la paire existe déjà. - Une quantité de 0 ne satisfait pas la vérification de quantité positive.
- Le comportement par défaut de la clé étrangère bloque la suppression du produit 11 tant que des lignes y font référence.
Une clé inutilisée ne rend pas une ligne valide si sa référence est manquante.
Identifier les nouvelles lignes
Lorsqu’un client existant achète deux produits existants différents, cela ajoute une ligne orders et deux lignes order_items. Le client et les produits existent déjà. Proposer un nouveau produit ajoute une ligne products, sans nécessiter de commande.
Points clés
- Localise chaque information demandée avant de suivre le chemin de clés.
- Fais correspondre les valeurs de clés étrangères aux clés référencées, et non aux noms ou aux positions des lignes.
- Utilise le prix de la ligne de vente pour calculer les totaux historiques des commandes.
- Vérifie chaque contrainte applicable lorsque tu évalues une modification proposée.
- Un nouvel événement ajoute des lignes aux tables dont il crée les informations.
Modèle relationnel : exemples
1Des enregistrements partagés aux requêtes à la base de données
12 étapes
- 1IntroductionQui s’occupe des informations partagées ?
Les équipes de vente, d’assistance et de direction d’une boutique utilisent les mêmes enregistrements de clients. Une base de données contient ces informations partagées et un logiciel appelé SGBD les gère.
Découvre comment un système de base de données partage ces informations, maintient la cohérence des modifications grâce à une transaction et répond aux demandes des applications.
- 2ExplicationDistinguer l’ensemble de données du logiciel
Les données sont des faits enregistrés. Une base de données est un ensemble organisé de données liées ; un SGBD est le logiciel qui le gère.
Les clients et les commandes de la boutique sont des données. PostgreSQL les stocke, vérifie les règles et répond aux demandes.
- 3ExempleMettre à jour un seul numéro de téléphone
Le numéro de téléphone de Maria apparaît sur 14 ventes dans une feuille de calcul. Une modification oubliée laisse des copies contradictoires.
Stocke son numéro une seule fois sous
customer_id1 et fais-y référence depuis les ventes. Un changement de numéro ne nécessite alors qu’une mise à jour ; chaque vente conserve ses propres informations. - 4AnalogieGarder deux modifications groupées
Un transfert soustrait un montant du compte courant et l’ajoute au compte d’épargne. Enregistrer uniquement la soustraction laisserait des soldes incorrects.
Une transaction enregistre les deux modifications ensemble ou les annule toutes deux, même si elles concernent plusieurs lignes ou tables.
- 5DéfiChoisir la protection
Une réservation réduit le nombre de places disponibles, mais l’enregistrement de son paiement échoue. Les deux modifications appartiennent à une seule transaction. Que doit-il rester après l’annulation de cette transaction ?
---reveal---
Aucune des deux modifications ne doit subsister. Annuler la réduction du nombre de places rétablit la disponibilité précédente et aucun enregistrement de paiement issu de cette transaction échouée n’est conservé. Ne garder que la modification des places laisserait une réservation partielle.
- 6LienReconnaître la charge de travail
Passer une commande est une tâche transactionnelle : quelques lectures et écritures rapides. Comparer les ventes mensuelles par région est une tâche analytique : elle synthétise de nombreux enregistrements historiques.
Une base de données de ventes peut servir aux deux activités.
- 7ExplicationSuivre la requête de l’application
Les clients envoient des requêtes à un serveur de base de données, comme avec PostgreSQL ou SQL Server. SQLite fonctionne comme une bibliothèque dans l’application, sans serveur distinct.
Un fournisseur de service cloud géré exploite les serveurs pour ses utilisateurs ; les tables et les requêtes restent utilisées.
- 8ExempleLire une requête déclarative
SELECT first_name, city FROM customers WHERE state = 'TX';demande deux colonnes pour les clients de TX.SQL est déclaratif : il indique le résultat et laisse au SGBD le choix des étapes pour l’obtenir. SQL est le langage ; PostgreSQL est un produit qui l’interprète.
- 9ConseilComprendre le rôle de l’instruction
ALTER TABLEmodifie la structure ;INSERTajoute une ligne ;GRANTgère une autorisation ;COMMITenregistre une transaction.Le texte utilise des apostrophes :
'TX'. Double une apostrophe interne :'O''Brien'. Un point-virgule termine normalement une instruction. - 10DéfiDistinguer structure et données
Une boutique ajoute une colonne
delivery_note, puis la remplit pour une commande. Ces deux opérations modifient-elles des lignes ?---reveal---
Ajouter la colonne modifie la structure : c’est de la définition de données. La remplir modifie les données stockées : c’est de la manipulation de données.
- 11DéfiRéunir les éléments
Un site web envoie du SQL à un serveur PostgreSQL pour enregistrer un achat. Un responsable lit plus tard une vue ordinaire des ventes. La vue contient-elle une autre copie stockée de toutes ces lignes d’achat ?
---reveal---
Non. Une vue ordinaire enregistre une requête qui lit les données sous-jacentes ; elle ne stocke pas ses propres lignes de résultat séparées. PostgreSQL reste le SGBD qui gère les enregistrements d’achats, tandis que le site web et l’outil de rapport sont des clients.
- 12RécapitulatifUn ensemble partagé aux responsabilités claires
Une base de données contient des informations ; un SGBD gère le stockage, les règles, l’accès et la restauration. Les transactions maintiennent les modifications groupées.
Les requêtes SQL concernent la structure, les lignes, les autorisations ou le contrôle des transactions. Identifie leur rôle avant d’en lire les détails.
2Comprendre le sens d’une table
10 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionCommencer par ce que représente une ligne
- 2ExempleTrouver la ville d’un client
- 3ExplicationUtiliser les noms formels
- 4DéfiPrévoir deux types d’ajouts
- 5Point cléIdentifier les enregistrements sans leur position
- 6AnalogieGarder une valeur pour chaque propriété
- 7ExplicationAssocier un type à son domaine
- 8DéfiInterpréter un export de feuille de calcul
- 9DéfiVérifier un nouvel enregistrement et ses valeurs
- 10RécapitulatifLire la structure avant les valeurs
3Choisir le stockage et raisonner avec NULL
15 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDeux choix pour chaque colonne
- 2ExplicationDistinguer les familles de types numériques
- 3ConseilRemarquer les différences entre produits
- 4DéfiVérifier la plage d’un type décimal
- 5LienReconnaître les dates et les indicateurs
- 6ExplicationChoisir selon l’usage de la valeur
- 7ExempleStocker les montants exactement
- 8DéfiCorriger le type d’un code et d’une quantité
- 9ExplicationLire ce qui manque
- 10ExempleSuivre une comparaison inconnue
- 11Point cléUtiliser le test de valeur manquante
- 12DéfiCombiner le connu et l’inconnu
- 13ExempleCompter ce qui est présent
- 14DéfiVérifier l’interprétation d’un rapport
- 15RécapitulatifLaisser le sens guider le stockage
4Construire des liens fiables à partir des clés
18 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionL’identification précède le lien
- 2ExplicationVérifier l’unicité et la minimalité
- 3DéfiExaminer une inscription future
- 4ConseilDéclarer une seule clé primaire
- 5ExplicationChoisir un identifiant stable
- 6Point cléConserver une règle métier distincte
- 7DéfiInterpréter un trou sans renuméroter
- 8ExempleSuivre la référence d’une commande
- 9ExplicationRéférences obligatoires et facultatives
- 10DéfiLire une règle de suppression
- 11LienVérifier la référence complète
- 12ExplicationLire une association un-à-plusieurs dans les deux sens
- 13ExempleLimiter un lien à un
- 14ExempleReprésenter chaque paire commande-produit
- 15Point cléStocker une information sur la paire
- 16DéfiChoisir un lien pour une nouvelle situation
- 17DéfiCombiner identification et références
- 18RécapitulatifLes clés remplissent ensemble différents rôles
5Lire un schéma pour répondre à une question
14 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDistinguer le plan des enregistrements
- 2ExempleLire une définition de commande
- 3Point cléCombiner une vérification et une valeur obligatoire
- 4DéfiClasser deux modifications
- 5ConseilTrouver les règles complètes
- 6ExplicationLire la légende d’un diagramme
- 7ExemplePartir d’une ligne et regarder l’autre extrémité
- 8DéfiPrévoir un lien facultatif
- 9LienRepérer une table de paires
- 10ExempleSuivre la commande 102 jusqu’à sa ville
- 11ExempleCalculer à partir des lignes de vente
- 12DéfiÉvaluer une ligne proposée
- 13DéfiRelier les données, les règles et le sens
- 14RécapitulatifUtiliser chaque source pour ses propres informations
Modèle relationnel : QCM
Série 1 : Lire les enregistrements, les types et les liens simples10 Questions Pratiques
Question 1 sur 10
DECIMAL(7, 2) ?Afficher la réponseMasquer la réponse
Question 2 sur 10
Afficher la réponseMasquer la réponse
Question 3 sur 10
Afficher la réponseMasquer la réponse
Question 4 sur 10
Afficher la réponseMasquer la réponse
Question 5 sur 10
badge_number soit présent et unique. Les services se répètent. Pourquoi (badge_number, service) est-il une super-clé mais pas une clé candidate ?Afficher la réponseMasquer la réponse
badge_number, qui est unique : la paire n’est donc pas minimale. Les services répétés ne remettent pas en cause l’unicité de la paire ; c’est la colonne superflue qui l’empêche d’être candidate.Question 6 sur 10
Afficher la réponseMasquer la réponse
0047 et 47-A comme identifiants. Un entier perd les zéros initiaux et ne peut pas représenter la lettre et le tiret. Choisis un type selon l’usage de la valeur.Question 7 sur 10
WHERE region <> 'NE' ?Afficher la réponseMasquer la réponse
Question 8 sur 10
event_id contrôlée et non NULL vers Events. Les événements 12 et 19 existent. Deux billets font déjà référence à l’événement 12. Que se passe-t-il pour un troisième billet faisant référence à l’événement 12 ?Afficher la réponseMasquer la réponse
Question 9 sur 10
Afficher la réponseMasquer la réponse
Question 10 sur 10
quantity INTEGER CHECK (quantity > 0) et status TEXT DEFAULT 'new'. Aucune des deux colonnes n’a NOT NULL. Une nouvelle ligne fournit la quantité NULL et omet le statut. Que stocke-t-on ?Afficher la réponseMasquer la réponse
Série 2 : Appliquer les règles dans une petite base de données10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
open_jobs et un index sur jobs.job_id. Quel est le rôle de chacun ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
VARCHAR(4). Une ligne fournit le texte « Saison ». Que fait SQLite ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
account_id 14. Accounts contient le compte 14 à Phoenix et le compte 620 à Tulsa. Le account_id de la commande référence Accounts.account_id. Où se trouve le compte de la commande 620 ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 3 : Choisir les types et suivre les enregistrements liés10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
delay_days NULL et le statut 'urgent'. Quel est le résultat de (delay_days > 2) OR (status = 'urgent') et WHERE conserve-t-il la ligne ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
tracking_note comme nouvelle colonne pour chaque livraison. Quelle propriété change directement ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
member_id généré comme clé primaire. L’adresse électronique doit être présente et identifier au plus un compte. Quelle déclaration supplémentaire impose les deux règles sur l’adresse électronique dans PostgreSQL ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Profiles.user_id est à la fois la clé primaire de Profiles et une clé étrangère vers Users.user_id. Aucune règle n’impose à un utilisateur d’avoir un profil. Qu’est-ce que cela autorise ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
warehouse_id, item_id) et contient les lignes (4, 7) et (5, 9). Reservations possède une clé étrangère composite obligatoire et contrôlée vers StockRows. Une réservation pour (4, 9) est-elle autorisée ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 4 : Lire les contraintes et expliquer leurs conséquences10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
order_id, product_id) et les deux éléments sont des clés étrangères. Que montre cela entre les commandes et les produits ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
person_id et locker_id sont tous deux obligatoires et individuellement uniques. La clé primaire est person_id. Comment faut-il classer locker_id ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
DECIMAL(8, 2). Quelle information supplémentaire faut-il pour interpréter un prix stocké de 45,00 comme un montant réel ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
DECIMAL(6, 2) et le libellé VARCHAR(3). Des lignes fournissent le montant 1 234 567,89 et le libellé « Été ». Qu’imposent ces seules déclarations ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 5 : Résoudre des cas de données manquantes et de contraintes liées10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
batch_id, page_no). La paire (18, 4) existe. Les numéros de lot et de page peuvent se répéter séparément. Quelle ligne proposée est rejetée précisément parce qu’elle duplique cette clé ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Orders.customer_id est une clé étrangère non NULL vers Customers, sans règle d’unicité. Les clients peuvent n’avoir aucune commande. L’ajout de UNIQUE à Orders.customer_id laisse les autres règles inchangées. Comment l’association change-t-elle ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
WHERE NOT (city = 'Miami') OR city IS NULL ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
a INTEGER NOT NULL, b INTEGER NOT NULL, PRIMARY KEY (a, b) et q INTEGER NOT NULL CHECK (q > 0). Aucune ligne n’existe. Quelle ligne proposée respecte toutes ces contraintes ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
project_id qui autorise NULL et utilise ON DELETE SET NULL. La note 4 fait référence à la tâche 7 par une clé étrangère contrôlée utilisant ON DELETE CASCADE. Après la suppression du projet 31, la tâche 7 est supprimée. Que reste-t-il de la tâche 9 et de la note 4 ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Tu bloques sur ton propre exercice ? Aide aux Devoirs
Mots-Clés
A
Action référentielle
ON DELETE SET NULL conserve les lignes enfants mais efface leur référence au parent ; cette référence doit donc autoriser NULL.Affinité de type
abc comme texte lorsque la conversion en entier échoue.Architecture client-serveur
Association facultative
coupon_id à NULL tandis que d’autres commandes font référence à des coupons existants.Association plusieurs-à-plusieurs
Association réflexive
manager_id d’un employé pointe vers une autre ligne d’employé, avec NULL pour une personne qui n’a pas de responsable.Association un-à-plusieurs
Association un-à-un
user_id à la fois comme clé primaire et comme clé étrangère, ce qui empêche un second profil pour un même utilisateur.B
Base de données
Base de données relationnelle
C
Cardinalité d’une association
Cardinalité d’une table
Cascade
Centimes entiers
Charge analytique (OLAP)
Charge transactionnelle (OLTP)
Chemin de clés
customer_id jusqu’à une ligne de client et lis la ville de cette ligne.Clé alternative
account_id généré.Clé candidate
employee_id devient la clé primaire.Clé composite
Clé de substitution
customer_id reste fixe lorsque le client change d’adresse électronique, de numéro de téléphone ou de nom de famille.Clé étrangère
customer_id 1, chacune faisant référence au même enregistrement de client unique.Clé naturelle
state_code à deux lettres comme clé primaire lisible dans les enregistrements d’adresses.Clé primaire
customer_id comme clé primaire afin que les commandes puissent faire référence à un client précis.Code de devise
Code numérique
02108 doit être stocké sous forme de texte pour conserver le zéro initial lors de sa lecture.Colonne (attribut ou champ)
city contient une valeur de ville, ou NULL lorsque cela est autorisé, pour chaque enregistrement de client.Contrainte
Contrainte CHECK
NOT NULL avec CHECK (quantity > 0) pour couvrir les deux règles.D
Degré
Diagramme de schéma
orders.customer_id à la clé du client, rendant visible la référence des commandes vers les clients.Diagramme entité-association
Dialecte SQL
LIMIT 10 pour limiter un résultat, tandis que SQL Server utilise couramment TOP 10.Dictionnaire de données
shipped_date NULL signifie que la commande n’a pas été expédiée ou que la date a été perdue.Domaine
Données
Données structurées
É
Échelle
DECIMAL(p, s) est s, le nombre de chiffres après la virgule, qui détermine sa précision fractionnaire.F
Format de date ISO
2026-03-02.I
Identifiant généré
INTEGER PRIMARY KEY fournit un entier lorsqu’une nouvelle ligne omet l’identifiant.Indépendance des données
Index
Instance de base de données
Intégrité référentielle
IS NULL
IS NULL est le test SQL qui renvoie vrai lorsqu’une entrée est manquante, ce qui permet de trouver ces lignes sans comparaison d’égalité.phone IS NULL identifie les clients dont les numéros de téléphone n’ont pas été enregistrés.J
Jointure
orders.customer_id à customers.customer_id pour atteindre la bonne ville.L
Langage de définition de données (LDD)
Langage de manipulation de données (LMD)
Ligne (n-uplet ou enregistrement)
Ligne de commande
Ligne orpheline
Logique à trois valeurs
M
Montant de la ligne
Moteur de base de données embarqué
N
NOT NULL
NOT NULL est une contrainte qui impose la présence d’une entrée dans une colonne et rejette NULL, sans vérifier elle-même que la valeur est positive ou que le texte est non vide.Notation en patte d’oie (crow’s foot)
NULL
P
Précision
DECIMAL(p, s) est p, le nombre total de chiffres disponibles pour les parties entière et fractionnaire d’une valeur.DECIMAL(8, 2), huit chiffres au total laissent de la place pour six avant la virgule et deux après.S
Schéma de base de données
SQL
Super-clé
employee_id est unique, l’associer au service identifie toujours l’employé, mais ajoute une colonne superflue.Système de gestion de bases de données (SGBD)
T
Table (relation)
Table d’association
order_items relie une commande à un produit et enregistre la quantité et le prix unitaire facturé.Table parente et table enfant
Transaction
Type à virgule flottante
Type booléen
in_stock enregistre si un article est disponible ; sa forme exacte de stockage varie selon le SGBD.Type caractère
MUG-11-BLU doit être stocké sous forme de texte, car c’est un identifiant, et non une quantité.Type décimal exact
DECIMAL(8, 2) stocke des montants exacts en euros et centimes dans sa plage.Type entier
U
UNKNOWN
state <> 'TX' vaut UNKNOWN pour un client dont l’État est NULL, donc WHERE exclut cette ligne.UUID
V
Valeur atomique
Valeur par défaut
DEFAULT 'pending' enregistre le statut « pending » (« en attente ») lorsque la nouvelle ligne ne le précise pas.Vue
À propos de cette unité
Crée ton propre Matériel d'Étude
Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.