Introduction à SQL. Alain BUI. Professeur Département de Mathématiques et Informatique

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

Le langage SQL Rappels

1 Introduction et installation

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

Langage SQL : créer et interroger une base

SQL Historique

Les bases de données

Le Langage SQL version Oracle

16H Cours / 18H TD / 20H TP

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

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

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

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

Bases de données relationnelles

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

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

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

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

TP Bases de données réparties

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

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

Vincent Augusto

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

LE LANGAGE SQL2 1. INTRODUCTION

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

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

Cours Base de données relationnelles. M. Boughanem, IUP STRI

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

Optimisation SQL. Quelques règles de bases

Bases de Données. Plan

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

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

BTS/CGO P10 SYSTEME INFORMATION Année

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

Systèmes de Gestion de Bases de Données

Cours 4 : Agrégats et GROUP BY

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

MySQL / SQL EXEMPLES

Introduction aux Bases de Données 2004/2005

Information utiles. webpage : Google+ : digiusto/

FORMATION A L UTILISATION DE PMB QUELQUES NOTIONS DE SQL

Bases de Données Avancées

FileMaker 13. Guide de référence SQL

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

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

Système de Gestion de Bases de Données Relationnelles. MySQL. Youssef CHAHIR

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

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

Bases de données Cours 4 : Le langage SQL pour ORACLE

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

TP Contraintes - Triggers

Bases de données Outils de gestion

Intégrité des données

Olivier Mondet

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

Présentation du module Base de données spatio-temporelles

Bases de Données. Le cas des BD relationnelles ouverture sur les BD relationnelles spatiales Séance 2 : Mise en oeuvre

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

Bases de données avancées Introduction

OpenPaaS Le réseau social d'entreprise

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

INTRODUCTION : Données structurées et accès simplifié

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

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

Rappel sur les bases de données

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

Session S12 Les bases de l optimisation SQL avec DB2 for i

Bases de données cours 1

Introduction à JDBC. Accès aux bases de données en Java

Introduction aux Bases de Données

INTRODUCTION AU DATA MINING

IFT3030 Base de données. Chapitre 1 Introduction

Chapitre Introduction : Notion de Bases de données. 2. Définition : BD Répartie. 3. Architecture des SGBD. 4. Conception des bases réparties

La présente publication est protégée par les droits d auteur. Tous droits réservés.

Initiation à SQL. Le langage de communication avec une base de données relationnelles. Application avec PostgreSQL. Nathalie Camelin 2011/2012

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

Bases de Données Relationnelles. Le Modèle Relationnel

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

1. Base de données SQLite

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Devoir Data WareHouse

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

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

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

Le Langage De Description De Données(LDD)

Java DataBaseConnectivity

Bases de données et sites WEB

COURS de BASES de DONNEES

TP3 : Creation de tables 1 seance

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Quelques aspects du Relationnel-Objet du SGBD Oracle

Faculté des sciences de gestion et sciences économiques BASE DE DONNEES

A QUOI SERVENT LES BASES DE DONNÉES?

Patrice BOURSIER. Professeur, Univ. de La Rochelle. Bases de Données. Notes de cours

Compétences Business Objects

Comprendre les bases de données

Transcription:

Bases de Données Introduction à SQL Alain BUI Professeur Département de Mathématiques et Informatique alain.bui@univ-reims.fr 1 Langage SQL Structered Query Langage Standard, langage relationnel incontournable 600 pages, cours donne un aperçu Historique 1970 Codd modèle relationnel 1974 SEQUEL SEQUEL/2 (System /R, IBM) 1981 Oracle (SQL) 1983 DB2 (IBM) 1986 SQL/86 normalisé 1989 SQL/89 (SQL/1) 1992 SQL/92 (SQL/2) SQL/3 2

SQL = LMD Langage de manipulation de données LDD Langage de Définition de Données LCD Langage de Contrôle de Données Une requête SQL peut être Interactive Incluse dans un programme d application 3 LMD Syntaxe Minimale SELECT <liste d attributs projetés> FROM <liste de relations> Syntaxe possiblement enrichie de très nombreuses clauses permettant d exprimer Projections Restrictions Jointures Tris 4

