TD n 10 : Ma première Base de Données



Documents pareils
1 Introduction et installation

Le langage SQL Rappels

clef primaire ; clef étrangère ; projection ; restriction ; jointure ; SQL ; SELECT ; FROM ; WHERE

Langage SQL : créer et interroger une base

MODE OPERATOIRE OPENOFFICE BASE

Access et Org.Base : mêmes objectifs? Description du thème : Création de grilles d écran pour une école de conduite.

TP base de données SQLite. 1 Différents choix possibles et choix de SQLite : 2 Définir une base de donnée avec SQLite Manager

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

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

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

Les bases de données. Se familiariser avec Base. Figure 1.1A Ouvre le fichier dont tu as besoin. Lance OpenOffice Base.

Bases de données relationnelles

Dossier I Découverte de Base d Open Office

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

Création et Gestion des tables

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

La Clé informatique. Formation Excel XP Aide-mémoire

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

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

Création de Sous-Formulaires

PRISE EN MAIN D UN TABLEUR. Version OPEN OFFICE

Les différents types de relation entre les tables

INTRODUCTION AU DATA MINING

Sommaire. I.1 : Alimentation à partir d un fichier Access (.mdb)...2

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

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

Bases de données cours 4 Construction de requêtes en SQL. Catalin Dima

UNIVERSITE DE CONSTANTINE 1 FACULTE DES SIENCES DE LA TECHNOLOGIE DEPARTEMENT D ELECTRONIQUE 3 ème année LMD ELECTRONIQUE MEDICALE

SOMMAIRE. Travailler avec les requêtes... 3

Les bases de données

SQL Historique

1. Introduction Création d'une requête...2

Objectifs du TP : Initiation à Access

Manipulation de données avec SAS Enterprise Guide et modélisation prédictive avec SAS Enterprise Miner

Excel avancé. Frédéric Gava (MCF)

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

Manipuler fichiers et dossiers

16H Cours / 18H TD / 20H TP

Base est le module pour les bases

COURS WINDEV NUMERO 3

Cahier Technique. «Développer une application intranet pour la gestion des stages des étudiants» Antonin AILLET. Remi DEVES

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

Insérer des images dans Base

OpenOffice Base Gestionnaire de Base de Données

Le cas «BOURSE» annexe

Le Langage SQL version Oracle

Utilisation de l outil lié à MBKSTR 9

INSERER DES OBJETS - LE RUBAN INSERTION... 3 TABLEAUX

Le cas «BOURSE» annexe

Chaque ordinateur est constitué de différentes unités de stockage de données (Disque dur, Graveur ) que l on peut imaginer comme de grandes armoires.

Les BASES de DONNEES dans WampServer

Exploiter les statistiques d utilisation de SQL Server 2008 R2 Reporting Services

Initiation à Excel. Frédéric Gava (MCF)

EXCEL TUTORIEL 2012/2013

Cours: Les Jointures 1

Débuter avec OOo Base

BIRT (Business Intelligence and Reporting Tools)

Groupe Eyrolles, 2003, ISBN : X

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

GUIDE Excel (version débutante) Version 2013

Base de données relationnelle et requêtes SQL

Notice d installation et d utilisation du blog nomade avec un nouveau blog

Bases de données élémentaires Maude Manouvrier

Importation des données dans Open Office Base

Création d un formulaire de contact Procédure

Thème : Gestion commerciale

BDD - OpenOffice Base

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

AIDE à l utilisation du cédérom «L athlétisme à l école» Niveau Primaire SOMMAIRE

Découverte du logiciel ordinateur TI-n spire / TI-n spire CAS

NOTICE TELESERVICES : Demander un état hypothécaire

GUIDE D UTILISATION DU BROWSER DE BEYOND 20/20

[WINDOWS 7 - LES FICHIERS] 28 avril Logiciel / Windows

Olivier Mondet

Support de TD ArcGIS Introduction à l automatisation et au développement avec ArcGIS 10.1 JEAN-MARC GILLIOT e année ingénieur

Excel 2007 Niveau 3 Page 1

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

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.

