🛢️Parcours Fioul GroupéMySQL · Chapitre 07
Accueil › MySQL › Chapitre 07
Chapitre 07 / 16

Autres opérateurs et fonctions

Sous-requêtes, opérateurs ensemblistes et la riche bibliothèque de fonctions intégrées : texte, nombres, dates et conditions.

1 Notion

Les sous-requêtes

Une sous-requête est une requête imbriquée. Elle renvoie une valeur, une liste ou une table.

-- campagnes moins chères que la moyenne
SELECT libelle, prix_litre FROM campagne
WHERE prix_litre < (SELECT AVG(prix_litre) FROM campagne);

-- participants ayant au moins une commande
SELECT nom FROM participant
WHERE id IN (SELECT participant_id FROM commande);
2 Notion

Quantificateurs & EXISTS

-- EXISTS : teste la simple existence (souvent le plus efficace)
SELECT p.nom FROM participant p
WHERE EXISTS (SELECT 1 FROM commande c WHERE c.participant_id = p.id);
Sous-requête corrélée — ici la sous-requête référence p.id de la requête externe : elle s'évalue pour chaque ligne externe. Puissant, à surveiller sur gros volumes.
3 Notion

UNION

UNION empile deux résultats (mêmes colonnes) et dédoublonne ; UNION ALL garde les doublons et va plus vite.

SELECT nom, 'participant' AS type FROM participant
UNION
SELECT nom, 'fournisseur' FROM fournisseur;
4 Notion

Fonctions intégrées

-- texte / nombres / dates / conditions
SELECT
  UPPER(nom)                              AS maj,
  ROUND(prix_litre * 1000, 2)             AS prix_1000L,
  DATE_FORMAT(date_cloture, '%d/%m/%Y')   AS cloture_fr,
  DATEDIFF(date_cloture, CURDATE())       AS jours_restants,
  IFNULL(email, 'non renseigné')          AS email2,
  CASE WHEN prix_litre < 1.10 THEN 'promo' ELSE 'standard' END AS gamme
FROM campagne ca JOIN participant p ON 1=1 LIMIT 5;

Retenez surtout : CONCAT, SUBSTRING, TRIM (texte) ; ROUND, CEIL, MOD (nombres) ; NOW, YEAR, DATE_ADD (dates) ; IFNULL, COALESCE, CASE (conditions).

🛢️ Sur le projet Fioul Groupé

« Jours restants avant clôture » et « étiquette promo » sont des colonnes calculées que l'API renvoie au front pour l'afficher directement :

SELECT libelle,
  DATEDIFF(date_cloture, CURDATE()) AS jours_restants,
  CASE WHEN prix_litre < (SELECT AVG(prix_litre) FROM campagne)
       THEN 'Bon plan' ELSE 'Standard' END AS badge
FROM campagne WHERE statut = 'OUVERTE';
À retenir
← Chapitre 06