Chapitre 4 : Partie3 LANGAGE DE MANIPULATION RELATIONNEL : S Q L



Documents pareils
1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

Le langage SQL Rappels

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

1 Introduction et installation

16H Cours / 18H TD / 20H TP

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

Langage SQL : créer et interroger une base

Le Langage SQL version Oracle

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

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

Bases de données relationnelles

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

Les bases de données

SQL Historique

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Bases de Données. Plan

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

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

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

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

TP Bases de données réparties

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

Cours: Les Jointures 1

Systèmes de Gestion de Bases de Données

MODE OPERATOIRE OPENOFFICE BASE

Vincent Augusto

Modélisation de bases de données : Le modèle relationnel

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

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

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

CREATION WEB DYNAMIQUE

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

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

MySQL / SQL EXEMPLES

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

Le Langage De Description De Données(LDD)

Introduction aux Bases de Données 2004/2005

Chapitre 3 LE MODELE RELATIONNEL ET SQL (DDL)

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

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

LE LANGAGE SQL2 1. INTRODUCTION

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

Devoir Data WareHouse

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

FileMaker 13. Guide de référence SQL

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

AGRÉGATION «ÉCONOMIE ET GESTION»

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

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

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

Information utiles. webpage : Google+ : digiusto/

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

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

Compétences Business Objects

Dossier I Découverte de Base d Open Office

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

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

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

Année Universitaire 2009/2010 Session 2 de Printemps

Cours 4 : Agrégats et GROUP BY

1 Modélisation d une base de données pour une société de bourse

Bases de données et sites WEB Licence d informatique LI345

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

Chapitre 1 : Introduction aux bases de données

Bases de données élémentaires Maude Manouvrier

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

FORMATION A L UTILISATION DE PMB QUELQUES NOTIONS DE SQL

Définitions. Numéro à préciser. (Durée : )

OpenPaaS Le réseau social d'entreprise

Interpréteur d algèbre relationnelle

Initiation aux bases de données (SGBD) Walter RUDAMETKIN

Bases de données. PTSI Lycée Eiffel. 28 février 2014

Rappel sur les bases de données

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

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

Gestion des utilisateurs et de leurs droits

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

Conception des bases de données : Modèle Entité-Association

Bases de données Page 1 de 11. Bases de données. Prof. : Dzenan Ridjanovic

Introduction aux Bases de Données

Optimisation SQL. Quelques règles de bases

Entrepôt de données 1. Introduction

A QUOI SERVENT LES BASES DE DONNÉES?

LibreOffice Calc : introduction aux tableaux croisés dynamiques

Introduction aux Bases de Données

Le chiffre est le signe, le nombre est la valeur.

A QUOI SERVENT LES BASES DE DONNÉES?

Les bases de données Page 1 / 8

Quelques aspects du Relationnel-Objet du SGBD Oracle

Mysql avec EasyPhp. 1 er mars 2006

Cours 1 : introduction

MEDIAplus elearning. version 6.6

Bases de données avancées Introduction

ÉTUDE DE CAS. Durée : 5 heures Coefficient : 5 CAS FEFORT ÉLÉMENTS DE CORRECTION

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

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

L'instruction if permet d'exécuter des instructions différentes selon qu'une condition est vraie ou fausse. Sa forme de base est la suivante:

Connexion à une base de données. Connexion à une base de données. Connexion à une base de données Développement d'une application

Transcription:

