Vous êtes sur la page 1sur 3

Corrigée TP 03 BDD (Partie 01)

Exercice 01:
1) D’une façon générale : Soit R et S deux relations de degrés respectifs r et s, telles que r > s et S ≠ 0.

R1 ÷ R2 = π A(R1) — π A ((π A (R1) X R2) — R1 ).

2) R1 R2 en SQL: SELECT ∗ FROM R1 INTERSECT SELECT ∗ FROM R2

SELECT * FROM R1 SELECT DISTINCT value FROM R1


INTERSECT Equivalent à: WHERE value IN (SELECT value FROM R2);
SELECT * FROM R2

A noter : la colonne « value » est à remplacer par la colonne de votre choix. La commande DISTINCT n’est
pas obligatoire, mais est la plupart du temps utile pour éviter d’afficher plusieurs fois les mêmes valeurs.
Dans notre cas :
SELECT *
FROM R1
WHERE (A,B) IN (SELECT A,B FROM R2); /* marche uniquement sur ORACLE*/
Ou bien:
SELECT *
FROM R1
WHERE EXISTS (SELECT *
FROM R2
WHERE R1.A = R2.A AND R1.B = R2.B)
/* marche sur ACCESS ou ORACLE*/
R1-R2 en SQL: SELECT ∗ FROM R1 EXCEPT SELECT ∗ FROM R2

SELECT *
FROM R1
WHERE (A,B) NOT IN (SELECT A,B FROM R2); /* marche uniquement sur ORACLE*/
Ou bien:
SELECT *
FROM R1
WHERE NOT EXISTS (SELECT *
FROM R2
WHERE R1.A = R2.A AND R1.B = R2.B)

/* marche sur ACCESS ou ORACLE*/


Remarque :

Dans ce cas on peut utiliser la jointure naturelle pour effectuer l’intersection.


Exercice 02 :

1- SELECT C.nom, C.prenom


FROM (client AS C INNER JOIN vente AS V ON C.noclient = V.noclient) INNER JOIN produit AS P
ON V.noproduit=P.noproduit
WHERE marque='DELL';
Autre Solution :
SELECT C.nom, C.prenom
FROM client AS C, vente AS V, produit AS P
WHERE C.noclient = V.noclient AND V.noproduit=P.noproduit AND marque='DELL';
………………………………………………………………………………………………………
2- SELECT noproduit, nom, prix
FROM produit AS P
WHERE NOT EXISTS (SELECT *
FROM VENTE V
WHERE V.noproduit = P.noproduit
AND datevte BETWEEN #01/04/2004# AND #30/04/2004#);
……………………………………………………………………………………………………..
3- SELECT noproduit
FROM vente
WHERE datevte BETWEEN #01/01/2010# AND #31/12/2010#
GROUP BY noproduit
HAVING SUM (qtevendue)= (SELECT MAX (SUM (qtevendue))
FROM vente
WHERE datevte BETWEEN #01/01/2010# AND #31/12/2010#
GROUP BY noproduit));
…………………………………………………………………………………………………..
Avec Acess
SELECT noproduit
FROM vente
WHERE datevte between #01/01/2005# AND #31/12/2005#
GROUP BY noproduit
HAVING SUM (qtevendue) = (
Select Max (qte_total)
From ((SELECT noproduit, SUM (qtevendue) As qte_total
FROM vente
WHERE datevte BETWEEN #01/01/2005# AND #31/12/2005#
GROUP BY noproduit)
)
);
…………………………………………………………………………………………………..
4- SELECT *
FROM produit AS P LEFT OUTER JOIN vente AS V ON P.noproduit=V.noproduit
WHERE V.noproduit IS NULL;
*************************************************
Requêtes supplémentaires
Le produit le plus cher
SELECT noproduit
FROM produit AS P1
WHERE not exists
(select NULL
from produit p2
where p1.prix<p2.prix);
****************************************************
Le produits acheté par tous les clients
méthode 1
SELECT noproduit
FROM Produit AS P
WHERE NOT EXISTS
(SELECT *
FROM client C
WHERE NOT EXISTS
(SELECT *
FROM vente V
WHERE V.noproduit = P.noproduit
AND V.noclient = C.noclient));

methode 2
SELECT DISTINCT noproduit
FROM vente
GROUP BY noproduit
HAVING count( DISTINCT noclient) =
(select count (*)
from client);

methode 2 Avec Access


SELECT noproduit
FROM (SELECT distinct noproduit,noclient FROM vente)
GROUP BY noproduit
HAVING count (noclient) =
(select count (*)
from client);

Vous aimerez peut-être aussi