Bases de données exemple Produits (pno, design, prix, poids, couleur) Fournisseurs (fno, nom, adresse, ville) Commandes (cno, fno, pno, qté) Une extension 5 +-----+--------+-------+-------+---------+ pno design prix poids couleur +-----+--------+-------+-------+---------+ 1 chaise 15.00 5.00 blanc 2 chaise 20.00 6.00 blanc 3 chaise 21.00 4.50 hetre 4 table 30.00 14.00 blanc 5 table 34.00 14.50 hetre 6 table 45.00 20.00 bleu 7 table 50.00 22.00 hetre 8 chaise 23.40 3.50 bleu 9 chaise 22.00 3.50 hetre +-----+--------+-------+-------+---------+ +-----+----------+---------+--------+ fno nom adresse ville +-----+----------+---------+--------+ 10 dupont NULL reims 11 dupond NULL amiens 12 durand NULL reims 13 jacquart NULL paris 14 moiti NULL reims 15 espere NULL amiens 16 jugovic NULL paris 17 machin NULL reims 18 truc NULL paris 19 muche NULL amiens +-----+----------+---------+--------+ 6

cno fno pno qte 100 10 1 2 101 10 2 3 102 10 6 4 103 12 4 2 104 12 8 4 105 13 7 3 106 13 9 1 107 14 2 5 108 14 9 1 109 16 1 4 110 16 2 2 111 16 3 9 112 16 4 3 113 16 5 2 114 16 6 1 115 16 7 2 116 16 8 3 117 16 9 2 118 19 3 20 Clé étrangère faisant Référence à Fournisseurs Clé étrangère faisant Référence à Produits 7 Projection SELECT <liste attributs> FROM <liste relations> Numéro et nom de tous les fournisseurs SELECT fno, nom FROM fournisseurs Ensemble des attributs SELECT * FROM <liste relations> Élimination des doublons (contrairement à l AR ceci n est pas effectué par défaut) SELECT DISTINCT couleur FROM Produits 8

Restriction SELECT <attributs> FROM <relations> WHERE <critères de restriction> Donner les données sur les produits dont le poids est > 10 Donner les désignations de produits différents dont le poids est compris entre 15 et 40 Opérateur BETWEEN Donner le nom des fournisseurs localisés à Amiens et Reims Opérateur ensembliste IN Quels sont les noms des fournisseurs commençant par D Opérateur LIKE (joker = _ ; séquence de caractères = % ) Donner la liste des fournisseurs dont l adresse est renseignée Opérateur NULL NOT peut préfixé les opérateurs IN, LIKE, BETWEEN et NULL 9 SELECT pno FROM produit WHERE poids BETWEEN 15 AND 40 SELECT nom FROM fournisseurs WHERE nom LIKE D% SELECT nom FROM fournisseurs WHERE adresse IS NOT NULL SELECT nom FROM fournisseurs WHERE ville IN ( Reims, Pau, Agen ) 10

Tri ORDER BY <attribut 1> [ASC / DESC],, <attribut n> [ASC / DESC] Donner la liste des produits rouges, verts et bleus, triés sur la désignation dans l ordre croissant et la couleur dans l ordre décroissant Présentation des colonnes SELECT <attributs> AS [nom apparaissant pour la colonne] FROM Donner les numéros de produits et leur désignation avec des noms de colonnes 11 Jointures Produit cartésien SELECT * FROM <relations> Éviter les ambiguïtés en préfixant le nom des attributs utilisés par le nom de la relation concernée suivi d un point : R.A On peut aussi utiliser le mot clé AS dans la clause FROM pour utiliser des synonymes pour les relations Jointure naturelle SELECT * FROM R,S WHERE R.A = S.A 12