Chapitre 4 : Partie3 LANGAGE DE MANIPULATION RELATIONNEL : S Q L SQL (Structured Query Language) est le langage de manipulation des données relationnelles le plus utilisé aujourd hui. Il est devenu un standard de fait pour les SGBD relationnels. Il possède des caractéristiques proches de l algèbre relationnelle (jointures, opérations ensemblistes) et d autres proches du calcul des tuples (variables sur les relations). SQL est un langage redondant qui permet souvent d'écrire les requêtes de plusieurs façons différentes. Dans ce chapitre, nous ne présentons que les clauses principales du langage de requêtes et du langage de mise à jour de SQL. Pour une description plus complète, le lecteur est invité à consulter un livre sur SQL. Les exemples dans ce chapitre s appuient sur la base de données relative aux fournisseurs (F), produits (P), usines (U) et livraisons (PUF), décrite par le schéma suivant: F (NF, nomf, statut, ville) P (NP, nomp, poids, couleur) U (NU, nomu, ville) PUF (NP, NU, NF, qt) 1. Format de base d'une requête <liste des noms d'attributs du résultat> <nom d'une relation (ou noms de plusieurs relations)> [ WHERE <condition logique qui définit les tuples du résultat> ] Exemple: nom et poids des produits rouges. WHERE nomp, poids P couleur = "rouge" Exemple : tous les renseignements sur tous les fournisseurs. ou NF, nomf, statut, ville F * /* l'étoile signifie: tous les attributs*/ F Un résultat sans doubles Les SGBD commercialisés (dont les SQL ) ne suppriment pas automatiquement les doubles. La clause DISTINCT permet à l'utilisateur d'avoir un résultat sans double. Exemple : liste des couleurs qui existent. DISTINCT couleur P Bases de données avancées 2005-2006 1

Un résultat trié La clause ORDER BY permet de définir un ordre de tri pour les tuples du résultat. La clause ASC signifie selon l'ordre croissant; la clause DESC selon l'ordre décroissant. Exemple : liste des fournisseurs de Lausanne par ordre alphabétique. nomf, NF, statut F WHERE ville = "Lausanne" ORDER BY nomf ASC, NF ASC Si plusieurs fournisseurs ont le même nom, ils seront classés selon leurs numéros. 2. Recherche avec blocs emboîtés Exemple : numéros des fournisseurs de produits rouges? ensemble des numéros des produits rouges : WHERE NP P couleur = "rouge" ensemble des numéros des fournisseurs de produits rouges : WHERE NF PUF NP IN ( NP P WHERE couleur = "rouge" ) Le mot clef IN signifie "appartient", l'opérateur mathématique de la théorie des ensembles ( ). La phrase NP IN ( NP P WHERE couleur = "rouge") est une condition logique, signifiant "la valeur de NP est dans l'ensemble des numéros de produits rouges", ce qui est vrai ou faux. Pour répondre à cette requête, le SGBD : 1. exécute la requête interne (calcul de l'ensemble des numéros des produits rouges), 2. exécute la requête externe NF PUF WHERE NP IN (...) en balayant PUF et en testant pour chaque tuple si ce NP appartient à l'ensemble des numéros de produits rouges. Dans le WHERE, la condition logique peut avoir plusieurs formes : - elle peut être composée de conditions élémentaires connectées par AND, OR, NOT, et par des parenthèses; - les conditions élémentaires sont (entre autres) du type : <valeur attribut> <opérateur de comparaison> <valeur attribut> <valeur attribut> <opérateur d'appartenance> <ensemble> EXISTS <ensemble> NOT EXISTS <ensemble> avec : <valeur attribut> ::= nom d'attribut constante <opérateur de comparaison> ::= > < = Bases de données avancées 2005-2006 2

<opérateur d'appartenance> ::= IN NOT IN <ensemble> est soit un ensemble constant, par exemple (1,2,3), soit un ensemble défini par une requête : <ensemble> ::= "(" <constantes> ")" <requête > <constantes> ::= constante constante","<constantes> Exemple : noms des fournisseurs n 1, 2, 3. ou nomf F WHERE NF = 1 OR NF =2 OR NF = 3 nomf F WHERE NF IN (1, 2, 3) 3. Qualification des noms d'attributs Notations : NP : attribut P.NP, PUF.NP : attributs qualifiés par le nom d'une relation Règle 1 : ce Un nom d'attribut non qualifié, référence la relation la plus interne qui a un attribut de nom-là. Règle 2 : On peut renommer localement une relation dans la clause. Exemple:... PUF PUF1... la relation PUF s'appelle alors PUF1 pour le correspondant à ce uniquement. Exemple : noms des fournisseurs ne livrant pas le produit numéro 2. WHERE nomf F 2 NOT IN ( NP /* ensemble des NP PUF livrés par ce WHERE PUF.NF = F.NF) fournisseur */ Dans le WHERE du interne, on aurait pu tout aussi bien écrire : WHERE NF = F.NF (cf. règle 1). Exemple : numéros des fournisseurs livrant le même produit que le fournisseur 1 en une quantité plus grande. Sur le schéma, la requête peut être décrite comme suit : =1 PUF ( NP, NU, NF, qt ) = > PUF ( NP, NU, NF, qt ) Ce qui s'écrit en SQL: Bases de données avancées 2005-2006 3

