Chapitre 4 Solutions aux Exercices. Représentation UML du schéma VentesPleinDeFoin :

Documents pareils
Bases de Données relationnelles et leurs systèmes de Gestion

Intégrité sémantique dans les bases de données relationnelles

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

SQL Historique

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

Cours Bases de données 2ème année IUT

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Langage SQL : créer et interroger une base

Historisation des données

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Intégrité des données

Cours SQL. Base du langage SQL et des bases de données

TP Contraintes - Triggers

Bases de données relationnelles

TP3 : Creation de tables 1 seance

Olivier Mondet

INSTITUT NATIONAL DES TELECOMMUNICATIONS CONTROLE DES CONNAISSANCES. 2. Les questions sont indépendantes les unes des autres.

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Création et Gestion des tables

Compétences Business Objects

Introduction aux Bases de Données 2004/2005

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

CREATION WEB DYNAMIQUE

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

LE LANGAGE SQL2 1. INTRODUCTION

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Corrigés détaillés des exercices

Notes de cours : bases de données distribuées et repliquées

Pour les débutants. langage de définition des données

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Partie 0 : Gestion des tablespace et des utilisateurs... 3

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

PHP 5. La base de données MySql. A. Belaïd 1

A QUOI SERVENT LES BASES DE DONNÉES?

Devoir Data WareHouse

Bases de données avancées

A QUOI SERVENT LES BASES DE DONNÉES?

OpenPaaS Le réseau social d'entreprise

Présentation Windows Azure Hadoop Big Data - BI

Le Langage De Description De Données(LDD)

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

MySQL / SQL EXEMPLES

Le Langage SQL version Oracle

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

CATALOGUE FORMATIONS DOMAINE Bases de données

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

Le langage SQL (première partie) c Olivier Caron

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

FileMaker 13. Guide de référence SQL

Chapitre 3 LE MODELE RELATIONNEL ET SQL (DDL)

I4 : Bases de Données

BTS/CGO P10 SYSTEME INFORMATION Année

Auto-évaluation Oracle: cours de base

1. Base de données SQLite

Introduction au Système de Gestion de Base de Données et aux Base de Données

Bases de données et sites WEB

BASES DE DONNEES TP POSTGRESQL

Les bases fondamentales du langage Transact SQL

Les bases de données

Gestion des utilisateurs et de leurs droits

Gestion des transactions et accès concurrents dans les bases de données relationnelles

I. MySQL : Serveur et SGBD

Bases de données. Yamine AIT AMEUR. INPT-ENSEEIHT DIMA 2 Rue Charles Camichel Toulouse Cedex 7

Introduction au PL/SQL Oracle. Alexandre Meslé

Gestion de base de données

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

INTEGRITE ET BD ACTIVES

SQL Server 2000, Analysis Services et DTS

Bases de données. Mihaela Mathieu

1 Position du problème

Application web de gestion de comptes en banques

Université de Nice Sophia-Antipolis. Langage SQL. version 5.7 du polycopié. Richard Grin

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Durée : 4 heures Le sujet se présente sous la forme de deux dossiers indépendants

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

Cours Bases de données 2ème année IUT

SQL Server Cyril Gruau. 11 février 2003

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

Administration des bases de données. Jean-Yves Antoine

NF26 Data warehouse et Outils Décisionnels Printemps 2010

Quelques aspects du Relationnel-Objet du SGBD Oracle

PL langage de programmation côté serveur. SQL à la base : types, expressions, requêtes

Résumé S Q L. Auteur: Alexandre PATIN Edition: 22 février alexandre.patin@free.fr URL :

Chapitre 5 LE MODELE ENTITE - ASSOCIATION

Support de cours. Introduction à SQL et MySQL. 2003, Sébastien Namèche

Bases de Données Avancées PL/SQL

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

Comprendre les bases de données

1 Introduction. 2 Le modèle relationnel. 3 Algèbre relationnelle 4 SQL. 5 Organisation physique des données 1/228

Structured Query Language

Modélisation et Gestion des bases de données avec mysql workbench

Sage 100 CRM - Guide de la Fusion Avancée Version 8. Mise à jour : 2015 version 8

Réplication logique avec PostgreSQL 9.4

Transcription:

Chapitre 4 Solutions aux Exercices Représentation UML du schéma VentesPleinDeFoin :