Créer le schéma relationnel d une base de données ACCESS

SOMMAIRE. Présentation assistée sur ordinateur. Collège F.Rabelais 1/10

Les bases de données Page 1 / 8

GUIDE D UTILISATION DU CENTRE DE DONNÉES DE L ISU

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

1.1 L EXPLORATEUR WINDOWS

Guide de l Administrateur

TP 8: LES OPERATEURS ENSEMBLISTES

INTRODUCTION GENERALE...1 LA CONNEXION ODBC :...1. CONNEXION AU TRAVERS D EXCEL(tm)...6. LOGICIEL QUANTUM GIS (Qgis)... 10

Le Langage De Description De Données(LDD)

KIELA CONSULTING. Microsoft Office Open Office Windows - Internet. Formation sur mesure

Utilisation du BDE pour la maintenance des fichiers DBF de l'application TopoCad:

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

Exemple accessible via une interface Web. Bases de données et systèmes de gestion de bases de données. Généralités. Définitions

SYSTRAN 7 Guide de démarrage

Guide d'utilisation. OpenOffice Calc. AUTEUR INITIAL : VINCENT MEUNIER Publié sous licence Creative Commons

Documentation Liste des changements apportés

Whitepaper. Méthodologie de création de rapports personnalisés SQL Server Reporting Services

Transcription:

TD n 10 : Ma première Base de Données 4 heures Rédigé par Pascal Delahaye 11 mars 2015 Le but de ce TD est de découvrirles principales fonctions d OpenOffice Base, le systèmede gestion de bases de données proposé dans la suite OpenOffice disponible gratuitement sur Internet. Nous allons successivement : 1. Apprendre à créer une base et les tables de données 2. Apprendre à utiliser les fonctions : (a) d opérations ensemblistes : union, intersection, soustraction et produit cartésien de deux tables (b) de sélection dans une table (c) de projection dans une table 3. Apprendre à relier des tables entre elles par des relations et effectuer des jointures entre tables 4. Apprendre à utiliser des fonctions d agrégation 1 Création d une base de données Pour la création de la nouvelle base, effectuer les manipulations suivantes : 1. Ouvrir OpenOffice Base 2. Sélectionner Créer une base de données 3. Sélectionner Non, je ne souhaite pas que la base de données soit référencée puis terminer 4. Enregistrer votre nouvelle base de données dans votre espace personnel sous le nom fidelite Voilà... Vous venez de créer votre première base de données... Il reste alors : 1. à créer les tables de données 2. à effectuer des requêtes sur ces tables 1

1.1 Création des tables Pour créer une table, on commence par sélectionner l icône table dans la partie gauche de l écran. Apparaît alors 2 façons possibles de créer une table : 1. soit en mode ébauche 2. soit à l aide de l assistant Nous allons choisir le mode ébauche qui offre le plus de flexibilité. Apparaît alors un tableau permettant de définir le schéma relationnel de la table. Exercice : 1 Création de la structure des tables de données Créer les 4 tables suivantes : Pour indiquer qu un attribut est une clé primaire, on clique avec le bouton droit de la souris à gauche du nom de l attribut et on sélectionne clé primaire. 1. La table client1 de schéma relationnel : S1 = ((numclient, INTEGER (clé primaire - autovaleur = OUI)), (nomclient, CHAR (15 caractères - saisie requise = OUI)), (prenom, CHAR (15 caractères - saisie requise = OUI)), (age, INTEGER (saisie requise = OUI)), (sexe, CHAR (1 caractère))) 2. La table client2 de schéma relationnel : S2 = S1 (on pourra ici copier la table client1 ) 3. La table produit de schéma relationnel : S3 =((numproduit, INTEGER (clé primaire - autovaleur = OUI)), (nomproduit, CHAR (20 caractères - saisie requise = OUI)), (prix, NUMERIC (longueur = 5, décimale = 2 - saisie requise = OUI)), (stock, BOOL (saisie requise = OUI))) 4. La table achat de schéma relationnel : S4 = ((numachat, INTEGER (clé primaire - autovaleur = OUI)), (numclient, INTEGER (saisie requise = OUI)), (numproduit, INTEGER (saisie requise = OUI)), (date, DATE (saisie requise = OUI)), (promotion, BOOL (saisie requise = OUI))) 1.2 Insertion des données La structure des tables étant construites, il nous faut maintenant entrer les données. Pour cela, il suffit de cliquer sur l icône de la table concernées et remplir le tableau qui apparaît à l écran. Exercice : 2 Insertion des données dans les tables Remplisser les tables client1, client2 et produit avec les données suivantes... Attention à bien respecter l orthographe! client1 - client2 - produit 2