NF PUF PUFX /* PUF est renommé*/ WHERE NP IN ( NP /* ensemble PUF des produits du WHERE NF = 1 AND qt < PUFX.qt) fournisseur 1 */ 4. Recherche sur plusieurs relations simultanément Ces requêtes permettent d'obtenir dans le résultat (clause ) des attributs provenant de plusieurs relations. Le critère de jointure à effectuer entre les relations peut être défini soit dans la clause WHERE en spécifiant la condition sur les attributs (format 4.1 ci-dessous), soit, si c'est un cas classique de jointure, dans la clause en spécifiant explicitement la jointure entre les relations comme en algèbre relationnelle (format 4.2). 4.1. Recherche sur plusieurs relations avec produit des relations Format général : Aj R1, R2, Rn WHERE < condition de jointure entre les Ri > AND < condition(s) de la requête > Exemple : pour chaque produit livré, le nom du produit et les villes de leurs fournisseurs. nomp, ville P, F, PUF WHERE PUF.NP = P.NP AND PUF.NF = F.NF Si la clause WHERE est absente, alors le résultat de la requête est le produit simple des relations citées dans la clause. 4.2. Recherche sur plusieurs relations avec jointure des relations Plusieurs formats sont possibles dont les deux suivants : Aj R1 JOIN R2 USING Ak, [ WHERE ] Dans ce format l'attribut de jointure Ak doit exister dans R1 et dans R2, et il doit prendre la même valeur pour que les tuples de R1 et de R2 soient joints. Aj R1 NATURAL JOIN R2, [ WHERE ] Dans ce format la jointure s'effectue sur tous les attributs communs (de même nom dans les deux relations R1 et R2). Exemple : pour chaque produit livré, on veut le nom du produit et les villes de leurs fournisseurs. nomp, ville PUF JOIN P USING NP JOIN F USING NF 5. Recherche avec quantificateurs : SOME, ANY, ALL Bases de données avancées 2005-2006 4

SQL permet d'écrire des conditions où apparaissent des quantificateurs proches de ceux de la logique ("il existe" ( ), "quelque soit" ( ) ), grâce aux mots clefs SOME, ANY et ALL. Les mots clefs SOME et ANY ont exactement la même signification; ce sont des synonymes. Le format général d'une condition élémentaire avec quantificateur est le suivant: <valeur attribut> <opérateur de comparaison> <quantificateur> <ensemble> avec <quantificateur> ::= SOME ANY ALL ce qui signifie: - pour SOME et ANY : " existe-t-il dans l'ensemble au moins un élément e qui satisfait la condition: e <opérateur de comparaison> <ensemble>? " - pour ALL : " tous les éléments de l'ensemble satisfont-ils la condition? " Le mot clef IN est équivalent à un quantificateur existentiel (SOME ou ANY) avec l'opérateur de comparaison d'égalité. SOME et ANY sont donc plus puissants. Cependant le mot clef ALL ne permet pas d'exprimer toutes les requêtes contenant un quantificateur du type "quelque soit". On peut alors écrire la requête inverse avec un "NOT EXISTS" (voir paragraphe plus loin). Par exemple la requête "chercher les X qui pour tout Y satisfont telle condition" peut aussi s'exprimer: "chercher les X tels qu'il n'existe aucun Y qui ne satisfait pas telle condition". Exemples : Ensemble des numéros des fournisseurs de produits rouges : NF PUF WHERE NP = ANY ( NP P WHERE couleur = "rouge" ) Ensemble des numéros des fournisseurs qui ne fournissent que des produits rouges : NF F WHERE "rouge" = ALL ( couleur P WHERE NP = ANY ( NP PUF WHERE PUF.NF = F.NF) ) 6. Recherche avec test si un ensemble n'est pas vide : EXISTS Un format particulier de condition élémentaire est : EXISTS < ensemble>. Cette condition teste si l'ensemble n'est pas vide (ensemble Ø). Exemple : noms des fournisseurs qui fournissent au moins un produit rouge. nom F F WHERE EXISTS ( * PUF, P WHERE NF = F.NF AND couleur ="rouge" AND PUF.NP=P.NP) Il existe aussi la condition inverse : NOT EXISTS <ensemble>. Elle teste si l'ensemble est vide. Bases de données avancées 2005-2006 5

7. Valeur nulle Les attributs qui dans le schéma n ont pas la clause NOT NULL peuvent prendre une valeur particulière, la valeur nulle (NULL). Cette valeur peut être employée dans des cas très différents. Sa sémantique n est pas définie de façon précise. Par exemple, un attribut à valeur nulle peut signifier que la valeur est (pour le moment) inconnue. Pour un autre attribut, la valeur nulle signifiera que la valeur est inapplicable pour ce tuple (par exemple le nom-de-jeune-fille dans le cas d un homme). SQL permet d employer la valeur NULL pour tout attribut, quelque soit son domaine, sauf s il a été déclaré NOT NULL dans le schéma. Quand, dans une condition logique élémentaire d une requête SQL, un attribut de valeur nulle est testé, la valeur logique rendue par la condition n'est ni vrai, ni faux, mais inconnu (UKNOWN). Cela a nécessité d étendre la logique de Boole à une logique à trois valeurs : TRUE, FALSE et UNKNOWN. Les tables de vérité de cette logique ternaire sont les suivantes. NON OU vrai inconnu faux vrai faux vrai vrai vrai vrai inconnu inconnu inconnu vrai inconnu inconnu faux vrai faux vrai inconnu faux ET vrai inconnu faux vrai vrai inconnu faux inconnu inconnu inconnu faux faux faux faux faux Les requêtes SQL rendent en résultat les tuples pour lesquels la condition du WHERE est vraie. Ceux pour lesquels la condition rend inconnu ne font pas partie du résultat. Si on veut tester si la valeur d'un attribut est nulle, il faut le faire avec la clause particulière IS NULL (ou IS NOT NULL) qui rend toujours vrai ou faux. Employer la condition "attribut = NULL" serait une erreur, car elle rend toujours la valeur logique inconnu. De la même façon, les opérateurs arithmétiques ont été étendus afin de ne pas générer d'erreur d'exécution quand ils rencontrent une valeur nulle : une opération arithmétique appliquée à une valeur nulle rend NULL. Cependant, dans de nombreux cas, le traitement des valeurs nulles conduit à des bizarreries. Ce pourquoi, il est fortement conseillé d'éviter les valeurs nulles, par exemple en utilisant les valeurs par défaut. Un exemple de ces bizarreries est le suivant. Soit la relation Etudiant (n Etud, nom, prénom, age) L'union des deux requêtes suivantes : * Etudiant WHERE age = 22 * Etudiant WHERE age <> 22 ne rend pas en résultat la table Etudiant, car les tuples pour lesquels l'âge a la valeur nulle ne sont sélectionnés par aucune des deux requêtes. 8. Fonctions d'agrégation SQL offre les fonctions d'agrégation usuelles: cardinal : COUNT Bases de données avancées 2005-2006 6

moyenne : AVG minimum et maximum : MIN, MAX total : SUM qui opèrent sur un ensemble de valeurs prises par un attribut, ou pour COUNT uniquement, sur un ensemble de tuples. Exemple : quel est le nombre de livraisons faites par le fournisseur 1? COUNT (*) /* on compte les tuples de PUF tels PUF que NF = 1 */ WHERE NF=1 Exemple : combien de produits différents a livré le fournisseur 1? Attention : il faut ôter les doubles, car COUNT compte toutes les valeurs, y compris les valeurs doubles. COUNT (DISTINCT NP) PUF WHERE NF=1 9. Opérations ensemblistes SQL permet de faire l'union (UNION), la différence (EXCEPT) et l'intersection (INTERSECT) de relations qui possèdent au moins un attribut de même nom et de domaines compatibles. Lors de ces trois opérations SQL élimine les doubles du résultat (sauf si les variantes UNION ALL, EXCEPT ALL et INTERSECT ALL sont employées). Exemple : numéros des fournisseurs ayant livré le produit 1 mais jamais le produit 2. ( NF PUF WHERE NP = 1) EXCEPT ( NF PUF WHERE NP = 2) 10. Recherche avec partition des tuples d'une relation : GROUP BY Exemple : combien de produits différents ont été livrés par chacun des fournisseurs? Il faut partitionner l'ensemble des tuples de PUF en un sous-ensemble (ou groupe) par numéro de fournisseur. C'est ce que permet la clause GROUP BY. GROUP BY NF, COUNT (DISTINCT NP) PUF NF Cette instruction génère dans le SGBD les actions suivantes : 1. Classer les tuples de PUF, groupe par groupe selon l'attribut NF (un groupe = ensemble des tuples ayant même NF), 2. Pour chaque groupe : - évaluer le résultat du (compter le nombre de NP différents dans ce groupe). Exemple : combien de produits différents ont été livrés par chacun des fournisseurs, tels que la quantité totale de produits livrés par ce fournisseur soit supérieure à l000? NF, COUNT (DISTINCT NP) PUF GROUP BY NF Bases de données avancées 2005-2006 7

HAVING SUM (qt) > 1000 La clause "HAVING <condition>" permet de sélectionner les groupes qui satisfont une condition. Attention, contrairement à la clause "WHERE <condition>", la condition ne porte pas sur un tuple mais sur l'ensemble des tuples d'un groupe. Le format général du avec GROUP BY est le suivant : Soit une relation R (A1, A2,..., An) [Ai1] [,Ai2]... [,Aiu] [,f1 (Aj1)] [,f2 (Aj2)] [,fv (Ajv)] R [ WHERE <condition1 portant sur chaque tuple de R> ] GROUP BY Ak1 [,Ak2] [,Akw] [ HAVING <condition2 portant sur chaque groupe de tuples de R> ] avec fi = fonction d'agrégation (COUNT, SUM, MIN, MAX, AVG), {Ak1, Ak2,, Akw} {Ai1, Ai2,, Aiu}, {Ak1, Ak2,, Akw} {Aj1, Aj2,, Ajv} = Ø. La condition du HAVING peut comporter des conditions élémentaires de deux types : - condition comparant le résultat d'une fonction d'agrégation portant sur un attribut qui ne fait pas partie de la clause GROUP BY : fi (Ajx) <opérateur de comparaison> valeur où fi est une fonction d'agrégation Cette fonction porte alors sur l'ensemble des valeurs prises par l'attribut pour le groupe de tuples; - condition portant sur (ou des) attributs de la clause GROUP BY. L'instruction ci-dessus génère dans le SGBD les actions suivantes : 1. Créer une relation de travail, R', qui est une copie de R; éliminer de R' les tuples qui ne satisfont pas la condition du WHERE. 2. Classer les tuples de R', groupe par groupe (un groupe = un ensemble des tuples ayant même valeur pour Ak1 [,Ak2] [,Akw]). 3. Pour chaque groupe de tuples de R' faire: - tester la condition du HAVING - si elle est vérifiée, alors créer un tuple dans le résultat en évaluant la clause. Exemple : numéros des fournisseurs qui livrent leurs produits en grande quantité (c'est-à-dire dont la moyenne de leurs quantités livrées est supérieure à 100). NF PUF GROUP BY NF HAVING AVG(qt) > 100 11. Mise à jour de la base de données Insérer des tuples - Insérer un tuple : INSERT INTO nomrelation : < tuple constant> - Insérer un ensemble de tuples : INSERT INTO nomrelation : <requête dont le résultat a même schéma que la relation nomrelation> Exemple : autre catalogue de produits à rajouter à P : Catalogue (NP, nomp, couleur, poids, prix). INSERT INTO P : Bases de données avancées 2005-2006 8

