Skip to main content

Les groupements, requetes imbriquées et opérateurs ensemblistes

Toutes ces choses ont l'avantage de permettre de faire des requètes plus compliquées en assemblant des requètes plus simple ou en utilisant des fonctions pour nous simplifier la vie.

📎 Les groupements

Les groupements permettent de grouper plusieurs résultats en même temps. Par exemple pour faire la moyenne d'une/plusieurs colonne(s), les additioner, etc.

-- Ici on a une fonction sum() qui permet d'additioner tous les résultats ensemble
SELECT c.description, sum(b.surface_habitable + b.surface_jardin) || 'm2' AS surface
FROM Categorie_bien c
JOIN Bien b ON b.id_catbien = c.id_catbien

-- On peut grouper les choses par description 
-- (on y met juste toutes les colonnes qui sont dans le select mais pas dans la fonction de groupement)
GROUP BY c.description
-- HAVING fait la même chose qu'un WHERE mais sur le résultat d'un groupement
HAVING sum(b.surface_habitable + b.surface_jardin) BETWEEN 2000 AND 3000

Les fonctions de groupements que l'on peut utiliser sont :

  • AVG() pour faire une moyenne de plusieurs résultats
  • SUM() pour addtionner plusieurs résultats
  • MAX() pour avoir le plus grand résultat
  • MIN() pour avoir le plus petit résultat
  • COUNT() pour compter le nombre de résultats
    • COUNT(*) pour compter le nombre de tuples
    • COUNT(attr) pour compter le nombre de valeurs dans une colonne
    • COUNT(DISTINCT attr) pour compter le nombre de valeurs distinctes d'une colonne

🪆 Les requètes imbriquées

Les requètes imbriquées permettent de diviser des problèmes complexe en requètes plus simple que l'on assemble entre elles.

-- trouvez le nom du ou des candidats qui ont fait l’offre la plus haute
SELECT c.nom 
FROM candidat c
JOIN offre o ON o.id_candidat = c.id_candidat
WHERE o.montant = (SELECT max(montant) FROM offre)

Dans cette requète on divise le problème en deux partie :

  1. Trouver le montant le plus haut (c'est la requete imbriquée)
  2. Trouver le(s) candidat·e·s qui ont une offre qui correponds à ce montant

🖇 Les opérateurs ensemblistes

-- écrivez une requête qui affichera en 3 colonnes les noms, prénoms et rôle (Candidat, Client, Vendeur) des candidats, des clients et des vendeurs
select nom, prenom, 'Vendeur' as role
from vendeur
union
select nom, prenom, 'Candidat' as role
from candidat
union
select nom, prenom, 'Client' as role
from client

Ici étant donné que l'on a les même noms de colonnes pour chaque requète on peut les combiner ensemble (comme vu avec les ensembles en math ou avec les jointures)

Il existe 3 types d'opérateurs ensemblistes en Oracle SQL :

  • Le UNION qui permet de combiner les deux (additionner en somme)
  • Le MINUS qui va prendre tout ce qui est dans le premier mais pas après (différence en math)
  • Le INTERSECT qui va prendre seulement ce qui est commun aux deux requètes

Voici d'autres exemples avec d'autres opérateurs :

-- Sélectionner tous les biens qui n'ont pas fait l'objet d'une offre
SELECT id_bien
FROM bien

MINUS

SELECT id_bien
FROM offre

Ou encore

-- affichez les identifiants des biens qui ont une offre d'un montant supérieur à 200.000€ dans la province de Liège

-- On prends tous les biens qui sont dans la province de liège
SELECT id_bien
FROM bien
WHERE code_postal BETWEEN 4000 AND 4999

INTERSECT

-- Et on prends l'intersection avec toutes les offres qui ont un montant supérieur à 200000
SELECT id_bien
FROM offre
WHERE montant > 200000