2 Opérations ensemblistes usuelles Nous allons ici effectuer nos premières requêtes. Pour la création de requêtes, nous pouvons utiliser : Soit créer une requête en mode ébauche... Soit Utiliser l assistant de création de requêtes... Soit Créer une requête en mode SQL... Les deux premières options permettent à l utilisateur de créer des requêtes, même si celui-ci ne connaît pas le langage SQL qui est le langage standard pour la création de requête. Les assistants de requêtes ne permettent pas d effectuer des réunions, intersections et soustractions de tables. Ainsi, même si vous ne connaissez pas encore le langage SQL, nous sommes contraints dans cette partie de formuler nos requêtes directement en langage SQL (option 3). Ce sera donc l occasion de commencer à vous familiariser avec ce langage. Exercice : 3 Union - Intersection - Soustraction et Produit Cartésien Nous souhaitons réunir les deux tables client1 et client2 en une même table. Pour cette opération, OpenOffice Base nous contraint à utiliser le langage SQL : Vous devez alors effectuer les manipulations suivantes : Sélectionner la section requête dans la colonne à gauche de l écran Sélectionner la tâche Créer une requête en mode SQL... 1. UNION : Taper dans la requette les instructions suivantes : SELECT "client1"."nomclient", "client1"."prenom", "client1"."age", "client1"."sexe" FROM "client1" UNION SELECT "client2"."nomclient", "client2"."prenom", "client2"."age", "client2"."sexe" FROM "client2" (a) Tenter de comprendre la syntaxe du langage SQL. (b) Activer le mode SQL en cliquant sur l icône SQL (c) Cliquer sur F5 ou sur l icône Exécuter la requête (d) Enregistrer votre requette sous le nom de unionclient (e) Ouvrir la requête unionclient et observer le résultat obtenu. 2. INTERSECTION : Taper dans la requette les instructions suivantes : SELECT "client1"."nomclient", "client1"."prenom", "client1"."age", "client1"."sexe" FROM "client1" INTERSECT SELECT "client2"."nomclient", "client2"."prenom", "client2"."age", "client2"."sexe" FROM "client2" Enregistrer le résultat de la requête sous le nom intersectionclient et vérifier le résultat obtenu. 3. SOUSTRACTION : Taper dans la requette les instructions suivantes : SELECT "client1"."nomclient", "client1"."prenom", "client1"."age", "client1"."sexe" FROM "client1" EXCEPT SELECT "client2"."nomclient", "client2"."prenom", "client2"."age", "client2"."sexe" FROM "client2" 3

Enregistrer le résultat de la requête sous le nom soustractionclient et vérifier le résultat obtenu. 4. PRODUIT CARTESIEN : Taper dans la requette les instructions suivantes : SELECT "client1"."nomclient", "produit"."nomproduit" FROM "client1", "produit" Enregistrer le résultat de la requête sous le nom prodcartclient et vérifier le résultat obtenu. 3 Sélection et projection Contrairement à l UNION, l INTERSECTION et la SOUSTRACTION, pour la création de requêtes nous pourrons dans cette partie utiliser : soit la création de requêtes en mode ébouche soit l assistant de création de requêtes soit des instructions en langage SQL Nous choisirons d utiliser la création de requêtes en mode ébauche Remarque 1. L utilisation de cette fonction est suffisamment intuitive pour que je puisse me dispenser de longues explications écrites... A] SELECTION Exercice : 4 Il s agit ici de sélectionner des enregistrements répondant à un ou plusieurs critères dans une table donnée. Nous allons ici travailler sur la table client qui réunit les deux tables précédentes. 1. Sélectionner toutes les femmes parmi les clients 2. Sélectionner tous les clients dont l âge est inférieur à 30 ans 3. Sélectionner les hommes dont l âge est supérieur à 50 ans. Vérifier la traduction SQL des requêtes précédentes. Vous constaterez que la structure de la syntaxe est toujours la suivante : SELECT * FROM "table" WHERE (condition) Remarque 2. Le symbole signifie tous les attributs de la table. B] PROJECTION Exercice : 5 Il s agit ici de ne conserver que certains attributs parmi les attributs d une table donnée. Nous allons encore travailler sur la table client que nous avons conçue dans la partie précédente. 1. Créer une requête permettant de ne conserver que les attributs nomclient, prenom et age de la table client. Vérifier la traduction SQL de la requête précédente. 4