Noms des fournisseurs avec le n de produits et la quantité commandées Sans synonymes et Avec synonymes Les synonymes «f» ou «c» peuvent être utilisés dans le SELECT même s ils ne sont déclarés que dans le FROM SELECT f.nom, c.pno, quantite FROM fournisseurs as f, commandes as c WHERE f.fno = c.fno Opération de jointure «as» est optionnel 13 Jointures exécutées en cascade: Donner la liste (noms des fournisseurs + noms des produits) en commande pour des quantités supérieures à 5 SELECT f.nom, p.design FROM fournisseurs f, commande c, produits p WHERE f.fno = c.fno AND p.pno = c.pno AND qte > 5 14

Auto-jointure: Donner la liste des couples de numéros de fournisseurs situés dans la même ville en évitant les doublons par symétrie On utilise 2 x relation Fournisseurs -> l utilisation de synonymes est impératif SELECT f1.fno, f2.fno FROM fournisseurs as f1, fournisseurs as f2 WHERE f1.ville = f2.ville AND f1.fno < f2.fno Jointure entre attributs non «clés» Pourquoi faut il rajouter cette condition? Car 15 SQL2 Expression des jointures en SQL 2 Pas toujours supporté par tous les SGBD SELECT FROM <relations> INNER /* jointure classique*/ LEFT /*jointure externe*/ RIGHT /*jointure externe*/ JOIN ON <condition> Jointure interne Jointure externe (conserve les tuples d une des deux relations) 16

Jointure Externe (SQL2) SELECT f.fno, nom, ville, qte, cno FROM fournisseurs f INNER JOIN commandes c ON f.fno=c.fno WHERE f.fno<>16 +-----+----------+--------+-----+-----+ fno nom ville qte cno +-----+----------+--------+-----+-----+ 10 dupont reims 2 100 10 dupont reims 3 101 10 dupont reims 4 102 12 durand reims 2 103 12 durand reims 4 104 13 jacquart paris 3 105 13 jacquart paris 1 106 14 moiti reims 5 107 14 moiti reims 1 108 19 muche amiens 20 118 +-----+----------+--------+-----+-----+ 17 Jointure Externe (SQL2) SELECT f.fno, nom, ville, qte, cno FROM fournisseurs f LEFT JOIN commandes c ON f.fno = c.fno WHERE f.fno<>16 +-----+----------+--------+------+------+ fno nom ville qte cno +-----+----------+--------+------+------+ 10 dupont reims 2 100 10 dupont reims 3 101 10 dupont reims 4 102 11 dupond amiens NULL NULL 12 durand reims 2 103 12 durand reims 4 104 13 jacquart paris 3 105 13 jacquart paris 1 106 14 moiti reims 5 107 14 moiti reims 1 108 15 espere amiens NULL NULL 17 machin reims NULL NULL 18 truc paris NULL NULL 19 muche amiens 20 118 +-----+----------+--------+------+------+ 18

Calculs Attributs calculés : Donner les produits avec leur prix HT et TTC select pno,design, prix*1.206 as 'prix ttc' from produits Des stats AVG, COUNT, MAX, MIN, SUM Ces opérations ne peuvent pas s imbriquer. Utiliser alors des sous requêtes (vu plus loin) 19 MIN calcule le miminum MAX calcule le maximum SUM efectue une somme AVG effectue une moyenne COUNT compte des lignes syntaxe COUNT (expr) en général COUNT(*) Nombre de commandes Select count(*) from commandes Résultat: 19 Nombres de produits Select count(design) from produits Résultat: 9 Nombre de produits «différents» Select count(distinct design) from produits Résultat: 2 20

