• Aucun résultat trouvé

Partie II. Bases de données et SQLite -

N/A
N/A
Protected

Academic year: 2022

Partager "Partie II. Bases de données et SQLite -"

Copied!
65
0
0

Texte intégral

(1)

Syst`eme d’information

http://www.agroparistech.fr/Systeme-d-Information.html

Partie II

——————————————————-

Bases de donn´ees et SQLite

——————————————————-

Liliana Ib˘anescu

liliana.ibanescu@agroparistech.fr

Cristina Manfredotti

cristina.manfredotti@agroparistech.fr

UFR d’informatique D´epartement MMIP

Ann´ee 2019 - 2020

(2)

Ce support de cours s’appuie sur l’ouvrage Bases de donn´ees. Concepts,

utilisation et d´eveloppement de Jean-Luc Hainaut, paru en 2009 aux ´editions

Dunod.

(3)

Table des mati`eres

1 Les bases de donn´ees (BD) 5

1.1 La base de donn´eesclient commande . . . 7

1.2 La base de donn´eesgie agricole . . . 8

1.3 BD, tables, lignes et colonnes . . . 11

1.4 Type de donn´ee et op´erateurs . . . 11

1.5 Cl´e . . . 13

1.5.1 Cl´e primaire . . . 13

1.5.2 Cl´es ´etrang`eres . . . 14

1.6 Modification et contraintes d’int´egrit´e . . . 15

1.6.1 Contraintes impos´ees par les colonnes obligatoires . . . 15

1.6.2 Contraintes d’unicit´e impos´ees par les cl´es primaires . . . 15

1.6.3 Contraintes r´ef´erentielles impos´ees par les cl´es ´etrang`eres . . . . 16

1.7 Sch´ema et contenu d’une base de donn´ee . . . 18

1.8 Le langage SQL (Structured Query Language) . . . 20

1.9 Les syst`emes de gestion de bases de donn´ees (SGBD) . . . 21

2 Les instructions du langage SQL 23 2.1 Sites Web de r´ef´erence pour SQL et SQLite . . . 23

2.2 Le langage SQL DDL (Data Definition Language) . . . 23

2.2.1 Cr´eation d’un sch´ema . . . 23

2.2.2 Cr´eation d’une table (CREATE TABLE) . . . 24

2.2.3 Suppression d’une table (DROP) . . . 25

2.2.4 Modification du sch´ema . . . 26

2.3 Le langage SQL DML (Data Manipulation Language) . . . 26

2.3.1 Extraction de donn´ees . . . 26

2.3.2 Extraction simple (SELECT-FROM) . . . 27

2.3.3 Extraction de lignes s´electionn´ees (SELECT-FROM-WHERE) . . 27

2.3.4 Le r´esultat d’une requˆete . . . 28

2.3.5 Extractions et op´erations sur les valeurs . . . 29

2.3.6 Jointure : extraction de donn´ees de plusieurs tables . . . 31

2.3.7 Les sous-requˆetes . . . 34

2.3.8 Groupements (clauseGROUP BY) . . . 35

2.3.9 Ajout de lignes dans une table (INSERT) . . . 37

2.3.10 Suppression de lignes (DELETE) . . . 38

2.3.11 Modification de lignes (UPDATE) . . . 38

(4)

3 Prise en main de l’environment de d´eveloppement 39

3.1 Pr´e-requis . . . 39

3.2 AgroPythia . . . 39

3.3 L’´editeur de texteNotepad++ . . . 40

4 Travaux dirig´es en BD 43 4.1 Requˆetes simples sur une table . . . 45

4.2 Requˆetes avec jointures entre tables . . . 48

4.3 Donn´ees extraites et fonctions agr´egatives . . . 50

4.4 Sous-requˆetes . . . 52

4.5 La clauseGroup By . . . 53

4.6 Requˆetes de mise `a jour . . . 54

4.7 Modification et contraintes d’int´egrit´e . . . 56

4.8 Exercices sur la BDgie agricole . . . 59

4.9 Le syst`eme d’informationStarboat . . . 61

(5)

Chapitre 1

Les bases de donn´ees (BD)

L’objectif de ce chapitre est de pr´esenter de mani`ere formelle et succincte les notions et le vocabulaire utile en base de donn´ees1. Comme nous l’avons vu pr´ec´edemment, dans la premi`ere partie de ce cours, les fichiers nous permettent de stocker des donn´ees que l’on peut utiliser par la suite dans nos programmes et, `a l’inverse, nos programmes peuvent cr´eer des fichiers pour stocker les r´esultats des traitements effectu´es. N´eanmoins, selon la quantit´e de donn´ees et les relations existantes entre elles, les fichiers peuvent rapidement se r´ev´eler insuffisants.

Consid´erons l’extrait d’un fichier de donn´ees de commandes de clients donn´e en Fi- gure 1.1. En observant le contenu de ce fichier, nous pouvons rapidement constater un certain nombre de redondances. Par exemple, si l’on consid`ere le client C400, nous pou- vons constater que son nom et son adresse apparaissent `a plusieurs reprises. En effet, il a pass´e plusieurs commandes avec parfois plusieurs produits. De mani`ere analogue, un mˆeme produit command´e `a plusieurs reprises aura son libell´e not´e pour chaque achat.

Tout ceci est n´ecessaire lorsque l’on veut stocker ces donn´ees dans un fichier. N´eanmoins cela est rapidement coˆuteux. Ici, il ne s’agit que d’un bref exemple consid´erant unique- ment quelques clients et quelques produits. Imaginez a qu’il pourait se passer avec un volume de donn´ees analogues `a celui d’Amazon ou de la Fnac.

La particularit´e des donn´ees pr´esent´ees dans cet exemple par rapport `a ce que l’on a pu voir dans les s´eances pr´ec´edentes est qu’elles sont ici “li´ees” : un client est `a “ratta- cher” `a un certain nombre de commandes qui elles-mˆemes concernent un certain nombre de produits. Certaines de ces informations sont propres `a une entit´e particuli`ere comme par exemple l’adresse pour une personne ou le libell´e d’un produit, en revanche d’autres marquent les liens qui les unissent, par exemple le num´ero de commande permet de re- trouver tous les produits achet´es lors d’un mˆeme achat.

Lorsque l’on est confront´e `a ce cas de figure, il devient pr´ef´erable de stocker ces donn´ees dans ce que l’on appelle unebases de donn´ees (BD), database (DB)en anglais (voir les§1.3 `a§1.8). Par ailleurs, en dehors du probl`eme de redondance, il n’est pas ais´e avec un tel fichier de d´eterminer rapidement et automatiquement par exemple tous les produits command´es par un client donn´e.

Les bases de donn´ees sont des outils de plus en plus fr´equemment utilis´es. Elles per-

1. Pour plus de d´etails vous pourrez vous reporter `a l’ouvrageBases de donn´ees. Concepts, utilisation et d´eveloppementde Jean-Luc Hainaut, paru en 2009 aux ´editions Dunod.

(6)

FIGURE 1.1 – Un extrait d’un fichier de donn´ees de commandes de clients.

mettent de stocker des donn´ees nombreuses dans un seul ensemble bien structur´e, d’´eviter le plus souvent les doublons, d’assurer la coh´erence des informations qu’elles contiennent et fournissent des moyens d’interrogation performants r´epondant ainsi `a toutes nos r´eserves vis-`a-vis de l’usage de fichiers pour des donn´ees “li´ees”.

La gestion d’une base de donn´ees pose des probl`emes complexes et elle est assur´ee par des logiciels sp´ecialis´es :les syst`emes de gestion de bases de donn´ees (SGBD), en anglais DBMS pourdatabase management system(voir le§1.9).

Tout au long de ce cours nous utiliserons deux exemples de bases de donn´ees : 1. La base de donn´ees appel´ee client commande, d´ecrite dans le §1.1, est uti-

lis´ee pour enregistrer les clients, les produits et les commandes d’une entreprise de mat´eriaux de construction ; le syst`eme d’information construit sur cette base de donn´ees permettra, entre autres, d’´editer des factures, de g´erer les stocks et la comp- tabilit´e.

2. La base de donn´ees appel´eegie agricole, d´ecrite dans le§1.2, est utilis´ee par un GIE2agricole pour enregistrer les interventions de ses employ´es sur les parcelles des agriculteurs ; le syst`eme d’information construit sur cette base de donn´ees per- mettra, entre autres, d’´editer les fiches de paye des employ´es et les interventions effectu´ees pour un agriculteur.

2. GIE = groupement d’int´erˆet ´economique

(7)

1.1 La base de donn´ees client commande