Vous constaterez que la structure de la requête est alors la suivante : SELECT "champ1",... "champn" FROM "table" Si l on souhaite changer le nom des attributs, on peut ajouter AS dans la requête : SELECT "champ1" AS "newname1", "champ2" AS "newname2",..., "champn" AS "newnamen" FROM "table" WHERE (condition) 2. En général, les requêtes comportent à la fois : des sélections : on ne souhaite conserver que les enregistrements vérifiant certains critères des projections : on ne s intéresse qu à certaines propriétés (attributs) de ces enregistrements Créer une requête n affichant que les nom, prénom et âge des clients dont l âge est compris entre 30 et 50 ans. Vérifier la traduction SQL de la requête précédente. Vous constaterez que la structure de la requête est alors la suivante : SELECT "champ1",... "champn" FROM "table" WHERE (condition) Adapter la requête précédente afin que les enregistrements sélectionnés soient triés selon l âge des clients. Vérifier la traduction SQL de la requête précédente. Vous constaterez que la structure de la requête est alors la suivante : SELECT "champ1",... "champn" FROM "table" WHERE (condition) ORDER BY "champ" ASC (ou DESC) 3. Compléter la table client en ajoutant un attribut Ville de la façon suivante : Construire une requête affichant les nom, prénom et âge des clients hommes habitant à Paris. Vous tenterez de formuler directement votre requête en langage SQL, sans passer par l assistant de requêtes. 5

4 Jointure Nous allons dans cette section illustrer la notion de JOINTURE à l aide des tables client, produit et achat de notre base de données fidelite.odb. Voici le contenu de la table achat : La table achat contient une clé primaire (numachat) et deux clés étrangères (numclient et numproduit) nous permettant d effectuer une liaison avec les deux tables client et produit. Pour la création de requêtes : nous choisirons encore d utiliser la création de requêtes en mode ébauche Remarque 3. En observant la traduction SQL des différentes requêtes nous pourrons peu à peu nous familiariser avec ce langage. Les jointures avec le mode ébauche ne peuvent se faire qu après avoir explicité les relations qui existent entre les trois tables. Nous allons procéder ainsi : 1. Dans le menu outil sélectionner relation... 2. Ajouter dans la fenêtre qui s ouvre les tables client, produit et achat 3. Dans le menu insertion sélectionner nouvelle relation... Sélectionner les champs qui relient les tables client et achat (ne rien modifier aux options). 4. Renouveler l opération précédente pour lier les tables produit et achat. On obtient ainsi le Modèle Relationnel de Données suivant : 6

