-- Schéma de la base de données
-- PRODUIT (NPRO, NOMP, QTP, COULEUR)
-- VENTE (NVEN, NOMC, NPRV*, QTV, DATEV)
-- ACHAT (NACH, NOMF, NPRA*, QTA, DATEA)
-- 1. Donner les noms et couleurs de tous les produits
-- PRODUIT [ NOMP, COULEUR ]
-- 2. Donner les noms et quantités en stock des produits de couleur rouge
-- PRODUIT : ( COULEUR = 'rouge' ) [ NOMP, QTP ]
-- 3. Donner les numéros de vente, le nom du client, la quantité vendue pour les ventes du produit de nom « torchon », réalisées avant le 12/09/87
-- R1 = PRODUIT : (NOMP = 'torchon')
-- R2 = R1 (NPRO = NPRV) x VENTE
-- R3 = R2 : ( DATEV < 12/09/87 )
-- R4 = R3 [ NVEN, NOMC ]
AND DATEV < '1987-09-12';
-- 4. Donner les noms des clients ayant acheté au moins un produit de couleur vert
-- R1 = PRODUIT : (COULEUR = 'vert') [ NOMP ]
-- R2 = R1 (NPRO = NPRV) x VENTE
-- 5. Donner les noms des fournisseurs qui sont également des clients
-- 6. Donner les noms des fournisseurs qui fournissent les produits de couleur bleue et dont la quantité en stock (actuellement) est inférieur à 100
-- R1 = PRODUIT : (COULEUR = 'bleue') [ NPRO ]
-- R2 = R1 (NPRO = NPRA) x ACHAT
-- R3 = R2 (QTA < 100) [ NOMF ]
-- 7. Donner le nom des fournisseurs avec lesquels aucune commande de produit n’a été réalisée depuis le 30/06/87
-- R2 = ACHAT (DATEA < 30/06/87) [ NOMF ]
-- 8. Donner pour chaque produit, les noms des fournisseurs du produit et les noms des clients l’ayant acheté
-- R2 = ACHAT (NPRO = NPRA) [ NOMF ]
-- R3 = VENTE (NPRO = NPRV) [ NOMC ]
DISTINCT NPRA as "NUMERO P",
JOIN ACHAT ON NPRO = NPRA
JOIN VENTE ON NPRO = NPRV;
-- 9. Donner les noms des clients ayant acheté au moins une fois de tous les produits disponibles
-- R1 = VENTE [ NOMC, NPRV ]
-- Sous-requête extérieure :
-- La requête extérieure sélectionne les clients distincts dans la table VENTE (SELECT DISTINCT NOMC).
-- La condition principale utilise WHERE NOT EXISTS, qui vérifie que pour chaque client, il n'existe aucun produit qui n'a pas été acheté par ce client.
-- Première sous-requête (corrélée) :
-- La première sous-requête sélectionne les numéros de produits (NPRO) dans la table PRODUIT pour vérifier s'il existe des produits qu'un client donné n'a pas achetés.
-- Deuxième sous-requête (corrélée à la première) :
-- La deuxième sous-requête vérifie pour chaque produit (P.NPRO) s'il est présent dans les ventes du client en question (V2.NOMC = V1.NOMC et V2.NPRV = P.NPRO).
-- Si ce produit n'a pas été acheté par le client, alors cette sous-requête retourne une ligne, ce qui fait que l'existence de ce produit non acheté est confirmée. S'il n'existe pas de produit non acheté, le client est inclus dans le résultat.
-- 10. Donner les noms des fournisseurs qui fournissent tous les produits
-- R1 = ACHAT [ NOMF, NPRA ]
-- Sous-requête extérieure :
-- La requête extérieure sélectionne les fournisseurs distincts dans la table ACHAT (SELECT DISTINCT NOMF).
-- La condition principale utilise WHERE NOT EXISTS, qui vérifie que pour chaque fournisseur, il n'existe aucun produit qu'il n'a pas fourni.
-- Première sous-requête (corrélée) :
-- La première sous-requête sélectionne les numéros de produits (NPRO) dans la table PRODUIT pour vérifier s'il existe des produits qu'un fournisseur donné n'a pas fournis.
-- Deuxième sous-requête (corrélée à la première) :
-- La deuxième sous-requête vérifie pour chaque produit (P.NPRO) s'il est présent dans les achats du fournisseur en question (A2.NOMF = A1.NOMF et A2.NPRA = P.NPRO).
-- Si ce produit n'a pas été acheté par le fournisseur, alors cette sous-requête retourne une ligne, ce qui fait que l'existence de ce produit non acheté est confirmée. S'il n'existe pas de produit non acheté, le fournisseur est inclus dans le résultat.
-- 11. Donner, pour chaque couleur, le nombre de produits de cette couleur
-- R1 = PRODUIT [ COULEUR ]
-- R2 = PRODUIT (COULEUR = R1.COULEUR) [ COULEUR, COUNT(*) ]
-- 12. Donner le nom et le nombre des produits vendus lors de la plus grosse vente.
-- R1 = VENTE [ NVEN, NPRV, QTV ]
-- R2 = VENTE (QTV = MAX(QTV)) [ NVEN, NPRV, QTV ]
-- R3 = PRODUIT [ NPRO, NOMP ]
-- R4 = R2 (NPRV = NPRO) x R3
-- Sous-requête extérieure :
-- La requête extérieure sélectionne les produits (NOMP) dans la table PRODUIT.
-- La condition principale utilise WHERE EXISTS, qui vérifie que pour chaque produit, il existe une vente correspondante.
-- Première sous-requête (corrélée) :
-- La première sous-requête sélectionne la quantité vendue (QTV) dans la table VENTE pour le produit en question (V.NPRV = P.NPRO).
-- La condition NOT EXISTS vérifie que pour cette vente, il n'existe aucune autre vente avec une quantité supérieure.
-- Si la vente en question est la plus grosse vente pour ce produit, la quantité est retournée.
JOIN VENTE ON NPRO = NPRV