La base de donn´eesclient commandeest utilis´ee par une entreprise de mat´eriaux de construction pour lui permettre d’´editer des factures pour ses clients et de g´erer ses stocks.

Le sch´ema de la base de donn´eesclient commandeest pr´esent´e dans la figure 1.2 : 1. la table clientest utilis´ee pour enregistrer les propri´et´es concernant les clients

de l’entreprise : leur nom, leur adresse, etc.

2. la tableproduitest utilis´ee pour enregistrer les propri´et´es concernant les mat´eri- aux de construction disponibles `a la vente : leur libell´e, le prix `a l’unit´e, la quantit´e en stock.

3. la tablecommandeest utilis´ee pour enregistrer les propri´et´es concernant une com- mande : son num´ero, la date de la commande et l’identifiant du client (NCLI) qui permet de r´ecup´erer dans la table client toutes les informations relatives `a ce client.

4. la tabledetailest utilis´ee pour enregistrer les “lignes” des commandes : l’iden- tifiant de la commande (NCOM), l’identifiant du produit (NPRO) et la quantit´e com- mand´ee.

FIGURE 1.2 – Le sch´ema de la base de donn´eesclient commande.

A un instant donn´e, les lignes (ou enregistrements) de la BD client commande sont ceux donn´es dans la figure 1.3.

(8)

tableclient tablecommande

tableproduit tabledetail

FIGURE1.3 – Exemple de lignes de la base de donn´eesclient commande`a un instant donn´e.

1.2 La base de donn´ees gie agricole

La base de donn´eesgie agricoleest utilis´ee par un groupement d’int´erˆet ´econo- mique (GIE) agricole pour enregistrer les interventions de ses employ´es sur les parcelles des agriculteurs. La main d’œuvre pour l’exploitation des parcelles est assur´ee par les em- ploy´es du GIE, pay´es selon un salaire journalier brut. La BD permet, entre autre, d’´editer

(9)

les fiches de payes mensuelles des employ´es et de lister les interventions effectu´ees pour un agriculteur.

Le sch´ema de la base de donn´eesgie agricoleest pr´esent´e dans la figure 1.4 : 1. la table agriculteur est utilis´ee pour enregistrer les propri´et´es concernant un

agriculteur : son nom, son pr´enom et son adresse.

2. la tableparcelle est utilis´ee pour enregistrer les propri´et´es concernant les par- celles des agriculteurs : leur nom, leur lieu, leur superficie et l’identifiant de leur propri´etaire.

3. la table employe est utilis´ee pour enregistrer les propri´et´es concernant les em- ploy´es.

4. la table intervention est utilis´ee pour enregistrer les interventions des em- ploy´es du GIE sur les parcelles des agriculteurs.

FIGURE 1.4 – Le sch´ema de la base de donn´eesgie agricole.

A un instant donn´e, les lignes (ou enregistrements) de la BD gie agricolesont ceux donn´es dans la figure 1.5.

(10)

tableagriculteur tabletarif

tableparcelle

tableemploye

tableintervention

