Maîtriser les requêtes DQL : les techniques essentielles

Le langage de requête des données (DQL)

Pour interroger une base de données, on utilise presque exclusivement l'instruction SELECT. C'est la commande fondamentale, capable d'exécuter des requêtes aussi bien simples que complexes. Son utilisation est omniprésente dans le travail avec les bases de données relationnelles.

Sélectionner des colonnes spécifiques

-- Récupérer tous les enregistrements de la table 'eleve'
SELECT * FROM eleve;

-- Sélectionner seulement les colonnes numéro_eleve et nom_eleve
SELECT `numero_eleve`, `nom_eleve` FROM eleve;

-- Renommer les colonnes dans le résultat avec l'alias AS
SELECT `numero_eleve` AS matricule, `nom_eleve` AS prenom_nom FROM eleve AS e;

-- Concaténer des valeurs avec la fonction CONCAT()
SELECT CONCAT('Élève: ', nom_eleve) AS identite_complete FROM eleve;

La syntaxe générale est : SELECT colonnes FROM table. On utilise l'alias AS pour donner un nom plus explicite à une colonne ou à une table dans le contexte de la requête.

Éliminer les doublons

-- Lister tous les résultats d'examen
SELECT * FROM notes;

-- Voir quels élèves ont passé l'examen (peut contenir des doublons)
SELECT `numero_eleve` FROM notes;

-- Retirer les doublons pour obtenir une liste unique d'élèves ayant passé l'examen
SELECT DISTINCT `numero_eleve` FROM notes;

Expressions et calculs dans SELECT