Nombre de commandes du produit 9? select count(*) from commandes where pno=9 résultat: 3 Quantités min max et la moyenne des qtés à livrer pour pno=9? select min(qte), max(qte), avg(qte) from commandes where pno=9 +----------+----------+----------+ min(qte) max(qte) avg(qte) +----------+----------+----------+ 1 2 1.3333 +----------+----------+----------+ select * from commandes where pno =9; cno fno pno qte 106 13 9 1 108 14 9 1 117 16 9 2 21 Agrégats Un agrégat est un partitionnement horizontal d une relation selon des valeurs d un groupe d attributs suivi d un regroupement par une fonction de calcul. Exemple Soit une relation R(A,B,C,D,E) F_A BCD ( R ) Groupe = ens. des tuples de même valeur R A B b b a k a C c e c i e D d f d j f E regroupement regroupement 22

Regroupements Idée : regrouper les données d une table en sous-tables pour y faire des opérations par groupes Group By <Attribut 1 >,, <Attribut p > Groupe en une seule ligne toutes les lignes pour lesquelles les attributs de regroupement ont la même valeur Cette clause se place juste après la clause Where ou après la clause From si la clause Where n existe pas 23 Donner le nombre de commandes par fournisseur SELECT fno, COUNT(*) as nbre FROM commandes GROUP BY fno On compte le nombre de lignes qui concerne chaque fournisseurs dans la table commandes +-----+------+ fno nbre +-----+------+ 10 3 12 2 13 2 14 2 16 9 19 1 +-----+------+ Relation commandes cno fno pno qte 100 10 1 2 101 10 2 3 102 10 6 4 103 12 4 2 104 12 8 4 105 13 7 3 106 13 9 1 107 14 2 5 108 14 9 1 109 16 1 4 110 16 2 2 111 16 3 9 112 16 4 3 113 16 5 2 114 16 6 1 115 16 7 2 116 16 8 3 117 16 9 2 118 19 3 20 24

Donner le nombre de commande par fournisseur pour des commandes de quantité! 2 SELECT fno, count(*) FROM commandes WHERE qte >= 2 GROUP BY fno +-----+---------- + fno count(*) +-----+---------- + 10 3 12 2 13 1 14 1 16 8 19 1 +-----+---------- + Restriction sur la relation avant d opérer au regroupement 25 Restriction sur les regroupements HAVING <prédicat> : restriction sur les tuples de la relation obtenue après le calcul sur le regroupement. Se place après la clause GROUP BY 26

Donner les fournisseurs qui ont plus de 2 commandes SELECT fno, count(*) as nbcom FROM commandes GROUP BY fno HAVING count(*) > 2 On compte le nombre de lignes de la table commandes pour chaque fournisseur, puis on sélectionne que les fournisseurs qui ont plus de 2 commandes. +-----+----------+ fno nbcom +-----+----------+ 10 3 16 9 +-----+----------+ 27 Donner les fournisseurs qui fournissent plus d un produit SELECT fno, count(*) FROM commandes GROUP BY fno HAVING count(*)>1 le fournisseur 19 fournit 2 fois le produit 3 pour la commande 118 et 119 +-----+----------+ fno count(*) +-----+----------+ 10 3 12 2 13 2 14 2 16 9 19 2 +-----+----------+ Donner les fournisseurs qui fournissent plus d un produit différent (un pno différent, en effet, une nouvelle commande peut concerner un produit déjà commandé auparavant) 28

La solution est un peu plus difficile Une solution (à vérifier) étape 1: Fournisseurs qui fournissent 1 même produit pour des commandes différentes. select c1.cno, c1.fno, c1.pno, c1.qte from commandes c1, commandes c2 where c1.fno = c2.fno and c1.pno=c2.pno and c1.cno> c2.cno cno fno pno qte 119 19 3 4 2ème étape: Tous les fournisseurs sauf ceux de l étape 1 29 Utiliser la différence? select * from commandes EXCEPT select c1.cno, c1.fno, c1.pno, c1.qte from commandes c1, commandes c2 where c1.fno = c2.fno and c1.pno=c2.pno and c1.cno> c2.cno mais par exemple MySQL ne supporte pas EXCEPT mais gère désormais les sous-requêtes 30