NP, nomp, couleur, poids Catalogue. Supprimer des tuples DELETE nomrelation [WHERE condition] Si la clause "WHERE condition" est présente, seuls les tuples satisfaisant la condition sont supprimés. Si la clause "WHERE condition" est absente, alors tous les tuples sont supprimés; la relation continue d'exister, mais sa population est vide. Mettre à jour un (des) attribut(s) UPDATE nom relation SET nomattr1 = <expression1 qui définit une valeur pour l'attribut1>,... [WHERE condition] Exemple : pour les produits verts, changer leur couleur, elle devient "vert d'eau". UPDATE P SET couleur = "vert d'eau" WHERE couleur = "vert" 12. Plusieurs types d'utilisation de SQL Le langage SQL a essentiellement été utilisé pour offrir une interface de manipulation d'une base de données à des utilisateurs finaux (non informaticiens), dans un contexte d'interrogation/mise à jour ponctuelle interactive. Par ailleurs, dans plusieurs systèmes on a développé des passerelles entre SQL et un langage de programmation (C, Cobol, Ada, ) de façon à permettre l'écriture de programmes qui peuvent ainsi, entre autres, manipuler les données d'une base de données par des instructions SQL. Enfin, il existe des environnements de programmation, dits de 4ème génération, où un langage de type SQL permet de spécifier les traitements souhaités sur les données, ces spécifications étant ensuite traduites en langage exécutable (invisible à l'utilisateur) par un générateur de programmes. Ces deux derniers types d'utilisation de SQL (inclus dans un langage de programmation et inclus dans un langage de spécifications type 4ème génération) ont nécessité de développer des mécanismes pour faire cohabiter deux philosophies différentes : celle de SQL dont les instructions "..." donnent en résultat un ensemble de tuples, et celle des langages type programmation qui travaillent sur un article/tuple à la fois. Pour cela, la solution généralement adoptée est de déclarer le "...", puis dans une boucle itérative de récupérer, un par un, les tuples du résultat. Par exemple, pour inclure SQL dans un langage de programmation, la notion de "curseur" est employée. Un curseur est l'équivalent d'un fichier séquentiel temporaire dont le contenu est constitué d'une copie de l'ensemble des tuples résultat d'un. Exemple de programme en pseudo code + SQL avec curseur : trouver la liste des noms et villes des fournisseurs du produit de numéro numprod. Bases de données avancées 2005-2006 9

DECLARE Fourn CURSOR FOR nomf, ville F WHERE NF IN ( NF PUF WHERE NP = numprod) ; /* déclaration du curseur effectuée */ Lire (numprod) ; /* entrée du numéro du produit */ OPEN Fourn ; /* L'OPEN fait exécuter le du curseur; les tuples résultat sont chargés dans le fichier curseur Fourn */ FETCH Fourn INTO Fnom, Fville; /* un premier tuple est chargé en mémoire centrale Fnom et Fville sont des variables du langage hôte */ Tant que Rep-SGBD = "ok" faire : /* itération pour chaque tuple résultat du curseur */ Fin tant que; Afficher (Fnom, Fville) ; FETCH Fourn INTO Fnom, Fville ; /* le tuple suivant est chargé */ CLOSE Fourn ; /* le curseur est fermé */ Bases de données avancées 2005-2006 10