SQL / Bases de données
Sommaire
1. Vocabulaire de base
| Terme | Définition |
|---|---|
| BD / BDD | Ensemble structuré de données, stocké pour être facilement exploité (ajout, mise à jour, recherche). |
| SGBD | Logiciel qui gère l'accès à une BDD (description, manipulation, sécurité, cohérence des données). |
| SGBDR | Un SGBD relationnel (données organisées en tables liées entre elles). |
| SQL | Le langage de requêtes qui permet de dialoguer avec une BDD relationnelle. |
Évolution / typologie des BDD
- BDD relationnelles (schéma fixe, normalisé) — la norme depuis des décennies.
- Depuis 2008 : BDD NoSQL (Google, Facebook, Amazon…), schéma libre, pensées pour les très gros volumes.
SGBDR les plus utilisés : SQL Server (Microsoft), Oracle (Oracle Corp.), MySQL (Oracle Corp.), MariaDB, PostgreSQL, SQLite.
Les deux grandes familles du langage SQL
- LDD — Langage de Définition des Données (
CREATE,ALTER,DROP…) - LMD — Langage de Manipulation des Données, dont le LID (Langage d'Interrogation des Données) : la commande
SELECT, au cœur de cette fiche.
2. Les 3 niveaux de représentation d'une BDD
Niveau Conceptuel → MCD (Modèle Conceptuel de Données) / diagramme de classes
Niveau Logique → MLD (Modèle Logique des Données) = modèle relationnel
Niveau Physique → MPD, base de données réellement implémentée dans le SGBDR
Le MLD (Modèle Logique des Données)
- Composé de tables (= relations).
- Les colonnes = attributs (champs).
- Les lignes = tuples (enregistrements).
Formalisme d'écriture d'une table :
NOMTABLE (clé_primaire, attribut1, attribut2, …, #clé_étrangère)
Exemple issu du cours :
EPREUVE (codeEpreuve, intituleEpreuve, coefficientEpreuve)
ETABLISSEMENT (codeEtab, nomEtab, villeEtab)
CANDIDAT (numCandidat, nomCandidat, prenomCandidat, …, #codeEtab)
Contraintes d'intégrité :
- Clé primaire : identifie une ligne de façon unique dans sa table.
- Clé étrangère (préfixée
#) : référence la clé primaire d'une autre table, pour créer le lien entre les deux.
3. SELECT — la structure générale
SELECT colonne1, colonne2, ...
FROM table
WHERE condition
GROUP BY colonne
HAVING condition_sur_groupe
ORDER BY colonne;
a) Projection — choisir les colonnes (SELECT)
| Mot-clé / syntaxe | Rôle |
|---|---|
SELECT col1, col2 | Sélectionne certaines colonnes |
SELECT * | Sélectionne toutes les colonnes |
AS | Renomme une colonne à l'affichage (alias) |
DISTINCT | Supprime les doublons du résultat |
ORDER BY col [ASC|DESC] | Trie le résultat |
SELECT nomCandidat AS "Nom", prenomCandidat AS "Prénom"
FROM candidat
ORDER BY nomCandidat;
SELECT DISTINCT villeEtab
FROM etablissement;
Fonctions utiles (syntaxe Oracle vue en cours, logique proche en MySQL) :
- Sur les chaînes :
LENGTH(chaine),UPPER(chaine),LOWER(chaine) - Sur les nombres :
+ - * /,ABS(n) - Sur les dates :
SYSDATE(date système), opérateurs+/-entre dates,DATEDIFF(date1, date2)en MySQL (nombre de jours entre deux dates) - Fonctions d'agrégat (de groupe) :
COUNT(*),COUNT(colonne)(ignore les valeurs NULL),SUM(),AVG(),MIN(),MAX()
SELECT COUNT(*) AS "Nombre"
FROM candidat;
b) Sélection — filtrer les lignes (WHERE)
SELECT numCandidat, note
FROM obtenir
WHERE note >= 10;
- La condition est une expression logique (vrai / faux) portant sur une valeur de champ.
- Opérateurs logiques :
AND(plusieurs conditions à la fois),OR(conditions alternatives). - Autres opérateurs utiles :
=,<>ou!=,<,>,<=,>=,LIKE(motif avec%),BETWEEN,IN.
c) Jointures — combiner plusieurs tables
- Produit cartésien : toutes les combinaisons possibles entre les lignes de 2 tables (rarement utile seul, base théorique de la jointure).
- Jointure interne (
INNER JOIN) : ne garde que les lignes qui correspondent dans les deux tables.
SELECT numCandidat, nomCandidat, prenomCandidat, nomEtab
FROM candidat
INNER JOIN etablissement ON candidat.codeEtab = etablissement.codeEtab;
- Jointure externe (
LEFT OUTER JOIN/RIGHT OUTER JOIN) : garde en plus les lignes qui n'ont pas de correspondance dans l'autre table (complétées parNULL).
SELECT prenomCandidat, nomEpreuve, note
FROM candidat
LEFT OUTER JOIN obtenir ON candidat.numCandidat = obtenir.numCandidat;
- Préfixer les colonnes (
table.colonne) est obligatoire dès que deux tables jointes ont un champ de même nom, pour lever l'ambiguïté. - Alias de table :
FROM candidat AS c(ou justeFROM candidat c) permet ensuite d'écrirec.nomCandidat— pratique pour raccourcir les requêtes.
d) Regroupement — agréger des lignes
SELECT villeEtab, COUNT(*) AS "Nombre"
FROM etablissement
GROUP BY villeEtab
HAVING COUNT(*) > 1;
GROUP BY colonne: regroupe les lignes ayant la même valeur sur la/les colonne(s) indiquée(s).- Règle importante : toute colonne projetée qui n'est pas une fonction d'agrégat doit apparaître dans le
GROUP BY(MySQL est permissif là-dessus, mais ce n'est pas une bonne pratique). HAVING: filtre les groupes (après leGROUP BY), commeWHEREfiltre les lignes (avant le regroupement).
4. Pense-bête — ordre d'exécution logique d'une requête
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
L'ordre d'écriture du SQL n'est pas l'ordre d'exécution — utile pour comprendre pourquoi HAVING peut utiliser un agrégat mais pas WHERE.
5. À réviser côté exercices
Le cours contient un sujet type DS sur une base DANINE (fabricant/expéditeur de yaourts) avec des exercices de projection/sélection à partir d'un modèle physique de données, et l'utilisation de DATEDIFF(). Refaire ce type d'exercice (écrire la requête à partir d'un cahier des charges en français) est le meilleur entraînement avant un DS.