La solution SELECT fno, count(*) FROM commandes c WHERE cno NOT IN (SELECT c1.cno FROM commandes c1, commandes c2 WHERE c1.fno = c2.fno and c1.pno=c2.pno and c1.cno> c2.cno) GROUP BY fno HAVING count(*)>1 +-----+----------+ fno count(*) +-----+----------+ 10 3 12 2 13 2 14 2 16 9 +-----+----------+ 31 on récupère les n de commandes des fournisseurs de même n de produit pno cno fno pno qte 118 19 3 20 119 19 3 4 120 19 3 5 extrait de la table pour fno=19 (seul fno se rapportant à notre cas d étude) +-----+-----+-----+--------+ cno fno pno c2.cno +-----+-----+-----+--------+ 119 19 3 118 120 19 3 118 120 19 3 119 +-----+-----+-----+--------+ +-----+ cno +-----+ 119 120 120 +-----+résultat de la sous requête il reste donc un seul numéro de commande (118) concernant le même produit 3 32

Synthèse SELECT <liste d attributs projetés> FROM <liste de relations> [WHERE < restrictions - jointure>] [GROUP BY <liste d attributs à partitionner> [HAVING <condition>] ] [ORDER BY <attribut> [ASC/DESC] [<attribut> [ASC/DESC] ] ] Pour les commandes dont le numéro est > 112, quels sont les noms des fournisseurs avec les quantités maximales commandées, dont la moyenne des quantités commandées est supérieure à 6 articles. Trier le résultat par ordre décroissant des noms. 33 Restriction Regroupement Projection Présentation SELECT f.nom, MAX(qte) as qte_max FROM commandes c, fournisseurs f WHERE c.cno >112 and c.fno=f.fno GROUP BY f.nom HAVING AVG(qte) >2 ORDER BY f.nom DESC Restriction sur regroupement Tri Jointure 34

Ce qu il faut (faudrait) faire pour étudier son cours Ecrire toutes les requêtes SQL en algèbre relationnelle (sauf sur les calculs) Etre capable de reformuler toutes les requêtes en SQL Utiliser un SGBD et manipuler la base PFC (en TP ou en accès libre) 35 Sous requêtes Where -> conditions par comparaisons sur des valeurs Expressions de conditions sur des relations?? Sous requêtes: décrire des requêtes complexes permettant d effectuer des opérations dépendant d autres requêtes. WHERE HAVING sous requête Sous requête renvoie Une valeur unique => opérateurs de comparaisons classiques Un attribut => opérateurs IN, EXISTS, opérateurs de comparaisons classiques + ALL ou ANY 36

Restriction classique : une valeur SELECT WHERE pno > (SELECT pno FROM ) Plusieurs valeurs : succès si valeur testée est dans le résultat de la sous requête (on peut aussi utiliser NOT) SELECT WHERE pno IN (SELECT pno FROM ) SELECT WHERE pno > ALL (SELECT pno FROM ) SELECT WHERE EXISTS (SELECT WHERE pno ) On peut exprimer jointure et autres par ce biais. 37 Ex. Donner les fournisseurs qui habitent la même ville que le fournisseur n 10. Requête «classique» SELECT f1.nom FROM fournisseurs f1, fournisseurs f2 WHERE f1.ville = f2.ville AND f2.fno=10 A l aide de sous requêtes, on peut «décomposer» la question 1- ville où habite le fournisseur n 10 SELECT ville from fournisseurs where fno=10 2-La solution SELECT nom from fournisseurs WHERE ville = (SELECT ville from fournisseurs where fno=10) 38

On complique? Donner les nom des fournisseurs dont au moins un des produits est fourni aussi par un fournisseur d un produit blanc. La méthode reste la même: «décomposer» Produit blanc SELECT pno FROM produits WHERE couleur= blanc Fournisseur d un produit blanc SELECT fno FROM commandes WHERE pno IN (SELECT pno FROM produits WHERE couleur= blanc ) 39 Produit fourni aussi par un fournisseur d un produit blanc SELECT pno from commandes WHERE fno ( SELECT fno FROM commandes WHERE pno IN (SELECT pno FROM produits WHERE couleur= blanc ) ) Numéro des fournisseurs dont au moins un des produits est fourni aussi par un fournisseur d un produit blanc. SELECT fno from commandes WHERE pno IN ( SELECT pno from commandes WHERE fno IN ( SELECT fno FROM commandes WHERE pno IN (SELECT pno FROM produits WHERE couleur= blanc ) ) ) 40