Schéma SQL VentesPleinDeFoin : CREATE TABLE Client (noclient INTEGER NOT NULL, nomclient VARCHAR(20 NOT NULL, notéléphone VARCHAR(15 NOT NULL, PRIMARY KEY (noclient CREATE TABLE Article (noarticle INTEGER NOT NULL, description VARCHAR(20, prixunitaire DECIMAL(10,2 NOT NULL, quantitéenstock INTEGER DEFAULT 0 NOT NULL CHECK (quantitéenstock >= 0, PRIMARY KEY (noarticle CREATE TABLE Commande (nocommande INTEGER NOT NULL, datecommande DATE NOT NULL, noclient INTEGER NOT NULL, PRIMARY KEY (nocommande, FOREIGN KEY (noclient REFERENCES Client CREATE TABLE LigneCommande (nocommande INTEGER NOT NULL, noarticle INTEGER NOT NULL, quantité INTEGER NOT NULL CHECK (quantité > 0, PRIMARY KEY (nocommande, noarticle, FOREIGN KEY (nocommande REFERENCES Commande, FOREIGN KEY (noarticle REFERENCES Article CREATE TABLE Livraison (nolivraison INTEGER NOT NULL, datelivraison DATE NOT NULL, PRIMARY KEY (nolivraison CREATE TABLE DétailLivraison (nolivraison INTEGER NOT NULL, nocommande INTEGER NOT NULL, noarticle INTEGER NOT NULL, quantitélivrée INTEGER NOT NULL CHECK (quantitélivrée > 0, PRIMARY KEY (nolivraison, nocommande, noarticle, FOREIGN KEY (nolivraison REFERENCES Livraison, FOREIGN KEY (nocommande, noarticle REFERENCES LigneCommande

1 Formulez en SQL les requêtes suivantes sur le schéma de la BD de la pépinière PleinDeFoin (N.B. a à m sont identiques à l'exercice 2 sur l'algèbre relationnelle. Cherchez les formulations équivalentes : a Les Clients dont le notéléphone = (999999-9999 * Client notéléphone = (999999-9999 b Le nocommande et la datecommande des Commandes du Client #10 dont le nocommande est supérieur à 5. nocommande, datecommande Commande noclient = 10 AND nocommande > 5 c Les noarticle et description des Articles dont le prixunitaire est entre $10 et $20. noarticle, description Article prixunitaire BETWEEN 10 AND 20 noarticle, description Article prixunitaire >= 10 AND prixunitaire <= 20 d Le noclient, notéléphone du Client et nocommande pour les Commandes faites le 4/06/2000. Client.noClient, notéléphone, nocommande Client, Commande Client.noCLient = Commande.noClient AND DateCommande = 4/06/2000 e Les noarticles commandés au moins une fois par le Client #10 après le 01/06/2000. DISTINCT noarticle Commande, LigneCommande Commande.noCommande = LigneCommande.noCommande AND noclient = 10 AND DateCommande > 1/06/2000 Solution avec imbriqué :

DISTINCT noarticle LigneCommande nocommande IN ( nocommande Commande noclient = 10 AND DateCommande > '1/06/2000' f Les nolivraisons correspondant aux Commandes faites par le Client #10. DISTINCT nolivraison Commande C, DétailLivraison D C.noCommande = D.noCommande AND noclient = 10 Solution avec imbriqué : DISTINCT nolivraison DétailLivraison nocommande IN ( nocommande Commande noclient = 10 g Les nocommandes des Commandes qui ont été placées à la même date que la Commande #2. Commande.noCommande Commande, Commande C2 Commande.dateCommande = C2.dateCommande AND C2.noCommande = 2 h Les nolivraison faites à la même date qu'une des Commandes correspondant à la Livraison. DISTINCT V.noLivraison Commande C, DétailLivraison D, Livraison V C.noCommande = D.noCommande AND D.noLivraison = V.noLivraison AND C.dateCommande = V.dateLivraison i La liste des nocommande avec les nolivraisons associées incluant les nocommandes sans livraison. DISTINCT nocommande, nolivraison Commande NATURAL LEFT OUTER JOIN DétailLivraison Solution avec le dialecte Oracle DISTINCT C.noCommande, D.noLivraison

Commande C,DétailLivraison D C.noCommande = D.noCommande (+ j Les noclient, nomclient des Clients qui n'ont pas placé de Commande au mois de mars de l'année 2000. noclient, nomclient Client NOT EXISTS ( * Commande noclient = Client.noClient AND datecommande BETWEEN 01/03/2000 AND 31/03/2000 Solution avec MINUS (N.B. Oracle utilise MINUS plutôt que EXCEPT ( MINUS ( noclient, nomclient Client noclient, nomclient Client, Commande Commande. noclient = Client.noClient AND datecommande BETWEEN '01/03/2000' AND '31/03/2000' k Les nocommandes qui ne contiennent pas l'article # 10. nocommande Commande NOT EXISTS ( * LigneCommande Commande.noCommande = nocommande AND noarticle =10 l Les noarticle qui apparaissent dans toutes les Commandes. noarticle Article NOT EXISTS ( nocommande Commande NOT EXISTS ( * LigneCommande noarticle = Article.noArticle AND nocommande = Commande.noCommande

ou : noarticle Article NOT EXISTS (( nocommande Commande EXCEPT ( nocommande LigneCommande noarticle = Article.noArticle (N.B. Oracle utilise MINUS plutôt que EXCEPT ou en utilisant l'équivalence T 1 (X T 2 (Y = π X-Y (T 1 - π X-Y ((π X-Y (T 1 T 2 - T 1 : ( DISTINCT noarticle LigneCommande EXCEPT ( DISTINCT noarticle (( DISTICNT LigneCommande.noArticle,Commande.noCommande LigneCommande, Commande EXCEPT ( DISTINCT noarticle,nocommande LigneCommande m Les noarticles qui apparaissent dans toutes les Commandes du Client #10. ou : noarticle Article NOT EXISTS ( nocommande Commande noclient = 10 AND NOT EXISTS ( * LigneCommande noarticle = Article.noArticle AND nocommande = Commande.noCommande noarticle Article NOT EXISTS (( nocommande Commande

noclient = 10 EXCEPT ( C.noCommande (N.B. Oracle utilise MINUS plutôt que EXCEPT Commande C, LigneCommande L noarticle = Article.noArticle AND C.noCommande = L.noCommande AND noclient = 10 n Les Articles dont la description débute par la lettre «C». * Article description LIKE 'C%' o Le Clients dont le notéléphone n'est pas NULL. * Client notéléphone IS NOT NULL p Les Articles dont le prix est supérieur à la moyenne. * Article prixunitaire > ( AVG(prixUnitaire Article q Le montant total de la Commande #1 avant et après la taxe de 15%. SUM(quantité*prixUnitaireAS totalcommande, SUM(quantité*prixUnitaire*1.15AS totalplustaxe LigneCommande L, Article A L.noArticle = A.noArticle AND nocommande = 1 r Le montant total de la Livraison #1 avant et après la taxe de 15% totalplustaxe SUM(quantitéLivrée*prixUnitaireAS totallivraison, SUM(quantitéLivrée*prixUnitaire*1.15AS

DétailLivraison D, Article A D.noArticle = A.noArticle AND nolivraison = 1 s La quantité commandée et quantité en attente pour chaque LigneCommande. nocommande, noarticle, quantité, quantité-case WHEN SUM(quantitéLivrée IS NULL THEN 0 ELSE SUM(quantitéLivrée END AS quantitéenattente LigneCommande NATURAL LEFT OUTER JOIN DétailLivraison GROUP BY nocommande, noarticle, quantité Solutions avec le dialecte Oracle : L.noCommande, L.noArticle, quantité, quantité-nvl(sum(quantitélivrée,0 AS quantitéenattente LigneCommande L, DétailLivraison D L.noArticle = D.noArticle (+ AND L.noCommande = D.noCommande (+ GROUP BY L.noCommande, L.noArticle, quantité Ou encore avec DECODE GROUP BY L.noCommande, L.noArticle, quantité, quantité-decode(sum(quantitélivrée,null,0,sum(quantitélivrée AS quantitéenattente LigneCommande L, DétailLivraison D L.noArticle = D.noArticle (+ AND L.noCommande = D.noCommande (+ L.noCommande, L.noArticle, quantité nocommande noarticle quantité quantitéenattente 1 10 10 0 1 70 5 0 1 90 1 0 2 40 2 0 2 95 3 2 3 20 1 0 4 40 1 0 4 50 1 1 5 10 5 5 5 20 5 5 5 70 3 1 6 10 15 15

6 40 1 1 7 50 1 1 7 95 2 2 8 20 3 3 t La quantité commandée et quantité en attente pour chaque LigneCommande dont la quantité en attente est supérieur à 0. nocommande, noarticle, quantité, quantité-case WHEN SUM(quantitéLivrée IS NULL THEN 0 ELSE SUM(quantitéLivrée END AS quantitéenattente LigneCommande NATURAL LEFT OUTER JOIN DétailLivraison GROUP BY nocommande, noarticle, quantité HAVING (quantité- CASE WHEN SUM(quantitéLivrée IS NULL THEN 0 ELSE SUM(quantitéLivrée END > 0 Solutions avec le dialecte Oracle : L.noCommande, L.noArticle, quantité, quantité-nvl(sum(quantitélivrée,0 AS quantitéenattente LigneCommande L, DétailLivraison D L.noArticle = D.noArticle (+ AND L.noCommande = D.noCommande (+ GROUP BY L.noCommande, L.noArticle, quantité HAVING (quantité-nvl(sum(quantitélivrée,0 > 0 u L'article de prix minimum * Article prixunitaire = ( MIN(prixUnitaire Article ou encore : * Article prixunitaire <= ALL ( prixunitaire Article

v Les nolivraison des Livraisons effectuées le 4/06/2000 qui contiennent au moins deux DétailLivraison. Le résultat doit être trié par le nolivraison. L.noLivraison Livraison L, DétailLivraison D L.noLivraison = D.noLivraison AND datelivraison = '4/06/2000' GROUP BY L.noLivraison HAVING count(* >=2 ORDER BY L.noLivraison w Les noarticle avec la quantité totale commandée depuis le 05/07/2000 dans le cas où cette quantité dépasse 10. noarticle, SUM(quantité Commande C, LigneCommande L C.noCommande = L.noCommande AND datecommande > '5/07/2000' GROUP BY noarticle HAVING SUM(quantité >=10 x Supprimer les Articles qui n'ont jamais été commandés. DELETE Article NOT EXISTS ( * LigneCommande noarticle = Article.noArticle y Augmenter la quantité commandée de 2 unités pour la Commande #1 et l'article #10. UPDATE LigneCommande SET quantité = quantité + 2 nocommande = 1 AND noarticle = 10 z Supprimer le Client # 1 avec toutes les données qui lui sont associées (Commandes, Livraisons, etc. La solution suivante n'est pas la plus efficace car elle crée une table intermédiaire pour stocker temporairement les numéros de livraison des livraisons du client #1. Cette liste pourrait être conservée en mémoire centrale en utilisant un langage procédural. Dans la solution, on ne considère pas cette possibilité et tout doit être fait directement en SQL. Il est nécessaire de stocker temporairement les numéros de livraison des livraisons du client #1 car il faut supprimer les DétailLivraisons avant les Livraisons. Mais après avoir supprimer les DétailLivraisons, il devient impossible de déterminer le numéro du client correspondant à une Livraison!

CREATE TABLE nolivraisonduclient1(nolivraison INTEGER PRIMARY KEY INSERT INTO nolivraisonduclient1 DISTINCT nolivraison DétailLivraison D, Commande C C.noCommande = D.noCommande AND noclient = 1 DELETE DétailLivraison nolivraison IN ( * nolivraisonduclient1 DELETE Livraison nolivraison IN ( * nolivraisonduclient1 DELETE LigneCommande nocommande IN ( nocommande Commande noclient = 1 DELETE Commande noclient = 1 DELETE Client noclient = 1 DROP TABLE nolivraisonduclient1

2 Exercices supplémentaires : a Le nombre d'articles à prix modique dont le prixunitaire est inférieur à $15.00 et le nombre d'articles dispendieux dont le prixunitaire est supérieur à $25.00 (dans le même Cheap.nombre, Dispendieux.nombre ( COUNT(* AS nombre Article prixunitaire < 15.00 Cheap, ( COUNT(* AS nombre Article prixunitaire > 25.00 Dispendieux b Le noclient, son nom, le numéro de téléphone du client, le montant total commandé pour les articles dispendieux dont le prix unitaire est supérieur à $20, et le montant total commandé pour les articles à prix modiques dont le prix unitaire est inférieur à $15 pour les clients qui ont commandé un montant moins élevé d'articles dispendieux que d'articles à prix modique. Client.noClient, nomclient, notéléphone, Dispendieux.total, Modique.total Client, ( noclient, SUM(quantité*prixUnitaire AS total Commande C, LigneCommande L, Article A L.noArticle = A.noArticle AND C.noCommande = L.noCommande AND prixunitaire >20 GROUP BY noclient Dispendieux, ( noclient, SUM(quantité*prixUnitaire AS total Commande C, LigneCommande L, Article A L.noArticle = A.noArticle AND C.noCommande = L.noCommande AND prixunitaire < 15 GROUP BY noclient Modique Client.noClient = Dispendieux.noClient AND Client.noClient = Modique.noClient AND Dispendieux.total < Modique.total