SQL en prépa : Maîtriser les bases de données
Le langage SQL (Structured Query Language) est un outil essentiel pour tout futur ingénieur. Il permet de manipuler et d’interroger des bases de données, ce qui est crucial dans de nombreux domaines, de la recherche scientifique au développement web. Cet article vise à te donner une introduction complète à SQL, en couvrant les notions fondamentales et en les illustrant avec des exemples concrets.
Notions fondamentales
- Tables et attributs: Une base de données est constituée de tables, qui sont des ensembles de données organisés en colonnes (attributs) et en lignes (enregistrements).
- Entités et relations: Les tables représentent des entités (objets du monde réel) et les liens entre elles sont définis par des relations.
- Clés primaires et étrangères: Chaque table possède une clé primaire qui identifie de manière unique chaque enregistrement. Une clé étrangère est une colonne qui référence la clé primaire d’une autre table.
Exemple de base de données
Voici un exemple de base de données que nous utiliserons tout au long de l’article.
Considérons les tables suivantes :
“Etudiants” qui contient les informations des étudiants, tels que leur numéro d’étudiant, leur nom, leur prénom, leur classe (MP, PSI, PT…) et l’identifiant de leur établissement :
- NumEtudiant (int, clé primaire)
- Nom (varchar(255))
- Prenom (varchar(255))
- Classe (varchar(4))
- IdEtablissement (int)
“Etablissements” qui contient les informations des établissements, telles que l’identifiant de l’établissement et le nom de l’établissement :
- IdEtablissement (int, clé primaire)
- NomEtablissement (varchar(255))
La table “Etudiants” est liée à la table “Etablissement” par la colonne “IdEtablissement“. Un étudiant est inscrit dans un seul établissement.
- int correspond à un nombre entier
- varchar(x) correspond à une chaîne de x caractères maximum
La déclaration du type de variable se fait lors de la création de la table, ce qui n’est pas au programme du concours.
Les requêtes
Parcourons à présents les différentes requêtes à connaître. Pour chaque requête un exemple sera donné pour l’expliquer, toujours en utilisant la base de données présentées précédemment.
La commande SELECT et les clauses WHERE et DISTINCT
La commande SELECT permet de sélectionner des données d’une ou plusieurs tables.
La clause WHERE permet de filtrer les résultats selon des conditions spécifiques. Le mot-clé DISTINCT permet de supprimer les doublons.
Exemples
SELECT Nom, Prenom FROM Etudiants WHERE Classe = 'MP' AND IdEtablissement = 1;
Cette requête sélectionne les noms et prénoms des étudiants de la classe MP inscrits dans l’établissement 1.
La clause WHERE permet de filtrer les résultats en fonction de deux conditions : Classe et IdEtablissement.
Le résultat est un tableau avec deux colonnes : Nom et Prenom
Nom | Prenom ------- | -------- Dupont | Jean Martin | Pierre ...
SELECT DISTINCT NomEtablissement FROM Etablissements;
Cette requête sélectionne les noms des différents établissements.
Le mot-clé DISTINCT permet de supprimer les doublons dans le résultat s’il y en a.
Le résultat est donc une liste des noms de filières, sans doublons :
NomEtablissement --------------- Louis-le-Grand Sainte-Geneviève Henri-IV Le Parc ...
Les mots-clés LIMIT, OFFSET et ORDER BY
Les mot-clés permettent de trier les données que l’on veut afficher ou modifier les paramètres d’affichage. Voici ceux au programme :
- LIMIT limite le nombre de résultats,
- OFFSET permet de sauter un certain nombre de résultats en partant du début,
- ORDER BY permet de trier les résultats selon un ou plusieurs attributs.
Exemples
SELECT * FROM Etudiants ORDER BY Nom ASC LIMIT 10;
Cette requête sélectionne les 10 premiers étudiants triés par ordre alphabétique croissant du nom.
ORDER BY Nom ASC trie les résultats par la colonne Nom dans l’ordre croissant (ASC).
LIMIT 10 limite le nombre de résultats à 10.
Ce qui donnerait :
NumEtudiant | Nom | Prenom | Classe | IdEtablissement ------- | -------- | -------- | -------- | -------- 1 | Abadie | Alexandre | MP | 1 2 | Bernard | Thomas | PSI | 2 3 | ... ... 10 | Petit | Jade | PC | 5
SELECT * FROM Etudiants ORDER BY Prenom DESC OFFSET 5;
Cette requête sélectionne tous les champs de la table Etudiants triés par ordre décroissant du prénom (DESC).
La clause OFFSET 5 permet de sauter les 5 premiers résultats.
NumEtudiant | Nom | Prenom | Classe | IdEtablissement ------- | -------- | -------- | -------- | -------- 32 | Martin | Thomas | PSI | 2 31 | Durand | Sophie | MP | 1 30 | ...
Les opérateurs ensemblistes
Intéressons-nous désormais aux opérateurs ensemblistes :
- UNION combine les résultats de deux requêtes,
- INTERSECT ne conserve que les résultats présents dans les deux requêtes,
- EXCEPT soustrait les résultats de la deuxième requête de ceux de la première.
Exemples
SELECT * FROM Etudiants WHERE Classe = 'MP' UNION SELECT * FROM Etudiants WHERE Classe = 'PC';
Cette requête combine les résultats de deux requêtes : les étudiants de la classe MP et ceux de la classe PC.
L’opérateur UNION permet de fusionner les deux ensembles de résultats en supprimant les doublons.
Le résultat est une liste de tous les étudiants en MP et PC.
SELECT * FROM Etudiants WHERE Classe = 'MP' INTERSECT SELECT * FROM Etudiants WHERE IdEtablissement = 1;
Cette requête sélectionne tous les champs de la table Etudiants qui satisfont deux conditions :
- La classe est égale à MP,
- L’identifiant de l’établissement est égal à 1.
L’opérateur INTERSECT est utilisé pour ne conserver que les enregistrements qui sont présents dans les deux ensembles de résultats. Cette requête utilise donc une jointure implicite.
SELECT * FROM Etudiants WHERE Classe = 'MP' EXCEPT SELECT * FROM Etudiants WHERE IdFiliere = 2;
Cette requête sélectionne tous les champs de la table Etudiants qui répondent à la condition suivante :
- La classe est égale à ‘MP’ ET
- L’identifiant de l’établissement est différent de 2.
L’opérateur EXCEPT permet d’exclure les enregistrements du second ensemble de résultats qui sont présents dans le premier ensemble.
Les jointures
Les jointures permettent de combiner des données de plusieurs tables. La jointure interne JOIN ne conserve que les enregistrements qui ont des correspondances dans les deux tables.
Exemple
SELECT Etudiants.Nom, Etablissements.NomEtablissement FROM Etudiants JOIN Etablissements ON Etudiants.IdEtablissement = Etablissements.IdEtablissement;
Cette requête combine les informations des tables Etudiants et Etablissements.
La jointure JOIN permet de lier les deux tables sur la colonne commune IdEtablissement.
Le résultat est un tableau avec deux colonnes : Nom de l’étudiant et nom de l’établissement dans lequel il est inscrit.
Les fonctions d'agrégation
Les fonctions d’agrégation permettent de calculer des statistiques sur les données :
- MIN calcule le minimum d’une série
- MAX calcule le maximum
- AVG calcule la moyenne
- COUNT compte le nombre d’éléments de la série
Exemple
SELECT COUNT(*) FROM Etudiants WHERE Classe = 'MP';
Cette requête compte le nombre d’étudiants inscrits en MP.
Filtrage des agrégats
La clause HAVING permet de filtrer les résultats d’une requête d’agrégation.
Exemple
Imaginons que chaque élève possède désormais une note (sa moyenne générale par exemple), qui est renseignée dans la table Etudiants. La requête suivante va alors donner la liste des classes et la moyenne de la classe là où la moyenne de classe est supérieure à 12.
SELECT Classe, AVG(Note) FROM Etudiants GROUP BY Classe HAVING AVG(Note) > 12;
Conclusion
Cet article a présenté les bases du langage SQL et ses applications comme on pourrait les retrouver au concours. Toutefois ces exemples restent simples pour assimiler les bases et ne sont pas suffisant pour établir toutes les requêtes qui seront demandées.