Au final Donner les nom des fournisseurs dont au moins un des produits est fourni aussi par un fournisseur d un produit blanc. SELECT nom FROM fournisseurs WHERE fno IN ( SELECT fno from commandes WHERE pno IN ( SELECT pno from commandes WHERE fno IN ( SELECT fno FROM commandes WHERE pno IN (SELECT pno FROM produits WHERE couleur= blanc ) ) ) ) en exercice: écrire sans sous requêtes 41 L expression SQL EXISTS (SELECT FROM ) est évalué à Vrai ssi le résultat de l évaluation du SELECT FROM est non vide (le résultat donne au moins un tuple) Donner le nom de tous les fournisseurs du produit n 2. SELECT f.nom FROM fournisseurs AS f WHERE EXISTS (SELECT * FROM commandes AS c WHERE c.pno=2 AND f.fno=c.fno) Le résultat retourné n a pas d importance car il suffit que le résultat soit non vide Imbrication car un champ de la requête principale est utilisé dans la ss-requête Sans cela on aura tous les noms! 42

Donner deux solutions équivalentes avec le IN puis sans sous-requêtes. SELECT f.nom FROM fournisseurs AS f WHERE f.fno IN (SELECT c.fno FROM commandes AS c WHERE c.pno =2) SELECT f.nom FROM fournisseurs AS f, commandes AS c WHERE c.fno = f.fno AND c.pno = 2 Exercice: 2 requêtes (utilisant des sous-requêtes) pour obtenir le nom des fournisseurs ne fournissant pas le produit 3. 43 SELECT f.nom FROM fournisseurs f WHERE NOT EXISTS (SELECT * FROM commandes c WHERE c.pno=3 AND f.fno=c.fno) SELECT f.nom FROM fournisseurs f WHERE f.fno NOT IN (SELECT c.fno FROM commandes c WHERE c.pno=3) 44

Division [Algèbre relationnelle] La division de la relation R de schéma R(A 1,,A n ) par la relation S de schéma S(A p+1,,a n ) est la relation T de schéma T(A 1,,A p ) formés de tous les tuples qui concaténées à chaque tuples de S donnent toujours un tuple de R Notation R / S Opérateur type qui permet de répondre aux questions du type: «donner les docteurs qui soignent tous les patients» 45 Division (suite) Q: Donner les fournisseurs qui livre (en commande) tous les produits. cno fno pno qte 109 16 1 4 110 16 2 2 111 16 3 9 112 16 4 3 113 16 5 2 114 16 6 1 115 16 7 2 116 16 8 3 117 16 9 2 fournisseurs tous les produits 46

Division (suite) La réponse:! fno,pno (commandes) %! pno (produits) On va obtenir une relation du type T(fno) tel que [Déf] tous les tuples de T concaténés à chacun de ceux de! pno (produits) est un tuple de! fno,pno (commandes) 47! +-----+-----+ fno,pno (commandes) fno pno +-----+-----+ 10 1 10 2 10 6 12 4 12 8 13 7 13 9 14 2 14 9 16 1 16 2 16 3 16 4 16 5 16 6 16 7 16 8 16 9 19 3 19 3 19 3 19 4 +-----+-----+! pno (produits) T(fno) +-----+ pno +-----+ 1 2 3 4 5 6 7 8 9 +-----+ % = +--------+ fno +--------+ 16 tuple +--------+ 48

Exercice Reprendre la base Docteur-Patient-Maladie-Soin et répondre à la question Donner les noms des patients soignés par tous les docteurs. 49 Division SQL n offre pas la possibilité d exprimer directement le quantificateur ". On utilise une négation du quantificateur #. La question «Donner le nom des fournisseurs livrant tous les produits» devient «Donner le nom des fournisseurs pour lesquels il n existe aucun produit non livré» Procéder par étapes 50