-- Obtenir la version du système de base de données (utilisation d'une fonction)
SELECT VERSION();

-- Effectuer un calcul arithmétique direct
SELECT 100 * 3 - 1 AS resultat_calcul;

-- Accéder à une variable système (ex: pas d'auto-incrémentation)
SELECT @@auto_increment_increment;

-- Appliquer un calcul sur une colonne (ajouter 1 point à chaque note)
SELECT `numero_eleve`, `note_examen` + 1 AS note_ajustee FROM notes;

Le champ SELECT peut contenir des expressions variées : des valeurs de texte, des noms de colonnes, NULL, des fonctions, des calculs ou des variables système.

Filtrer les données avec WHERE

-- Récupérer les notes des élèves
SELECT `numero_eleve`, `note_examen` FROM notes;

-- Filtrer les résultats entre 95 et 100 (utilisation de AND)
SELECT `numero_eleve`, `note_examen` FROM notes WHERE note_examen >= 95 AND note_examen <= 100;

-- Alternative avec l'opérateur && (équivalent à AND)
SELECT `numero_eleve`, `note_examen` FROM notes WHERE note_examen >= 95 && note_examen <= 100;

-- Utiliser BETWEEN pour un intervalle continu
SELECT `numero_eleve`, `note_examen` FROM notes WHERE note_examen BETWEEN 95 AND 100;

-- Exclure un élève spécifique (l'élève 1000)
SELECT `numero_eleve`, `note_examen` FROM notes WHERE numero_eleve != 1000;

-- Même exclusion avec l'opérateur NOT
SELECT `numero_eleve`, `note_examen` FROM notes WHERE NOT numero_eleve = 1000;

Requêtes avec motifs (LIKE)

-- Trouver les élèves dont le nom commence par 'Dupont'
-- Le joker % représente zéro ou plusieurs caractères, _ représente un seul caractère.
SELECT `numero_eleve`, `nom_eleve` FROM `eleve` WHERE nom_eleve LIKE 'Dupont%';

-- Trouver les élèves dont le nom est 'Dupont' suivi d'un seul caractère (ex: Duponta)
SELECT `numero_eleve`, `nom_eleve` FROM `eleve` WHERE nom_eleve LIKE 'Dupont_';

Filtrage avec une liste de valeurs (IN)

-- Trouver les élèves avec les numéros 1001, 1002 ou 1003
SELECT `numero_eleve`, `nom_eleve` FROM `eleve` WHERE numero_eleve IN (1001, 1002, 1003);

Gérer les valeurs nulles (NULL)

-- Trouver les élèves sans adresse (chaîne vide ou NULL)
SELECT `numero_eleve`, `nom_eleve` FROM `eleve` WHERE adresse = '' OR adresse IS NULL;

-- Trouver les élèves sans date de naissance enregistrée
SELECT `numero_eleve`, `nom_eleve` FROM `eleve` WHERE date_naissance IS NULL;

Requêtes multi-tables (Jointures)

Démarche pour construire une jionture

  1. Analyser la requête : identifier de quelles tables proviennent les données nécessaires.
  2. Choisir le type de jointure approprié (INNER, LEFT, RIGHT, etc.).
  3. Déterminer la colonne commune (clé) qui servira de lien entre les tables (ex: eleve.numero_eleve = notes.numero_eleve).

La syntaxe de base est : SELECT ... FROM table1 AS alias1 JOIN table2 AS alias2 ON alias1.colonne_commune = alias2.colonne_commune.

-- Jointure interne (INNER JOIN) : seuls les élèves ayant des notes sont retournés
SELECT e.numero_eleve, e.nom_eleve, n.code_matiere, n.note_examen
FROM eleve AS e
INNER JOIN notes AS n ON e.numero_eleve = n.numero_eleve;

-- Jointure externe droite (RIGHT JOIN) : toutes les lignes de 'notes' sont gardées
SELECT e.numero_eleve, e.nom_eleve, n.code_matiere, n.note_examen
FROM eleve AS e
RIGHT JOIN notes AS n ON e.numero_eleve = n.numero_eleve;

-- Jointure externe gauche (LEFT JOIN) : toutes les lignes de 'eleve' sont gardées
SELECT e.numero_eleve, e.nom_eleve, n.code_matiere, n.note_examen
FROM eleve AS e
LEFT JOIN notes AS n ON e.numero_eleve = n.numero_eleve;

-- Trouver les élèves n'ayant pas passé d'examen (gauche sans correspondance à droite)
SELECT e.numero_eleve, e.nom_eleve, n.code_matiere, n.note_examen
FROM eleve AS e
LEFT JOIN notes AS n ON e.numero_eleve = n.numero_eleve
WHERE n.note_examen IS NULL;

Jointure sur plusieurs tables

-- Requête complexe : infos sur les élèves ayant passé un examen (nom, matière, note)
-- Étape 1 : Lier les élèves aux notes.
-- Étape 2 : Lier les notes aux matières.
SELECT e.numero_eleve, e.nom_eleve, m.nom_matiere, n.note_examen
FROM eleve AS e
INNER JOIN notes AS n ON n.numero_eleve = e.numero_eleve
INNER JOIN matiere AS m ON m.code_matiere = n.code_matiere;

Jointure réflexive (Auto-jointure)

Une table est jointe à elle-même. L'astuce consiste à la traiter comme deux instances distinctes via des alias différents. C'est utile pour représenter des relations hiérarchiques (parenet-enfant) au sein d'une même table.

-- Exemple : Table 'categorie' avec une relation parent-enfant.
-- Afficher le nom de la catégorie parente et le nom de la catégorie enfant.
SELECT parent.`nom_categorie` AS 'Catégorie Parent',
       enfant.`nom_categorie` AS 'Catégorie Enfant'
FROM `categorie` AS parent,
     `categorie` AS enfant
WHERE parent.`id_categorie` = enfant.`id_parent`;

Regroupement et filtrage des résultats (GROUP BY, HAVING)

-- Calculer des statistiques par matière : moyenne, note max, note min.
-- Filtrer pour n'afficher que les matières avec une moyenne supérieure à 80.
SELECT m.nom_matiere,
       AVG(n.note_examen) AS moyenne,
       MAX(n.note_examen) AS note_max,
       MIN(n.note_examen) AS note_min
FROM notes AS n
INNER JOIN matiere AS m ON n.code_matiere = m.code_matiere
GROUP BY n.code_matiere   -- Regrouper les lignes par matière
HAVING moyenne > 80;      -- Filtrer les groupes APRÈS agrégation (impossible avec WHERE)

Étiquettes: SQL MySQL DQL requêtes base de données

Publié le 27 juillet à 10h55