A] JOINTURE DIRECTE entre 2 tables : Le fait que deux tables soient liées par un attribut commun nous autorise à effectuer des jointures entre elles. A l aide de l option créer une requête en mode ébauche, répondez aux questions suivantes : 1. Les clientes Berthy et Kim achètent-t-elles essentiellement des produits en promotion? Pour obtenir cette information, nous avons besoin des tables client et achat. SELECT "client"."nomclient", "achat"."promotion" FROM "achat", "client" WHERE ( "client"."nomclient" = Berthy OR "client"."nomclient" = Kim ) AND "achat"."numclient" = "client"."numclient" (condition assurant la jointure) ORDER BY "client"."nomclient" ASC, "achat"."promotion" ASC Le codage SQL le plus efficace en terme de rapidité consiste à utiliser la commande FROM "R1" JOIN "R2" ON Ce qui donne : SELECT "client"."nomclient", "achat"."promotion" FROM "achat" JOIN "client" ON "achat"."numclient" = "client"."numclient" WHERE ( "client"."nomclient" = Berthy OR "client"."nomclient" = Kim ) ORDER BY "client"."nomclient" ASC, "achat"."promotion" ASC 2. Qui a acheté des produits le 12 avril 2013? Pour obtenir cette information, nous avons besoin des tables client et achat. SELECT "achat"."date", "client"."nomclient" FROM "achat", "client" WHERE "achat"."numclient" = "client"."numclient" (condition assurant la jointure) AND "achat"."date" = {D 2013-04-12 } Traduire les instructions précédentes en utilisant la commande FROM "R1" JOIN "R2" ON 3. Quels produits ont été achetés le 12 avril 2013? Pour obtenir cette information, nous avons besoin des tables produit et achat. 7

SELECT "achat"."date", "produit"."nomproduit" FROM "achat", "produit" WHERE "achat"."numproduit" = "produit"."numproduit" (condition assurant la jointure) AND "achat"."date" = {D 2013-04-12 } Traduire ces instructions en utilisant la commande FROM "R1" JOIN "R2" ON 4. A quelle date les clients masculins qui n habitent pas Paris ont-ils effectué des achats? Pour obtenir cette information, nous avons besoin des tables client et achat. SELECT "achat"."date" FROM "achat", "client" WHERE "achat"."numclient" = "client"."numclient" AND "client"."sexe" = M AND "client"."ville" <> Paris (condition assurant la jointure) Traduire ces instructions utilisant la commande FROM "R1" JOIN "R2" ON B] JOINTURE INDIRECTE entre deux tables : Il est possible de regrouper des informations situées dans des tables liées entre elles par l intermédiaire d une troisième table. Dans notre exemple, les tables client et produit sont liées par l intermédiaire de la table achat grâce aux attributs numclient (qui relie client à achat ) et numproduit (qui relie produit à achat ). 1. Pouvez-vous dire ce qu ont acheté les différents clients? Modifier le code SQL afin que les résultats de la requête soient ordonnés selon le nom des clients. Utiliser le résultat de la requête pour donner le nom des clients qui ont le plus consommé? SELECT "client"."nomclient", "produit"."nomproduit" FROM "achat", "client", "produit" WHERE "achat"."numclient" = "client"."numclient" (jointure entre client et achat) AND "achat"."numproduit" = "produit"."numproduit" (jointure entre produit et achat) ORDER BY "client"."nomclient" La syntaxe utilisant la commande... JOIN... ON... est alors la suivante : SELECT "client"."nomclient", "produit"."nomproduit" FROM "achat" JOIN "client" ON "achat"."numclient" = "client"."numclient" JOIN "produit" ON "achat"."numproduit" = "produit"."numproduit" ORDER BY "client"."nomclient" 2. Donner la liste ordonnée des produits achetés par les clientes du magasins. On affichera également les noms et prénoms des clientes. SELECT "client"."nomclient", "client"."prenom", "produit"."nomproduit" FROM "achat", "client", "produit" WHERE "achat"."numclient" = "client"."numclient" (jointure entre client et achat) AND "achat"."numproduit" = "produit"."numproduit" (jointure entre produit et achat) AND "client"."sexe" = F ORDER BY "produit"."nomproduit" 8