Produits non livrés SELECT pno FROM produits AS p WHERE NOT EXISTS (SELECT * FROM commandes WHERE c.pno = p.pno) SELECT pno FROM produits AS p WHERE p.pno NOT IN (SELECT c.pno FROM commandes as c) Réponse à la question SELECT f.nom FROM fournisseurs AS f WHERE NOT EXISTS (SELECT null FROM produits AS p WHERE NOT EXISTS (SELECT null FROM commandes AS c WHERE c.pno = p.pno AND f.fno=c.fno) ) 51 Division R(A,B) / S(B) = T(A) ={a $ R(A) / " b $ S(B), (a,b) $ R(A,B)} ={a $ R(A) / # b $ S(B), (a,b) % R(A,B)} La traduction «mot à mot» donne SELECT A FROM R AS R1 WHERE NOT EXISTS (SELECT B FROM S WHERE NOT EXISTS (SELECT A, B FROM R WHERE R1.A = A AND S.B = B ) ) commandes (fno,pno) / produits (pno) = T(fno) c est à dire les fournisseurs de tous les produits. 52

Opérations ensemblistes UNION / INTERSECT / EXCEPT s intercalent entre deux SELECT Les opérations parlent d elles mêmes Donner les produits dont le poids est > 20 ainsi que les produits commandés par le fournisseur n 150 Donner les fournisseurs ayant des commandes en cours sauf ceux localisés à Reims 53 Mise à jour d informations Insertion INSERT INTO <relation> [att 1,, att n ] VALUES (val 1,,val n ) INSERT INTO <relation> (att 1,, att n ) SELECT Insérer un nouveau produit Insérer des tuples dans une relation existante dont la valeur de certains attributs n est pas connus (valeur NULL par défaut) Insérer les valeurs produit n 800, écrou de 8FF dans produits Une relation citée dans le champ INTO du INSERT ne peut pas être citée dans le champ FROM du ss-select de ce même INSERT 54

Mise à jour UPDATE <relation> SET att 1 = val 1,, att n = val n WHERE <condition> UPDATE <relation> SET (att 1,, att n ) = (SELECT ) WHERE <condition> Augmenter le prix de tous les produits de couleur or de 15% Suppression DELETE FROM <relation> WHERE <condition> Suppression de tuples selon une condition fixée Supprimer les produits dont le prix est inférieur à 100FF DELETE FROM <relation> donne quoi comme résultat? 55 Exercice BD suivante Buveurs (nb, nom, ville) Vins (nv, cru, mill, region, couleur) Conso (nb, nv, qte) REPONSE EN SQL 1. Noms des buveurs rémois? 2. Cru des bordeaux rouges de l année 1994? 3. Noms des buveurs rémois qui ont consommé un vin rouge? Donner 3 réponses dont 2 utilisant des sous-requêtes 4. Noms des buveurs qui ne boivent pas de vins? Donner 2 réponses utilisant des sous-requêtes 5. Donner une version en algèbre relationnelle pour chacune des questions précédentes. 56

Noms des buveurs rémois qui ont consommé un vin rouge? Donner 3 réponses dont 2 utilisant des sous-requêtes select nom from buveurs where nb in (select nb from conso where nv in (select nv from vins where couleur= rouge )) select nom from buveurs b where exists (select * from conso c where b.nb=c.nb and exists (select * from vins v where v.nv = c.nv and couleur= rouge )) select nom from buveurs b, conso c, vins v where c.nv=v.nv and b.nb = c.nb abd couleur = rouge 57 Exercice suite SQL seul Donner la moyenne des consommations de vins rouges. Donner la moyenne des consommations par couleur de vin Donner la quantité totale de vins consommée par chaque buveur Donner le nom des buveurs qui consomment plus que la moyenne. 58