FIGURE 1.5 – Exemple de lignes de la base de donn´ees gie agricole `a un instant donn´e.

(11)

1.3 BD, tables, lignes et colonnes

Unebase de donn´eesest compos´ee d’un ensemble detables.

Unetablecontient une collection/suite delignes, aussi appel´eesenregistrements.

Uneligned’une table est une suite devaleurs, chacune d’un type d´etermin´e. Une ligne regroupe les donn´ees relatives `a une entit´e ou un fait du domaine d’application (la partie du monde `a laquelle on s’int´eresse). Toutes les lignes d’une table ont le mˆeme format ou structure.

Unecolonneest d´efinie par son nom et le type de ses valeurs.

Exemple 1. La figure 1.6 repr´esente les informations enregistr´ees `a un instant donn´e dans la tableproduit de la BDclient commande : la table a 7 lignes (enregistrements) d´ecrivant chacune un produit. On trouve dans chaque ligne quatre valeurs repr´esentant respectivement le code, le libell´e, le prix `a l’unit´e d’un produit, ainsi que la quantit´e restant en stock. La colonneLIBELLE contient des valeurs qui sont des chaˆınes de caract`eres, les valeurs de la colonnePRIXsont des nombres d´ecimaux (dont deux chiffres apr`es la virgule) et les valeurs de la colonneQSTOCKsont des nombres entiers (cf `a la figure 1.2).

FIGURE1.6 – Exemple de lignes de la tableproduitde la BDclient commande`a un instant donn´e.

1.4 Type de donn´ee et op´erateurs

Nous rappelons que, en informatique, untype de donn´ee, ou simplementtype, d´efinit le type des valeurs que peut prendre une donn´ee, ce qui permet de d´eterminer les op´erateurs qui peuvent ˆetre appliqu´es `a cette donn´ee. Les types de base sont les suivants :

– typebool´een: les valeurstrueetfalse;

– typenum´erique: des nombres entiers, des nombres d´ecimaux, des nombres r´eels ; – typechaˆıne de caract`eres: du texte ;

– typetemporel: une date (jour, mois et ann´ee), une heure (heure, minute et seconde).

Les op´erateurs utilis´es pour comparer des valeurs sont :

(12)

= ´egal `a

> plus grand que

< plus petit que

<> diff´erent de

>= plus grand ou ´egal

<= plus petit ou ´egal

L’interpr´etation de ces relations est ´evidente pour les valeurs num´eriques. Pour les va- leurs temporelles, l’expressiondate1<date2 s’interpr`ete comme date1 est ant´erieure `a date2dans le calendrier. Pour les chaˆınes de caract`eres, l’expressionch1<ch2pour toute chaˆınesch1etch2, s’interpr`ete commech1est plus petite quech2selon l’ordre lexicogra- phique (celui du dictionnaire). Attention : le caract`ere “a” n’est pas ´egal `a “A”.

Lesop´erateurs logiquesutilis´es pour les valeurs de type bool´een sont : and: conjonction

or: disjonction not: n´egation

Lorsqu’une expression complexe comporte plusieurs op´erateurs, lespriorit´es des op´e- rateursd´eterminent l’ordre d’ex´ecution des op´erations. Cet ordre peut affecter consid´erablement la valeur du r´esultat. Un op´erateur de priorit´e ´elev´ee est ´evalu´e avant un op´erateur de prio- rit´e basse. Lorsque deux op´erateurs dans une expression ont le mˆeme niveau de priorit´e, ils sont ´evalu´es de gauche `a droite en fonction de leur position dans l’expression. En r`egle g´en´erale :

– les op´erateurs arithm´etiques de multiplication et de division sont prioritaires sur les op´erateurs arithm´etiques d’addition et de soustraction ;

– les op´erateurs arithm´etiques sont prioritaires sur les op´erateurs de comparaison ; – les op´erateurs de comparaison sont prioritaires sur les op´erateurs logiques ; – l’op´erateur logiqueandest prioritaire sur l’op´erateuror.

Pour modifier la priorit´e habituelle des op´erateurs dans une expression il faut utiliser des parenth`eses. Tout ce qui se trouve entre parenth`eses est ´evalu´e en premier pour pro- duire une seule valeur qui est ensuite utilis´ee par un op´erateur en dehors des parenth`eses.

Exemple 2. L’expression 2+3×4 est calcul´ee comme l’expression(2+ (3×4))car la multiplication est prioritaire sur l’addition.

L’expression 5×6 : 3 est calcul´ee comme l’expression((5×6): 3)car la multiplication et la division ont la mˆeme priorit´e et l’´evaluation se fait de gauche `a droite. L’expression

age=16+5orage=20andville=’Paris’

est calcul´ee comme l’expression

((age= (16+5))or((age=20)and(ville=’Paris’)))

car l’op´erateur arithm´etique d’addition est prioritaire sur tous les autres op´erateurs, l’op´e- rateur de comparaison=est prioritaire par rapport aux op´erateurs logiques et l’op´erateur andest prioritaire sur l’op´erateuror.

La valeurNULL

L’absence de valeur d’une colonne dans une ligne d’une table se signalera par l’affec- tation de la valeur conventionnelleNULL`a cette colonne.

(13)

On peut imposer l’interdiction d’assigner la valeurNULL`a une colonne : cette colonne sera alors unecolonne obligatoire. Si la valeurNULLest autoris´ee, cette colonne sera dite facultative.

Contrainte : Toute tentative d’ins´erer une ligne qui ne poss´ederait pas de valeur pour une colonne obligatoire serait automatiquement signal´ee comme une erreur.

Exemple 3. Dans la tableclientde la BDclient commandela colonneCAT, pour cat´egorie de client, est une colonne facultative. Si, au moment de l’enregistrement d’un client, la valeur de la cat´egorie de ce client n’est pas connue, alors il est possible de ne pas renseigner cette colonne pour ce client et c’est le marqueurNULLqui sera enregistr´e.

Remarque :La valeurNULLa un statut particulier par rapport aux autres valeurs, son usage entraˆıne de multiples difficult´es et certains auteurs recommandent de l’´eviter.

1.5 Cl´e

Une ligne dans une table regroupe des informations sur une entit´e. Il est primordial de pouvoir identifier de mani`ere unique une ligne dans une table `a l’aide d’unidentifiantou unecl´e(keyen anglais).

Exemple 4. Une ligne de la tableclientdonne les informations relatives `a un client : son nom, son adresse, la ville o`u il habite.

D´eclarer que la colonneNOMest une cl´e de la tableclient, impliquerait alors, qu’`a tout instant, il n’existera pas deux (ou plusieurs) lignes ayant la mˆeme valeur dans la colonne NOM.

1.5.1 Cl´e primaire

Parmi les identifiants d’une table, l’un est d´eclar´eidentifiant primaireoucl´e primaire (primary keyen anglais).

La cl´e primaire d’une table impose unecontrainte d’unicit´e: le SGBD rejettera auto- matiquement toute tentative d’insertion d’une ligne dont la valeur de la cl´e primaire est d´ej`a pr´esente dans la table.

Une cl´e primaire peut ˆetre compos´ee de plusieurs colonnes, qui doivent toutes ˆetre obligatoires.

Exemple 5.La cl´e primaire de la tableemployede la base de donn´eesgie agricole3 est repr´esent´ee par la colonneEmp Nssqui contient les num´eros de s´ecurit´e sociale des employ´es, qui sont donc uniques.

La cl´e primaire de la tabledetailde la base de donn´eesclient commande4est repr´esent´ee par le couple de deux colonnesNCOMetNPRO, ce qui impose qu’on ne pourra

3. voir la figure 1.4, page 9 4. voir la figure 1.2, page 7

(14)

pas enregistrer deux lignes ayant le mˆeme num´ero de commande et le mˆeme num´ero de produit (voir aussi l’exemple 9, page 15).

La cl´e primaire de la tableinterventionde la base de donn´eesgie agricole5 est repr´esent´ee par ses trois premi`eres colonnes.

1.5.2 Cl´es ´etrang`eres

Dans une table, appel´eetable enfant, une de ses colonnes, appel´eecl´e ´etrang`ere(fo- reign keyen anglais), peut faire r´ef´erence `a la colonne qui est cl´e primaire dans une autre table, appel´eetable parent. Le couple constitu´e par une cl´e ´etrang`ere de la table enfant et la cl´e primaire de la table parent permet de relier des lignes dans des tables distinctes.

Exemple 6. La tableparcelle(table enfant) de la base de donn´eesgie agricole6 a ´et´e d´efinie avec une cl´e ´etrang`ere repr´esent´ee par la colonnePar Propqui fait r´ef´erence

`a la cl´e primaire Agr Id de la tableagriculteur (table parent). Ceci implique que pour une ligne de la tableparcelle, la valeur de la colonnePar Proppermet de relier cette ligne `a une ligne de la tableagriculteur.

Pour la version de la BD de la figure 1.5, sur la troisi`eme ligne de la tableparcelle, la valeur 1 dans la colonnePar Proppermet de relier la parcelle d´ecrite sur cette ligne, Plan des Bauges, avec la premi`ere ligne de la tableagriculteur, en retrouvant ainsi toutes les informations concernant l’agriculteur : son nom (Dulhac), son pr´enom et son adresse.

Exemple 7.La tabledetail(table enfant) de la base de donn´eesclient commande7 a deux cl´es ´etrang`eres :

1. la colonneNCOM, appel´ee dans la suiteFK1 (Foreign Key 1), qui fait r´ef´erence `a la cl´e primaire, la colonneNCOM, de la tablecommande(table parent) ;

2. la colonne NPRO, appel´ee dans la suite FK2, qui fait r´ef´erence `a la cl´e primaire NPRO, de la la tableproduit(table parent’).

Pour la version de la BD de la figure 1.3, pour la derni`ere ligne de la tabledetail – la valeur30188dans la colonneNCOMpermet de relier cette ligne avec la derni`ere

ligne de la tablecommandeen retrouvant ainsi la date de la commande, le 3 janvier 2009 (par la cl´eFK1).

– la valeur PH222dans la colonne NPRO permet de relier cette ligne avec l’avant- derni`ere ligne de la table produit en retrouvant ainsi toutes les informations concernant le produitPL. HETRE 200x20x2(par la cl´eFK2).

On notera que le nom d’une colonne formant une cl´e ´etrang`ere peut ˆetre le mˆeme ou non que celui de la cl´e primaire `a laquelle elle fait r´ef´erence.

Pour qu’une cl´e ´etrang`ere joue correctement le rˆole de r´ef´erence, il est n´ecessaire que l’ensemble de ses valeurs dans la table enfant soit un sous-ensemble des valeurs de la cl´e primaire de la table parent. Cette propri´et´e est appel´eecontrainte r´ef´erentielle(voir aussi

5. voir la figure 1.4, page 9 6. voir la figure 1.4, page 9 7. voir la figure 1.2, page 7

(15)

le §1.6.3, page 16). Elle est garantie par le SGBD pour autant qu’on ait explicitement d´eclar´e les cl´es ´etrang`eres (c.`a.d. cr´eer les relations avec les cl´es primaires auxquelles elles font r´ef´erence) : toute op´eration qui conduirait `a violer cette contrainte serait auto- matiquement rejet´ee.

1.6 Modification et contraintes d’int´egrit´e

Les colonnes obligatoires, les cl´es primaires et les cl´es ´etrang`eres, imposent aux donn´ees des contraintes qui doivent toujours ˆetre satisfaites. Ces contraintes, d´esign´ees g´en´eralement sous le terme de contraintes d’int´egrit´e, seront prises en compte lors de toute tentative de modification sur les donn´ees. Ajouter une ligne, supprimer une ligne ou modifier une valeur de colonne d’une ligne sont des op´erations qui ne sont autoris´ees que si ces contraintes sont toujours respect´ees par les donn´ees apr`es ces op´erations. Si ces contraintes sont viol´ees, on dit que les donn´ees ont perdu leur int´egrit´e.

1.6.1 Contraintes impos´ees par les colonnes obligatoires

Si une colonne est d´eclar´ee obligatoire, chaque ligne doit en poss´eder une valeur. Lors des op´erations de cr´eation et de modification de lignes, cette colonne devra rec¸evoir une valeur, `a l’exclusion de la valeurNULL.

1.6.2 Contraintes d’unicit´e impos´ees par les cl´es primaires

Une cl´e primaire (cf.§1.5.1) impose une contrainte d’unicit´e signifiant qu’`a tout ins- tant les lignes d’une table poss`edent des valeurs distinctes pour la ou les colonnes consti- tuant la cl´e.

– Lacr´eation d’une ligne est autoris´ee s’il n’existe pas de ligne poss´edant la mˆeme valeur pour la cl´e primaire ;

– Pour lasuppression d’une ligneil n’y a pas de contrainte ;

– Lamodification de la cl´e primaire d’une ligne est autoris´ee s’il n’existe pas d´ej`a une ligne poss´edant cette nouvelle valeur de la cl´e primaire.

Exemple 8. La cl´e primaire de la table client de la BD client commande8 est repr´esent´ee par la colonneNCLI.

Pour la version de la BD de la figure 1.3, la cr´eation d’une nouvelle ligne ayant comme valeur C123 dans la colonne NCLI n’est pas autoris´ee car il existe d´ej`a une ligne, la sixi`eme, dans cette table ayant cette valeur dans la colonneNCLI.

Exemple 9. La cl´e primaire de la table detail de la BD client commande9 est repr´esent´ee par le couple de deux colonnesNCOMetNPRO.

Pour la version de la BD de la figure 1.3, la cr´eation d’une ligne ayant comme valeur 30188dans la colonneNCOMetPH222dans la colonneNPROn’est pas autoris´ee car il existe d´ej`a une ligne, la derni`ere, ayant ces valeurs pour la cl´e primaire.

8. voir la figure 1.2, page 7 9. voir la figure 1.2, page 7

(16)

1.6.3 Contraintes r´ef´erentielles impos´ees par les cl´es ´etrang`eres

Une contrainte r´ef´erentielle pr´ecise que dans une table enfant chaque colonne iden- tifi´ee comme ´etant une cl´e ´etrang`ere doit `a tout instant, pour chaque ligne, contenir une valeur correspondant `a la valeur d’une cl´e primaire dans une ligne de la table parent.

Exemple 10. La cl´e ´etrang`ere de l’exemple 6 page 14 pour la BD gie agricoleim- pose que dans la colonnePar Propde la tableparcelleles seules valeurs accept´ees soient celles d´ej`a pr´esentes dans la colonneAgr Idde la tableagriculteur.

Exemple 11. Les deux cl´es ´etrang`eres pr´esent´ees dans l’exemple 7 page 14 pour la BD client commandeimposent deux contraintes r´ef´erentielles :

1. la premi`ere, cf. FK1, indique que toute valeur de la colonneNCOM dansdetail doit faire r´ef´erence `a une valeur de la colonneNCOMde la tablecommande; 2. la seconde, cf. FK2, indique que toute valeur de la colonneNPRO dans detail

doit faire r´ef´erence `a une valeur de la colonneNPROde la tableproduit.

Exemple 12. La table commande (table enfant) de la BD client commande doit respecter la contrainte r´ef´erentielle donn´ee par la colonneNCLIidentifi´ee comme ´etant une cl´e ´etrang`ere, appel´eeFK3, qui fait r´ef´erence `a la colonneNCLIde la tableclient (table parent) : dans la colonneNCLIde la tablecommandeles seules valeurs accept´ees sont celles d´ej`a pr´esentes dans la colonneNCLIde la tableclient.

La suppression dans la table parent d’une ligne r´ef´erenc´ee par d’autres lignes dans une table enfant sera ex´ecut´ee selon une des strat´egies possibles suivantes, appel´eesdelete mode:

– blocage: la suppression de la ligne dans la table parent est refus´ee ;

– cascade : la suppression de la ligne dans la table parent est accompagn´ee de la suppression des lignes correspondantes dans la table enfant ;

– ind´ependance : la suppression de la ligne dans la table parent est accompagn´ee par la mise `a NULL des colonnes correspondant aux cl´es ´etrang`eres des lignes concern´ees dans la table enfant.

Exemple 13. Dans la base de donn´eesclient commandela tabledetaila pour cl´e primaire le couple de colonnes (NCOM, NPRO) (voir aussi l’exemple 5) et doit respecter les deux contraintes r´ef´erentielles donn´ees dans l’exemple 11. Les cons´equences sur la modification de cette table sont les suivantes :

1. La cr´eation d’une ligne dans la tabledetailest autoris´ee seulement si :

(a) la valeur de la colonne NCOM de cette nouvelle ligne existe dans la colonne NCOMde la tablecommande(cf.FK1) ;

(b) la valeur de la colonne NPRO de cette nouvelle ligne existe dans la colonne NPROde la tableproduit(cf.FK2) ;

(c) le couple de valeurs (NCOM,NPRO) n’existe pas d´ej`a dans une ligne de la table detail(voir aussi l’exemple 8).

2. La suppression d’une ligne dans la tabledetailest autoris´ee.

(17)

3. La modification de la cl´e primaire d’une ligne dans la tabledetail, c’est-`a-dire du couple de valeurs (NCOM, NPRO), est autoris´ee seulement si ces valeurs respectent les contraintes 1(a), 1(b) et 1(c) vues ci-dessus.

Exemple 14. Dans la base de donn´eesclient commande, la tablecommande i) a pour cl´e primaire la colonneNCOM,

ii) est la table parent dans la cl´e ´etrang`ereFK1 (voir aussi l’exemple 7), et iii) est la table enfant dans la cl´e ´etrang`ereFK3 (voir aussi l’exemple 12).

Les cons´equences sur la modification de cette table sont les suivantes :

1. La cr´eation d’une ligne dans la tablecommandeest autoris´ee seulement si : (a) la valeur de la colonne NCOM de cette nouvelle ligne n’existe pas d´ej`a dans

une ligne de la tablecommande(NCOMest cl´e primaire) ;

(b) la valeur de la colonne NCLI de cette nouvelle ligne existe dans la colonne NCLIde la tableclient(cf.FK3).

2. Si la strat´egie de suppression est en modeblocage, alors la suppression d’une ligne lcomm dans la table commande est autoris´ee seulement s’il n’existe pas de lignes dans la tabledetailqui font r´ef´erence `a cette lignelcomm(cf.FK1).

3. La modification de la cl´e primaire d’une ligne dans la table commande, c’est-`a- dire la valeur de la colonne NCOM, est autoris´ee seulement si cette valeur respecte la contrainte 1(a).

Exemple 15. Dans la base de donn´ees client commande, la table clienta pour cl´e primaire la colonneNCLI et elle est la table parent dans la cl´e ´etrang`ere FK3. Les cons´equences sur la modification de cette table sont les suivantes :

1. La cr´eation d’une ligne dans la tableclientest autoris´ee seulement si la valeur de la colonne NCLI de cette nouvelle ligne n’existe pas d´ej`a dans une ligne de la table ;

2. Si la strat´egie de suppression est en modeblocage, alors la suppression d’une ligne lcli dans la tableclientest autoris´ee seulement s’il n’existe pas de lignes dans la tablecommandequi font r´ef´erence `a cette lignelcli (cf.FK3) ;

3. La modification de la cl´e primaire d’une ligne dans la tableclient, c’est-`a-dire la valeur de la colonneNCLI, est autoris´ee seulement si cette valeur n’existe pas d´ej`a dans une ligne de la tableclient.

Exemple 16. Dans la base de donn´eesclient commande, si la strat´egie de suppres- sion est en modecascadepour les cl´es ´etrang`eresFK3 etFK1, alors la suppression d’une ligne dans la tableclientsera accompagn´ee de la suppression de toutes les lignes de la tablecommandequi y font r´ef´erence (c.`a.d. toutes les commandes de ce client), ainsi que de la suppression de toutes les lignes concern´ees de la tabledetail (c.`a.d. toutes les lignes de toutes les commandes de ce client).

(18)

1.7 Sch´ema et contenu d’une base de donn´ee

Une base de donn´ees est compos´ee de deux parties distinctes : son sch´ema et son contenu.

Le sch´ema d’une base de donn´ees sp´ecifie la liste des tables et pour chacune son nom, la liste de ses colonnes, sa cl´e primaire et, ´eventuellement, sa/ses cl´e(s) ´etrang`ere(s).

Pour chaque colonne il faut sp´ecifier son nom, son type et pr´eciser si c’est une colonne obligatoire ou non.

Lecontenu d’une base de donn´ees `a un instantt est l’ensemble des lignes de toutes ses tables.

Le contenu d’une base de donn´ees r´eelle est g´en´eralement volumineux (plusieurs millions de lignes) et est susceptible d’´evoluer constamment. En revanche, le sch´ema comporte un nombre limit´e d’´el´ements (quelques tables `a quelques milliers de tables en g´en´eral) pr´esentant une relative stabilit´e dans le temps : on ne modifie la structure d’une base de donn´ees que lorsque la structure du domaine d’application `a repr´esenter ´evolue.

Il existe plusieurs conventions graphiques de repr´esentation d’un sch´ema de BD, parmi lesquelles les plus utilis´ees sont les suivantes :

1. Une table est repr´esent´ee soit par un rectangle contenant le nom de la table et celui de chaque colonne, en liste horizontale (`a la mode “EXCEL”), soit par une boˆıte dont le premier compartiment indique le nom de la table et ensuite les noms de ses colonnes en liste verticale ;

2. La cl´e primaire est soit soulign´ee d’un trait continu, soit elle est indiqu´ee en gras, soit elle est sp´ecifi´ee par la clause “id :” ;

3. Une cl´e ´etrang`ere est soit soulign´ee d’un trait pointill´e, soit sp´ecifi´ee par la clause

“ref :” ;

4. Une contrainte r´ef´erentielle est repr´esent´ee par une fl`eche qui part du nom de la colonne qui est une cl´e ´etrang`ere et qui pointe vers la cl´e primaire r´ef´erenc´ee dans la table cible.

(19)

Exemple 17. La figure 1.7 donne trois repr´esentations graphiques du sch´ema de la base de donn´eesclient commande, d´ecrite dans le§1.1.

FIGURE 1.7 – Diff´erentes repr´esentations graphiques d’un mˆeme sch´ema d’une BD (source : “Bases de donn´ees. Concepts, utilisation et d´eveloppement” de Jean-Luc Hai- naut).

FIGURE 1.8 – Le sch´ema de la base de donn´eesclient commande.

(20)

1.8 Le langage SQL (Structured Query Language)

Les SGBD proposent un langage de requˆete d´enomm´e SQL (Structured Query Lan- guage). Pr´esent´e pour la premi`ere fois en 1973, ce langage a rapidement ´et´e adopt´e comme standard potentiel et pris en charge par les organismes de normalisation ANSI et ISO qui ont publi´e 3 normes : SQL-89, SQL-92 (d´enomm´ee aussi SQL2) et SQL : 1999 (SQL3).

Malheureusement, les ´editeurs de SGBD ne respectent pas int´egralement ces normes : ils ne reprennent qu’un sous-ensemble de sp´ecifications, modifient la syntaxe, voire l’in- terpr´etation des concepts retenus, et ajoutent leur propres fonctions. Dans ce cours, nous utiliserons la syntaxe SQL2 dans sa version SQLite.

Le langage de bases de donn´ees SQL est compos´e de deux sous-langages :

1. SQL DDL (Data Definition Language) pour la d´efinition et la modification des structures (table, colonne, contrainte). Les instructions sont : CREATE, ALTER, et DROP;

2. SQL DML (Data Manipulation Language) pour l’extraction et la modification des donn´ees. Les instructions sont :SELECT,INSERT,DELETE, etUPDATE.

Une instruction SQL constitue unerequˆete(en anglaisquery), c’est-`a-dire la descrip- tion d’une op´eration que le SGBD doit ex´ecuter.

Une requˆete SQL peut ˆetre ´ecrite en utilisant le clavier, g´en´er´ee `a partir d’une interface graphique, ou import´ee `a partir d’un fichier. Le r´esultat de l’ex´ecution d’une requˆete peut apparaˆıtre `a l’´ecran avec des ´eventuels messages d’erreurs. Dans la premi`ere partie de ce cours, nous utiliserons cette formulation interactive des requˆetes SQL.

Une requˆete peut ´egalement ˆetre envoy´ee par un programme (´ecrit en C, PHP ou Py- thon, par exemple) au SGBD. Dans ce cas, le r´esultat de la requˆete est stock´e par le SGBD, ligne par ligne, dans les variables du programme. Dans la dernier partie du cours, nous utiliserons du code Python pour envoyer des requˆetes au SGBD et exploiter ensuite leurs r´esultats dans des programmes.

(21)

1.9 Les syst`emes de gestion de bases de donn´ees (SGBD)

La gestion d’une base de donn´ees est assur´ee par des logiciels sp´ecialis´es : les SGBD.

Les fonctions d’un SGBD sont les suivantes :

1. Organisation des donn´ees : le SGBD organise les donn´ees en tables stock´ees sur disque et il cr´ee les m´ecanismes garantissant un acc`es rapide aux donn´ees ;

2. Gestion des donn´ees : le SGBD garantit l’´evolution coh´erente des donn´ees et il v´erifie que les contraintes (unicit´e, r´ef´erence entre tables, etc.) sont respect´ees ; 3. Acc`es aux donn´ees: le SGBD permet l’acc`es aux donn´ees `a la fois par un utilisa-

teur occasionnel et par des programmes de traitement de donn´ees ;

4. Gestion des acc`es concurrents : le SGBD permet l’acc`es simultan´e aux donn´ees par des centaines voire des milliers d’utilisateurs. Il contrˆole rigoureusement les op´erations simultan´ees sur les mˆemes donn´ees ;

5. Contrˆole des acc`es: le SGBD garantit que seuls les utilisateurs autoris´es peuvent acc´eder aux donn´ees et les modifier.

Les diff´erents SGBD sur le march´e se diff´erencient par le p´erim`etre d’utilisation des bases de donn´ees. Le p´erim`etre influence le nombre d’utilisateurs simultan´es, la taille des bases de donn´ees et la puissance de calcul n´ecessaire. Certains SGBD, utilis´es dans les entreprises, supportent de tr`es grandes bases de donn´ees et n´ecessitent des ordinateurs puissants et tr`es couteux. D’autres SGBD fonctionnent sur des ordinateurs personnels bon march´e, avec des limites quant `a la taille des bases de donn´ees et la puissance de calcul.

Le march´e des SGBD10 se r´epartit entre : 1. des SGBD commerciaux (payants) :

– Oracle Database11;

– DB2 Database Software12 d’IBM ; – SQL Server13 de Microsoft ;

– Access14, ´edit´e par Microsoft, qui fait partie de la suite bureautique MS Office Pro, etc.

2. des SGBDOpen Source(ou libre) : – SQLite15;

– MySQL16;

– PostgreSQL17, etc.

Dans ce cours, nous utiliserons le SGBDSQLite, un logiciel SGBD libre.

SQLite est une biblioth`eque ´ecrite en C qui propose un moteur de base de donn´ees relationnelle accessible par le langage SQL. Contrairement aux serveurs de bases de

10. Pour en savoir plus sur les parts de march´e consultez, par exemple,http://www.mysql.com/

why-mysql/marketshare/

11. http://www.oracle.com/fr/products/database/index.html 12. http://www-01.ibm.com/software/data/db2/

13. http://www.microsoft.com/france/serveur-cloud/sql/

14. http://office.microsoft.com/fr-fr/access/

15. https://www.sqlite.org/

16. http://www.mysql.fr/

17. http://www.postgresql.org/

(22)

donn´ees traditionnels, comme MySQL ou PostgreSQL, sa particularit´e est de ne pas reproduire le sch´ema habituel client-serveur mais d’ˆetre directement int´egr´ee aux pro- grammes que l’on souhaite d´evelopper. L’int´egralit´e de la base de donn´ees (d´eclarations, tables, index et donn´ees) est stock´ee dans un fichier ind´ependant de la plateforme.

(23)

Chapitre 2

Les instructions du langage SQL

Dans la suite nous pr´esentons une syntaxe simplifi´ee des instructions du langage SQL, adapt´ee aux objectifs du cours. Le langage SQL est le standard utilis´e pour la d´efinition du sch´ema d’une base de donn´ees et pour la manipulation des donn´ees. Nous utiliserons en TD l’application AgroPythia qui est une application d´evelopp´ee en Python par Christine Martin pour vous permettre d’interagir avec les instructions du langage SQL.

2.1 Sites Web de r´ef´erence pour SQL et SQLite

Une version compl`ete de la syntaxe SQL DDL (Data Definition Language) se trouve, par exemple, `a l’adresse :

http://sqlpro.developpez.com/cours/sqlaz/ddl/

Pour consulter la syntaxe des instruction du SQL DML (Data Manipulation Language) consultez les adresses suivantes :

http://sqlpro.developpez.com/cours/sqlaz/select/

http://sqlpro.developpez.com/cours/sqlaz/dml/

Sur le site de r´ef´erence de SQLite se trouvent les instructions/commandes pour la d´efinition et la manipulation des donn´ees :https://www.sqlite.org/lang.html.

2.2 Le langage SQL DDL (Data Definition Language)

Le langage SQL DDL offre des commandes de d´efinition et de modification des struc- tures permettant de d´efinir (cr´eer), de supprimer et de modifier une table, une colonne ou une contrainte.

2.2.1 Cr´eation d’un sch´ema

Une base de donn´ees est d´efinie par son sch´ema. Pour cr´eer un sch´ema vide (sans tables), en SQLite il suffit de fournir un nom de fichier. EnAgroPythia, cela est possible par le menu Fichier Cr´eer une base de donn´ees.

(24)

Exemple 18. Pour cr´eer en SQLite la base de donn´eesclient commandeil faut cr´eer un nouveau fichierclient commande.sqlite. Cette op´eration produit une nouvelle BD, sans tables.

2.2.2 Cr´eation d’une table ( CREATE TABLE )

Pour cr´eer une table, le langage SQL propose l’instructionCREATE TABLE: CREATE TABLE nom_table

( nom_colonne type, nom_colonne type, ...

nom_colonne type )

Il faut sp´ecifier le nom de la nouvelle table,nom table, ainsi que la description de ses colonnes : pour chaque colonne il faut sp´ecifier son nom,nom colonne, et le type de ses valeurs. Des contraintes peuvent ˆetre ajout´ees sur les colonnes :

– pour d´efinir une colonne obligatoire, il faut ajouterNOT NULLapr`es sa d´efinition ; – pour d´efinir une cl´e primaire, il faut ajouterPRIMARY KEY;

– pour d´efinir une cl´e ´etrang`ere, il faut ajouter

FOREIGN KEY REFERENCEStable cible (colonne).

Cette op´eration produit une table vide (c’est-`a-dire sans lignes).

Les colonnes et leurs types

SQL offre divers types de donn´ees, dits de base, possibles pour une colonne d’une table. On citera les principaux :

smallint: entier sign´e court ; – integerouint: entier sign´e long ;

numeric(p,q): nombre d´ecimaux de pchiffres dontqapr`es le point d´ecimal ; si elle n’est pas mentionn´ee, la valeur deqest 0 ;

decimal(p,q): nombre d´ecimaux d’au moins p chiffres dontq apr`es le point d´ecimal ; si elle n’est pas mentionn´ee, la valeur deqest 0 ;

float(p)oufloat: nombre en virgule flottante ;

character(p)ouchar: chaˆıne de longueur fixe de pcaract`eres ;

character varyingouvarchar(p): chaˆıne de longueur variable de pca- ract`eres ;

date: date (ann´ee, mois et jour) ;

time: instant (heure, minute, seconde, milli`eme de seconde) ;

La norme SQL 3 (1999) a ajout´e 3 types fondamentaux : bool´een, CLOB et BLOB.

boolean: type de donn´ees valant vrai ou faux ;

– les Binary Large Objects (BLOB) : sorte de contenants g´en´eriques pouvant accueillir des chaˆınes de bits de longueur non-born´ee telles que des images, s´equences vid´eo, s´equences sonores ou musicales. Les Character Large Objects (CLOB) sont simi- laires, mais consid´er´es comme ´etant form´es de caract`eres ; ce type est utilis´e pour stocker des textes de taille importante.

(25)

Exemple 19. Pour cr´eer dans la base de donn´eesclient commandela tableclient, la commande SQLite est la suivante :

1 CREATE TABLE client (

2 NCLI char(8) NOT NULL PRIMARY KEY, 3 NOM char(18) NOT NULL,

4 ADRESSE char(24) NOT NULL, 5 LOCALITE char(20) NOT NULL, 6 CAT char(2) DEFAULT NULL, 7 COMPTE decimal(9,2) NOT NULL

8 )

Pour cr´eer la tabledetail, la commande SQLite est la suivante :

1 CREATE TABLE detail (

2 NCOM INTEGER NOT NULL, 3 NPRO char(10) NOT NULL, 4 QCOM int(11) NOT NULL, 5 PRIMARY KEY (NCOM,NPRO)

6 FOREIGN KEY (NCOM) REFERENCES commande (NCOM), 7 FOREIGN KEY (NPRO) REFERENCES produit (NPRO)

8 )

De plus, le mot cl´eAUTOINCREMENTnot´e apr`es la d´efinition d’une colonne de type entier s’av`ere particuli`erement utile pour les cl´es primaires et permet d’attribuer `a chaque nouvelle ligne (enregistrement) un num´ero unique qui s’incr´emente automatiquement. Il est particuli`erement utile lorsque la valeur de la cl´e n’a pas de sens particulier pour l’entit´e d´ecrite.

Le mot cl´e DEFAULT quant `a lui sera utilis´e pour pr´eciser une valeur pour d´efault pour une colonne.

Exemple 20. Pour cr´eer la tableparcelle, dans la base des donn´eesgie agricole la commande SQLite est la suivante :

1 CREATE TABLE parcelle (

2 Par_Idf INTEGER PRIMARY KEY AUTOINCREMENT, 3 Par_Nom char(30) NOT NULL,

4 Par_Lieu char(30) NOT NULL, 5 Par_Superficie INTEGER,

6 FOREIGN KEY (Par_Prop) REFERENCES agriculteur (Agr_Id)

7 )

2.2.3 Suppression d’une table (DROP)

Pour supprimer une table, le langage SQL propose l’instruction suivante : DROP TABLE nom_table

Attention :Toutes les donn´ees ainsi que la structure de la table seront perdues `a la suite de cette op´eration !

(26)

2.2.4 Modification du sch´ema

La modification du sch´ema d’une base de donn´ees implique le plus souvent des modi- fications de donn´ees. Par exemple, l’ajout d’une colonne `a une table contenant des lignes est suivi de la modification de cette colonne pour chacune des lignes (mises `a NULL ou `a la valeur par d´efaut). Pour pouvoir ˆetre appliqu´ees, ces op´erations de modification doivent respecter les contraintes d’int´egrit´e d´efinies dans la table. Nous donnons quelques exemples de r`egles :

• Ajout d’une colonne.Si la colonne est facultative, l’op´eration s’effectue sans con- trainte. Si elle est obligatoire, alors la table doit ˆetre vide ou la colonne doit ˆetre accompagn´ee d’une valeur par d´efaut.

• Suppression d’une colonne. Cette colonne ne peut pas intervenir dans la compo- sition d’une cl´e primaire ou d’une cl´e ´etrang`ere. Si n´ecessaire, ces cl´es doivent d’abord ˆetre modifi´ees ou supprim´ees.

• Ajout d’une cl´e primaire. Si la table n’est pas vide, les lignes doivent respecter la contrainte d’unicit´e.

• Suppression d’une cl´e primaire.Cette suppression n’est pas soumise `a des condi- tions sur les donn´ees. Cependant, cette cl´e primaire ne doit pas ˆetre r´ef´erenc´ee par une cl´e ´etrang`ere.

• Ajout d’une cl´e ´etrang`ere.Si la table n’est pas vide, les lignes doivent respecter la contrainte r´ef´erentielle.

Attention ! A cause de toutes ces r`egles, la modification du sch´ema d’une base de donn´ees n’est pas une op´eration fr´equente et doit ˆetre effectu´ee avec pr´ecautions.

2.3 Le langage SQL DML (Data Manipulation Language)

Le langage SQL DML (Data Manipulation Language) comporte deux grandes classes de fonctions : l’extraction de donn´ees et la modification de donn´ees.

2.3.1 Extraction de donn´ees

L’extraction1de donn´ees fait l’objet d’une seule commande : la requˆeteselect. Une requˆeteselectsimple contient trois parties principales :

1. la clause selectpr´ecise le nom des colonnes dont on veut r´ecup´erer les valeurs dans le r´esultat de la requˆete ;

2. la clause from indique la ou les tables sur lesquelles portent la requˆete. Toutes les colonnes de la clauseselectdoivent appartenir `a une des tables de la clause from;

3. la clause where sp´ecifie les conditions de s´election des valeurs du r´esultat de la requˆete. Cette partie de la requˆete est facultative ;

1. Une donn´ee extraite reste dans la base de donn´ees, on en extrait une copie ! La commandedelete est utilis´ee pour extraire (effacer) une donn´ee.

(27)

L’ex´ecution d’une requˆete select directement en SQLite sans insertion dans un programme, produit un r´esultat qui est une table volatile : ses lignes sont envoy´ees `a l’´ecran, mais cette table n’est pas cr´e´ee dans la base de donn´ees.

2.3.2 Extraction simple (SELECT-FROM)

La requˆete selectla plus simple, appel´eeprojection, n’a pas de clause whereet permet l’affichage de toutes les lignes d’une table, mais en ne montrant que certaines colonnes. Sa forme g´en´erale est :

SELECT liste_colonnes FROM nom_table

Exemple 21. Pour la base de donn´eesclient commande, la requˆete

1 SELECT NCLI, NOM, LOCALITE 2 FROM client

affiche pour toutes les lignes de la tableclientseulement les valeurs des trois colonnes NCLI,NOM, etLOCALITE.

Pour obtenir les valeurs de toutes les colonnes, la requˆete est :

1 SELECT * 2 FROM client

2.3.3 Extraction de lignes s´electionn´ees (SELECT-FROM-WHERE)

Une requˆete des´electioncontient dans la clausewheredes conditions qui permettent de ne s´electionner que certaines lignes d’une table. Sa forme g´en´erale est :

SELECT liste_colonnes FROM nom_table

WHERE condition

Exemple 22. Pour la base de donn´eesclient commande, la requˆete

1 SELECT NCLI, NOM 2 FROM client

3 WHERE LOCALITE = ’ T o u l o u s e ’

n’affiche que les lignes de la tableclientdont la valeur de la colonneLOCALITEest

´egale `a la chaˆıne de caract`eres ’Toulouse’. De plus, seules les valeurs des colonnesNCLI etNOMseront affich´ees.

Conditions de s´election

Dans la clausewhere, pour construire la condition de s´election on dispose : – des noms des colonnes de la tablenom table;

– des op´erateurs du§1.4 ; – des constantes :

(28)

• num´eriques et d´ecimales, comme par exemple :123, -0.003, 7.12;

• chaˆınes de caract`eres : valeurs entre ’ et ’ (exemple : ’Jean Mercier’) ; la pr´esence du caract`ere ’ dans la chaˆıne se repr´esente par son redoublement (exemple :’rue de l’’Et´e’) ;

• dates : valeurs entre’’comme pour les chaˆınes de caract`eres,’2009-02-14’

(standard SQL 2) ; autres variantes selon les SGBD :’14-02-2009’,’14/02/2009’.

Pour les expressions compos´ees, l’usage des parenth`eses permet de former des condi- tions plus ´elabor´ees, comme par exemple :

1 SELECT NCLI, NOM 2 FROM client

3 WHERE COMPTE >0 AND (CAT = ’ C1 ’ OR LOCALITE = ’ P a r i s ’)

Qui permet de s´electionner le num´ero et le nom des clients avec compte positif et qui sont soit de cat´egorie C1 soit habitent `a Paris.

Conditions de s´election plus complexes

Une condition peut porter sur la pr´esence de la valeurNULL:

1 CAT is null 2 CAT is not null

ou sur l’appartenance `a un ensemble :

1 CAT in (’ C1 ’, ’ C2 ’, ’ C3 ’)

2 LOCALITE not in (’ T o u l o u s e ’,’ Namur ’,’ B r e d a ’)

ou encore sur la pr´esence de certains caract`eres dans une chaˆıne de caract`eres ou une date :

1 CAT like ’ 1 ’

2 ADDRESSE like ’%Neuve%’

Dans les deux derni`eres conditions, le signe ’ ’ d´esigne un caract`ere quelconque et ’%’

d´esigne toute suite de caract`eres, ´eventuellement vide.

2.3.4 Le r´esultat d’une requˆete

Lignes dupliqu´ees dans le r´esultat (clause DISTINCT)

Pour ´eliminer les lignes en double dans le r´esultat d’une requˆete, on utilise la clause distinct

1 SELECT distinct LOCALITE 2 FROM client

Ordre des lignes d’un r´esultat (clauseORDER BY)

Il est possible d’imposer un ordre de pr´esentation sp´ecifique lors de l’affichage des lignes du r´esultat d’une requˆete en utilisant la clauseorder by:

(29)

SELECT liste_colonnes FROM nom_table

WHERE condition

ORDER BY liste_colonnes DESC

Par d´efault, le classement se fait par ordre ascendant des valeurs. On peut ´egalement sp´ecifier explicitement un ordre ascendant (ASC) ou descendant (DESC).

Exemple 23. Pour la base de donn´eesclient commande, la requˆete

1 SELECT * 2 FROM client

3 WHERE CAT is not null 4 ORDER BY LOCALITE

affiche les noms des localit´es par ordre alphab´etique croissant.

On peut indiquer plusieurs crit`eres de tri :

1 SELECT * 2 FROM client

3 ORDER BY LOCALITE, CAT

Les clients sont affich´es class´es par localit´e, puis dans chaque localit´e, class´es par cat´egorie.

L’ordre des composants du crit`ere de tri est important. La requˆete

1 SELECT * 2 FROM client

3 ORDER BY CAT, LOCALITE

affiche les clients class´es par cat´egorie, puis dans chaque cat´egorie, class´es par localit´e.

2.3.5 Extractions et op´erations sur les valeurs

La clause select permet aussi de sp´ecifier des donn´ees calcul´ees ou encore des constantes. Dans l’exemple :

Exemple 24.

1 SELECT ’TVA de ’, NPRO, ’ = ’, 0.196*PRIX*QSTOCK 2 FROM produit

3 WHERE QSTOCK > 500

le r´esultat de la requˆete sera un tableau des montants TVA des articles en stock dont la quantit´e restante est sup´erieure `a 500 unit´es. Dans le r´esultat (voir Figure 2.1), les co- lonnes rec¸oivent un nom qui est celui du composant de la clauseSELECT(dans l’exemple precedentTVA de).

On peut aussi d´efinir explicitement le nom qui apparait en tˆete de colonne grˆace `a la clauseAS:

Exemple 25.

1 SELECT NPRO AS produit, 0.196*PRIX*QSTOCK AS ” m o n t a n t TVA”

2 FROM produit

3 WHERE QSTOCK > 500

(30)

FIGURE2.1 – Le r´esultat de la requˆete de l’exemple 24.

le r´esultat de la requˆete sera toujours le mˆeme, mais les noms affich´es seront ceux sp´ecifi´es apr`es la clauseAS.

SQLite offre plusieurs fonctions permettant de d´eriver des valeurs `a partir des valeurs des colonnes des lignes extraites2.

Les fonctions agr´egatives (ou statistiques)

Il existe des fonctions pr´ed´efinies3 qui donnent une valeur “agr´eg´ee” calcul´ee pour les lignes s´electionn´ees par la requˆeteselect:

• count(*)compte le nombre de lignes trouv´ees ;

• count(nom colonne) compte le nombre de valeurs de la colonne nom co- lonne, equivalent au nombre de lignes dans la colonnenom colonne;

• avg(nom colonne)calcule la moyenne des valeurs de la colonne ;

• sum(nom colonne)calcule la somme des valeurs de la colonne ;

• min(nom colonne)calcule le minimum des valeurs de la colonne ;

• max(nom colonne)calcule le maximum des valeurs de la colonne.

Il est `a noter que ces fonctions, `a l’exception de la premi`ere (count), ne consid`erent que les valeurs nonNULLde la colonne. En outre, chaque valeur est prise en compte, mˆeme si elle apparaˆıt plusieurs fois.

Exemple 26. Pour la base de donn´eesclient commandela requˆete

1 SELECT count(*) 2 FROM client

compte le nombre de clients, la requˆete

1 SELECT count(NCLI) 2 FROM commande

compte le nombre de commandes, la requˆete

1 SELECT count(distinct NCLI) 2 FROM commande

compte le nombre de clients ayant pass´e au moins une commande (en utilisent la mot cl´e distincton s’assure de compter une seule fois chaque client), et la requˆete

1 SELECT sum(QSTOCK*PRIX) 2 FROM produit

3 WHERE LIBELLE like ’%SAPIN%’

2. voirhttps://www.sqlite.org/lang_corefunc.htmlpour une liste de celle-ci.

3. voirhttps://www.sqlite.org/lang_aggfunc.html.

(31)

calcule le montant total de produits de type sapin en stock.

2.3.6 Jointure : extraction de donn´ees de plusieurs tables

Pour extraire des donn´ees corr´el´ees, stock´ees dansdeuxtables, on utilise unejointure (join en anglais), d´efinie par unecondition de jointure, sp´ecifiant la r`egle selon laquelle les lignes des tables sont reli´ees :

SELECT liste_colonnes

FROM nom_table_E, nom_table_P WHERE col_FK_E = col_PK_P AND condition

Dans la clauseFROMon donne la liste des noms des tables `a relier.

Dans la clause WHERE on donne lacondition de jointure qui se pr´esente sous la forme d’une ´egalit´e entre les valeurs de deux colonnes :col FK E = col PK P, o`u

i) la colonnecol FK Eest la cl´e ´etrang`ere de la tablenom table E(table enfant), ii) la colonnecol PK Pest la cl´e primaire de la tablenom table P(table parent),

et

iii) la tablenom table Pest la table parent r´ef´erenc´ee dans la tablenom table E par la cl´e ´etrang`erecol FK E.

Dans la clauseWHERE, en plus de la condition de jointure (obligatoire !), on peut ajouter d’autres conditions de s´election des valeurs dans la partiecondition.

Exemple 27. Pour la base de donn´eesclient commande, la requˆete

1 SELECT NCOM, DATECOM, NOM, LOCALITE 2 FROM commande, client

3 WHERE commande.NCLI = client.NCLI

affiche pour chaque commande de la tablecommande, le nom et la ville du client qui a pass´e cette commande (voir la figure 2.2).

FIGURE2.2 – Le r´esultat de la requˆete de l’exemple 27.

Les valeurs des colonnes NCOM et DATECOM sont extraites de la table commande (table enfant) tandis que les valeurs des colonnesNOMetLOCALITEsont extraites de la

(32)

tableclient(table parent). La colonnecommande.NCLIest une cl´e ´etrang`ere4de la tablecommandeet fait r´ef´erence `a la cl´e primaireclient.NCLIde la tableclient.

Remarque 1 : Si les deux tables ont des colonnes qui ont le mˆeme nom, il faut le- ver l’ambigu¨ıt´e et pr´eciser `a quelle table appartient la colonne, en utilisant la syntaxe suivante :nom table.nom colonne

Remarque 2 :L’ordre des noms des tables dans la clauseFROMainsi que l’ordre des conditions dans la clauseWHEREn’a pas d’importance. La requˆete

1 SELECT NCOM, DATECOM, NOM, LOCALITE 2 FROM client, commande

3 WHERE client.NCLI = commande.NCLI

est la mˆeme que la requˆete de l’exemple 27 et que la requˆete suivante

1 SELECT NCOM, DATECOM, NOM, LOCALITE 2 FROM client, commande

3 WHERE commande.NCLI = client.NCLI

Le r´esultat d’une jointure entre deux tables est obtenu comme suit :

1. On construit une table (virtuelle) en couplant chaque ligne de la premi`ere table avec chaque ligne de la seconde, sans prendre en compte la clause where. Si on lance la requˆete de l’exemple 27 sur la base de donn´ees client commandecontenant les lignes donn´ees dans la figure 1.3, page 8, alors cette table virtuelle contient 9 colonnes (3 colonnes de la tablecommande, plus 6 colonnes de la tableclient), et 112 lignes (112 = 7 x 16 : 7 lignes de la tablecommande, multipli´e par 16 lignes de la tableclient).

2. On s´electionne, parmi les lignes ainsi obtenues, celles qui v´erifient la condition de jointure. Pour l’exemple 27 on garde 7 lignes sur les 112.

3. On ne retient alors que les colonnes demand´ees. Quatre colonnes seront affich´ees pour l’exemple 27.

Par extension, la jointure de trois tables r´eclamera deux conditions de jointure : SELECT liste_colonnes

FROM nom_table_E, nom_table_P, nom_table_3 WHERE col_FK_E = col_PK_P

AND col_FK_E2 = col_PK_P2 AND condition

La deuxi`eme condition de jointure,col FK E2 = col PK P2, sp´ecifie la r`egle pour relier la tablenom table 3`a la tablenom table Eou `a la tablenom table P.

Exemple 28. Pour la base de donn´eesclient commande, la requˆete

4. not´eeFK3 dans l’exemple 11, page 16

(33)

1 SELECT NOM, commande.NCOM, detail.NPRO, detail.QCOM 2 FROM client, commande, detail

3 WHERE client.NCLI = commande.NCLI 4 AND detail.NCOM = commande.NCOM

affiche pour chaque client et pour chaque commande qu’il a pass´e le num´ero de produit et la quantit´e command´ee.

Pour avoir aussi le libell´e du produit il faut faire une requˆete avec la jointure dequatre tables en imposanttroisconditions de jointure

1 SELECT client.NOM, commande.NCOM, commande.DATECOM, detail.NPRO, 2 detail.QCOM, produit.LIBELLE

3 FROM client, commande, detail, produit 4 WHERE client.NCLI = commande.NCLI 5 AND detail.NCOM = commande.NCOM 6 AND detail.NPRO = produit.NPRO

Attention ! Une requˆete sans condition de jointure porte le nom deproduit cart´esien: chaque ligne de la premi`ere table est coupl´ee avec chaque ligne de la deuxi`eme table.

Si dans la requˆete de l’exemple 27 on oublie d’imposer la condition de jointure, alors la requˆete

1 SELECT NCOM, DATECOM, NOM, LOCALITE 2 FROM commande, client

est le produit cart´esien des deux tables.

Si on lance cette requˆete sur la BD client commande contenant les lignes donn´ees dans la figure 1.3, page 8, alors les 7 lignes de la tablecommandeseront reli´ees `a chacune des 16 lignes de la table client et le r´esultat de cette requˆete contiendra 112 lignes (112=7×16), ce qui, en g´en´eral, ne correspond pas `a ce qui ´etait attendu.

Exemple 29. Pour la base de donn´eesclient commande, la requˆete

1 SELECT NCOM, DATECOM 2 FROM commande, client

3 WHERE command.NCLI = client.NCLI 4 and client.LOCALITE = ’ Namur ’

affiche les commandes des clients qui habitent `a Namur.

Exemple 30. Pour la base de donn´eesclient commande, la requˆete

1 SELECT NPRO

2 FROM detail, commande, client 3 WHERE detail.NCOM = commande.NCOM 4 and commande.NCLI = client.NCLI 5 and client.LOCALITE = ’ Namur ’

donne les r´ef´erences des produits des commandes des clients qui habitent `a Namur.

(34)

2.3.7 Les sous-requˆetes

Unesous-requˆeteest une instructionselect, cf.§2.3.3, qui intervient dans la clause whered’une autre instructionselect.

Exemple 31. Pour la base de donn´eesclient commande, la requˆete

1 SELECT NOM, COMPTE 2 FROM client

3 WHERE COMPTE in (SELECT max(COMPTE) 4 FROM client)

affiche le nom et le compte du client qui a le compte de plus grande valeur.

Si la sous-requˆete renvoie une seule ligne, il est permis d’utiliser les op´erateurs de comparaison classiques, par exemple :

1 SELECT * 2 FROM client

3 WHERE COMPTE > (SELECT COMPTE 4 FROM client

5 WHERE NCLI = ’ C400 ’)

Remarque 1 :La requˆete de l’exemple 29 peut s’´ecrire ´egalement sous la forme d’une sous-requˆete :

1 SELECT NCOM, DATECOM 2 FROM commande

3 WHERE NCLI in (SELECT NCLI

4 FROM client

5 WHERE LOCALITE = ’ Namur ’)

Exemple 32. La requˆete

1 SELECT NCOM, DATECOM 2 FROM commande

3 WHERE DATECOM in (SELECT MAX(DATECOM) 4 FROM commande)

affiche la date de la derni`ere commande.

Attention :Les structures deselectemboˆıt´es qui utilisent des conditions de non- association (not in) ne peuvent pas s’exprimer par une jointure !

Exemple 33. La requˆete

1 SELECT NCOM, DATECOM, NCLI 2 FROM commande

3 WHERE NCOM not in (SELECT NCOM 4 FROM detail

5 WHERE NPRO = ’ PA60 ’)

d´esigne les commandes qui ne portent pas sur le produitPA60. Cette requˆete n’est pas

´equivalente `a la requˆete

(35)

1 SELECT distinct commande.NCOM, DATECOM, NCLI 2 FROM commande, detail

3 WHERE commande.NCOM = detail.NCOM 4 AND NPRO <> ’ PA60 ’

qui d´esigne les commandes qui portentau moinssur un produit diff´erent dePA60(mais qui par ailleurs peuvent ´egalement porter sur le produitPA60).

2.3.8 Groupements (clause GROUP BY )

Pour extraire des donn´ees regroup´ees selon une certaine valeur de colonne, on utilise la clauseGROUP BY:

SELECT liste_colonnes FROM nom_table

WHERE condition

GROUP BY liste_colonnes

Exemple 34. Pour la base de donn´eesclient commande, la requˆete :

1 SELECT localite, count(*), avg(compte) 2 FROM client

3 GROUP BY localite

affiche pour chaque groupe de clients regroup´es par localit´e, le nom de cette derni`ere, le nombre de clients dans le groupe et la valeur moyenne des comptes des clients du groupe.

Le r´esultat compte autant de lignes qu’il y a de groupes ainsi constitu´es, et donc autant de lignes qu’il y a de localit´es distinctes dans la tableclient.

Selection de groupes et selection de lignes (clauseHAVING)

Des conditions de s´election peuvent ˆetre impos´ees aux groupes `a s´electionner. Elles seront exprim´ees dans une clauseHAVING, ce qui ´evite toute confusion avec la clause WHEREqui s’applique `a chacune des lignes.

Exemple 35. Dans la requˆete suivante, on ne retient que les groupes d’au moins trois clients :

1 SELECT localite, count(*), avg(compte) 2 FROM client

3 GROUP BY localite 4 having count(*) >= 3

Dans cette requˆete, la condition HAVING peut porter sur les ´el´ement cit´es dans la clauseSELECT, mais aussi sur toute autre fonction d’agr´egation calculable sur chaque groupe.

Exemple 36. La requˆete suivante traite les lignes de COMMANDE en les regroupant par client :

Références

Documents relatifs

En effet, poser la question de l’évaluation, de ses différentes typologies (largement explorées par la recherche savante) impose de facto à l’enseignant

[r]

[r]

Zig dispose d’une collection de poids en laiton de masses pas nécessairement distinctes qui peut être divisée en quatre lots ou bien en cinq lots ou bien en six lots et pour

- les périmètres des huit triangles sont identiques. Les triangles ainsi obtenus sont appelés magiques. Trouver trois tableaux 3 x 3 distincts de sorte que l’aire de l’un au moins

E₁ Puce reçoit une première liste de 2019 entiers compris entre 0 et n qu’il doit recopier sur une même colonne puis en face de chaque entier il doit écrire sur une deuxième

E₁ Puce reçoit une première liste de 2019 entiers compris entre 0 et n qu’il doit recopier sur une même colonne puis en face de chaque entier il doit écrire sur une deuxième

» correspond à la valeur de l’année en cours, 2017 et le bon vieux logiciel « Derive », exécuté sous une émulation de XP,