Traduire ces instructions en utilisant la commande... JOIN... ON... 3. Donner la liste des produits achetés par les clients dont l âge est compris entre 20 et 40 ans. On ordonnera les résultats selon l âge des clients. SELECT "client"."age", "produit"."nomproduit" FROM "achat", "client", "produit" WHERE "achat"."numclient" = "client"."numclient" (jointure entre client et achat) AND "achat"."numproduit" = "produit"."numproduit" (jointure entre produit et achat) AND "client"."age" >= 20 AND "client"."age" <= 40 ORDER BY "client"."age" Traduire ces instructions en utilisant la commande... JOIN... ON... 5 Agrégation Les fonctions d agrégation permettent d effectuer des statistiques simples sur les données. On peut ainsi par exemple : 1. Dénombrer des enregistrements 2. Calculer des sommes, le maximum ou le minimum d un ensemble de valeurs 3. Calculer des moyennes, des écarts-types d un ensemble de valeurs Dans notre base de données fidele.odb, nous disposons du champ prix de la table produit et du champ age de la table client sur lesquels il est possible de tester ces différentes fonctions. Pour la création de requêtes : nous choisirons encore d utiliser la création de requêtes en mode ébauche A] Statistiques globales sur une table : 1. Déterminer le nombre de produits listés dans la table produit. On pourra retenir la traduction de la requête en langage SQL : SELECT COUNT( "produit".* ) FROM "produit" Vérifiez que la table produit contient le même nombre de valeurs par colonne SELECT COUNT( "produit"."numproduit" ), COUNT( "produit"."nomproduit" ), COUNT( "produit"."prix" ), COUNT( "produit"."stock" ) FROM "produit" 2. Déterminer la moyenne des prix des produits contenus dans la table produit. 9

SELECT AVG( "prix" ) FROM "produit" Déterminer dans la table produit, le nombre de prix, leur moyenne, leur écart-type (STDEV-SAMP), le maximum et le minimum. SELECT COUNT("nomproduit"), AVG( "prix" ), STDDEV_SAMP( "prix" ), MAX( "prix" ), MIN( "prix" ) FROM "produit" B] Statistiques par catégories : Dans cette partie, nous continuons à nous intéresser aux mêmes indicateurs, mais cette fois par catégories. Nous pouvons pour cela, continuer à utiliser le mode ébauche pour la formulation des requêtes. On désignera l attribut permettant le regroupement par catégories en sélectionnant groupe dans la ligne fonction. 1. Déterminer la moyenne d âge des clients par sexe. On pourra retenir la traduction de la requête en langage SQL, en particulier les instructions GROUP BY et AS : SELECT AVG( "client"."age" ) AS "moyenne d age", "client"."sexe" AS "sexe des clients" FROM "client" GROUP BY "sexe" (regroupement par valeurs de "sexe") 2. Déterminer les sommes moyennes et les sommes totales dépensées par les hommes et les femmes. Quel est le groupe qui a dépensé le plus? SELECT AVG( "produit"."prix" ) AS "somme moyenne dépensée", SUM("produit"."prix") AS "somme totale", "client"."sexe" AS "sexe des clients" FROM "client", "achat", "produit" WHERE "client"."numclient" = "achat"."numclient" (jointure "client" - "achat") AND "achat"."numproduit" = "produit"."numproduit" (jointure "produit" - "achat") GROUP BY "client"."sexe" (regroupement par valeurs de "sexe") Traduire ces instructions en utilisant la commande... JOIN... ON... 3. Déterminer par ville d origine, la moyenne d âge des clients et la somme totale dépensée par ceux-ci. SELECT AVG( "client"."age" ) AS "age moyen", SUM("produit"."prix") AS "somme totale", "client"."ville" AS "ville" FROM "client", "achat", "produit" WHERE "client"."numclient" = "achat"."numclient" (jointure "client" - "achat") AND "achat"."numproduit" = "produit"."numproduit" (jointure "produit" - "achat") GROUP BY "client"."ville" (regroupement par valeurs de "ville") Traduire ces instructions en utilisant la commande... JOIN... ON... 10

Exercice : 6 Sauriez-vous formuler en langage SQL les requêtes suivantes : 1. Requêtes simples : (a) Classer les clients selon le nombre de produits achetés (b) Déterminer les produits qui ont été vendus au moins une fois en promotion (c) Déterminer la somme moyenne dépensée par client 2. Composition de requêtes : (a) Déterminer les clients dont l âge est supérieur à la moyenne des âges de tous les clients. (b) Déterminer les clients qui ont acheté plus de produits que la moyenne. 11