À quoi ressemble une base de données

Vous débutez en SQL ? Commencez ici. Les exemples montrent comment une table contient des données et comment lire le résultat d’une requête.

Ouvrez-la d’abord

Utilisez le bouton sous le premier exemple. Planche s’ouvre dans un nouvel onglet avec une base de boutique déjà chargée. La base est traitée dans la page : vos essais ne modifient aucun serveur. Pour repartir de zéro, rechargez la base d’exemple depuis l’écran d’accueil.

Une table est une grille

Exécutez celle-ci. Elle demande tout ce que contient la table categories.

1

SELECT * FROM categories;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 33

idnamedescriptionparent_idsort_orderis_active
1ElectronicsElectronics and related productsNULL01
2LaptopsLaptops in Electronics111
3PhonesPhones in Electronics121
4TabletsTablets in Electronics131
5AudioAudio in Electronics141

Planche s’ouvre dans un onglet séparé, la base d’exemple déjà chargée et cette requête prête dans l’éditeur. Tous les exemples de la page réutilisent cet onglet, et rien ne s’exécute tant que vous n’appuyez pas sur F9.

Le résultat s’affiche sous forme de grille : c’est une table. Trois mots suffisent pour la décrire :

  • Une colonne est l’un des en-têtes en haut — id, name, description. Chaque entrée de la table a ces mêmes six colonnes, et ce sont ces noms que vous taperez dans vos requêtes.
  • Une ligne traverse la grille horizontalement, et c’est une chose. Ici, une ligne est une catégorie. Il y a 33 lignes, la boutique a donc 33 catégories.
  • Une cellule est le croisement d’une ligne et d’une colonne — une valeur, par exemple le nom d’une catégorie donnée.

Toutes les tables de cette base ont la même forme. products a une ligne par produit, orders une par commande, customers une par client. Ce qui change, ce sont les colonnes.

Certaines cases sont vides, et cela porte un nom

2

SELECT id, name, parent_id
FROM categories
LIMIT 8;
Ouvrir dans Planche

Résultat — 5 premières lignes sur 8

idnameparent_id
1ElectronicsNULL
2Laptops1
3Phones1
4Tablets1
5Audio1

Regardez parent_id. Certaines lignes ont un nombre, d’autres affichent NULL. Cette colonne indique dans quelle catégorie celle-ci se trouve — les portables sont dans l’électronique — et les catégories de premier niveau ne sont dans aucune : il n’y a rien à y mettre.

NULL veut dire « pas de valeur ici ». Cela mérite d’être appris comme une idée à part entière plutôt que comme une sorte de zéro, car ce n’en est pas un :

  • NULL n’est pas 0. Zéro est un nombre que vous avez mesuré ; NULL est une mesure que vous n’avez pas.
  • NULL n’est pas non plus une chaîne vide. Un client dont le nom est enregistré comme vide n’est pas la même chose qu’un client dont le nom n’a jamais été saisi.

NULL suit des règles de comparaison particulières, expliquées dans la troisième leçon. Retenez pour l’instant qu’il représente une valeur inconnue ou absente.

Chaque ligne a son propre numéro

La première colonne ici est id, un nombre qui appartient à exactement une ligne et n’est jamais réutilisé. C’est la clé primaire de la ligne — la façon dont tout le reste y fait référence sans dépendre de son nom, que quelqu’un pourrait changer.

Presque toutes les tables que vous rencontrerez en ont une, généralement appelée id.

Pourquoi 23 tables et pas une seule

Une boutique pourrait en principe tenir dans une seule grille énorme : une ligne par commande, avec le nom du client, son adresse, chaque produit et son prix répétés sur cette ligne. Les bases de données ne sont pas construites ainsi, pour une raison très terre à terre : un client qui déménage obligerait à modifier chacune de ses commandes passées, et la moindre ligne oubliée devient une version de la vérité qui contredit les autres.

À la place, chaque type de chose a sa table, et les lignes se désignent entre elles par clé primaire. products.category_id contient un categories.id, orders.customer_id contient un customers.id. Une colonne qui pointe vers la ligne d’une autre table est une clé étrangère, et la suivre est ce que la quatrième leçon appelle une jointure.

C’est aussi pourquoi il vous faut un endroit où consulter les colonnes d’une table. La page de la base de démonstration liste chaque table, chaque colonne, et quelle colonne pointe vers quelle table. Gardez-la ouverte dans un autre onglet — même ceux qui écrivent du SQL tous les jours gardent le schéma à côté d’eux.

Une requête est une question, et la réponse est aussi une table

3

SELECT COUNT(*) AS how_many FROM products;
Ouvrir dans Planche

Résultat — 1 ligne

how_many
400

Une ligne, une colonne, un nombre. C’est toujours une table, simplement très petite — et c’est toute l’idée de SQL : vous envoyez une question, et ce qui revient a toujours la même forme rectangulaire, que ce soit 400 lignes ou une seule.

Remarquez aussi que cette réponse n’existe nulle part dans la base. Rien ne stocke le nombre 400 ; la base a compté les lignes au moment où vous avez demandé. La plupart des requêtes utiles sont ainsi : elles calculent une réponse au lieu d’aller la chercher.

En exécuter une vous-même

Dans l’éditeur en haut de l’espace de travail, écrivez ou modifiez une requête et appuyez sur F9 pour l’exécuter — ou sur Ctrl / ⌘ + Entrée pour n’exécuter que l’instruction où se trouve le curseur. Le résultat apparaît dans la grille en dessous, et le nombre de lignes en bas.

Le panneau de gauche est la même base sous forme d’arborescence : dépliez main, puis Tables, et double-cliquez sur une table pour voir ses lignes sans rien écrire. C’est souvent le moyen le plus rapide de découvrir ce qu’une table contient avant de l’interroger.

Chaque exemple de ces pages s’ouvre dans son propre onglet : vous pouvez en modifier un, l’exécuter et revenir en arrière sans perdre votre place.

Quand ça se passe mal

Cela arrivera, et les messages sont courts et littéraux. Une faute dans un nom de colonne donne :

no such column: naem

Lisez d’abord la fin du message — elle nomme en général exactement ce que la base n’a pas trouvé. Trois causes couvrent l’essentiel des erreurs de début : un nom de colonne mal orthographié, une colonne qui se trouve dans une autre table que celle imaginée, et des guillemets manquants autour d’un texte (SQL veut 'paid', avec des apostrophes ; les guillemets doubles signifient autre chose).

Une erreur signifie que rien n’a été exécuté. L’instruction est rejetée en bloc : une requête qui échoue n’a rien modifié.

La suite

Vous savez ce qu’est une table, une ligne, une colonne et un NULL, et vous savez exécuter une requête et lire le résultat. La prochaine leçon porte sur les quatre clauses qui composent presque toutes les requêtes.

À vous d’essayer

  1. Combien de clients la boutique compte-t-elle ? Vous avez vu la forme de cette requête dans le dernier exemple de la page.

    Voir la réponse

    Voir la réponse

    SELECT COUNT(*) AS how_many FROM customers;
    Ouvrir dans Planche

    Résultat — 1 ligne

    how_many
    1500

    COUNT(*) compte les lignes, et AS how_many ne fait que donner un nom lisible à la colonne de résultat. Remplacez customers par un autre nom de table pour compter celle-là.