Download - CHEZ LE MÊME ÉDITEUR
CHEZ LE MEcircME EacuteDITEUR
Du mecircme auteur
C SOUTOU ndash De UML agrave SQLNdeg11098 2002 500 pages
C SOUTOU ndash SQL pour Oracle ndash 2e eacuteditionNdeg11697 2005 480 pages
Autour de SQL et MySQL
P J PRATT ndash Initiation agrave SQLNdeg9285 2001 328 pages
AG TAYLOR ndash SQL Web TrainingNdeg25413 2002 428 pages
R LENTZNER ndash 300 astuces pour SQL et MySQLNdeg25359 2001 254 pages
M KOFLER ndash MySQL 5 Guide de lʼadministrateur et du deacuteveloppeurNdeg11633 2005 672 pages
J-M AQUILINA ndash Aide-meacutemoire MySQLNdeg25451 2002 384 pages
J-M DEFRANCE ndash PHPMySQL avec Flash MX 2004Ndeg11468 2005 710 pages
P CHALEacuteAT D CHARNAY et J-R ROUET ndash Les Cahiers du programmeur PHPMySQL et JavaScriptNdeg11678 2005 212 pages
J-M DEFRANCE ndash PHPMySQL avec Dreamweaver 2004 (best of)Ndeg11709 2005 550 pages
EacuteDITIONS EYROLLES61 bd Saint-Germain75240 Paris Cedex 05
wwweditions-eyrollescom
Le code de la proprieacuteteacute intellectuelle du 1er juillet 1992 interdit en effet expresseacutement la photocopie agrave usage collectif sans autorisation des ayants droit Or cette pratique srsquoest geacuteneacuteraliseacutee notamment dans les eacutetablissements drsquoenseignement provoquant une baisse brutale des achats de livres au point que la possibiliteacute mecircme pour les auteurs de creacuteer des œuvres nouvelles et de les faire eacutediter correctement est aujourdrsquohui menaceacuteeEn application de la loi du 11 mars 1957 il est interdit de reproduire inteacutegralement ou partiellement le
preacutesent ouvrage sur quelque support que ce soit sans autorisation de lrsquoeacutediteur ou du Centre Franccedilais drsquoExploitation du Droit de Copie 20 rue des Grands-Augustins 75006 Pariscopy Groupe Eyrolles 2006 ISBN 2-212-11915-1
Pour Aureacutelia mon chat aux yeux si bleus si verts si gris
Pour Reneacute et Lydie Jean et Denise qui sont devenus mes parents
4055_00a_Dedi Page V Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir
4055_00a_Dedi Page VI Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
VII
Table des matiegraveres
Remerciements XVII
Avant-propos XIX
Guide de lecture
XXPremiegravere partie SQL de base XXDeuxiegraveme partie programmation proceacutedurale XXTroisiegraveme partie langages et outils XXAnnexe XX
Typographie
XXI
Contact avec lrsquoauteur ndash Corrigeacutes des exercices
XXII
Introduction 1
SQL une norme un succegraves
1
Modegravele de donneacutees
2Tables et donneacutees 2Les cleacutes 3
MySQL
3Un peu drsquohistoire 4Offre du moment 5Licences 6Et la concurrence 6Notion de scheacutema (database) 6Notion drsquohocircte 7Aspects eacutetudieacutes 8
Mise en œuvre de MySQL (sous Windows)
9Installation 9Deacutesinstallation 10Reconfiguration 10
Premiers pas
10Lrsquointerface de commande 10Creacuteation drsquoun utilisateur 11Connexion au serveur 12Veacuterification de la version 12Options de base 13Batch 14Votre prompt et vite 14Commandes de base 15
4055_00b_TDMfm Page VII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL Table des matiegraveres
VIII
copy Eacuteditions Eyrolles
Partie I SQL de base 17
1 Deacutefinition des donneacutees 19
Tables relationnelles
19Creacuteation drsquoune table (
CREATE TABLE
) 19Deacutelimiteurs 20Sensibiliteacute agrave la casse 20Commentaires 21Premier exemple 22Contraintes 23Conventions recommandeacutees 24Types des colonnes 26Structure drsquoune table (
DESCRIBE
) 29Restrictions 30
Index
30Arbres balanceacutes 31Creacuteation drsquoun index (
CREATE INDEX
) 32Bilan 33
Destruction drsquoun scheacutema
33Suppression drsquoune table (
DROP TABLE
) 33Ordre des suppressions 34
Exercices
35
2 Manipulation des donneacutees 37
Insertions drsquoenregistrements (
INSERT
)
37Syntaxe 37Renseigner toutes les colonnes 38Renseigner certaines colonnes 38Plusieurs enregistrements 39Ne pas respecter des contraintes 39Donneacutees binaires 40Eacutenumeacuterations 40Dates et heures 41
Seacutequences
44Utilisation en tant que cleacute primaire 44Modification drsquoune seacutequence 45Utilisation en tant que cleacute eacutetrangegravere 46
Modifications de colonnes
47Syntaxe (
UPDATE
) 47Modification drsquoune colonne 48Modification de plusieurs colonnes 48Modification de plusieurs enregistrements 48Ne pas respecter les contraintes 48
4055_00b_TDMfm Page VIII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
IX
Table des matiegraveres Apprendre SQL avec MySQL
Restrictions 50Dates et intervalles 50
Remplacement drsquoun enregistrement
54
Suppressions drsquoenregistrements
54Instruction
DELETE
54Instruction
TRUNCATE
55
Inteacutegriteacute reacutefeacuterentielle
56Syntaxe 56Coheacuterences assureacutees 56Contraintes cocircteacute laquo pegravere raquo 57Contraintes cocircteacute laquo fils raquo 58Cleacutes composites et nulles 58Coheacuterence du fils vers le pegravere 59Coheacuterence du pegravere vers le fils 60En reacutesumeacute 62
Insertions agrave partir drsquoun fichier
62
Exercices
64
3 Eacutevolution drsquoun scheacutema 67
Renommer une table (
RENAME
)
67
Modifications structurelles (
ALTER TABLE
)
68Ajout de colonnes 68Renommer des colonnes 69Modifier le type des colonnes 69Valeurs par deacutefaut 70Supprimer des colonnes 70
Modifications comportementales
71Ajout de contraintes 71Suppression de contraintes 73Deacutesactivation des contraintes 75Reacuteactivation des contraintes 77Contraintes diffeacutereacutees 79
Exercices
80
4 Interrogation des donneacutees 83
Geacuteneacuteraliteacutes
83Syntaxe (
SELECT
) 84Pseudotable 84
Projection (eacuteleacutements du
SELECT
)
85Extraction de toutes les colonnes 86Extraction de certaines colonnes 86Alias 87Duplicatas 87
4055_00b_TDMfm Page IX Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL Table des matiegraveres
X
copy Eacuteditions Eyrolles
Expressions et valeurs nulles 88Ordonnancement 89Concateacutenation 89Insertion multiligne 90Limitation du nombre de lignes 90
Restriction (
WHERE
)
91Opeacuterateurs de comparaison 92Opeacuterateurs logiques 93Opeacuterateurs inteacutegreacutes 93Alias 95
Fonctions
95Caractegraveres 95Numeacuteriques 99Fonction pour les bits 100Dates 101Conversions 105Comparaisons 106Eacutenumeacuterations 107Autres fonctions 108
Regroupements
109Fonctions de groupe 110Eacutetude du
GROUP BY
et
HAVING
111
Opeacuterateurs ensemblistes
114Restrictions 114Exemple 115Intersection 115Opeacuterateurs
UNION
et
UNION ALL
116Diffeacuterence 117Ordonner les reacutesultats 118Produit carteacutesien 119Bilan 120
Jointures
121Classification 121Jointure relationnelle 122Jointures SQL2 122Types de jointures 123Eacutequijointure 123Autojointure 125Ineacutequijointure 127Jointures externes 128Jointures proceacutedurales 132Jointures mixtes 136Sous-interrogations synchroniseacutees 137Autres directives SQL2 140
4055_00b_TDMfm Page X Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
XI
Table des matiegraveres Apprendre SQL avec MySQL
Division
142Deacutefinition 143Classification 143Division inexacte 144Division exacte 144
Reacutesulats en HTML ou XML
145
Eacutecriture dans un fichier
146
Exercices
147
5 Controcircle des donneacutees 151
Gestion des utilisateurs
152Classification 152Creacuteation drsquoun utilisateur (
CREATE USER
) 152Modification drsquoun utilisateur 154Renommer un utilisateur (
RENAME USER
) 154Suppression drsquoun utilisateur (
DROP USER
) 155
Gestion des bases de donneacutees
155Creacuteation drsquoune base (
CREATE DATABASE
) 156Seacutelection drsquoune base de donneacutees (
USE
) 157Modification drsquoune base (
ALTER DATABASE
) 158Suppression drsquoune base (
DROP DATABASE
) 158
Privilegraveges
158Niveaux de privilegraveges 159Tables de la base
mysql
159Table
mysqluser
160Attribution de privilegraveges (
GRANT
) 163Table
mysqldb
167Table
mysqlhost
167Table
mysqltables_priv
168Table
mysqlcolumns_priv
168Table
mysqlprocs_priv
168Reacutevocation de privilegraveges (
REVOKE
) 170Attributions et reacutevocations laquo sauvages raquo 172
Accegraves distants
172Connexion par lrsquointerface de commande 173Table
mysqlhost
173
Vues
175Creacuteation drsquoune vue (
CREATE VIEW
) 176Classification 177Vues monotables 177Vues complexes 181Autres utilisations de vues 185Transmission de droits 188Modification drsquoune vue (
ALTER VIEW
) 188
4055_00b_TDMfm Page XI Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL Table des matiegraveres
XII
copy Eacuteditions Eyrolles
Visualisation drsquoune vue (
SHOW CREATE VIEW
) 189Suppression drsquoune vue (
DROP VIEW
) 189
Dictionnaire des donneacutees
190Constitution 190Modegravele graphique du dictionnaire des donneacutees 191Deacutemarche agrave suivre 191Classification des vues 193Bases de donneacutees du serveur 194Composition drsquoune base 195Deacutetail de stockage drsquoune base 195Structure drsquoune table 196Recherche des contraintes drsquoune table 198Composition des contraintes drsquoune table 199Recherche du code source drsquoun sous-programme 200Privilegraveges des utilisateurs drsquoune base de donneacutees 201Commande
SHOW
203
Exercices
205
Partie II Programmation proceacutedurale 207
6 Bases du langage de programmation 209Geacuteneacuteraliteacutes 209
Environnement client-serveur 209Avantages 210Structure drsquoun bloc 210Porteacutee des objets 211Casse et lisibiliteacute 211Identificateurs 212Commentaires 212
Variables 212Variables scalaires 213Affectations 213Restrictions 213Reacutesolution de noms 214Opeacuterateurs 214Variables de session 215Conventions recommandeacutees 215
Test des exemples 216Structures de controcircle 217
Structures conditionnelles 217Structures reacutepeacutetitives 219
Interactions avec la base 222Extraire des donneacutees 223Manipuler des donneacutees 224
4055_00b_TDMfm Page XII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles XIII
Table des matiegraveres Apprendre SQL avec MySQL
Transactions 227Caracteacuteristiques 227Deacutebut et fin drsquoune transaction 228Mode de validation 228Votre premiegravere transaction 228Controcircle des transactions 229Transactions imbriqueacutees 230
Exercices 231
7 Programmation avanceacutee 233
Sous-programmes 233Geacuteneacuteraliteacutes 233Proceacutedures catalogueacutees 234Fonctions catalogueacutees 235Structure drsquoun sous-programme 236Exemples 236Fonction nrsquointeragissant pas avec la base 238Compilation 239Appel drsquoun sous-programme 239Reacutecursiviteacute 241Sous-programmes imbriqueacutes 242Modification drsquoun sous-programme 243Destruction drsquoun sous-programme 243Restrictions 244
Curseurs 244Geacuteneacuteraliteacutes 244Instructions 245Parcours drsquoun curseur 246Accegraves concurrents (FOR UPDATE) 247Restrictions 248
Exceptions 248Geacuteneacuteraliteacutes 248Restrictions 250Exceptions avec EXIT 250Exceptions avec CONTINUE 254Gestion des autres erreurs (SQLEXCEPTION) 255Mecircme erreur sur diffeacuterentes instructions 257Exceptions nommeacutees 260
Deacuteclencheurs 262Geacuteneacuteraliteacutes 262Agrave quoi sert un deacuteclencheur 262Meacutecanisme geacuteneacuteral 263Syntaxe 263Deacuteclencheurs LMD (de lignes) 264
4055_00b_TDMfm Page XIII Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL Table des matiegraveres
XIV copy Eacuteditions Eyrolles
Appel de sous-programmes 271Dictionnaire des donneacutees 272Programmation drsquoune contrainte de veacuterification 273Invalidation dans le deacuteclencheur 275Tables mutantes 277Restrictions 278Suppression drsquoun deacuteclencheur 278
SQL dynamique 278Syntaxe 279Exemples 280Restrictions 281
Exercices 284
Partie III Langages et outils 287
8 Utilisation avec Java 289
JDBC avec ConnectorJ 289Classification des pilotes (drivers) 290Le paquetage javasql 291Structure drsquoun programme 291Test de votre configuration 292
Connexion agrave une base 293Base Access 294Base MySQL 295Interface Connection 295
Eacutetats drsquoune connexion 296Interfaces disponibles 296Meacutethodes geacuteneacuteriques pour les paramegravetres 296Eacutetats simples (interface Statement) 297Meacutethodes agrave utiliser 298
Correspondances de types 298Manipulations avec la base 300
Suppression de donneacutees 300Ajout drsquoenregistrements 301Modification drsquoenregistrements 301
Extraction de donneacutees 301Curseurs statiques 302Curseurs navigables 303
Curseurs modifiables 307Suppressions 309Modifications 310Insertions 310
4055_00b_TDMfm Page XIV Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles XV
Table des matiegraveres Apprendre SQL avec MySQL
Gestion des seacutequences 311Meacutethode getGeneratedKeys 312Curseur modifiable 312
Interface ResultSetMetaData 313Interface DatabaseMetaData 314Instructions parameacutetreacutees (PreparedStatement) 316
Extraction de donneacutees (executeQuery) 316Mises agrave jour (executeUpdate) 317Instruction LDD (execute) 317
Proceacutedures catalogueacutees 318Exemple 319
Transactions 320Points de validation 321
Traitement des exceptions 322Affichage des erreurs 323Traitement des erreurs 323
Exercices 325
9 Utilisation avec PHP 327Configuration adopteacutee 327
Logiciels 327Fichiers de configuration 327Test drsquoApache et de PHP 328Test drsquoApache de PHP et de MySQL 329
API de PHP pour MySQL 329Connexion 330Interactions avec la base 330Extractions 332Instructions parameacutetreacutees 335Gestion des seacutequences 337Traitement des erreurs 337Proceacutedures catalogueacutees 339Meacutetadonneacutees 340
Exercices 344
10 Outils graphiques 349MySQL Administrator 349
Connexion 349Connexion nommeacutee 350Liste des accegraves utilisateur 351Gestion des privilegraveges 351Caracteacuteristiques systegraveme 352Options scripts SQL 353Composition drsquoune base 354
4055_00b_TDMfm Page XV Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL Table des matiegraveres
XVI copy Eacuteditions Eyrolles
Composition drsquoune table 355Composition des index 356Modification drsquoun scheacutema 356Restriction 358
MySQL Query Browser 359Fenecirctre principale 359Extraction 360Modification 361
phpMyAdmin 362Composition de la base 363Structure drsquoune table 364Administrer une table 364Extractions 365Rechercher 366Exporter 367Utilisateurs 368
TOAD for MySQL 368Administration 369Instructions en ligne 370Deacuteveloppement 371Creacuteation drsquoobjets 371Recherche drsquoobjets 373Exportations 374
Navicat 374Creacuteation drsquoune table 375Deacutefinition drsquoune contrainte 376Creacuteation drsquoune requecircte 377Importation 378Gestion des utilisateurs 378
MySQL Manager 379Creacuteation drsquoune table 380Creacuteation drsquoune requecircte 382Proceacutedures catalogueacutees 382Gestion des utilisateurs 383Gestion des privilegraveges 383
Bilan 384
Annexe bibliographie et webographie 385
Index 387
4055_00b_TDMfm Page XVI Jeudi 2 mars 2006 212 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
XVII
Remerciements
Je nrsquoai que deux personnes agrave remercier Il srsquoagit de deux jeunes informaticiens rencontreacutes auhasard drsquoun forum Ils sont talentueux et deacutesinteacuteresseacutes ce qui devient tellement rare dans cemonde drsquoindividualisme exacerbeacute Le premier recherchait un emploi agrave la peacuteriode de la reacutedac-tion souhaitons qursquoil trouve clavier agrave ses mains Le second dirige la rubrique MySQL du siteDeveloppezcom
Merci Pierre Caboche pour la lecture de la premiegravere moitieacute de lrsquoouvrage pour tes remarquesque jrsquoai (presque) toutes prises en compte pour les compleacutements en ligne agrave propos des opeacutera-teurs ensemblistes dans les requecirctes
Merci Guillaume Lebur pour tous tes commentaires de qualiteacute et pour tes corrections agravepropos de la programmation sous MySQL Merci pour ton activiteacute et tes tutoriels mis en lignesur le site de Developpezcom
4055_00c_Lim Page XVII Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir
4055_00c_Lim Page XVIII Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
XIX
Avant-propos
Nombre drsquoouvrages traitent de SQL et de MySQL certains reacutesultent drsquoune traduction hasar-deuse et sans vocation peacutedagogique drsquoautres ressemblent agrave des Bottin teacuteleacutephoniques ouproviennent de la traduction de la documentation officielle en moins bien Les survivants nesont peut-ecirctre plus vraiment agrave jour
Ce livre a eacuteteacute reacutedigeacute avec une volonteacute de concision et de progression dans sa deacutemarche il estillustreacute par ailleurs de nombreux exemples et figures Bien que la source principale drsquoinforma-tions fucirct la documentation officielle de MySQL (httpdevmysqlcomdoc) lrsquoouvrage neconstitue pas un condenseacute de commandes SQL Chaque notion importante est introduite parun exemple simple et que jrsquoespegravere deacutemonstratif En fin de chaque chapitre des exercices vouspermettront de tester vos connaissances
La documentation en ligne de MySQL (
MySQL 5 Reference Manual
) repreacutesente une dizainede meacutegaoctets au format HTML Tous les concepts srsquoy trouvant ne pourraient pas ecirctre icideacutecemment expliqueacutes sauf peut-ecirctre si cet ouvrage ressemblait agrave un annuaire Jrsquoai tenteacute drsquoenextraire seulement les aspects fondamentaux sous la forme drsquoune synthegravese
Vous nrsquoy trouverez donc pas des consideacuterations agrave propos drsquoaspects avanceacutes du langage ou duserveur comme lrsquooptimisation de requecirctes la restauration drsquoune base la reacuteplication la versiondu serveur agrave partir de laquelle telle ou telle fonction est apparue etc
Ce livre reacutesulte de mon expeacuterience de lrsquoenseignement dans le domaine des bases de donneacuteesen premier deuxiegraveme et troisiegraveme cycles universitaires dans des cursus drsquoinformatique agravevocation professionnelle (IUT licences et masters professionnels)
Cet ouvrage srsquoadresse principalement aux novices deacutesireux de deacutecouvrir SQL en program-mant sous MySQL
Les eacutetudiants et enseignants trouveront des exemples peacutedagogiques pour chaque conceptabordeacute ainsi que des exercices theacutematiques
Les deacuteveloppeurs PHP ou Java deacutecouvriront des moyens de stocker leurs donneacutees
4055_00c_Lim Page XIX Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL
XX
copy Eacuteditions Eyrolles
Guide de lecture
Ce livre srsquoorganise autour de trois parties distinctes mais compleacutementaires La premiegravere inteacute-ressera le lecteur deacutebutant en la matiegravere car elle concerne les instructions SQL et les notionsde base de MySQL La deuxiegraveme partie deacutecrit la programmation avec le langage proceacuteduralde MySQL La troisiegraveme partie attirera lrsquoattention des programmeurs qui envisagent drsquoutiliserMySQL agrave lrsquoaide drsquooutils natifs ou tout en programmant avec des langages eacutevolueacutes ou via desinterfaces Web (PHP ou Java)
Premiegravere partie SQL de base
Cette partie preacutesente les diffeacuterents aspects du langage SQL de MySQL en eacutetudiant en deacutetailles instructions de base Agrave partir drsquoexemples jrsquoexplique notamment comment deacuteclarer mani-puler faire eacutevoluer et interroger des tables avec leurs diffeacuterentes caracteacuteristiques et leurseacuteleacutements associeacutes (contraintes index vues seacutequences) Nous eacutetudions aussi SQL dans uncontexte multi-utilisateur (droits drsquoaccegraves) et au niveau du dictionnaire de donneacutees
Deuxiegraveme partie programmation proceacutedurale
Cette partie deacutecrit les caracteacuteristiques du langage proceacutedural de MySQL Le chapitre 6 traitedes eacuteleacutements de base (structure drsquoun programme variables structures de controcircle interactionsavec la base et transactions) Le chapitre 7 traite des sous-programmes des curseurs de lagestion des exceptions des deacuteclencheurs et de lrsquoutilisation du SQL dynamique
Troisiegraveme partie langages et outils
Cette partie inteacuteressera les programmeurs qui envisagent drsquoexploiter une base MySQL enutilisant un langage de programmation Le chapitre 8 deacutetaille lrsquoAPI JDBC 30 qui permet demanipuler une base MySQL 5 par lrsquointermeacutediaire drsquoun programme Java Le chapitre 9 deacutecritles principales fonctions de lrsquoAPI
mysqli
qui permet drsquointerfacer un programme PHP 5 avecune base MySQL 5
Le chapitre 10 syntheacutetise les fonctionnaliteacutes de plusieurs outils graphiques tels que
MySQLAdministrator
MySQL Query Browser
et
phpMyAdmin
Drsquoautres consoles graphiquesdrsquoadministration sont eacutetudieacutees agrave savoir
Toad
for MySQL
Navicat
et
EMS SQL Manager
Annexe
Lrsquoannexe contient une bibliographie et des adresses Web
4055_00c_Lim Page XX Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
XXI
Avant-propos
Typographie
La police
courrier
est utiliseacutee pour souligner les instructions SQL noms de types tablescontraintes etc (ex
SELECT nom FROM Pilote
)
Les majuscules sont employeacutees pour les directives SQL et les minuscules pour les autreseacuteleacutements Les noms des tables index vues fonctions proceacutedureshellip sont preacuteceacutedeacutes drsquounemajuscule (exemple la table
CompagnieAerienne
contient la colonne
nomComp
)
Les termes de MySQL (bien souvent traduits litteacuteralement de lrsquoanglais) sont noteacutes en italiqueexemple
trigger
table
column
etc
Dans une instruction SQL les symboles deacutesignent une liste drsquoeacuteleacutements et le symbole laquo | raquoun choix (exemple
CREATE
TABLE
|
VIEW
Les symboles laquo [ raquo et laquo ] raquo preacutecisent le carac-tegravere optionnel drsquoune directive au sein drsquoune commande (exemple
CREATE[UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ONtable_name (index_col_namehellip)
)
Ce sigle introduit une deacutefinition un concept ou une remarque importante Il apparaicirct soit dansune partie theacuteorique soit dans une partie technique pour souligner des instructions importantes
ou la marche agrave suivre avec SQL
Ce sigle annonce soit une impossibiliteacute de mise en œuvre drsquoun concept soit une mise en gardeIl est principalement utiliseacute dans la partie consacreacutee agrave SQL
Jrsquoen profite pour faire passer le message suivant si vous travaillez en version 4 de MySQLcertaines instructions deacutecrites dans ce livre ne fonctionneront pas Cet ouvrage nrsquoest pas unguide de reacutefeacuterence Vous trouverez sur le Web des ressources pour connaicirctre la compatibiliteacute
de telle ou telle fonction SQL
Ce sigle indique que le code source est teacuteleacutechargeable agrave partir du site des eacuteditions Eyrolles(wwweyrollescom) Cela est valable pour les exercices corrigeacutes mais aussi pour tous les
exemples du livre
Ce sigle signale une astuce ou un conseil personnel
Web
4055_00c_Lim Page XXI Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL
XXII
copy Eacuteditions Eyrolles
Contact avec lrsquoauteur ndash Corrigeacutes des exercices
Si vous avez des remarques agrave formuler sur le contenu de cet ouvrage nrsquoheacutesitez pas agrave mrsquoeacutecrireagrave lrsquoadresse
soutouiut-blagnacfr
Ne me demandez pas de deacuteboguer votre proceacutedurecatalogueacutee ou drsquooptimiser une de vos requecircteshellip Seules les remarques relatives agrave lrsquoouvragetrouveront une reacuteponse
Par ailleurs un site drsquoaccompagnement de lrsquoouvrage (
errata
corrigeacutes des exercices sourcedes exemples et compleacutements) est en ligne et accessible via wwweditions-eyrollescom
4055_00c_Lim Page XXII Jeudi 2 mars 2006 213 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
1
Introduction
Dans cette introduction nous preacutesentons tout drsquoabord le cadre geacuteneacuteral dans lequel cetouvrage se positionne (SQL le modegravele de donneacutees et lrsquooffre MySQL) Nous deacutecrivons pourfinir la proceacutedure drsquoinstallation de MySQL sous Windows et lrsquoutilisation de lrsquointerface decommande en ligne pour que vous puissiez programmer en SQL degraves le chapitre 1
SQL une norme un succegraves
Crsquoest IBM
agrave tout seigneur tout honneur
qui avec System-R a implanteacute le modegravele relationnelau travers du langage SEQUEL (
Stuctured English as QUEry Language
) rebaptiseacute par lasuite SQL (
Structured Query Language
)
La premiegravere norme (SQL1) date de 1987 Elle eacutetait le reacutesultat de compromis entre construc-teurs mais elle eacutetait fortement influenceacutee par le dialecte drsquoIBM SQL2 a eacuteteacute normaliseacutee en1992 Elle deacutefinit quatre niveaux de conformiteacute le niveau drsquoentreacutee (
entry level
) les niveauxintermeacutediaires (
transitional
et
intermediate levels
) et le niveau supeacuterieur (
full level
) Leslangages SQL des principaux eacutediteurs sont tous conformes au premier niveau et ont beaucoupde caracteacuteristiques relevant des niveaux supeacuterieurs Depuis 1999 la norme est appeleacutee SQL3Elle comporte de nombreuses parties (concepts objets entrepocircts de donneacutees seacuteries temporel-les accegraves agrave des sources non SQL reacuteplication des donneacutees etc)
Le succegraves que connaissent les eacutediteurs de SGBD relationnels a plusieurs origines et reposenotamment sur SQL
Le langage est une norme depuis 1986 qui srsquoenrichit au fil du temps
SQL peut srsquointerfacer avec des langages de troisiegraveme geacuteneacuteration comme C ou Cobol maisaussi avec des langages plus eacutevolueacutes comme C++ Java ou C Certains considegraverent ainsique le langage SQL nrsquoest pas assez complet (le dialogue entre la base et lrsquointerface nrsquoestpas direct) et la litteacuterature parle de laquo deacutefaut drsquoimpeacutedance raquo (
impedance mismatch
)
Les SGBD rendent indeacutependants programmes et donneacutees (la modification drsquoune structure dedonneacutees nrsquoentraicircne pas forceacutement une importante refonte des programmes drsquoapplication)
Ces systegravemes sont bien adapteacutes aux grandes applications informatiques de gestion (archi-tectures type client-serveur et Internet) et ont acquis une maturiteacute sur le plan de la fiabiliteacuteet des performances
Ils integravegrent des outils de deacuteveloppement comme les preacutecompilateurs les geacuteneacuterateurs decode drsquoeacutetats de formulaires
4055_00d_Intro Page 1 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL
2
copy Eacuteditions Eyrolles
Ils offrent la possibiliteacute de stocker des informations non structureacutees (comme le textelrsquoimage etc) dans des champs appeleacutes LOB (
Large Object Binary
)
Nous eacutetudierons les principales instructions SQL de MySQL qui sont classifieacutees dans letableau suivant
Modegravele de donneacutees
Le modegravele de donneacutees relationnelles repose sur une theacuteorie rigoureuse bien qursquoadoptant desprincipes simples La table relationnelle (
relational table
) est la structure de donneacutees de basequi contient des enregistrements appeleacutes aussi laquo lignes raquo (
rows
) Une table est composeacutee decolonnes (
columns
) qui deacutecrivent les enregistrements
Tables et donneacutees
Consideacuterons la figure suivante qui preacutesente deux tables relationnelles permettant de stockerdes compagnies des pilotes et le fait qursquoun pilote soit embaucheacute par une compagnie
Tableau 0-1 Classification des ordres SQL
Ordres SQL Aspect du langage
CREATE ndash ALTER ndash DROP - RENAME ndash TRUNCATE
Deacutefinition des donneacutees (LDD)
INSERT ndash UPDATE ndash DELETE - LOCK TABLE
Manipulation des donneacutees (LMD)
SELECT
Interrogation des donneacutees (LID)
GRANT ndash REVOKE ndash COMMIT ndash ROLLBACK ndash SAVEPOINT - SET TRANSACTION
Controcircle des donneacutees (LCD)
Figure 0-1
Deux tables
Compagnie
comp nrue rue ville nomComp
AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL
Pilote
brevet nom nbHVol compa
PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING
4055_00d_Intro Page 2 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
3
Introduction
Les cleacutes
La cleacute primaire (
primary key
) drsquoune table est lrsquoensemble minimal de colonnes qui permet
drsquoidentifier de maniegravere unique chaque enregistrement
Dans la figure preacuteceacutedente les colonnes laquo cleacutes primaires raquo sont noteacutees en gras La colonne
comp
repreacutesente le code de la compagnie et la colonne
brevet
deacutecrit le numeacutero du brevet
Une cleacute est dite laquo candidate raquo (
candidate key
) si elle peut se substituer agrave la cleacute primaire agrave tout
instant Une table peut contenir plusieurs cleacutes candidates ou aucune
Dans notre exemple les colonnes
nomComp
et
nom
peuvent ecirctre des cleacutes candidates si onsuppose qursquoaucun homonyme nrsquoest permis
Une cleacute eacutetrangegravere (
foreign key
) reacutefeacuterence dans la majoriteacute des cas une cleacute primaire drsquoune autretable (sinon une cleacute candidate sur laquelle un index unique aura eacuteteacute deacutefini) Une cleacute eacutetrangegravereest composeacutee drsquoune ou de plusieurs colonnes Une table peut contenir plusieurs cleacutes eacutetrangegrave-
res ou aucune
Dans notre exemple la colonne
compa
(noteacutee en italique dans la figure) est une cleacute eacutetrangegraverecar elle permet de reacutefeacuterencer un enregistrement unique de la table
Compagnie
via la cleacuteprimaire
comp
Le modegravele relationnel est ainsi fondamentalement baseacute sur les valeurs Les associations entretables sont toujours binaires et assureacutees par les cleacutes eacutetrangegraveres Les theacuteoriciens considegraverentcelles-ci comme des pointeurs logiques Les cleacutes primaires et eacutetrangegraveres seront deacutefinies dansles tables en SQL agrave lrsquoaide de contraintes
MySQL
MySQL est agrave la fois le nom du SGBD et le nom de la socieacuteteacute (qui se nomme en faitMySQL AB deacutecrite sur httpwwwmysqlcom) dont le siegravege se trouve en Suegravede agrave Uppsala ndashcompter une cinquantaine de kilomegravetres au nord de Stockholm Selon leurs dires leur serveurde donneacutees qui est eacutecrit en C et C++ serait installeacute de faccedilon opeacuterationnelle sur plus de sixmillions de sites Drsquoun point de vue coucirct lrsquoutilisation du SGBD sur des projets importants(entre 250 000
euro
et 500 000
euro
) ferait eacuteconomiser 90 sur le prix des licences du serveur60 sur les ressources systegraveme 70 sur le prix du mateacuteriel 50 sur les tacircches drsquoadminis-tration et de support
4055_00d_Intro Page 3 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL
4
copy Eacuteditions Eyrolles
Par analogie avec les systegravemes drsquoexploitation depuis 1999 MySQL connaicirct le succegraves deLinux Teacuteleacutechargeacutee pregraves drsquoun million de fois en trois semaines (en octobre 2005) la version
production
de MySQL doit sa populariteacute du fait de son caractegravere
open source
de ses fonction-naliteacutes de plus en plus riches de ses performances de son ouverture agrave tous les principauxlangages du marcheacute de son fonctionnement sur les systegravemes les plus courants (les distribu-tions classiques de Linux Windows Mac OS BSD Novell et les deacuteriveacutes drsquoUnix) et de safaciliteacute drsquoutilisation pour des applications Web de taille moyenne
Un peu drsquohistoire
Le tableau suivant reacutesume lrsquohistorique des fonctionnaliteacutes importantes du serveur de donneacuteesMySQL Une version majeure comme 323 se deacutecline au fil des mois en diffeacuterentes sous-versions en fonction des diverses phases de deacuteveloppement
alpha
correspond agrave la phase active de nouvelles fonctionnaliteacutes sont ajouteacutees
becircta
correspond agrave lrsquoimpleacutementation des nouvelles fonctionnaliteacutes de la phase
alpha
sansapport important de code
gamma
correspond au terme
release candidate
(apregraves reacutesolution des bugs de la version
becircta
)
production
est lrsquoeacutetape suivante aussi appeleacutee GA (
Generally Available
) Les bugs sontreacutesolus srsquoils ne modifient pas le comportement geacuteneacuteral du serveur
old
correspond agrave la preacuteceacutedente version de production (par rapport agrave la courante)
Ainsi en septembre 2005 la version 4114 eacutetait mise en production et en octobre 2005 laversion 50 lrsquoeacutetait aussi
Ce qui est planifieacute agrave moyen terme concerne un enrichissement geacuteneacuteral des commandes SQLla prise en compte des types manquants de SQL2 et de ODBC3 la programmation des requecirc-tes hieacuterarchiques (interrogation de structures en arbres) en srsquoinspirant de ce qursquoa fait Oracle enla matiegravere (directive
CONNECT BY
dans un
SELECT
)
Tableau 0-2 Dates importantes pour MySQL
Anneacutee ndash versions Caracteacuteristiques principales
1999 ndash 323
x
Reacuteplication ndash Recherches textuelles ndash Transactions et Inteacutegriteacute reacutefeacuterentielle tables InnoDB (2002 ndash 32344)
2001 ndash 40
x
Cache de requecirctes ndash Seacutecurisation SSL ndash Sauvegarde agrave chaud
2003 ndash 41
x
Support de Unicode ndash Donneacutees geacuteographiques ndash SQL dynamique
2004 ndash 50
x
Vues ndash Curseurs ndash Proceacutedures catalogueacutees ndash Deacuteclencheurs ndash Dictionnaire des donneacutees ndash Transactions distribueacutees (XA)
Agrave venir ndash 51
x
Jointure externe ndash Contraintes
CHECK
ndash Sauvegarde agrave chaud et Inteacutegriteacute reacutefeacuterentielle tables MyISAM
4055_00d_Intro Page 4 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
5
Introduction
Ce qui nrsquoest pas encore planifieacute reste la prise en charge du stockage de donneacutees au formatXML et les extensions objets de SQL3 (principalement les types abstraits les heacuteritage et lesmeacutethodes)
Les changements opeacutereacutes sont preacutesenteacutes en deacutetail et par version agrave lrsquoadresse httpdevmysqlcomdocrefman
xy
ennewshtml (
xy
eacutetant le numeacutero de version majeure parexemple actuellement 51)
Offre du moment
La figure suivante (merci au passage agrave httpwwwiconarchivecom) preacutesente la majeurepartie des fonctionnaliteacutes de MySQL qui se positionnent au sein du serveur de donneacutees(SGBD)
Les API permettent drsquointeacutegrer SQL dans des programmes de diffeacuterents langages Le langageSQL sera utiliseacute par tous ceux (manuellement ou par un outil) travaillant sur la base dedonneacutees (administrateur deacuteveloppeur utilisateur) Le langage proceacutedural de MySQL permetdrsquoincorporer nativement tout ordre SQL dans un programme
Concregravetement une fois teacuteleacutechargeacute et installeacute vous avez accegraves agrave un SGBD un client en modetexte (interface de commande) Les pilotes ODBC JDBC API pour les langages C et C++ etles outils
MySQL Administrator
MySQL Query Browser
et
MySQL Migration Toolkit
sont agraveteacuteleacutecharger puis agrave installer seacutepareacutement
Figure 0-2
Offre MySQL
API C JDBC ODBC NET PHP Python Perl Ruby Microsoft VB
Pool de connexions Authentification ndash Reacuteutilisation de processus ndash Cache ndash hellip
Utilitaires Sauvegarde Restauration Reacuteplication Migrat ion Cluster hellip
SQL LDD ndash LMD LCD - Vues Proceacutedures Deacuteclencheurs hellip
Analyseur Requecirctes Privilegraveges
Optimiseur Accegraves Statistiques
Cache Buffers
Moteurs de stockage Meacutemoire - Index
MyISAM InnoDB Archive Cluster Federated
Serveur MysQL
Systegraveme de fichiers NTFS ndash NFS ndash SAN - NAS
Fichiers et logs Donneacutees ndash index - hellip
4055_00d_Intro Page 5 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL
6
copy Eacuteditions Eyrolles
Licences
Deux types de licences sont proposeacutes par MySQL commerciale et GPL Dans le cadre drsquoundeacuteveloppement drsquoapplication entiegraverement sous licence GPL MySQL est gratuit Il en va demecircme srsquoil nrsquoest pas copieacute modifieacute distribueacute ou employeacute pour une utilisation en combinaisonavec un serveur Web (si vous deacuteveloppez lrsquoapplication Web vous-mecircme)
Dans tous les autres cas il est neacutecessaire drsquoobtenir une licence commerciale Par exemple sivous incluez un serveur MySQL ou des pilotes MySQL dans une application non
open source
Et la concurrence
Elle fait rage Deux types de concurrents ceux qui sont dans le domaine de lrsquo
open source
etceux qui engrangent des dollars agrave tour de bras
Dans la premiegravere cateacutegorie citons principalement Interbase 6 et Firebird de BorlandPostgreSQL et Berkeley DB
Dans la seconde on trouvera 4D Filemaker IBM (
DB2 UDB
) Informix Microsoft (
SQLServer Access
) Oracle et Sybase (
Adaptive Server SQL Anywhere Studio
) Depuis peu lesgrands eacutediteurs srsquoouvrent agrave la distribution gratuite Ces produits neacutecessitent de solides confi-gurations ce que nrsquoexigent pas les eacutediteurs de la premiegravere cateacutegorie
Fin 2004 Microsoft proposait
SQL Server 2005 Express Edition
qui est limiteacute drsquoun seulCPU 1 Go de meacutemoire et 4 Go de donneacutees
Fin 2004 Sybase offrait
ASE Express Edition
Plusieurs instances peuvent cohabiter surune machine tout en nrsquoutilisant pas plus drsquoun processeur moins de 2 Go de RAM et pasplus de 5 Go de donneacutees
Oracle annonccedilait en novembre 2005 une version gratuite avec
Oracle Database XE
(
Express Edition
) Version toutefois laquo limiteacutee raquo agrave un processeur moins de 1 Go de RAMune seule instance par systegraveme et pas plus de 4 Go de donneacutees
Peu de temps avant IBM avait aussi annonceacute une licence gratuite de
DB2 Express
Pasplus de deux processeurs et moins de 4 Go de RAM
Tout le monde est donc sur les rangs La guerre des versions nrsquoest donc pas finie Bien malinqui pourra preacutedire qui gagnera sur ce terrain
Notion de scheacutema (database)
MySQL appelle
database
un regroupement logique drsquoobjets (tables index vues deacuteclen-cheurs proceacutedures catalogueacutees etc) pouvant ecirctre stockeacutes agrave diffeacuterents endroits de lrsquoespacedisque Je ferai donc souvent reacutefeacuterence au terme laquo base de donneacutees raquo pour parler de cettenotion
On peut aussi assimiler ce concept agrave la notion de scheacutema pour ceux qui connaissent OracleLagrave ougrave MySQL et drsquoautres SGBD diffegraverent crsquoest sur la notion drsquoutilisateur (
user
)
4055_00d_Intro Page 6 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
7
Introduction
Pour tous un utilisateur sera associeacute agrave un mot de passe pour pouvoir se connecter et mani-puler des tables (srsquoil en a le droit bien sucircr)
Pour MySQL il nrsquoy a pas de notion drsquoappartenance drsquoun objet (table index etc) agrave unutilisateur Un objet appartient agrave son scheacutema (
database
) Ainsi deux utilisateurs distincts(
Jules
et
Paul) se connectant sur la mecircme base (database) ne pourront pas creacuteer chacunune table de nom Compagnie Srsquoils doivent le faire ce sera dans deux bases diffeacuterentes(bdjules et bdpaul)
Pour Oracle ou drsquoautres SGBD chaque objet appartient agrave un scheacutema (user) Ainsi deuxutilisateurs distincts Jules et Paul se connectant agrave la base (qui est un ensemble de scheacute-mas) pourront creacuteer chacun une table de nom Compagnie (la premiegravere sera reacutefeacuterenceacuteeJulesCompagnie la seconde PaulCompagnie)
La figure suivante illustre deux utilisateurs travaillant sur diffeacuterentes bases par une interfacequi peut ecirctre la fenecirctre de commande en ligne (dans la majeure partie des enseignements) ouun langage de programmation comme C Java ou PHP (utilisation drsquoune API) Notez deacutejagravelrsquoexistence de trois bases initiales (mysql test et information_schema) que nousdeacutetaillerons au chapitre 5
Notion drsquohocircte
MySQL deacutenomme host la machine heacutebergeant le SGBD MySQL diffegravere aussi agrave ce niveau desautres SGBD car il est possible de distinguer des accegraves drsquoun mecircme utilisateur suivant qursquoil seconnecte agrave partir drsquoune machine ou drsquoune autre La notion drsquoidentiteacute est baseacutee sur le couplenom drsquoutilisateur MySQL (user) cocircteacute serveur machine cliente
Identiteacutes
Ainsi lrsquoutilisateur Paul se connectant depuis la machine camparols peut ne pas ecirctre lemecircme que celui se connectant depuis la machine gambetta Srsquoil srsquoagit du mecircme il faudra auniveau du serveur eacuteventuellement composer un ensemble de preacuterogatives eacutequivalent pour lesdeux accegraves (voir le chapitre 5) Srsquoil srsquoagit de deux personnes diffeacuterentes il faudra distinguer
Figure 0-3 Notions de base et drsquoutilisateur MySQL
Interface
MySQL
Jules Paul
mysql test
information_schema
bdjules bdpaul
4055_00d_Intro Page 7 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL
8 copy Eacuteditions Eyrolles
les attributions des diffeacuterents droits La figure suivante illustre le fait que deux utilisateurspeuvent se connecter par deux accegraves diffeacuterents Trois identiteacutes seront donc agrave preacutevoir cocircteacuteserveur
Nous verrons au chapitre 5 comment configurer le serveur et les clients Nous eacutetudierons auchapitre 9 des outils graphiques drsquoaide agrave lrsquoadministration
Accegraves agrave MySQL
Une fois que vous aurez installeacute MySQL sur votre ordinateur vous serez libre de choisirlrsquoaccegraves qui vous convient Ce livre utilise essentiellement lrsquointerface de commande en lignefournie avec le SGBD mais aussi Java via JDBC et le navigateur Web au travers de PHP
Aspects eacutetudieacutes
Nous nrsquoeacutetudierons pas tous les eacuteleacutements drsquoune base car certains sont assez speacutecifiques etsortent du cadre traditionnel de lrsquoenseignement mecircme supeacuterieur Le tableau suivant indiquedans quel chapitre du livre les principaux eacuteleacutements drsquoun scheacutema sont eacutetudieacutes
Figure 0-4 Notion drsquohocircte MySQL
brassens
Jules
Paul
mysql test
julesgambetta
paulcamparols
camparols
gambetta
Paul paulgambetta
TCP-IP
Tableau 0-3 Eacuteleacutements drsquoune base MySQL
Eacuteleacutements eacutetudieacutes ndash Chapitre Aspects non eacutetudieacutes
Deacuteclencheurs (triggers) ndash 7Fonctions et proceacutedures ndash 7Tables et index ndash 1Seacutequences ndash 2 5Vues (views) et utilisateurs ndash 5
Clusters ndash Moteurs de stockage (storage engine) ndash Partitionnement ndash Donneacutees spatiales
4055_00d_Intro Page 8 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 9
Introduction
Mise en œuvre de MySQL (sous Windows)
Si tout se passe bien comptez quelques minutes pour installer MySQL Je vous conseilletoutefois de creacuteer un point de restauration Windows pour pouvoir revenir agrave votre derniegraverebonne configuration connue Extraire lrsquoarchive teacuteleacutechargeacutee sur le site officiel de MySQL AB(httpdevmysqlcomdownloads) dans un reacutepertoire temporaire (exemple CTemp) puisexeacutecuter Setupexe
Installation
Le premier choix est donneacute pour le type drsquoinstallation typique complegravete et personnaliseacutee ndashchoisir typique dans un premier temps
Le deuxiegraveme eacutecran vous invite agrave vous enregistrer ndash ce nrsquoest pas obligatoire mais conseilleacutetoutefois pour saluer lrsquoeacutenorme travail fait par ces jeunes informaticiens de geacutenie (voilagrave lapommade est passeacutee)
La suite concerne la configuration du serveur de donneacutees (choisir la configuration deacutetailleacuteepour suivre les diffeacuterentes eacutetapes et mieux comprendre le parameacutetrage de votre serveur)
Lrsquoassistant propose en premier lieu de deacuteterminer le type de votre serveur (machine dedeacuteveloppement serveur ou machine deacutedieacutee) Jrsquoai opteacute pour le premier choix
Choissisez ensuite le type de base de donneacutees que vous comptez exploiter (multifonctionmode transactionnel seulement ou jamais transactionnel) Jrsquoai opteacute pour le premier choix
Deacuteterminez ensuite le reacutepertoire qui contiendra les donneacutees des bases InnoDB (crsquoest letype de tables que nous utiliserons dans cet ouvrage car eacutetant le seul dans cette version agraveprendre en charge les cleacutes eacutetrangegraveres) Jrsquoai opteacute pour le choix par deacutefaut
Choissisez ensuite lrsquooption qui convient agrave votre utilisation (en fonction du nombre deconnexions) Jrsquoai opteacute pour le premier choix (vingt connexions maximum)
Il est ensuite possible de modifier le port UDP drsquoeacutecoute (par deacutefaut 3306) et le modecomportemental du serveur par rapport agrave la syntaxe des instructions SQL Jrsquoai opteacute pour lepremier choix (mode strict)
Attention agrave ne pas seacutelectionner un jeu de caractegraveres japonais dans lrsquoeacutecran qui arrive Jrsquoaiopteacute pour les choix par deacutefaut (West European et latin1)
Lrsquoeacutecran suivant permet de deacuteclarer MySQL comme un service Windows (qursquoon pourraarrecircter via le panneau de configuration plutocirct qursquoavec une belle commande en ligne ou parun Ctrl-Alt-Suppr bien connu des bidouilleurshellip) Penser aussi agrave inclure dans le path lechemin de lrsquoexeacutecutable mysql de maniegravere agrave pouvoir lancer une connexion en ligne decommande Il vous suffit de cocher la case approprieacutee
Saisissez un mot de passe pour root vous pouvez aussi creacuteer un compte anonyme(connexion fantocircme sans utilisateur ni mot de passe)
4055_00d_Intro Page 9 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL
10 copy Eacuteditions Eyrolles
Apregraves avoir valideacute la demande drsquoexeacutecution (bouton Execute) quelques secondes vontsrsquoeacutecouler avant qursquoon vous invite agrave terminer lrsquoinstallation
Voilagrave MySQL est installeacute Si ce nrsquoest pas le cas la section suivante vous aidera sucircrementDerniegravere chose si vous nrsquoutilisez pas souvent MySQL pensez agrave arrecircter et agrave positionner surManuel le service (ce nrsquoest pas pour lrsquoespace qursquoil occupe 10 Mo en RAM)
Pour modifier une configuration existante vous trouverez un assistant dans DeacutemarrerMySQLhellipMySQL Server Instance Wizard
Deacutesinstallation
Pour supprimer une configuration vous trouverez un assistant dans DeacutemarrerTous lesprogrammesMySQLhellipMySQL Server Instance Wizard choix Remove InstanceCependant le reacutepertoire installeacute par deacutefaut dans Program Files reste sur le disque (compterune centaine de meacutega-octets) De mecircme qursquoen ce qui concerne les entreacutees dans le menu Deacutemar-rer je ne parle pas de la base de registres qui est inchangeacuteehellip
Dans Panneau de configuration AjoutSuppression de programmes supprimerMySQL Server Il reste encore des choses dans la base de registres Le reacutepertoire MySQL sousProgram Files a diminueacute de taille mais il est toujours preacutesent Une fois que tout est faitredeacutemarrez votre machine et reprenez lrsquoinstallation initiale Prudence si vous modifiez leschemins des reacutepertoires des donneacutees entre plusieurs installations
Reconfiguration
En relanccedilant une installation il vous est donneacute drsquoajouter des composants (option Modify) sivous nrsquoavez pas fait une installation complegravete au deacutebut Vous avez aussi la possibiliteacute delaquo reacuteparer raquo (option Repair) une configuration existante
Premiers pas
La proceacutedure suivante va guider vos premiers pas pour travailler sous cette interface drsquounemaniegravere laquo professionnelle raquo Il srsquoagit de stocker vos fichiers de commande qui pourront serviragrave diffeacuterentes actions (creacuteations de tables de vues ou drsquoutilisateurs insertions modificationsou suppressions drsquoenregistrements eacutelaboration de requecirctes de proceacutedures catalogueacutees etc)
Lrsquointerface de commande
Lrsquointerface de commande en ligne porte le nom du SGBD (mysql) Cette interface ressembleagrave une fenecirctre DOS ou telnet et permet de dialoguer de la plus simple faccedilon avec la base dedonneacutees Lrsquoutilisation peut ecirctre interactive ou laquo batch raquo Quand lrsquoutilisation est interactive
4055_00d_Intro Page 10 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 11
Introduction
(crsquoest le mode le plus courant) le reacutesultat des extractions est preacutesenteacute sous une forme tabulaireau format ASCII
Vous verrez qursquoil est notamment possible
drsquoexeacutecuter des instructions SQL (creacuteeacuter des tables manipuler des donneacutees extraire desinformations etc)
de compiler des proceacutedures catalogueacutees et des deacuteclencheurs
de reacutealiser des tacircches drsquoadministration (creacuteation drsquoutilisateurs attribution de privilegravegesetc)
Le principe geacuteneacuteral de lrsquointerface est le suivant apregraves une connexion locale ou distante desinstructions sont saisies et envoyeacutees agrave la base qui retourne des reacutesultats afficheacutes dans la mecircmefenecirctre de commande
Nrsquoayez pas honte de bien maicirctriser cette interface au lieu de connaicirctre toutes les options drsquounoutil graphique (comme PhpMyAdmin MySQL Administrator ou autre) Il vous sera toujoursplus facile de vous adapter aux diffeacuterents boutons et menus tout en connaissant les instruc-tions SQL que lrsquoinverse
Imaginez-vous un jour agrave Singapour sur une machine ne disposant pas drsquooutils graphiques quele client vous demande la reacuteduction que vous pouvez lui faire sur la vente drsquoune piscine inteacute-rieure drsquoun Airbus A380 et que vous devez interroger (ou mettre agrave jour) une table sur leserveur du siegravege social agrave Blagnac Vous ne savez pas vous servir de lrsquointerface en ligne vousnrsquoecirctes pas un vrai informaticien
Creacuteation drsquoun utilisateur
Vous allez maintenant creacuteer un utilisateur MySQL Ouvrez le fichier premierPassql qui setrouve dans le reacutepertoire Introduction agrave lrsquoaide du bloc-notes (ou drsquoun eacutediteur de texte de votre
Figure 0-5 Principe geacuteneacuteral de lrsquointerface de commande en ligne
mysql [options] [nomBase] [entreacutees-sorties]
quit ou exit
mysqlgt INSERT hellip
mysqlgt CREATE hellip
mysqlgt SELECT hellip
hellip
mysqlgt
mysql
Systegraveme drsquoexploitation
nomBase
Web
4055_00d_Intro Page 11 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL
12 copy Eacuteditions Eyrolles
choix) Changez laquo util raquo par le nom de lrsquoutilisateur agrave creacuteer (modifiez aussi le nom de la base) Vouspouvez changer le mot de passe si vous voulez Enregistrez ce fichier dans un de vos reacutepertoires
Connexion au serveur
Dans une fenecirctre de commande Windows Linux (ou autre) lancer lrsquointerface en ligne enconnectant lrsquoutilisateur root avec le mot de passe que vous avez donneacute lors de lrsquoinstallation
mysql --user=root -p
Une fois connecteacute par copier-coller (en effectuant un clic droit dans la fenecirctre de commandeMySQL) exeacutecutez une agrave une les diffeacuterentes instructions (creacuteation de la base de lrsquoutilisateurdes privilegraveges et deacuteconnexion de root) Nous eacutetudierons au chapitre 5 les notions eacuteleacutementai-res de droits et de seacutecuriteacute Les lignes preacuteceacutedeacutees de laquo -- raquo sont des commentaires
Voilagrave votre utilisateur (util) est creacuteeacute il peut se connecter et il possegravede toutes les preacuterogatives sur labase (bdutil) pour exeacutecuter les instructions deacutecrites dans cet ouvrage Pour tester votre connexionlancez la commande suivante qui se connecte au serveur sur la base bdutil sous lrsquoutilisateur util
mysql --user=util --host=localhost -p --database=bdutil
Veacuterification de la version
Pour controcircler la version du serveur sur lequel vous ecirctes connecteacute exeacutecutez la connexion-deacuteconnexion suivante dans une fenecirctre de commande Windows Linux (ou autre)
mysql --version
Si vous ecirctes deacutejagrave connecteacute la commande laquo SELECT VERSION() raquo vous renseignera eacutegale-ment agrave propos de la version du SGBD Si vous nrsquoecirctes pas en version 5 il vous sera impossiblede travailler avec des proceacutedures catalogueacutees vues et deacuteclencheurs Pour ma part lors de lareacutedaction de cet ouvrage cette commande a renvoyeacute le reacutesultat suivant
Figure 0-6 Interface en mode ligne de commande
4055_00d_Intro Page 12 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 13
Introduction
+-----------+
| VERSION() |
+-----------+
| 5015-nt |
+-----------+
Options de base
Les principales options au lancement de mysql sont reacutesumeacutees dans le tableau suivant
Tableau 0-4 Principales options de la commande mysql
Option Commentaire
--help ou - Affiche les options disponibles lrsquoeacutetat des variables drsquoenvironnement etrend la main
--batch ou -B Toute commande SQL peut ecirctre lanceacutee dans la fenecirctre de commandesystegraveme sans pour autant voir lrsquoinvite les reacutesultats (colonnes) sontseacutepareacutes par des tabulations
--database=nomBD ou ndashD nomBD
Seacutelection de la base de donneacutees agrave utiliser apregraves la connexion
--host=nomServeur ou -h nomServeur
Deacutesignation du serveur
--html ou -H Formate le reacutesultat des extractions en HTML
--one-database ou -O Restreint les instructions agrave la base de donneacutees speacutecifieacutee initialement
-p Demande le mot de passe sans lrsquoemployer en tant que paramegravetre
--password=motdePasse Transmission du mot de passe de lrsquoutilisateur agrave connecter Eacutevitez cetteoption et preacutefeacuterez la preacuteceacutedentehellip
--prompt=parametre Personnalise lrsquoinvite de commande (par deacutefaut mysqlgt)
--silent ou -s Configure le mode silence pour reacuteduire les messages de MySQL
--skip-column-names ou -N
Nrsquoeacutecrit aucun en-tecircte de colonne pour les reacutesultats drsquoextraction
--table ou -t Formate le reacutesultat des extractions en tables agrave en-tecircte de colonne (pardeacutefaut dans le mode interactif)
--tee=cheminNomFichier Copie la trace de toute la session dans le fichier que vous indiquez
--user=utilisateur ou -u utilisateur
Deacutesigne lrsquoutilisateur devant se connecter
--verbose ou -v Mode verbeux pour avoir davantage de messages du serveur
--version ou -V Affiche la version du serveur et rend la main
--vertical ou -E Affiche les reacutesultats des extractions verticalement (non plus en ligneshorizontales)
--xml ou -X Formate le reacutesultat des extractions en XML Les noms de balisesgeacuteneacutereacutees sont ltresultsetgt pour la table reacutesultat ltrowgtpour chaque ligne et ltfieldgt pour les colonnes
4055_00d_Intro Page 13 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
Apprendre SQL avec MySQL
14 copy Eacuteditions Eyrolles
Ces options peuvent se combiner en les seacuteparant simplement par un espace (exemple mysql--tee=Ddevsortiemysqltxt --database=bdsoutou va se connecteranonymement agrave la base bdsoutou en inscrivant le contenu de la trace de la session dans lefichier sortiemysqltxt situeacute dans le reacutepertoire Ddev)
Le tableau suivant reacutesume les principaux paramegravetres pour afficher les invites de commande(relatives agrave lrsquooption prompt)
Batch
Pour lancer plusieurs commandes regroupeacutees dans un fichier agrave extension laquo sql raquo il fautpreacuteciser le chemin du fichier et celui qui contiendra les eacuteventuels reacutesultats (crsquoest du laquo brut dedeacutecoffrage raquo ) Ainsi lrsquoinstruction suivante exeacutecute dans la base bdsoutou sous lrsquoautoriteacutede lrsquoutilisateur soutou les commandes contenues dans le fichier Testbatchsql situeacutedans le reacutepertoire Ddev (notez lrsquoutilisation du double back-slash pour deacutesigner une arbo-rescence Windows) Le reacutesultat sera consigneacute dans le fichier sortietxt du mecircme reacuteper-toire
mysql --user=soutou --password=iut bdsoutou
Votre prompt et vite
Lrsquoexeacutecution de lrsquoinstruction laquo mysql --prompt=(uh) [d]gt --user=root ndashp raquodans une fenecirctre de commande shell ou DOS connectera lrsquoutilisateur root en lui demandantson mot de passe Lrsquoinvite de commande agrave lrsquoaffichage sera de la forme suivante
Tableau 0-5 Principales options de lrsquoinvite de commandes
Option Commentaire
v Version du serveur
d Base de donneacutees en cours drsquoutilisation
h Nom du serveur
u Nom drsquoutilisateur
U Nom drsquoutilisateur long (au format nomserveur)
_ Un espace
R Heure (0 agrave 23)
m Minutes
s Secondes
Y Anneacutee sur quatre chiffres
D Date en cours
c Compteur drsquoinstructions
ltDdevTestbatchsql gtDdevsortietxt
4055_00d_Intro Page 14 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 15
Introduction
(rootlocalhost) [bdsoutou]gt une fois que root aura seacutelectionneacute la base bdsou-tou (par la commande laquo use nombase raquo)
Configurez votre invite de commande SQL dans le fichier de configuration myini situeacute enprincipe dans le reacutepertoire CProgram FilesMySQLMySQL Server xx de la maniegravere quivous convient le plus
Pour ma part jrsquoai ajouteacute les deux lignes suivantes sous la section [mysql] elle-mecircme situeacuteesous lrsquoeacutetiquette [client]
mon prompt
prompt=(uh) [d]_mysqlgt_
Une fois le serveur redeacutemarreacute en consideacuterant que votre compte srsquoappelle util toutes voscommandes SQL devraient en principe ecirctre preacutefixeacutees de la syntaxe suivante
(utillocalhost) [bdutil] mysqlgt
Commandes de base
Une fois connecteacute vous pouvez utiliser des commandes ou faire des copier-coller drsquoun eacutediteurde texte dans lrsquointerface mysql (ce moyen de faire correspond plus agrave un environnement detest qui conviendra agrave lrsquoapprentissage) Le tableau suivant reacutesume les principales instructionspour manipuler le buffer drsquoentreacutee de lrsquointerface
La commande source est tregraves utile pour eacuteviter les copier-coller de trop nombreuses instructions
Tableau 0-6 Commandes de base du buffer drsquoentreacutee
Commande Commentaire
Affichage des commandes disponibles
delimiter chaicircne Modifie le deacutelimiteur (par deacutefaut laquo raquo)
use nomBase Rend une base de donneacutees courante
prompt chaicircne Modifie lrsquoinvite de commande avec les paramegravetres vus preacuteceacutedemment
quit ou exit Quitte lrsquointerface
source cheminNomFichiersql Charge et exeacutecute dans le buffer le contenu du cheminNomFichiersql (ex source DdevTestbatchsql exeacutecutera le script Testbatchsql situeacute dans Ddev)
tee nomFichierSortie Creacuteation nomFichierSortie dans le reacutepertoire CProgram FilesMySQLMySQL Server nnbin qui contiendra la trace de la session
4055_00d_Intro Page 15 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
4055_00d_Intro Page 16 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
Partie I
SQL de base
4055_00e_P01 Page 17 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
4055_00e_P01 Page 18 Jeudi 2 mars 2006 159 13 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
19
Chapitre 1
Deacutefinition des donneacutees
Ce chapitre deacutecrit les instructions SQL qui constituent lrsquoaspect LDD (langage de deacutefinitiondes donneacutees) Agrave cet effet nous verrons notamment comment deacuteclarer une table avec ses eacuteven-tuels index et contraintes
Tables relationnelles
Une table est creacuteeacutee en SQL par lrsquoinstruction
CREATE TABLE
modifieacutee au niveau de sa struc-ture par lrsquoinstruction
ALTER TABLE
et supprimeacutee par la commande
DROP TABLE
Creacuteation drsquoune table (
CREATE TABLE
)
Pour pouvoir creacuteer une table dans votre base il faut que vous ayez reccedilu le privilegravege
CREATE
Le meacutecanisme des privilegraveges est deacutecrit au chapitre 5
La syntaxe SQL simplifieacutee est la suivante
CREATE
[TEMPORARY]
TABLE
[IF NOT EXISTS] [
nomBase
]
nomTable
(
colonne1 type1
[NOT NULL | NULL] [DEFAULT
valeur1
] [COMMENT
chaine1
]
[
colonne2 type2
[NOT NULL | NULL] [DEFAULT
valeur2
] [COMMENT
chaine2
] ]
[CONSTRAINT
nomContrainte1 typeContrainte1
]
)
[ENGINE= InnoDB | MyISAM |
]
TEMPORARY
pour creacuteer une table qui nrsquoexistera que durant la session courante (la tablesera supprimeacutee agrave la deacuteconnexion) Deux connexions peuvent ainsi creacuteer deux tablestemporaires de mecircme nom sans risquer de conflit Il faut posseacuteder le privilegravege
CREATETEMPORARY TABLES
IF NOT EXISTS
permet drsquoeacuteviter qursquoune erreur se produise si la table existe deacutejagrave (sicrsquoest le cas elle nrsquoest aucunement affecteacutee par la tentative de creacuteation)
nomBase
(jusqursquoagrave 64 caractegraveres permis dans un nom de reacutepertoire ou de fichier sauflaquo
raquo laquo
raquo et laquo
raquo) srsquoil est omis il sera assimileacute agrave la base connecteacutee Srsquoil est preacuteciseacute il
4055_01_C01 Page 19 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
Partie I SQL de base
20
copy Eacuteditions Eyrolles
deacutesigne soit la base connecteacutee soit une autre base (dans ce cas il faut que lrsquoutilisateurcourant ait le droit de creacuteeacuter une table dans lrsquoautre base) Nous aborderons ces points dansle chapitre Controcircle des donneacutees et nous consideacutererons jusque-lagrave que nous travaillons dansla base courante (ce sera votre configuration la plupart du temps)
nomTable
mecircmes limitations que pour le nom de la base
colonnei typei
nom drsquoune colonne (mecircmes caracteacuteristiques que pour les noms destables) et son type (
INTEGER
CHAR
DATE
hellip) Nous verrons quels types sont disponiblessous MySQL La directive
DEFAULT
fixe une valeur par deacutefaut La directive
NOT NULL
interdit que la valeur de la colonne soit nulle
NULL
repreacutesente une valeur qursquoon peut consideacuterer comme non disponible non affecteacutee incon-nue ou inapplicable Elle est diffeacuterente drsquoun espace pour un caractegravere ou drsquoun zeacutero pour un
nombre
COMMENT
(jusqursquoagrave 60 caractegraveres) permet de commenter une colonne Ce texte seraensuite automatiquement afficheacute agrave lrsquoaide des commandes
SHOW CREATE TABLE
et
SHOWFULL COLUMNS
(voir le chapitre 5)
nomContraintei typeContraintei
nom de la contrainte et son type (cleacute primairecleacute eacutetrangegravere etc) Nous allons deacutetailler dans le paragraphe suivant les diffeacuterentescontraintes possibles
ENGINE
deacutefinit le type de table (par deacutefaut
InnoDB
bien adapteacute agrave la programmation detransactions et adopteacute dans cet ouvrage)
MyISAM
correspond au type par deacutefaut desversions 3 parfaitement robuste mais ne supportant pas pour lrsquoheure lrsquointeacutegriteacute reacutefeacuteren-tielle Drsquoautres types existent citons
MEMORY
pour les tables temporaires
ARCHIVE
etc
laquo
raquo symbole par deacutefaut qui termine une instruction MySQL en mode ligne decommande (en lrsquoabsence drsquoun autre deacutelimiteur)
Deacutelimiteurs
En mode ligne de commande il est possible (par la directive
delimiter
) de choisir lesymbole qui terminera chaque instruction Dans lrsquoexemple suivant on choisit le dollar aucours de lrsquoouvrage nous resterons avec le symbole par deacutefaut de MySQL agrave savoir laquo raquo
delimiter $
CREATE TABLE Test (t CHAR(8))$
Sensibiliteacute agrave la casse
Alors que MySQL est sensible par deacutefaut agrave la casse (au niveau des noms de base et de table)dans la plupart des distributions Unix il ne lrsquoest pas pour Windows En revanche concernantles noms de colonnes index alias de colonnes deacuteclencheurs et proceacutedures catalogueacutees
4055_01_C01 Page 20 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
21
chapitre ndeg 1 Deacutefinition des donneacutees
MySQL nrsquoest pas sensible agrave la casse tous systegravemes confondus En fait tous ces noms sontstockeacutes en minuscules dans le dictionnaire de donneacutees
La variable
lower_case_table_names
permet de forcer la sensibiliteacute agrave la casse pourles noms des tables et des bases de donneacutees (si elle vaut 0 la sensibiliteacute agrave la casse est active etles noms sont stockeacutes en minuscules 1 pas de sensibiliteacute agrave la casse et les noms sontstockeacutes en minuscules 2 pas de sensibiliteacute agrave la casse et les noms sont stockeacutes en respectant lacasse)
Je vous invite agrave positionner cette variable agrave 0 de maniegravere agrave homogeacuteneacuteiser le codage et agravecontrocircler un peu plus lrsquoeacutecriture de vos instructions SQL De plus crsquoest lrsquooption par deacutefaut surLinux Dans le fichier
myini
sous la section serveur identifieacutee par [
mysqld
] ajouter laligne et le commentaire suivants
Rend sensible agrave la CASSE les noms de tables et de database
lower_case_table_names=0
Refusez ce type de programmation (rendue impossible drsquoailleurs si la variable
lower_case_table_names
est positionneacutee agrave 0)
mysqlgt SELECT FROM
Avion
WHERE
AVION
capacite gt 150
Par ailleurs la casse devrait toujours avoir (quel que soit le SGBD concerneacute) une incidencemajeure dans les expressions de comparaison entre colonnes et valeurs que ce soit dans uneinstruction SQL ou un test dans un programme
Ainsi lrsquoexpression laquo
nomComp=Air France
raquo a la mecircme signification que lrsquoexpressionlaquo
nomComp=AIR France
raquo avec MySQL Horreur oui
Donc si vous deacutesirez veacuterifier la casse au sein mecircme des donneacutees il faudra utiliser la fonction
BINARY()
qui convertit en bits une expression En effet laquo
BINARY(AIR France)
raquo est dif-feacuterent de laquo
BINARY(Air France)
raquo et laquo
BINARY(nomComp)=BINARY(Air France)
raquo
renverra vrai en respectant la casse
Commentaires
Dans toute instruction SQL (deacuteclaration manipulation interrogation et controcircle des donneacutees)il est possible drsquoinclure des retours chariot des tabulations espaces et commentaires (sur uneligne preacuteceacutedeacutee de deux tirets laquo
ndash - raquo en fin de ligne agrave lrsquoaide du diegravese laquo raquo au sein drsquouneligne ou sur plusieurs lignes entre laquo raquo et laquo raquo) Les scripts suivants deacutecrivent la deacutecla-ration drsquoune mecircme table en utilisant diffeacuterentes conventions
4055_01_C01 Page 21 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
Partie I SQL de base
22 copy Eacuteditions Eyrolles
Comme nous le conseillons dans lrsquoavant-propos il est preacutefeacuterable drsquoutiliser les conventionssuivantes
bull Tous les mots-cleacutes de SQL sont noteacutes en majuscules
bull Les noms de tables sont noteacutes en Minuscules (excepteacute la premiegravere lettre ces noms serontquand mecircme stockeacutes dans le systegraveme en minuscules)
bull Les noms de colonnes et de contraintes en minuscules
Lrsquoadoption de ces conventions rendra vos requecirctes scripts et programmes plus lisibles (un peuagrave la mode Java)
Premier exemple
Le tableau ci-apregraves deacutecrit lrsquoinstruction SQL qui permet de creacuteer la table Compagnie illustreacuteepar la figure suivante dans la base bdsoutou (lrsquoabsence du preacutefixe laquo bdsoutou raquo conduiraitau mecircme reacutesultat si bdsoutou eacutetait la base connecteacutee lors de lrsquoexeacutecution du script)
Tableau 1-1 Diffeacuterentes eacutecritures SQL
Sans commentaire Avec commentaires
CREATE TABLE Test(colonneDECIMAL(388))
CREATE TABLE Test (colonne DECIMAL(388))
CREATE TABLE -- nom de la tableTest( deacutebut de la description COLONNE DECIMAL(388) )-- fin ne pas oublier le point-virguleCREATE TABLE Test ( une plus grande description des colonnes COLONNE type DECIMAL(388))
Figure 1-1 Table agrave creacuteer
Compagnie
comp nrue rue ville nomComp
4055_01_C01 Page 22 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 23
chapitre ndeg 1 Deacutefinition des donneacutees
Contraintes
Les contraintes ont pour but de programmer des regravegles de gestion au niveau des colonnes destables Elles peuvent alleacuteger un deacuteveloppement cocircteacute client (si on deacuteclare qursquoune note doit ecirctrecomprise entre 0 et 20 les programmes de saisie nrsquoont plus agrave tester les valeurs en entreacutee maisseulement le code retour apregraves connexion agrave la base on deacuteporte les contraintes cocircteacute serveur)
Les contraintes peuvent ecirctre deacuteclareacutees de deux maniegraveres
En mecircme temps que la colonne (valable pour les contraintes monocolonnes) ces contrain-tes sont dites laquo en ligne raquo (inline constraints) Lrsquoexemple preacuteceacutedent en deacuteclare deux
Apregraves que la colonne est deacuteclareacutee ces contraintes ne sont pas limiteacutees agrave une colonne etpeuvent ecirctre personnaliseacutees par un nom (out-of-line constraints)
Il est recommandeacute de deacuteclarer les contraintes NOT NULL en ligne les autres peuvent soit ecirctredeacuteclareacutees en ligne soit ecirctre nommeacutees Eacutetudions agrave preacutesent les types de contraintes nommeacutees(out-of-line) Les quatre types de contraintes les plus utiliseacutees sont les suivants
CONSTRAINT nomContrainte
UNIQUE (colonne1 [colonne2])
PRIMARY KEY (colonne1 [colonne2])
FOREIGN KEY (colonne1 [colonne2])
REFERENCES nomTablePere [(colonne1 [colonne2])]
[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]
[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]
CHECK (condition)
La contrainte UNIQUE impose une valeur distincte au niveau de la table (les valeurs nullesfont exception agrave moins que NOT NULL soit aussi appliqueacutee sur les colonnes)
La contrainte PRIMARY KEY deacuteclare la cleacute primaire de la table Un index est geacuteneacutereacute auto-matiquement sur la ou les colonnes concerneacutees Les colonnes cleacutes primaires ne peuventecirctre ni nulles ni identiques (en totaliteacute si elles sont composeacutees de plusieurs colonnes)
Tableau 1-2 Creacuteation drsquoune table et de ses contraintes
Instruction SQL Commentaires
CREATE TABLE bdsoutouCompagnie (comp CHAR(4) nrue INTEGER(3) rue CHAR(20) ville CHAR(15) DEFAULT Paris COMMENT Par defaut Paris nomComp CHAR(15) NOT NULL)
La table contient cinq colonnes (quatre chaicircnes de caractegraveres et un numeacuterique de trois chiffres) La colonne ville est commenteacuteeLa table inclut en plus deux contraintes bull DEFAULT qui fixe Paris comme valeur par deacutefaut
de la colonne ville bull NOT NULL qui impose une valeur non nulle dans
la colonne nomComp
4055_01_C01 Page 23 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
Partie I SQL de base
24 copy Eacuteditions Eyrolles
La contrainte FOREIGN KEY deacuteclare une cleacute eacutetrangegravere entre une table enfant (child) et unetable pegravere (parent) Ces contraintes deacutefinissent lrsquointeacutegriteacute reacutefeacuterentielle que nous aborde-rons plus tard Les directives ON UPDATE et ON DELETE disposent de quatre options quenous deacutetaillerons avec les directives MATCH agrave la section Inteacutegriteacute reacutefeacuterentielle duchapitre 2)
La contrainte CHECK impose un domaine de valeurs ou une condition simple ou complexe entrecolonnes (exemple CHECK (note BETWEEN 0 AND 20) CHECK (grade=Copilote ORgrade=Commandant)) Cette contrainte est prise en charge au niveau de la deacuteclarationmais nrsquoest pas encore opeacuterationnelle mecircme dans la version 51
Il est recommandeacute de ne pas deacutefinir de contraintes sans les nommer (bien que cela soit possi-ble) car il sera difficile de les faire eacutevoluer (deacutesactivation reacuteactivation suppression) et la lisi-biliteacute des programmes en sera affecteacutee
Nous verrons au chapitre 3 comment ajouter supprimer deacutesactiver et reacuteactiver des contraintes(options de la commande ALTER TABLE)
Conventions recommandeacutees
Adoptez les conventions drsquoeacutecriture suivantes pour vos contraintes
bull Preacutefixez par pk_ le nom drsquoune contrainte cleacute primaire fk_ une cleacute eacutetrangegravere ck_ une veacuteri-fication un_ une uniciteacute
bull Pour une contrainte cleacute primaire suffixez du nom de la table la contrainte (exemple pk_Avion)
bull Pour une contrainte cleacute eacutetrangegravere renseignez (ou abreacutegez) les noms de la table source dela cleacute et de la table cible (exemple fk_Pil_compa_Comp)
En respectant nos conventions deacuteclarons les tables de lrsquoexemple suivant (Compagnie avec sacleacute primaire et Avion avec sa cleacute primaire et sa cleacute eacutetrangegravere) Du fait de lrsquoexistence de la cleacuteeacutetrangegravere la table Compagnie est dite laquo parent raquo (ou laquo pegravere raquo) de la table Avion laquo enfant raquo(ou laquo fils raquo) Cela reacutesulte de la traduction drsquoune association un-agrave-plusieurs entre les deuxtables (De UML agrave SQL Eyrolles 2002) Nous reviendrons sur ces principes agrave la section Inteacute-griteacute reacutefeacuterentielle du prochain chapitre
4055_01_C01 Page 24 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 25
chapitre ndeg 1 Deacutefinition des donneacutees
Remarques
bull Lrsquoordre nrsquoest pas important dans la deacuteclaration des contraintes nommeacutees
bull PRIMARY KEY eacutequivaut agrave UNIQUE + NOT NULL + index
bull Lrsquoordre de creacuteation des tables est important quand on deacutefinit les contraintes en mecircme tempsque les tables (on peut diffeacuterer la creacuteation ou lrsquoactivation des contraintes voir le chapitre 3)Il faut creacuteer drsquoabord les tables laquo pegraveres raquo puis les tables laquo fils raquo Le script de destruction destables suit le raisonnement inverse
Figure 1-2 Deux tables relieacutees agrave creacuteer
Tableau 1-3 Contraintes en ligne et nommeacutees
Tables Contraintes
CREATE TABLE Compagnie(comp CHAR(4) nrue INTEGER(3) rue CHAR(20) ville CHAR(15) DEFAULT Paris COMMENT Par defaut Paris nomComp CHAR(15) NOT NULL CONSTRAINT pk_Compagnie PRIMARY KEY(comp))
Deux contraintes en ligneet une contrainte nommeacuteede cleacute primaire
CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) NOT NULL nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) CONSTRAINT ck_nbHVol CHECK(nbHVol BETWEEN 0 AND 20000) CONSTRAINT un_nom UNIQUE (nom) CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp))
Une contrainte en ligneet quatre contraintes nommeacutees bull Cleacute primairebull NOT NULLbull CHECK (nombre drsquoheures de vol
compris entre 0 et 20 000)bull UNIQUE (homonymes interdits)bull Cleacute eacutetrangegravere
Pilote
brevet nom nbHVol compa
Compagnie
comp nrue rue ville nomComp
Web
4055_01_C01 Page 25 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
Partie I SQL de base
26 copy Eacuteditions Eyrolles
Types des colonnes
Pour deacutecrire les colonnes drsquoune table MySQL fournit les types preacutedeacutefinis suivants (built-indatatypes)
caractegraveres (CHAR VARCHAR TINYTEXT TEXT MEDIUMTEXT LONGTEXT)
valeurs numeacuteriques (TINYINT SMALLINT MEDIUMINT INT INTEGER BIGINTFLOAT DOUBLE REAL DECIMAL NUMERIC et BIT)
dateheure (DATE DATETIME TIME YEAR TIMESTAMP)
donneacutees binaires (BLOB TINYBLOB MEDIUMBLOB LONGBLOB)
eacutenumeacuterations (ENUM SET)
Deacutetaillons agrave preacutesent ces types Nous verrons comment utiliser les plus courants au chapitre 2et les autres au fil de lrsquoouvrage
Caractegraveres
Le type CHAR permet de stocker des chaicircnes de caractegraveres de taille fixe Les valeurs sontstockeacutees en ajoutant srsquoil le faut des espaces (trailing spaces) agrave concurrence de la tailledeacutefinie Ces espaces ne seront pas consideacutereacutes apregraves extraction agrave partir de la table
Le type VARCHAR permet de stocker des chaicircnes de caractegraveres de taille variable Les valeurssont stockeacutees sans lrsquoajout drsquoespaces agrave concurrence de la taille deacutefinie Depuis la version 503de MySQL les eacuteventuels espaces de fin de chaicircne seront stockeacutes et extraits en conformiteacuteavec la norme SQL Des caractegraveres Unicode (meacutethode de codage universelle qui fournit unevaleur de code unique pour chaque caractegravere quels que soient la plate-forme le programme oula langue) peuvent aussi ecirctre stockeacutes
Tableau 1-4 Types de donneacutees caractegraveres
Type Description Commentaire pour une colonne
CHAR(n) [BINARY | ASCII| UNICODE]
Chaicircne fixe de n octets ou caractegraveres
Taille fixe (maximum de 255 caractegraveres)
VARCHAR(n) [BINARY] Chaicircne variable de n caractegraveres ou octets
Taille variable (maximum de 65 535 caractegraveres)
BINARY(n) Chaicircne fixe de n octets
Taille fixe (maximum de 255 octets)
VARBINARY(n) Chaicircne variable de n octets
Taille variable (maximum de 255 octets)
TINYTEXT(n) Flot de n octets Taille fixe (maximum de 255 octets)
TEXT(n) Flot de n octets Taille fixe (maximum de 65 535 octets)
MEDIUMTEXT(n) Flot de n octets Taille fixe (maximum de 16 meacutegaoctets)
LONGTEXT(n) Flot de n octets Taille fixe (maximum de 429 gigaoctets)
4055_01_C01 Page 26 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 27
chapitre ndeg 1 Deacutefinition des donneacutees
Les types BINARY et VARBINARY sont similaires agrave CHAR et VARCHAR excepteacute par le faitqursquoils contiennent des chaicircnes drsquooctets sans tenir compte drsquoun jeu de caractegraveres en particulier
Les quatre types permettant aussi de stocker du texte sont TINYTEXT TEXT MEDIUMTEXTet LONGTEXT Ces types sont associeacutes agrave un jeu de caractegraveres Il nrsquoy a pas de meacutecanisme desuppression drsquoespaces de fin ni de possibiliteacute drsquoy associer une contrainte DEFAULT
Valeurs numeacuteriques
De nombreux types sont proposeacutes par MySQL pour deacutefinir des valeurs exactes (entiers ou deacutecimauxpositifs ou neacutegatifs INTEGER et SMALLINT) et des valeurs agrave virgule fixe ou flottante (FLOATDOUBLE et DECIMAL) En plus des speacutecifications de la norme SQL MySQL propose les typesdrsquoentiers restreints (TINYINT MEDIUMINT et BIGINT) Le tableau suivant deacutecrit ces types
n indique le nombre de positions de la valeur agrave lrsquoaffichage (le maximum est de 255) Ainsiil est possible de deacuteclarer une colonne TINYINT(4) sachant que seules 3 positions sontneacutecessaires en fonction du domaine de valeurs permises
Tableau 1-5 Types de donneacutees numeacuteriques
Type Description
BIT[(n)] Ensemble de n bits Taille de 1 agrave 64 (par deacutefaut 1)
TINYINT[(n)] [UNSIGNED] [ZEROFILL]
Entier (sur un octet) de -128 agrave 127 signeacute 0 agrave 255 non signeacute
BOOL et BOOLEAN Synonymes de TINYINT(1) la valeur zeacutero est consideacutereacuteecomme fausse Le non-zeacutero est consideacutereacute comme vrai Dans lesprochaines versions le type boolean comme le preacuteconise lanorme SQL sera reacuteellement pris en charge
SMALLINT[(n)] [UNSIGNED] [ZEROFILL]
Entier (sur 2 octets) de ndash 32 768 agrave 32 767 signeacute 0 agrave 65 535 nonsigneacute
MEDIUMINT[(n)] [UNSIGNED] [ZEROFILL]
Entier (sur 3 octets) de ndash 8 388 608 agrave 8 388 607 signeacute 0 agrave 16 777 215 non signeacute
INTEGER[(n)] [UNSIGNED] [ZEROFILL]
Entier (sur 4 octets) de ndash2 147 483 648 agrave 2 147 483 647 signeacute0 agrave 4 294 967 295 non signeacute
BIGINT[(n)] [UNSIGNED] [ZEROFILL]
Entier (sur 8 octets) de ndash 9 223 372 036 854 775 808 agrave 9 223 372 036 854 775 807 signeacute 0 agrave 18 446 744 073 709 551 615 non signeacute
FLOAT[(n[p])] [UNSIGNED] [ZEROFILL]
Flottant (de 4 agrave 8 octets) p deacutesigne la preacutecision simple (jusqursquoagrave7deacutecimales) de -34 10+38 agrave -11 10-38 0 signeacute et de 11 10-38 agrave34 10+38 non signeacute
DOUBLE[(n[p])] [UNSIGNED] [ZEROFILL]
Flottant (sur 8 octets) p deacutesigne la preacutecision double (jusqursquoagrave 15deacutecimales) de -17 10+308 agrave -22 10-308 0 signeacute et de 22 10-308
agrave 17 10+308 non signeacute
DECIMAL[(n[p])] [UNSIGNED] [ZEROFILL]
Deacutecimal agrave virgule fixe p deacutesigne la preacutecision (nombre de chiffresapregraves la virgule maximum 30) Par deacutefaut n vaut 10 p vaut 0
4055_01_C01 Page 27 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
Partie I SQL de base
28 copy Eacuteditions Eyrolles
La directive UNSIGNED permet de consideacuterer seulement des valeurs positives
La directive ZEROFILL complegravete par des zeacuteros agrave gauche une valeur (par exemple soit unINTEGER(5) contenant 4 si ZEROFILL est appliqueacute la valeur extraite sera laquo 00004 raquo)En deacuteclarant une colonne ZEROFILL MySQL lrsquoaffecte automatiquement aussi agrave UNSI-GNED
Synonymes et alias
bull INT est synonyme de INTEGER
bull DOUBLE PRECISION et REAL sont synonymes de DOUBLE
bull DEC NUMERIC et FIXED sont synonymes de DECIMAL
bull SERIAL est un alias pour BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
bull Dans toute instruction SQL eacutecrivez la virgule avec un point (72 retourne 35)
Dates et heures
Les types suivants permettent de stocker des moments ponctuels (dates dates et heuresanneacutees et heures) Les fonctions NOW() et SYSDATE() retournent la date et lrsquoheure courantesDans une proceacutedure ou un deacuteclencheur SYSDATE est reacuteeacutevalueacutee en temps reacuteel alors que NOWdeacutesignera toujours lrsquoinstant de deacutebut de traitement
Tableau 1-6 Types de donneacutees dates et heures
Type Description Commentaire pour une colonne
DATE Dates du 1er janvier de lrsquoan 1000 au 31 deacutecembre 9999 apregraves J-C
Sur 3 octets Lrsquoaffichage est au format lsquoYYYY-MM-DDrsquo
DATETIME Dates et heures (de 0 h de la premiegravere date agrave 23 h 59 minutes 59 secondes de la derniegravere date)
Sur 8 octets Lrsquoaffichage est au format lsquoYYYY-MM-DD HHMMSSrsquo
YEAR[(2|4)] Sur 4 positions de 1901 agrave 2155 (incluant 0000) Sur 2 positions de 70 agrave 69 (deacutesignant 1970 agrave 2069)
Sur 1 octet lrsquoanneacutee est consideacutereacutee sur 2 ou 4 positions (4 par deacutefaut) Le format drsquoaffichage est lsquoYYYYrsquo
TIME Heures de -838 h 59 minutes 59 secondes agrave 838 h 59 minutes 59 secondes
Lrsquoheure au format lsquoHHHMMSSrsquo sur 3 octets
TIMESTAMP Instants du 1er Janvier 1970 0 h 0 minute 0 seconde agrave lrsquoanneacutee 2037
Estampille sur 4 octets (au format lsquoYYYY-MM-DD HHMMSSrsquo) mise agrave jour agrave chaque modification sur la table
4055_01_C01 Page 28 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 29
chapitre ndeg 1 Deacutefinition des donneacutees
Donneacutees binaires
Les types BLOB (Binary Large OBject) permettent de stocker des donneacutees non structureacuteescomme le multimeacutedia (images sons videacuteo etc) Les quatre types de colonnes BLOB sontTINYBLOB BLOB MEDIUMBLOB et LONGBLOB Ces types sont traiteacutes comme des flotsdrsquooctets sans jeu de caractegravere associeacute
Eacutenumeacuteration
Deux types de collections sont proposeacutes par MySQL
Le type ENUM deacutefinit une liste de valeurs permises (chaicircnes de caractegraveres)
Le type SET permettra de comparer une liste agrave une combinaison de valeurs permises agravepartir drsquoun ensemble de reacutefeacuterence (chaicircnes de caractegraveres)
Structure drsquoune table (DESCRIBE)
DESCRIBE (eacutecriture autoriseacutee DESC) est une commande qui vient de SQLPlus drsquoOracle etqui a eacuteteacute reprise par MySQL Elle permet drsquoextraire la structure brute drsquoune table ou drsquounevue
DESCRIBE [nomBase] nomTableouVue [colonne]
Si la base nrsquoest pas indiqueacutee il srsquoagit de celle en cours drsquoutilisation Retrouvons la structuredes tables Compagnie et Pilote preacuteceacutedemment creacuteeacutees Le type de chaque colonneapparaicirct
Tableau 1-7 Types de donneacutees binaires
Type Description Commentaire pour une colonne
TINYBLOB(n)
Flot de n octets
Taille fixe (maximum de 255 octets)
BLOB(n) Taille fixe (maximum de 65 535 octets)
MEDIUMBLOB(n) Taille fixe (maximum de 16 meacutegaoctets)
LONGBLOB(n) Taille fixe (maximum de 429 gigaoctets)
Tableau 1-8 Types de donneacutees eacutenumeacuteration
Type Description
ENUM(valeur1valeur2) Liste de 65 535 valeurs au maximum
SET(valeur1valeur2) Ensemble de reacutefeacuterence (maximum de 64 valeurs)
4055_01_C01 Page 29 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
Partie I SQL de base
30 copy Eacuteditions Eyrolles
Restrictions
Les contraintes CHECK deacutefinies ne sont pas encore opeacuterationnelles
La fraction de seconde du type TIME nrsquoest pas encore pris en charge D HHMMSSfrac-tion
Les noms des colonnes doivent ecirctre uniques pour une table donneacutee (il est en revanchepossible drsquoutiliser le mecircme nom de colonne dans plusieurs tables)
Les colonnes de type SET sont eacutevalueacutees par des chaicircnes de caractegraveres seacutepareacutes par des laquo raquo(lsquoAirbus Boeingrsquo) En conseacutequence aucune valeur drsquoun SET ne doit contenir le symbole laquo raquo
Les noms des objets (base tables colonnes contraintes vues etc) ne doivent pas emprunterdes mots-cleacutes de MySQL TABLE SELECT INSERT IFhellip Si vous ecirctes laquo franco-franccedilais raquo celane vous gecircnera pas
Index
Comme lrsquoindex de cet ouvrage vous aide agrave atteindre les pages concerneacutees par un mot recher-cheacute un index MySQL permet drsquoacceacuteleacuterer lrsquoaccegraves aux donneacutees drsquoune table Le but principal
Tableau 1-9 Structure brute des tables
Reacutesultat Commentaires
mysqlgt DESCRIBE Pilote+--------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+--------+-------------+------+-----+---------+-------+| brevet | char(6) | NO | PRI | | || nom | char(15) | YES | UNI | NULL | || nbHVol | double(72) | YES | | NULL | || compa | char(4) | YES | MUL | NULL | |+--------+-------------+------+-----+---------+-------+
Les cleacutes primaires sont NOT NULL (deacutesigneacutees par PRI dans la colonne Key)Les uniciteacutes sont deacutesigneacutees par UNI dans la colonne KeyLes occurrences multiples possibles sont deacutesigneacutees par MUL dans la colonne KeyLes contraintes NOT NULL nommeacutees (deacutefinies via les contraintes CHECK) nrsquoapparaissent pasLa colonne Extra indique notamment les seacutequences (AUTO_INCREMENT)
mysqlgt DESCRIBE Compagnie+---------+----------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+----------+------+-----+---------+-------+| comp | char(4) | NO | PRI | | || nrue | int(3) | YES | | NULL | || rue | char(20) | YES | | NULL | || ville | char(15) | YES | | Paris | || nomComp | char(15) | NO | | | |+---------+----------+------+-----+---------+-------+
4055_01_C01 Page 30 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 31
chapitre ndeg 1 Deacutefinition des donneacutees
drsquoun index est drsquoeacuteviter de parcourir une table seacutequentiellement du premier enregistrementjusqursquoagrave celui viseacute (problegraveme rencontreacute si crsquoest le Franccedilais nommeacute laquo Zidane raquo qursquoon recherchedans une table non indeacutexeacutee de plus de soixante-six millions drsquoenregistrementshellip) Le principedrsquoun index est lrsquoassociation de lrsquoadresse de chaque enregistrement avec la valeur des colonnesindeacutexeacutees
Sans index et pour n enregistrements le nombre moyen drsquoaccegraves neacutecessaire pour trouver uneacuteleacutement est eacutegal agrave n2 Avec un index ce nombre tendra vers log(n) et augmentera donc bienplus faiblement en fonction de la monteacutee en charge des enregistrements Si une table contient1 000 enregistrements alors lrsquousage drsquoun index acceacuteleacuterera lrsquoaccegraves drsquoun facteur 100 par rapportagrave un accegraves seacutequentiel
Arbres balanceacutes
La figure suivante illustre un index sous la forme drsquoun arbre Cet index est baseacute sur la colonnenom de la table Pilote Cette figure est caricaturale car un index nrsquoest pas un arbre binaire(plus de deux liens peuvent partir drsquoun nœud) Dans cet exemple trois accegraves agrave lrsquoindex serontneacutecessaires pour adresser directement un pilote via son nom au lieu drsquoen analyser huit au plus
Un index est associeacute agrave une table et peut ecirctre deacutefini sur une ou plusieurs colonnes (diteslaquo indeacutexeacutees raquo) Une table peut laquo heacuteberger raquo plusieurs index Ils sont mis agrave jour automatique-ment apregraves rafraicircchissement de la table (ajouts et suppressions drsquoenregistrements ou modifica-tion des colonnes indeacutexeacutees) Un index peut ecirctre deacuteclareacute unique si on sait que les valeurs descolonnes indeacutexeacutees seront toujours uniques
Figure 1-3 Index sur la colonne nom
ROWID
Pilote
ROWID brevet nom nbHVol compa
A PL-1 Ameacutelie Sulpice 450 AF B PL-2 Thomas Sulpice 900 AF C PL-3 Paul Soutou 1000 SING D PL-4 Aureacutelia Ente 850 ALIB E PL-5 Agnegraves Bidal 500 SING F PL-6 Sylvie Payrissat 2500 SING G PL-7 Thierry Guibert 600 ALIB H PL-8 Cathy Castaings 400 AF
Index (nom)
E F A D C B H G
nom lt rsquoDrsquo nom ge rsquoDrsquo
lt rsquoAmrsquo ge rsquoAmrsquo
ge rsquoBrsquo lt rsquoBrsquo lt rsquoAjrsquo ge rsquoAjrsquo
ge rsquoTrsquo lt rsquoTrsquo
ge rsquoQrsquo ge rsquoThlrsquo lt rsquoQrsquo ge rsquoThlrsquo
4055_01_C01 Page 31 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
Partie I SQL de base
32 copy Eacuteditions Eyrolles
La plupart des index de MySQL (PRIMARY KEY UNIQUE INDEX et FULLTEXT) sont stoc-keacutes dans des arbres eacutequilibreacutes (balanced trees B-trees) Drsquoautres types drsquoindex existentcitons ceux qui portent sur des colonnes SPATIAL (reverse key R-trees) et ceux appliqueacutesaux tables MEMORY (tables de hachage hash)
La particulariteacute des index B-tree est qursquoils conservent en permanence une arborescence symeacute-trique (balanceacutee) Toutes les feuilles sont agrave la mecircme profondeur Le temps de recherche estainsi agrave peu pregraves constant quel que soit lrsquoenregistrement chercheacute Le plus bas niveau de lrsquoindex(leaf blocks) contient les valeurs des colonnes indexeacutees et le rowid Toutes les feuilles delrsquoindex sont chaicircneacutees entre elles Pour les index non uniques (par exemple si on voulait deacutefinirun index sur la colonne compa de la table Pilote) le rowid est inclus dans la valeur de lacolonne indexeacutee Ces index premiers apparus sont deacutesormais tregraves fiables et performants ilsne se deacutegradent pas lors de la monteacutee en charge de la table
Creacuteation drsquoun index (CREATE INDEX)
Pour pouvoir creacuteer un index dans sa base la table agrave indexer doit appartenir agrave la base Si lrsquoutili-sateur a le privilegravege INDEX il peut creacuteer et supprimer des index dans sa base Un index estcreacuteeacute par lrsquoinstruction CREATE INDEX et supprimeacute par DROP INDEX
La syntaxe de creacuteation drsquoun index est la suivante
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX nomIndex
[USING BTREE | HASH]
ON nomTable (colonne1 [(taille1)] [ASC | DESC])
UNIQUE permet de creacuteer un index qui nrsquoaccepte pas les doublons
FULLTEXT permet de beacuteneacuteficier de fonctions de recherche dans des textes (flot de caractegrave-res)
SPATIAL permet de profiter de fonctions pour les donneacutees geacuteographiques
ASC et DESC preacutecisent lrsquoordre (croissant ou deacutecroissant)
Creacuteons deux index sur la table Pilote
Tableau 1-10 Creacuteations drsquoindex
Instruction SQL Commentaires
CREATE UNIQUE INDEX idx_Pilote_nom3 USING BTREE ON Pilote (nom(3) DESC)
Index B-tree ordre deacutecroissant sur les troispremiers caractegraveres du nom des pilotes
CREATE INDEX idx_Pilote_compa USING BTREE ON Pilote (compa)
Index B-tree ordre croissant sur la colonne cleacuteeacutetrangegravere compa
4055_01_C01 Page 32 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 33
chapitre ndeg 1 Deacutefinition des donneacutees
Bilan
bull Un index ralentit les rafraicircchissements de la base (conseacutequence de la mise agrave jour de lrsquoarbreou des bitmaps) En revanche il acceacutelegravere les accegraves
bull Il est conseilleacute de creacuteer des index sur des colonnes (majoritairement des cleacutes eacutetrangegraveres)utiliseacutees dans les clauses de jointures (voir chapitre 4)
bull Il est possible de creacuteer des index pour toutes les colonnes drsquoune table (jusqursquoagrave concurrencede 16)
bull Les index sont peacutenalisants lorsqursquoils sont deacutefinis sur des colonnes tregraves souvent modifieacutees ousi la table contient peu de lignes
Destruction drsquoun scheacutema
Il vous sera utile drsquoeacutecrire un script de destruction drsquoun scheacutema (jrsquoentends laquo scheacutema raquo commeensemble de tables contraintes et index composant une base de donneacutees et non pas en tantqursquoensemble de tous les objets drsquoun utilisateur) pour pouvoir recreacuteer une base propre Bienentendu si des donneacutees sont deacutejagrave preacutesentes dans les tables et que vous souhaitez les garder ilfaudra utiliser une strateacutegie pour les reacuteimporter dans les nouvelles tables Agrave ce niveau delrsquoouvrage vous nrsquoen ecirctes pas lagrave et le script de destruction va vous permettre de corriger voserreurs de syntaxe du script de creacuteation des tables
Nous avons vu qursquoil fallait creacuteer drsquoabord les tables laquo pegraveres raquo puis les tables laquo fils raquo (si descontraintes sont deacutefinies en mecircme temps que les tables) Lrsquoordre de destruction des tablespour des raisons de coheacuterence est inverse (il faut deacutetruire les tables laquo fils raquo puis les tableslaquo pegraveres raquo) Dans notre exemple il serait malvenu de supprimer la table Compagnie avant latable Pilote En effet la cleacute eacutetrangegravere compa nrsquoaurait plus de sens
Suppression drsquoune table (DROP TABLE)
Pour pouvoir supprimer une table dans une base il faut posseacuteder le privilegravege DROP sur cettebase Lrsquoinstruction DROP TABLE entraicircne la suppression des donneacutees de la structure de ladescription dans le dictionnaire des donneacutees des index des deacuteclencheurs associeacutes (triggers) etla reacutecupeacuteration de la place dans lrsquoespace de stockage
DROP [TEMPORARY] TABLE [IF EXISTS]
[nomBase] nomTable1 [[nomBase2]nomTable2]
[RESTRICT | CASCADE]
4055_01_C01 Page 33 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
Partie I SQL de base
34 copy Eacuteditions Eyrolles
TEMPORARY pour supprimer des tables temporaires Les transactions en cours ne sont pasaffecteacutees Lrsquoutilisation de TEMPORARY peut ecirctre un bon moyen de srsquoassurer qursquoon nedeacutetruit pas accidentellement une table non temporairehellip
IF EXISTS permet drsquoeacuteviter qursquoune erreur se produise si la table nrsquoexiste pas
RESTRICT et CASCADE ne sont pas encore opeacuterationnels Le premier permettra de veacuteri-fier qursquoaucun autre eacuteleacutement nrsquoutilise la table (vue deacuteclencheur etc) Le second reacutepercu-tera la destruction agrave tous les eacuteleacutements reacutefeacuterenceacutes
Les eacuteleacutements qui utilisaient la table (vues synonymes fonctions et proceacutedures) ne sont passupprimeacutes mais sont temporairement inopeacuterants Attention une suppression ne peut pas ecirctrepar la suite annuleacutee
Ordre des suppressions
Il suffit de relire agrave lrsquoenvers le script de creacuteation de vos tables pour en deacuteduire lrsquoordre de sup-pression agrave eacutecrire dans le script de destruction de votre scheacutema
Le tableau suivant preacutesente deux eacutecritures possibles pour deacutetruire des scheacutemas La premiegravereeacutecriture nrsquoest pas encore possible et il reste agrave voir comment drsquoun point de vue des performan-ces MySQL programmera le CASCADE
Tableau 1-11 Scripts eacutequivalents de destruction
Avec CASCADE (pas encore opeacuterationnel) Les laquo fils raquo puis les laquo pegraveres raquo
DROP TABLE Compagnie CASCADEDROP TABLE Pilote
DROP TABLE PiloteDROP TABLE Compagnie
4055_01_C01 Page 34 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 35
chapitre ndeg 1 Deacutefinition des donneacutees
Exercices
Lrsquoobjectif de ces exercices est de creacuteer des tables leur cleacute primaire et des contraintes de veacuteri-fication (NOT NULL et CHECK)
11 Preacutesentation de la base de donneacutees
Une entreprise deacutesire geacuterer son parc informatique agrave lrsquoaide drsquoune base de donneacutees Le bacirctiment estcomposeacute de trois eacutetages Chaque eacutetage possegravede son reacuteseau (ou segment distinct) eacutethernet Cesreacuteseaux traversent des salles eacutequipeacutees de postes de travail Un poste de travail est une machine surlaquelle sont installeacutes certains logiciels Quatre cateacutegories de postes de travail sont recenseacutees(stations Unix terminaux X PC Windows et PC NT) La base de donneacutees devra aussi deacutecrire lesinstallations de logiciels
Les noms et types des colonnes sont les suivants
Tableau 1-12 Caracteacuteristiques des colonnes
Colonne Commentaire Type
indIP trois premiers groupes IP (exemple 13012080) VARCHAR(11)
nomSegment nom du segment VARCHAR(20)
etage eacutetage du segment TINYINT(1)
nSalle numeacutero de la salle VARCHAR(7)
nomSalle nom de la salle VARCHAR(20)
nbPoste nombre de postes de travail dans la salle TINYINT(2)
nPoste code du poste de travail VARCHAR(7)
nomPoste nom du poste de travail VARCHAR(20)
ad dernier groupe de chiffres IP (exemple 11) VARCHAR(3)
typePoste type du poste (UNIX TX PCWS PCNT) VARCHAR(9)
dateIns date drsquoinstallation du logiciel sur le poste dateTIME
nLog code du logiciel VARCHAR(5)
nomLog nom du logiciel VARCHAR(20)
dateAch date drsquoachat du logiciel dateTIME
version version du logiciel VARCHAR(7)
typeLog type du logiciel (UNIX TX PCWS PCNT) VARCHAR(9)
prix prix du logiciel DECIMAL(62)
numIns numeacutero seacutequentiel des installations INTEGER(5)
dateIns date drsquoinstallation du logiciel TIMESTAMP
delai intervalle entre achat et installation SMALLINT
typeLP types des logiciels et des postes VARCHAR(9)
nomType noms des types (Terminaux X PC Windowshellip) VARCHAR(20)
4055_01_C01 Page 35 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
Partie I SQL de base
36 copy Eacuteditions Eyrolles
12 Creacuteation des tables
Eacutecrire puis exeacutecuter le script SQL (que vous appellerez creParcsql) de creacuteation des tables avecleur cleacute primaire (en gras dans le scheacutema suivant) et les contraintes suivantes
bull Les noms des segments des salles et des postes sont non nuls
bull Le domaine de valeurs de la colonne ad srsquoeacutetend de 0 agrave 255
bull La colonne prix est supeacuterieure ou eacutegale agrave 0
bull La colonne dateIns est eacutegale agrave la date du jour par deacutefaut
13 Structure des tables
Eacutecrire puis exeacutecuter le script SQL (que vous appellerez descParcsql) qui affiche la description detoutes ces tables (en utilisant des commandes DESCRIBE) Comparer le reacutesultat obtenu avec lescheacutema ci-dessus
14 Destruction des tables
Eacutecrire puis exeacutecuter le script SQL de destruction des tables (que vous appellerez dropParcsql)Lancer ce script puis celui de la creacuteation des tables agrave nouveau
Figure 1-4 Composition des tables
SegmentindIP nomSegment etage
SallenSalle nomSalle nbPoste indIP
PostenPoste nomPoste indIP ad typePoste nSalle
LogicielnLog nomLog dateAch version typeLog prix
InstallernPoste nLog numIns dateIns delai
TypestypeLP nomType
4055_01_C01 Page 36 Jeudi 2 mars 2006 200 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
37
Chapitre 2
Manipulation des donneacutees
Ce chapitre deacutecrit lrsquoaspect LMD (langage de manipulation des donneacutees) de MySQL Nousverrons que SQL propose trois instructions pour manipuler des donneacutees
lrsquoinsertion drsquoenregistrements
INSERT
la modification de donneacutees
UPDATE
la suppression drsquoenregistrements
DELETE
(et
TRUNCATE
)
Il existe drsquoautres possibiliteacutes que nous ne deacutetaillerons pas dans ce chapitre pour inseacuterer desdonneacutees en utilisant des outils drsquoimportation ou de migration citons MySQL Migration Tool-kit SQLPorter Navicat Intelligent Converters et MySQL Data Import de la socieacuteteacute EMS
Insertions drsquoenregistrements (
INSERT
)
Pour pouvoir inseacuterer des enregistrements dans une table il faut que vous ayez reccedilu le privilegravege
INSERT
Il existe plusieurs possibiliteacutes drsquoinsertion lrsquoinsertion monoligne qui ajoute un enre-gistrement par instruction (que nous allons deacutetailler maintenant) et lrsquoinsertion multiligne quiinsegravere plusieurs enregistrements par une requecircte (que nous deacutetaillerons au chapitre 4)
Syntaxe
La syntaxe simplifieacutee de lrsquoinstruction
INSERT
monoligne est la suivante
INSERT
[LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] [
nomBase
]
nomTable
|
nomVue
[(
nomColonne
)]
VALUES (
expression
| DEFAULT)()
[ON DUPLICATE KEY UPDATE
nomColonne
=
expression
]
DELAYED
indique que lrsquoinsertion est diffeacutereacutee (si la table est modifieacutee par ailleurs leserveur attend qursquoelle se libegravere pour y inseacuterer peacuteriodiquement de nouveaux enregistre-ments si elle redevient active entre-temps)
LOW_PRIORITY
indique que lrsquoinsertion est diffeacutereacutee agrave la libeacuteration complegravete de la table(option agrave ne pas utiliser sur des tables
MyISAM
)
HIGH_PRIORITY
annule lrsquooption
low priority
du serveur
IGNORE
indique que les eacuteventuelles erreurs deacuteclencheacutees suite agrave lrsquoinsertion seront consideacute-reacutees en tant que
warning
s
4055_02_C02 Page 37 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
38
copy Eacuteditions Eyrolles
ON DUPLICATE KEY UPDATE
permet de mettre agrave jour lrsquoenregistrement preacutesent dansla table qui a deacuteclencheacute lrsquoerreur de doublon (dans le cas drsquoun index
UNIQUE
ou drsquounecleacute primaire) Dans ce cas le nouvel enregistrement nrsquoest pas inseacutereacute seul lrsquoancien estmis agrave jour
Agrave lrsquoaide drsquoexemples nous allons deacutetailler les possibiliteacutes de cette instruction en consideacuterant lamajeure partie des types de donneacutees proposeacutes par MySQL
Renseigner toutes les colonnes
Ajoutons trois lignes dans la table
Compagnie
en alimentant toutes les colonnes de la tablepar des valeurs La deuxiegraveme insertion utilise le mot-cleacute
DEFAULT
pour affecter explicitementla valeur par deacutefaut agrave la colonne
ville
La troisiegraveme insertion attribue explicitement la valeur
NULL
agrave la colonne
nrue
Renseigner certaines colonnes
Inseacuterons deux lignes dans la table
Compagnie
en ne preacutecisant pas toutes les colonnes Lapremiegravere insertion affecte implicitement la valeur par deacutefaut agrave la colonne
ville
Ladeuxiegraveme donne implicitement la valeur
NULL
agrave la colonne
nrue
La table
Compagnie
contient agrave preacutesent les lignes suivantes
Tableau 2-1 Insertions
Instruction SQL Commentaires
INSERT INTO Compagnie VALUES (SING 7 Camparols Singapour Singapore AL)
Toutes les valeurs sont renseigneacutees dans lrsquoordre de la structure de la table
INSERT INTO Compagnie VALUES (AC 10 Gambetta
DEFAULT
Air France)
DEFAULT
explicite
INSERT INTO Compagnie VALUES (AN1
NULL
Hoche Blagnac Air Nul1)
NULL
explicite
Web
Tableau 2-2 Insertions de certaines colonnes
Instruction SQL Commentaires
INSERT INTO Compagnie(comp nrue rue nomComp) VALUES (AF 8 Champs Elyseacutees Castanet Air)
DEFAULT
implicite
INSERT INTO Compagnie(comp rue ville nomComp) VALUES (AN2 Foch Blagnac Air Nul2)
NULL
sur
nrue
implicite
Web
4055_02_C02 Page 38 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
39
chapitre ndeg 2 Manipulation des donneacutees
Plusieurs enregistrements
Le script suivant ajoute trois nouvelles compagnies en une seule instruction
INSERT
INSERT INTO Compagnie VALUES
(LUFT9SalasMunichLuftansa)
(QUAN1KangourooSydneyQuantas)
(SNCM3P PaoliBastiaCorse Air)
Ne pas respecter des contraintes
Inseacuterons des enregistrements dans la table
Pilote
qui ne respectent pas des contraintes Le tableausuivant deacutecrit les messages renvoyeacutes pour chaque erreur (le nom de la contrainte apparaicirct danschaque message les valeurs erroneacutees sont noteacutees en gras) La premiegravere erreur vient de la cleacute primairela seconde de lrsquouniciteacute du nom La troisiegraveme erreur signifie que la cleacute eacutetrangegravere reacutefeacuterence une cleacuteprimaire absente (ici une compagnie inexistante) Nous reviendrons sur ce dernier problegraveme dans lasection
Erreur Source du renvoi introuvable
La derniegravere concerne la contrainte en ligne
NOT NULL
Figure 2-1
Table apregraves les insertions
Compagnie
comp nrue rue ville nomComp
SING 7 Camparols Singapour Singapore AL AF 10 Gambetta Paris Air France AN1 Hoche Blagnac Air Nul1 AC 8 Champs Elyseacutees Paris Castanet Air AN2 Foch Blagnac Air Nul2
Valeur par deacutefaut Valeur NULL
Tableau 2-3 Insertions
Insertions veacuterifiant les contraintes Insertions ne veacuterifiant pas les contraintes
INSERT INTO Pilote VALUES (PL-1 Louise Ente 450 AF)
mysqlgt INSERT INTO Pilote VALUES(
PL-1
Ameacutelie Sulpice 100 AF)ERROR
1062
(23000)
Duplicate entry
PL-1 forkey 1
INSERT INTO Pilote VALUES (PL-2 Jules Ente 900 AF)
mysqlgt INSERT INTO Pilote VALUES (PL-4
Louise Ente
450 AF)ERROR
1062
(23000)
Duplicate entry
Louise Ente for key 2
INSERT INTO Pilote VALUES (PL-3 Paul Soutou 1000 SING)
mysqlgt INSERT INTO Pilote VALUES (PL-5 Thomas Sulpice 500
TOTO
)ERROR
1452
(23000) Cannot add or update a child row a foreign key constraint fails (`bdsoutoupilote` CONSTRAINT`fk_Pil_compa_Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))mysqlgt INSERT INTO Pilote VALUES (PL-6
NULL
100 AF)ERROR
1048
(23000) Column nom cannot be null
Web
4055_02_C02 Page 39 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
40
copy Eacuteditions Eyrolles
Donneacutees binaires
Le type BIT permet de manipuler des suites variables de bits Des fonctions sont disponiblespour programmer le laquo ET raquo le laquo OU raquo exclusif ou inclusif etc La table suivante contientdeux colonnes de ce type Notez lrsquoutilisation du preacutefixe laquo b raquo pour initialiser un tel type
CREATE TABLE Registres (nom CHAR(5)numero BIT(2)adresse BIT(16))
INSERT INTO Registres VALUES (COM2 )
Eacutenumeacuterations
Le type ENUM est consideacutereacute comme une liste de chaicircnes de caractegraveres Toute valeur drsquounecolonne de ce type devra appartenir agrave cette liste eacutetablie lors de la creacuteation de la table Suppo-sons qursquoon recense quatre types possibles de diplocircmes (BTS DUT Licence et INSA) pourchaque eacutetudiant On ne stocke qursquoun seul diplocircme par eacutetudiant
Le script de la creacuteation de la table et des insertions est le suivant Notez que les parenthegravesessont optionnelles pour deacutesigner la colonne ENUM
Le type SET permet de comparer une liste agrave une combinaison de valeurs permises agrave partir drsquounensemble de reacutefeacuterence (chaicircnes de caractegraveres) Supposons qursquoon deacutesire stocker plusieursdiplocircmes par eacutetudiant
b10 b0000010011110111
Figure 2-2 Table avec une colonne ENUM
UnCursus
num nom diplome
E1 F Brouard BTS E2 F Degrelle Licence
ENUM
BTS DUT Licence INSA
Tableau 2-4 Insertions avec un ENUM
Creacuteation Insertions (deux bonnes une illicite)
CREATE TABLE UnCursus (num CHAR(4) nom CHAR(15) diplome ENUM CONSTRAINT pk_Cusus PRIMARY KEY(num))
mysqlgt INSERT INTO UnCursus VALUES (E1 F Brouard (BTS))mysqlgt INSERT INTO UnCursus VALUES (E2 F Degrelle Licence)
mysqlgt INSERT INTO UnCursus VALUES (E3 Bug (MathSup))ERROR 1265 (01000) Data truncated for column diplome at row 1
(BTSDUTLicenceINSA)
4055_02_C02 Page 40 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 41
chapitre ndeg 2 Manipulation des donneacutees
Le script de la creacuteation de la table et des insertions est le suivant (mecircme remarque pour lesparenthegraveses)
Dates et heures
Nous avons deacutecrit au chapitre 1 les caracteacuteristiques geacuteneacuterales des types MySQL pour stockerdes eacuteleacutements de type dateheure Eacutetudions maintenant la manipulation de ces types Nousverrons que MySQL peut les consideacuterer soit en tant que chaicircnes de caractegraveres soit commenumeacuteriques
Formats
Concernant les types DATETIME DATE et TIMESTAMP les formats possibles sont lessuivants
Chaicircnes de caractegraveres YYYY-MM-DD HHMMSS ou YY-MM-DD HHMMSS (pour lescolonnes DATE YYYY-MM-DD ou YY-MM-DD) Tout autre deacutelimiteur est autoriseacute comme 20051231 113045 (pour les colonnes DATE 651231 651231 et651231 sont eacutequivalents et deacutesignent tous le reacuteveillon de lrsquoanneacutee 1965)
Consideacutereacutes comme chaicircnes de caractegraveres dans les formats suivants YYYYMMDD-HHMMSS ou YYMMDDHHMMSS (pour les DATE YYYYMMDD ou YYMMDD) ensupposant que la chaicircne ait un sens en tant que date Ainsi 19650205063000 est inter-preacuteteacute comme le 5 feacutevrier 1965 agrave 6 heures et 30 minutes Par contre 19650255 nrsquoa pas desens du fait du jour (il sera interpreacuteteacute comme 0000-00-00)
Figure 2-3 Table avec une colonne SET
Cursus
num nom diplomes
E1 F Brouard BTS Licence E2 F Degrelle Licence INSA DUT
SET
BTS DUT Licence INSA
Tableau 2-5 Insertions avec un SET
Creacuteation Insertions (deux bonnes une illicite)
CREATE TABLE Cursus (num CHAR(4) nom CHAR(15) diplomes SET CONSTRAINT pk_Cusus PRIMARY KEY(num))
mysqlgt INSERT INTO Cursus VALUES (E1 F Brouard )mysqlgt INSERT INTO Cursus VALUES (E2 F Degrelle
mysqlgt INSERT INTO Cursus VALUES (E3 Bug )ERROR 1265 (01000) Data truncated for column diplomes at row 1
(BTSDUTLicenceINSA)
(BTSLicence)
LicenceINSADUT
(BTSINSAENAC)
4055_02_C02 Page 41 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
42 copy Eacuteditions Eyrolles
Consideacutereacutes comme numeacuteriques dans les formats suivants YYYYMMDDHHMMSS ouYYMMDDHHMMSS (pour les DATE YYYYMMDD ou YYMMDD) en supposant que le nombre aitun sens en tant que date Ainsi 19650205063000 est interpreacuteteacute comme le 5 feacutevrier 1965 agrave6 heures et 30 minutes Par contre 19650205069000 nrsquoa pas de sens du fait des minutes (ilsera interpreacuteteacute comme 00000000000000)
Exemple avec DATE et DATETIME
Deacuteclarons la table Pilote qui contient deux colonnes de type dateheure DATE et DATETIME
CREATE TABLE Pilote
(brevet VARCHAR(6) nom VARCHAR(20) dateNaiss DATE
nbHVol DECIMAL(72)dateEmbauche DATETIME compa VARCHAR(4)
CONSTRAINT pk_Pilote PRIMARY KEY(brevet))
Lrsquoinsertion du pilote initialise la date de naissance au 5 feacutevrier 1965 ainsi que celle delrsquoembauche agrave la date du moment (heures minutes secondes) par la fonction SYSDATE
INSERT INTO Pilote
VALUES (PL-1 Christian Soutou 1965-02-05 900 SYSDATE() AF)
Nous verrons au chapitre 4 comment extraire les anneacutees mois jours heures minutes etsecondes Nous verrons aussi qursquoil est possible drsquoajouter ou de soustraire des dates entre elles
Exemple avec TIME et YEAR
Par analogie aux diffeacuterents formats des dates les heures (type TIME HHMMSS ouHHHMMSS) peuvent aussi ecirctre manipuleacutees sous la forme de chaicircnes ou de nombres
Chaicircne D HHMMSSfraction avec le nombre de jours (0 agrave 34) et la fraction deseconde (pas encore opeacuterationnelle) HHMMSSfraction HHMMSS HHMMD HHMMSS D HHMM D HH ou SS
Chaicircne sans les deacutelimiteurs sous reacuteserve que la chaicircne ait un sens Ainsi 101112 estconsideacutereacute comme 101112 mais 109712 est incorrect du fait des minutes ildevient 000000
Nombre en raisonnant comme les chaicircnes Ainsi 101112 est consideacutereacute comme101112 mais 109712 est incorrect du fait des minutes il devient 000000Les formats suivants sont aussi corrects SS MMSS HHMMSS
La table Pilote suivante contient la colonne pasVolDepuis pour stocker le deacutelai depuis ledernier vol et la colonne retraite qui indique lrsquoanneacutee de retraite
CREATE TABLE Pilote
(brevet VARCHAR(6) nom VARCHAR(20) pasVolDepuis TIME retraite YEAR
CONSTRAINT pk_Pilote PRIMARY KEY(brevet))
4055_02_C02 Page 42 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 43
chapitre ndeg 2 Manipulation des donneacutees
Les insertions suivantes utilisent diffeacuterents formats Le premier pilote nrsquoa pas voleacute depuis1 jour et 23 heures (47 heures) le second depuis 15 heures 26 minutes 30 secondes le troi-siegraveme depuis 4 jours et 23 heures (119 heures) le quatriegraveme depuis 3 heures 27 minutes et50 secondes et le dernier se croit plus preacutecis que tous les autres en ajoutant une fraction qui nesera pas prise en compte au niveau de la base
INSERT INTO Pilote VALUES (PL-1 Hait 1 2300 2002)
INSERT INTO Pilote VALUES (PL-2 Crampes 152630 2006)
INSERT INTO Pilote VALUES (PL-3 Tuffery 4 2300 05)
INSERT INTO Pilote VALUES (PL-4 Mercier 032750 07)
INSERT INTO Pilote VALUES (PL-5 Albaric 1 2300457 01)
Lrsquoeacutetat de la base est le suivant
mysqlgt SELECT FROM Pilote
+--------+---------+--------------+----------+
| brevet | nom | pasVolDepuis | retraite |
+--------+---------+--------------+----------+
| PL-1 | Hait | 470000 | 2002 |
| PL-2 | Crampes | 152630 | 2006 |
| PL-3 | Tuffery | 1190000 | 2005 |
| PL-4 | Mercier | 032750 | 2007 |
| PL-5 | Albaric | 470000 | 2001 |
+--------+---------+--------------+----------+
Si un deacutepassement se produit au niveau drsquoune colonne TIME celle-ci est eacutevalueacutee au maximumou au minimum (-8500000 et 9990000 sont respectivement convertis agrave -8385959 et8385959)
Exemple avec TIMESTAMP
Toute colonne du type TIMESTAMP est actualiseacutee agrave chaque modification de lrsquoenregistrement la premiegravere fois agrave lrsquoINSERT puis agrave chaque UPDATE (quelle que soit la colonne mise agrave jour)Deacuteclarons la table Pilote qui contient une colonne de ce type
CREATE TABLE Pilote
(brevet VARCHAR(6) nom VARCHAR(20) misaJour TIMESTAMP
CONSTRAINT pk_Pilote PRIMARY KEY(brevet))
Lrsquoinsertion du pilote suivant initialisera la colonne agrave la date systegraveme (comme SYSDATE)
INSERT INTO Pilote (brevetnom) VALUES (PL-1 Hait)
Par la suite et agrave la diffeacuterence drsquoun type DATE ou DATETIME pour chaque modification de cepilote la colonne misaJour sera reacuteactualiseacutee avec la date de lrsquoinstant de la mise agrave jour
4055_02_C02 Page 43 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
44 copy Eacuteditions Eyrolles
Mecircme si vous croyez mettre agrave NULL cette colonne avec une instruction UPDATE elle contien-dra toujours lrsquoinstant de votre vaine tentative
Fonctions utiles
Les fonctions CURRENT_TIMESTAMP() CURRENT_DATE() et CURRENT_TIME() UTC_TIME() renseignent sur lrsquoinstant la date lrsquoheure et lrsquoheure GMT de la session en cours
Il nrsquoest pas neacutecessaire drsquoutiliser une table pour afficher une expression dans lrsquointerface decommande Lrsquoexemple suivant montre que la requecircte a eacuteteacute exeacutecuteacutee le 1er novembre 2005 agrave10 heures 11 minutes et 27 secondes Le client est sur le fuseau GMT+1h
mysqlgt SELECT CURRENT_TIMESTAMP() CURRENT_TIME() CURRENT_DATE() UTC_TIME()+---------------------+----------------+----------------+------------+| CURRENT_TIMESTAMP() | CURRENT_TIME() | CURRENT_DATE() | UTC_TIME() |+---------------------+----------------+----------------+------------+| 2005-11-01 101127 | 101127 | 2005-11-01 | 091127 |+---------------------+----------------+----------------+------------+
Seacutequences
Bien que laquo seacutequence raquo ne soit pas dans le vocabulaire de MySQL car le meacutecanisme qursquoilpropose nrsquoest pas aussi puissant que celui drsquoOracle MySQL offre la possibiliteacute de geacuteneacutererautomatiquement des valeurs numeacuteriques Ces valeurs sont bien utiles pour composer des cleacutesprimaires de tables quand vous ne disposez pas de colonnes adeacutequates agrave cet effet Ce meacuteca-nisme reacutepond en grande partie agrave ce qursquoon attendrait drsquoune seacutequence
En attendant que MySQL offre peut-ecirctre dans une prochaine version un meacutecanisme plus richeque celui que nous allons eacutetudier je me permets drsquoappeler laquo seacutequence raquo une colonne indexeacuteede type entier (INTEGER SMALLINT TINYINT MEDIUMINT et BIGINT) deacutefinie agrave lrsquoaide de ladirective AUTO_INCREMENT Cette colonne est cleacute primaire ou unique et non nulle Uneseacutequence est en geacuteneacuteral affecteacutee agrave une table mais vous pouvez lrsquoutiliser pour plusieurs tablesou variables
Utilisation en tant que cleacute primaire
La figure suivante illustre la seacutequence appliqueacutee agrave la colonne numAff pour initialiser lesvaleurs de la cleacute primaire de la table Affreter La fonction LAST_INSERT_ID() retournela derniegravere valeur de la seacutequence geacuteneacutereacutee (ici le pas est de 1 la seacutequence deacutebute par deacutefaut agrave 1nous verrons par la suite qursquoil est possible drsquoutiliser une valeur diffeacuterente)
4055_02_C02 Page 44 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 45
chapitre ndeg 2 Manipulation des donneacutees
Le tableau suivant deacutecrit la creacuteation de cette table et diffeacuterentes eacutecritures pour les insertions
Modification drsquoune seacutequence
La seule modification possible drsquoune seacutequence est celle qui consiste agrave changer la valeur dedeacutepart de la seacutequence (avec ALTER TABLE) Seules les valeurs agrave venir de la seacutequence modi-fieacutee seront changeacutees (heureusement pour les donneacutees existantes des tables)
Supposons qursquoon deacutesire continuer agrave inseacuterer des nouveaux affregravetements agrave partir de lavaleur 100 Le prochain affregravetement sera estimeacute agrave 100 et les insertions suivantes prendront encompte le nouveau point de deacutepart tout en laissant intactes les donneacutees existantes des tables
ALTER TABLE Affreter AUTO_INCREMENT = 100
INSERT INTO Affreter (compimmatdateAffnbPax)
VALUES (SING F-NEW SYSDATE() 77)
mysqlgt SELECT FROM Affreter
Figure 2-4 Seacutequence appliqueacutee agrave une cleacute primaire
Affreter numAff comp immat dateAff nbPax
1 AF F-WTSS 13-05-2005 85 2 SING F-GAFU 05-02-2005 155 3 AF F-WTSS 11-09-2005 90 4 AF F-GLFS 11-09-2005 75 AUTO_INCREMENT
LAST_INSERT_ID() rArr 4
Tableau 2-6 Seacutequence pour une cleacute primaire
Table Insertions
CREATE TABLE Affreter( comp CHAR(4) immat CHAR(6) dateAff DATE nbPax SMALLINT(3) CONSTRAINT pk_Affreter PRIMARY KEY (numAff))
INSERT INTO Affreter (compimmatdateAffnbPax) VALUES (AFF-WTSS2005-05-1385)
INSERT INTO Affreter (compimmatdateAffnbPax) VALUES (SINGF-GAFU2005-02-05155)
INSERT INTO Affreter VALUES (NULLAFF-WTSS2005-09-1190)
INSERT INTO Affreter VALUES (0AFF-GLFS2005-09-1175)
numAff SMALLINT AUTO_INCREMENT
4055_02_C02 Page 45 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
46 copy Eacuteditions Eyrolles
+--------+------+--------+------------+-------+
| numAff | comp | immat | dateAff | nbPax |
+--------+------+--------+------------+-------+
| 1 | AF | F-WTSS | 2005-05-13 | 85 |
| 2 | SING | F-GAFU | 2005-02-05 | 155 |
| 3 | AF | F-WTSS | 2005-09-11 | 90 |
| 4 | AF | F-GLFS | 2005-09-11 | 75 |
| 100 | SING | F-NEW | 2005-11-01 | 77 |
+--------+------+--------+------------+-------+
Utilisation en tant que cleacute eacutetrangegravere
Creacuteons deux seacutequences qui vont permettre de donner leur valeur aux cleacutes primaires des deuxtables illustreacutees agrave la figure suivante (les affregravetements commencent agrave 1 les passagers agrave 100)Servons-nous aussi de la seacutequence de la table Affreter pour indiquer le dernier vol dechaque passager La section Inteacutegriteacute reacutefeacuterentielle deacutetaille les meacutecanismes relatifs aux cleacuteseacutetrangegraveres
Le script SQL de deacutefinition et de manipulation des donneacutees est indiqueacute ci-apregraves La valeur dedeacutepart drsquoune seacutequence peut ecirctre deacutefinie agrave la fin de lrsquoordre CREATE TABLE Notez eacutegalementlrsquoutilisation de la fonction LAST_INSERT_ID dans les insertions pour reacutecupeacuterer la valeur dela cleacute primaire
Figure 2-5 Seacutequence appliqueacutee agrave une cleacute eacutetrangegravere
Affreter
numAff comp immat dateAff nbPax
1 AF F-WTSS 13-05-2005 85 2 SING F-GAFU 05-02-2005 155 3 AF F-WTSS 15-05-2005 82 AUTO_INCREMENT
LAST_INSERT_ID() rArr 3
Passager
numPax nom siege dernierVol
100 Payrissat 7A 2 101 Castaings 2E 3
AUTO_INCREMENT
LAST_INSERT_ID() rArr 101
4055_02_C02 Page 46 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 47
chapitre ndeg 2 Manipulation des donneacutees
Modifications de colonnes
Lrsquoinstruction UPDATE permet la mise agrave jour des colonnes drsquoune table Pour pouvoir modifierdes enregistrements drsquoune table il faut que cette derniegravere soit dans votre base ou que vousayez reccedilu le privilegravege UPDATE sur la table
Syntaxe (UPDATE)
La syntaxe simplifieacutee de lrsquoinstruction UPDATE est la suivante
UPDATE [LOW_PRIORITY] [IGNORE] [nomBase] nomTable
SET col_name1=expr1 [ col_name2=expr2 ]
SET colonne1 = expression1 | (requecircte_SELECT) | DEFAULT
[colonne2 = expression2]
[WHERE (condition)]
[ORDER BY listeColonnes]
[LIMIT nbreLimite]
LOW_PRIORITY indique que la modification est diffeacutereacutee agrave la libeacuteration complegravete de latable (option agrave ne pas utiliser sur des tables MyISAM)
IGNORE signifie que les eacuteventuelles erreurs deacuteclencheacutees suite aux modifications serontconsideacutereacutees en tant que warnings
La clause SET actualise une colonne en lui affectant une expression (valeur valeur pardeacutefaut calcul ou reacutesultat drsquoune requecircte)
Tableau 2-7 Seacutequence pour une cleacute eacutetrangegravere
Tables Insertions
CREATE TABLE Affreter( comp CHAR(4) immat CHAR(6) dateAff DATEnbPax SMALLINT(3) CONSTRAINT pk_Affreter PRIMARY KEY (numAff))
CREATE TABLE Passager( nom CHAR(15) siege CHAR(4) dernierVol SMALLINTCONSTRAINT pk_Passager PRIMARY KEY(numPax)CONSTRAINT fk_Pax_vol_Affreter FOREIGN KEY (dernierVol) REFERENCES Affreter(numAff))
INSERT INTO Affreter (compimmatdateAffnbPax) VALUES(AFF-WTSS2005-05-1385)
INSERT INTO Affreter (compimmatdateAffnbPax) VALUES(SINGF-GAFU2005-02-05155)
INSERT INTO Passager VALUES (NULLPayrissat7ALAST_INSERT_ID())
INSERT INTO Affreter VALUES (NULLAFF-WTSS2005-05-1582)
INSERT INTO Passager VALUES (NULLCastaings2ELAST_INSERT_ID())
WebnumAff SMALLINT AUTO_INCREMENT
numPax SMALLINT AUTO_INCREMENT
AUTO_INCREMENT = 100
4055_02_C02 Page 47 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
48 copy Eacuteditions Eyrolles
La condition du WHERE filtre les lignes agrave mettre agrave jour dans la table Si aucune conditionnrsquoest preacuteciseacutee tous les enregistrements seront actualiseacutes Si la condition ne filtre aucuneligne aucune mise agrave jour ne sera reacutealiseacutee
ORDER BY indique lrsquoordre de modification des colonnes
LIMIT speacutecifie le nombre maximum drsquoenregistrements agrave changer (par ordre de cleacuteprimaire croissante)
Modification drsquoune colonne
Modifions la compagnie de code AN1 en affectant la valeur 50 agrave la colonne nrue
UPDATE Compagnie SET nrue = 50 WHERE comp = AN1
Modification de plusieurs colonnes
Modifions la compagnie de code AN2 en affectant simultaneacutement la valeur 14 agrave la colonnenrue et la valeur par deacutefaut (Paris) agrave la colonne ville
UPDATE Compagnie SET nrue = 14 ville = DEFAULT WHERE comp = AN2
La table Compagnie contient agrave preacutesent les donneacutees suivantes
Modification de plusieurs enregistrements
Modifions les deux premiegraveres compagnies (par ordre de cleacute primaire ici AC et AF) en affec-tant la valeur Toulouse agrave la colonne ville
UPDATE Compagnie SET ville = Toulouse LIMIT 2
Ne pas respecter les contraintes
Il faut comme pour les insertions respecter les contraintes qui existent au niveau des colon-nes Dans le cas inverse une erreur est renvoyeacutee (le nom de la contrainte apparaicirct) et la mise agravejour nrsquoest pas effectueacutee
Figure 2-6 Table apregraves les modifications
Compagnie
comp nrue rue ville nomComp
SING 7 Camparols Singapour Singapore AL AF 10 Gambetta Paris Air France AN1 50 Hoche Blagnac Air Nul1 AC 8 Champs Elyseacutees Paris Castanet Air AN2 14 Foch Paris Air Nul2
Modifications 2
Modification 1
4055_02_C02 Page 48 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 49
chapitre ndeg 2 Manipulation des donneacutees
Agrave partir de la table Pilote le tableau suivant deacutecrit des modifications (certaines ne veacuterifientpas de contraintes) La mise agrave jour drsquoune cleacute eacutetrangegravere est possible si elle nrsquoest pas reacutefeacuterenceacuteepar une cleacute primaire (voir la section Inteacutegriteacute reacutefeacuterentielle)
Tableau 2-8 Table donneacutees et contraintes
Donneacutees Table et contraintes
Figure 2-7 Donneacutees CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) NOT NULL nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) CONSTRAINT ck_nbHVol CHECK (nbHVol BETWEEN 0 AND 20000) CONSTRAINT un_nom UNIQUE(nom) CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp))
Web
Pilote
brevet nom nbHVol compa
PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING
Tableau 2-9 Modifications
Veacuterifiant les contraintes (sauf une ) Ne veacuterifiant pas les contraintes
--Modification drsquoune cleacute eacutetrangegravereUPDATE Pilote SET compa = SING WHERE brevet = PL-2
-- Modification drsquoune cleacute primaireUPDATE Pilote SET brevet = PL3bis WHERE brevet = PL-3
--Passe outre la contrainte CHECK UPDATE Pilote SET nbHVol= 30000 WHERE brevet = PL-1
Figure 2-8 Apregraves modifications
mysqlgt UPDATE Pilote SET brevet=PL-2 WHERE brevet=PL-1ERROR 1062 (23000) Duplicate entry PL-2 for key 1
mysqlgt UPDATE Pilote SET nom = NULL WHERE brevet = PL-1ERROR 1263 (22004) Column set to default value NULL supplied to NOT NULL column nom at row 1
mysqlgt UPDATE Pilote SET nom=Paul Soutou WHERE brevet = PL-1ERROR 1062 (23000) Duplicate entry Paul Soutou for key 2
mysqlgt UPDATE Pilote SET compa=TOTO WHERE brevet = PL-1ERROR 1452 (23000) Cannot add or update a child row a foreign key constraint fails (`bdsoutoupilote` CONSTRAINT fk_Pil_compa_Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))
Web
Pilote
brevet nom nbHVol compa
PL-1 Louise Ente 30000 AF PL-2 Jules Ente 900 SING PL3bis Paul Soutou 1000 SING
4055_02_C02 Page 49 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
50 copy Eacuteditions Eyrolles
Restrictions
Pour lrsquoheure il nrsquoest pas possible de modifier une table en utilisant une requecircte (dans la clauseSET) portant sur cette mecircme table
Dates et intervalles
Le tableau suivant reacutesume les principales opeacuterations possibles entre des colonnes de type date-heure
Consideacuterons la table suivante
CREATE TABLE Pilote
(brevet VARCHAR(6) nom VARCHAR(20) dateNaiss DATETIME dernierVol DATE
dateEmbauche DATETIME prochainVolControle DATETIME
nombreJoursNaisBoulot INTEGER(5)
intervalleNaisBoulot Decimal (206) intervalleVolExterieur
Decimal (106)
intervalleEntreVols Decimal (106) intervalleEmbaucheControle
TIME
compa VARCHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet))
Agrave lrsquoinsertion du pilote Thierry Albaric de la compagnie de code AF initialisons sa date denaissance (25 mars 1967) la date de son dernier vol (30 octobre 2005) sa date drsquoembauche (agravecelle du jour) et la date de son prochain controcircle en vol (13 novembre 2005 15h30)
INSERT INTO Pilote VALUES
(PL-1 Thierry Albaric1967-03-252005-10-30 SYSDATE()
2005-11-13 153000 NULL NULL NULL NULL NULL AF)
Les mises agrave jour par UPDATE sur cet enregistrement vont consister sur la base de ces quatredates agrave calculer les intervalles illustreacutes agrave la figure suivante
Tableau 2-10 Opeacuterations entre colonnes date-heure
Opeacuterande 1 Opeacuterateur Opeacuterande 2 Reacutesultat
DATE | DATETIME + ou - Interval DATE | DATETIME
DATE | DATETIME + ou - INTEGER DATE | DATETIME
TIME + ou - TIME TIME
TIME + ou - INTEGER TIME
Web
4055_02_C02 Page 50 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 51
chapitre ndeg 2 Manipulation des donneacutees
Modification drsquoune heure
On modifie une date en preacutecisant une heure via la fonction en rajoutant le format HHMMSSquels que soient les deacutelimiteurs (ici laquo raquo)
UPDATE Pilote SET dateNaiss = 1967-03-25 123500
WHERE brevet = PL-1
Ajout drsquoun deacutelai
On modifie la date drsquoembauche de 10 minutes apregraves la semaine prochaine Lrsquoajout drsquoun inter-valle srsquoopegravere par la fonction DATE_ADD coupleacutee agrave la directive DAY_MINUTE qui permet despeacutecifier un jour une heure et une minute Ainsi la semaine agrave ajouter correspond au laquo 7 raquo duparamegravetre de mecircme pour les 10 minutes
UPDATE Pilote
SET dateEmbauche =
WHERE brevet = PL-1
Diffeacuterence entre deux dates
La diffeacuterence entre deux dates peut se programmer agrave lrsquoaide de la fonction DATEDIFF quirenvoie un entier correspondant au nombre de jours seacuteparant les deux dates
UPDATE Pilote
SET nombreJoursNaisBoulot =
WHERE brevet = PL-1
Cette mecircme diffeacuterence au format drsquoun intervalle plus preacutecis (nombre de jours deacutecimaux) requiertlrsquoutilisation de la fonction TIMESTAMPDIFF(intervalledatetime1datetime2) quenous eacutetudierons au chapitre 4 (il existe bien sucircr drsquoautres possibiliteacutes de programmation) Cettefonction effectue la diffeacuterence entre deux dates suivant un format drsquointervalle donneacute (ici onobtient des secondes qursquoon divise par (243600) pour convertir en jours)
Figure 2-9 Intervalles agrave calculer
dateNais 2351967 qui passe agrave 12h35
dernierVol 30-10-2005
dateEmbauche 02-11-2005 x h y min qui passe agrave 09-11-2005 x h y+10 min
prochainVolControle13-11-2005 15h30
nombreJoursNaisBoulot
intervalleNaisBoulot
intervalleVolExterieur
intervalleEntreVols
intervalleEmbaucheControle
DATE_ADD(dateEmbaucheINTERVAL 7 010 DAY_MINUTE)
DATEDIFF(dateEmbauchedateNaiss)
4055_02_C02 Page 51 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
52 copy Eacuteditions Eyrolles
UPDATE Pilote SET
intervalleNaisBoulot =
intervalleEntreVols =
intervalleVolExterieur =
WHERE brevet = PL-1
Diffeacuterence entre deux intervalles
La diffeacuterence entre deux deacutecimaux renvoie un deacutecimal qursquoon convertit en format TIME (srsquoilest infeacuterieur agrave 839 h soit 3495 jours) par la fonction SEC_TO_TIME apregraves lrsquoavoir changeacute ensecondes (multiplieacute par 243600)
UPDATE Pilote SET
intervalleEmbaucheControle =
WHERE brevet = PL-1
La ligne contient deacutesormais les informations suivantes Les donneacutees en gras correspondentaux mises agrave jour On trouve qursquoil a fallu 14 109126875 jours pour que ce pilote soit embau-cheacute 106511181 jours seacuteparent le dernier vol du pilote du moment de son embauche14645833 jours seacuteparent son dernier vol de son prochain controcircle en vol La diffeacuterence entreces deux deacutelais est de 95 heures 52 minutes et 18 secondes
Nous verrons au chapitre 4 comment convertir en jours heures minutes et secondes un deacuteci-mal de grande taille
Figure 2-10 Ligne modifieacutee par des calculs de dates
TIMESTAMPDIFF(SECONDdateNaissdateEmbauche)(243600)
TIMESTAMPDIFF(SECONDdernierVolprochainVolControle)(243600)
TIMESTAMPDIFF(SECONDdernierVoldateEmbauche)(243600)
SEC_TO_TIME((intervalleEntreVols - intervalleVolExterieur)243600)
Pilote
brevet nom dateNaiss dernierVol dateEmbauche prochainVolControle
PL-1 Thierry Albaric 1967-03-25 1967-03-25 123500
2005-10-30 2005-11-02 152742 2005-11-09 153742
2005-11-13 153000
nombreJoursNaisBoulot intervalleNaisBoulot intervall eVolExterieur
13186 1596 14109126875 10651181
intervalleEntreVols intervalleEmbaucheControle compa
14645833 955218 AF
4055_02_C02 Page 52 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 53
chapitre ndeg 2 Manipulation des donneacutees
Fonctions utiles
Les fonctions suivantes vous seront drsquoun grand secours pour manipuler des dates et des intervalles
bull DATE_FORMAT(dateformat) convertit une date (heure) suivant un certain format
bull EXTRACT(type FROM date) extrait une partie donneacutee drsquoune date (heure)
bull FROM_DAYS(n) retourne une date agrave partir drsquoun entier (le 110001 correspond agrave 366) UNIX_TIMESTAMP(date) retourne le nombre de secondes qui se sont eacutecouleacutees depuis le1er janvier 1970 jusqursquoagrave la date (heure) en paramegravetre
bull GET_FORMAT(DATE|TIME|DATETIMEEUR|USA|JIS|ISO|INTERNAL)retourne un format de date (heure)
bull SEC_TO_TIME(secondes) convertit un nombre en un type TIME et son inverse TIME_TO_SEC(time)
bull STR_TO_DATE(chaineformat) convertit une chaicircne en date (heure) suivant un certain format
bull TIME(expression)extrait drsquoune date (heure) un type TIME
bull TIME_FORMAT(timeformat) convertit un intervalle suivant un certain format
Les tableaux suivants preacutesentent quelques exemples drsquoutilisation de ces fonctions
Tableau 2-11 Quelques formats pour DATE_FORMAT et STR_TO_DATE
Expression Reacutesultat Commentaire
DATE_FORMAT(SYSDATE()j) 306 Ce nrsquoest pas la vitesse de Danieldans Taxi2 mais le numeacutero du jourde lrsquoanneacutee (ici il srsquoagit du2 novembre 2005)
DATE_FORMAT(dateNaissW en M X)
Saturday en March 1967
Affichage des libelleacutes des jours etdes mois en anglais par deacutefaut
STR_TO_DATE(11092005 153742dmY His)
2005-09-11 153742 Conversion drsquoune chaicircne typeacutee datefranccedilaise au format DATETIME
Tableau 2-12 Utilisation de EXTRACT et UNIX_TIMESTAMP
Expression Reacutesultat Commentaire
EXTRACT(DAY FROM dateEmbauche) 9 Extraction du jour contenu dans la colonne
EXTRACT(MONTH FROM dateNaiss) 3 Extraction du mois contenu dans la colonne
UNIX_TIMESTAMP(SYSDATE())(243600) 130898850 Le 2 novembre 2005 au soir 13 089 jours etdes poussiegraveres srsquoeacutetaient eacutecouleacutes depuis1970
4055_02_C02 Page 53 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
54 copy Eacuteditions Eyrolles
Remplacement drsquoun enregistrement
Lrsquoinstruction REPLACE consiste comme son nom lrsquoindique agrave remplacer un enregistrementdans sa totaliteacute (toutes ses colonnes) Il faut avoir les privilegraveges INSERT et DELETE sur latable Crsquoest selon la valeur de la cleacute primaire ou celle drsquoun index unique que lrsquoenregistrementsera remplaceacute
Si la table ne dispose pas drsquoune contrainte PRIMARY KEY ou UNIQUE lrsquoutilisation de REPLACEnrsquoa pas de sens et devient eacutequivalente agrave INSERT
La syntaxe simplifieacutee de lrsquoinstruction UPDATE est la suivante
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] [nomBase] nomTable [(colonne1)]
VALUES (expression1 | DEFAULT) [()]
LOW_PRIORITY et DELAYED ont la mecircme signification que pour INSERT et UPDATE
VALUES contient les valeurs de remplacement
Lrsquoinstruction suivante remplace lrsquoenregistrement relatif agrave la compagnie de code AN1 (voirfigure 2-6)
REPLACE INTO Compagnie VALUES (AN1 24 Salas Ramonville Air RENATO)
Suppressions drsquoenregistrements
Les instructions DELETE et TRUNCATE permettent de supprimer un ou plusieurs enregistre-ments drsquoune table Pour pouvoir supprimer des enregistrements dans une table il faut quecette derniegravere soit dans votre base ou que vous ayez reccedilu le privilegravege DELETE sur la table
Instruction DELETELa syntaxe simplifieacutee de lrsquoinstruction DELETE est la suivante
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM [nomBase] nomTable
[WHERE (condition)]
[ORDER BY listeColonnes]
[LIMIT nbreLimite]
LOW_PRIORITY IGNORE et LIMIT ont la mecircme signification que pour UPDATE
4055_02_C02 Page 54 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 55
chapitre ndeg 2 Manipulation des donneacutees
QUICK (pour les tables de type MyISAM) ne met pas agrave jour les index associeacutes pour acceacuteleacutererle traitement
La condition du WHERE seacutelectionne les lignes agrave supprimer dans la table Si aucune condi-tion nrsquoest preacuteciseacutee toutes les lignes seront deacutetruites Si la condition ne seacutelectionne aucuneligne aucun enregistrement ne sera supprimeacute
ORDER BY reacutealise un tri des enregistrements qui seront effaceacutes dans cet ordre
Deacutetaillons les possibiliteacutes de cette instruction en consideacuterant les diffeacuterentes tables preacuteceacutedem-ment deacutefinies La premiegravere commande supprime tous les pilotes de la compagnie de code AFla seconde avec une autre eacutecriture deacutetruit la compagnie de code AF
DELETE FROM Pilote WHERE compa = AF
DELETE FROM Compagnie WHERE comp = AF
Tentons de supprimer une compagnie qui est reacutefeacuterenceacutee par un pilote agrave lrsquoaide drsquoune cleacute eacutetran-gegravere Il srsquoaffiche une erreur qui sera expliqueacutee dans la section Inteacutegriteacute reacutefeacuterentielle
mysqlgt DELETE FROM Compagnie WHERE comp = SING
ERROR 1451 (23000) Cannot delete or update a parent row a foreign
key constraint fails (`bdsoutoupilote` CONSTRAINT `fk_Pil_compa_
Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))
Deacutetruisons enfin les deux premiegraveres compagnies (trieacutees par ordre croissant de cleacute ici AC etAN1) qui ne sont reacutefeacuterenceacutees par aucun pilote
DELETE FROM Compagnie LIMIT 2
Instruction TRUNCATELa commande TRUNCATE est une extension de SQL qui a eacuteteacute proposeacutee par Oracle et reprisepar MySQL Cette commande supprime tous les enregistrements drsquoune table et libegravere eacuteven-tuellement lrsquoespace de stockage utiliseacute par la table La syntaxe est la suivante
TRUNCATE [TABLE] [nomBase] nomTable
Avec le moteur InnoDB lrsquoopeacuteration est programmeacutee en DELETE Pour les autres moteurslrsquoopeacuteration diffegravere de DELETE de la maniegravere suivante
La table est supprimeacutee (DROP) puis recreacuteeacutee (CREATE) ce qui est plus rapide que dedeacutetruire les enregistrements un agrave un
Lrsquoopeacuteration peut ecirctre interrompue si une transaction active utilise la table (ou si un verrouest poseacute)
Le nombre drsquoenregistrements supprimeacutes nrsquoest pas retourneacute
Lrsquoeacuteventuelle derniegravere valeur drsquoune colonne AUTO_INCREMENT nrsquoest pas meacutemoriseacutee
Web
4055_02_C02 Page 55 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
56 copy Eacuteditions Eyrolles
Il nrsquoest pas possible de laquo tronquer raquo une table qui est reacutefeacuterenceacutee par des cleacutes eacutetrangegraveres acti-ves La solution consiste agrave deacutesactiver les contraintes puis agrave tronquer la table
Inteacutegriteacute reacutefeacuterentielle
Lrsquointeacutegriteacute reacutefeacuterentielle forme le cœur de la coheacuterence drsquoune base de donneacutees relationnelleCette inteacutegriteacute est fondeacutee sur la relation entre cleacutes eacutetrangegraveres et cleacutes primaires (ou candidates colonnes indexeacutees uniques et non nulles) qui permettent de programmer des regravegles de gestion(exemple lrsquoaffregravetement drsquoun vol doit se faire par une compagnie et pour un avion tous deuxexistant dans la base de donneacutees) Ce faisant la plupart des controcircles cocircteacute client (interface)sont ainsi deacuteporteacutes cocircteacute serveur
Pour les regravegles de gestion plus complexes (exemple lrsquoaffregravetement drsquoun avion doit se faire parune compagnie qui a embaucheacute au moins quinze pilotes dans les six derniers mois) il faudraprogrammer un deacuteclencheur (deacutecrits au chapitre 7) Il faut savoir que les deacuteclencheurs sontplus peacutenalisants que des contraintes dans un mode transactionnel
La contrainte reacutefeacuterentielle concerne toujours deux tables ndash une table laquo pegravere raquo aussi dite laquo maicirctre raquo(parentreferenced) et une table laquo fils raquo (childdependent) ndash posseacutedant une ou plusieurs colonnesen commun Pour la table laquo pegravere raquo ces colonnes composent la cleacute primaire (ou candidate avec unindex unique) Pour la table laquo fils raquo ces colonnes composent une cleacute eacutetrangegravere
Syntaxe
Crsquoest seulement dans sa version 32344 en 2002 (dix ans apregraves Oracle) que MySQL a inclusdans son offre les contraintes reacutefeacuterentielles pour les tables InnoDB Lrsquointeacutegriteacute reacutefeacuterentielle seprogramme dans la table laquo fils raquo par la contrainte suivante Il est conseilleacute de nommer lacontrainte sinon MySQL srsquoen charge Si la cleacute eacutetrangegravere nrsquoest pas deacutejagrave indexeacutee MySQL srsquoencharge aussi Les deux tables ne doivent pas ecirctre temporaires
[CONSTRAINT nomContrainte] FOREIGN KEY [id] (listeColonneEnfant)
REFERENCES nomTable (listeColonneParent)
[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]
[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]
Coheacuterences assureacutees
Lrsquoexemple suivant illustre quatre contraintes reacutefeacuterentielles Une table peut ecirctre laquo pegravere raquo pourune contrainte et laquo fils raquo pour une autre (crsquoest le cas de la table Avion)
Web
4055_02_C02 Page 56 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 57
chapitre ndeg 2 Manipulation des donneacutees
Deux types de problegravemes sont automatiquement reacutesolus par MySQL pour assurer lrsquointeacutegriteacutereacutefeacuterentielle
bull La coheacuterence du laquo fils raquo vers le laquo pegravere raquo on ne doit pas pouvoir inseacuterer un enregistrementlaquo fils raquo (ou modifier sa cleacute eacutetrangegravere) rattacheacute agrave un enregistrement laquo pegravere raquo inexistant Il estcependant possible drsquoinseacuterer un laquo fils raquo (ou de modifier sa cleacute eacutetrangegravere) sans rattacherdrsquoenregistrement laquo pegravere raquo agrave la condition qursquoil nrsquoexiste pas de contrainte NOT NULL auniveau de la cleacute eacutetrangegravere
bull La coheacuterence du laquo pegravere raquo vers le laquo fils raquo on ne doit pas pouvoir supprimer un enregistre-ment laquo pegravere raquo si un enregistrement laquo fils raquo y est encore rattacheacute Il est possible de suppri-mer les laquo fils raquo associeacutes (DELETE CASCADE) drsquoaffecter la valeur nulle aux cleacutes eacutetrangegraveresdes laquo fils raquo associeacutes (DELETE SET NULL) ou de reacutepercuter une modification de la cleacute pri-maire du pegravere (UPDATE CASCADE et UPDATE SET NULL)
Deacuteclarons agrave preacutesent ces contraintes sous MySQL en deacutetaillant les options disponibles
Contraintes cocircteacute laquo pegravere raquo
Le tableau suivant illustre les deux possibiliteacutes (cleacute primaire ou candidate) dans le cas de latable Compagnie Notons que pour le cas de la cleacute candidate une cleacute primaire peut ecirctre deacutefi-nie par ailleurs (sur nomComp par exemple)
Figure 2-11 Inteacutegriteacute reacutefeacuterentielle
Compagnie
comp nrue rue ville nomComp
AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL
Affreter
compAff immat dateAff nbPax
AF F-WTSS 2005-05-13 85 SING F-GAFU 2005-02-05 155 AF F-WTSS 2005-05-15 82
Pilote
brevet nom nbHVol compa
PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING
Avion
immat typeAvion nbHVol proprio
F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING
dependent child referenced parent
referenced parent
dependent child dependent child NOT NULL
4055_02_C02 Page 57 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
58 copy Eacuteditions Eyrolles
Contraintes cocircteacute laquo fils raquo
Indeacutependamment de lrsquoeacutecriture de la table laquo pegravere raquo plusieurs eacutecritures sont possibles au niveaude la table laquo fils raquo selon qursquoon creacuteeacute les index ou qursquoon laisse MySQL le faire et selon qursquoonnomme ou pas la contrainte de cleacute eacutetrangegravere
La premiegravere eacutecriture nomme la contrainte mais ne preacutecise rien agrave propos de lrsquoindex Ladeuxiegraveme ne nomme pas la contrainte mais deacutefinit lrsquoindex (sans option toutefois) Lrsquoeacutecritureagrave adopter est un meacutelange des deux agrave savoir nommer les contraintes et deacutecrire les index
Cleacutes composites et nulles
Les cleacutes eacutetrangegraveres ou primaires peuvent ecirctre deacutefinies sur plusieurs colonnes (16 au maxi-mum) on parle de composite keys
Des cleacutes eacutetrangegraveres peuvent ecirctre nulles (si elles ne font pas partie drsquoune cleacute primaire) siaucune contrainte NOT NULL nrsquoest deacuteclareacutee
Deacutecrivons agrave preacutesent le script SQL qui convient agrave notre exemple (la syntaxe de creacuteation desdeux premiegraveres tables a eacuteteacute discuteacutee plus haut) et eacutetudions ensuite les meacutecanismes program-meacutes par ces contraintes Deacutecidons qursquoun avion aura toujours un proprieacutetaire (NOT NULL)
Tableau 2-13 Eacutecritures des contraintes de la table laquo pegravere raquo
Cleacute primaire Cleacute candidate
CREATE TABLE Compagnie(comp CHAR(4) nrue INTEGER(3) rue CHAR(20) ville CHAR(15) nomComp CHAR(15) CONSTRAINT pk_Compagnie PRIMARY KEY(comp))
CREATE TABLE Compagnie(comp CHAR(4) NOT NULL nrue INTEGER(3) rue CHAR(20) ville CHAR(15) nomComp CHAR(15) CONSTRAINT un_Compagnie UNIQUE(comp) CONSTRAINT pk_Compagnie PRIMARY KEY(nomComp))
Tableau 2-14 Eacutecritures des contraintes de la table laquo fils raquo
Contrainte nommeacutee sans index Contrainte pas nommeacutee et index
CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp))
CREATE TABLE Pilote(brevet CHAR(6) nom CHAR(15) nbHVol DECIMAL(72) compa CHAR(4) CONSTRAINT pk_Pilote PRIMARY KEY(brevet) INDEX (compa) FOREIGN KEY (compa) REFERENCESCompagnie(comp))
4055_02_C02 Page 58 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 59
chapitre ndeg 2 Manipulation des donneacutees
CREATE TABLE Avion
(immat CHAR(6) typeAvion CHAR(15) nbhVol DECIMAL(102)
proprio CHAR(4) NOT NULL CONSTRAINT pk_Avion PRIMARY KEY(immat)
INDEX (proprio)
CONSTRAINT fk_Avion_comp_Compag
FOREIGN KEY(proprio) REFERENCES Compagnie(comp))
CREATE TABLE Affreter
(compAff CHAR(4) immat CHAR(6) dateAff DATE nbPax INTEGER(3)
CONSTRAINT pk_Affreter PRIMARY KEY (compAff immat dateAff)
INDEX (immat)
CONSTRAINT fk_Aff_na_Avion
FOREIGN KEY(immat) REFERENCES Avion(immat)
INDEX (compAff)
CONSTRAINT fk_Aff_comp_Compag
FOREIGN KEY(compAff) REFERENCES Compagnie(comp))
Coheacuterence du fils vers le pegravere
Si la cleacute eacutetrangegravere est deacuteclareacutee NOT NULL lrsquoinsertion drsquoun enregistrement laquo fils raquo nrsquoest possibleque srsquoil est rattacheacute agrave un enregistrement laquo pegravere raquo existant Dans le cas inverse lrsquoinsertion drsquounenregistrement laquo fils raquo rattacheacute agrave aucun laquo pegravere raquo est possible
Le tableau suivant deacutecrit des insertions correctes et une incorrecte Le message drsquoerreur est icien anglais (il y est question de ne pouvoir ajouter un enregistrement laquo fils raquo)
Pour inseacuterer un affregravetement il faut donc avoir ajouteacute au preacutealable au moins une compagnie etun avion Le chargement de la base de donneacutees est conditionneacute par la hieacuterarchie des contrain-tes reacutefeacuterentielles Ici il faut inseacuterer drsquoabord les compagnies puis les pilotes (ou les avions)enfin les affregravetements
Tableau 2-15 Insertions correctes et incorrectes
Insertions correctes Insertion incorrecte
-- fils avec pegravere INSERT INTO Pilote VALUES (PL-3 Paul Soutou 1000 SING)-- fils sans pegravereINSERT INTO Pilote VALUES (PL-4 Un Connu 0 NULL)-- fils avec pegraveresINSERT INTO Avion VALUES (F-WTSS Concorde 6570 SING)INSERT INTO Affreter VALUES(AF F-WTSS 15-05-2003 82)
-- avec pegravere inconnumysqlgt INSERT INTO Pilote VALUES (PL-5 Pb de Compagnie 0 )
ERROR 1452 (23000) Cannot add or update a child row a foreign key constraint fails (`bdsoutoupilote` CONSTRAINT`fk_Pil_compa_Comp` FOREIGN KEY (`compa`) REFERENCES `compagnie` (`comp`))
Web
4055_02_C02 Page 59 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
60 copy Eacuteditions Eyrolles
Il suffit de relire le script de creacuteation de vos tables pour en deacuteduire lrsquoordre drsquoinsertion des enre-gistrements
Coheacuterence du pegravere vers le fils
En fonction des options choisies au niveau de la contrainte reacutefeacuterentielle se trouvant dans latable laquo fils raquo
CONSTRAINT nomContrainte FOREIGN KEY hellip REFERENCES hellip
plusieurs sceacutenarios sont possibles pour assurer la coheacuterence de la table laquo pegravere raquo vers la table laquo fils raquo
Preacutevenir la modification ou la suppression drsquoune cleacute primaire (ou candidate) de la tablelaquo pegravere raquo Cette alternative est celle par deacutefaut Soit vous nrsquoajoutez pas drsquooption agrave la clauseREFERENCES ndash dans notre exemple toutes les cleacutes eacutetrangegraveres sont ainsi composeacutees ndash soitvous utilisez NO ACTION pour les directives ON DELETE et ON UPDATE La suppressiondrsquoun avion nrsquoest donc pas possible si ce dernier est reacutefeacuterenceacute dans un affregravetement
Propager la suppression des enregistrements laquo fils raquo associeacutes agrave lrsquoenregistrement laquo pegravere raquosupprimeacute Ce meacutecanisme est reacutealiseacute par la directive ON DELETE CASCADE Dans notre exem-ple nous pourrions ainsi deacutecider de supprimer tous les affregravetements degraves qursquoon retire un avion
Eacutetendre la modification de la cleacute primaire de lrsquoenregistrement laquo pegravere raquo aux enregistrementslaquo fils raquo associeacutes Ce meacutecanisme est reacutealiseacute par la directive ON UPDATE CASCADE Dansnotre exemple nous pourrions ainsi deacutecider de mettre agrave jour tous les affregravetements degravesqursquoon modifie lrsquoimmatriculation drsquoun avion
Propager lrsquoaffectation de la valeur nulle aux cleacutes eacutetrangegraveres des enregistrements laquo fils raquoassocieacutes agrave lrsquoenregistrement laquo pegravere raquo supprimeacute ou modifieacute Ce meacutecanisme est reacutealiseacute par ladirective ON DELETE SET NULL (ou ON UPDATE SET NULL en cas de modification dela cleacute primaire du laquo pegravere raquo) Dans ces deux cas il ne faut pas poser de contrainte NOTNULL sur la cleacute eacutetrangegravere Dans notre exemple nous pourrions ainsi deacutecider de mettreNULL dans la colonne compa de la table Pilote pour chaque pilote drsquoune compagniesupprimeacutee Nous ne pourrions pas appliquer ce meacutecanisme agrave la table Affreter quidispose de contraintes NOT NULL sur ses cleacutes eacutetrangegraveres (car composant la cleacute primaire)
RESTRICT est une directive de la norme SQL qui nrsquoest pas encore mise en œuvre sousMySQL Elle concerne les SGBD compatibles avec les contraintes diffeacutereacutees Pour lrsquoheure NOACTION (qui en principe diffegravere les contraintes) et RESTRICT (qui ne diffegravere pas les contraintes)jouent le mecircme rocircle
Les options DELETE CASCADE et DELETE SET NULL sont disponibles depuis laversion 32350 celles relatives agrave ON UPDATE sont disponibles depuis la version 408
[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]
[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]
4055_02_C02 Page 60 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 61
chapitre ndeg 2 Manipulation des donneacutees
Le tableau suivant deacutecrit quelques alternatives de coheacuterence agrave notre base de donneacutees exempleentre les tables Avion et Affreter puis Pilote et Compagnie
Pour lrsquoheure aucun deacuteclencheur ne peut ecirctre activeacute suite agrave la modification drsquoune colonneinduite drsquoune action de reacutepercussion (CASCADE ou SET NULL)
MySQL ne permet pas encore de propager une valeur par deacutefaut (set default) comme la normeSQL le preacutevoit
Tableau 2-16 Alternatives de coheacuterence du laquo pegravere raquo vers les laquo fils raquo
Alternatives Syntaxe Message drsquoerreur
Preacutevenir la modification de lrsquoimmatriculation drsquoun avion ou la suppression drsquoun avion
--dans AffreterCONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES Avion(immat) ON DELETE NO ACTION ON UPDATE NO ACTION
mysqlgt DELETE FROM AvionERROR 1451 (23000) Cannot delete or update a parent row a foreign key constraint fails (`bdsoutouaffreter` CONSTRAINT `fk_Aff_na_Avion` FOREIGN KEY (`immat`) REFERENCES `avion` (`immat`)ON DELETE NO ACTION ON UPDATE NO ACTION)
Propager la suppression drsquoun avion
--dans AffreterCONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES Avion(immat) ON DELETE CASCADE
Propager la modification de lrsquoimmatriculation drsquoun avion
--dans AffreterCONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES Avion(immat) ON UPDATE CASCADE
Propager la modification du code de la compagnie dansles tables Pilote Avion et Affreter Affecter la valeur nulle dans la table Pilote suite agrave la suppression drsquoune compagnie tout en preacuteservant lrsquointeacutegriteacute avec la table Avion
--dans AffreterCONSTRAINT fk_Aff_comp_Compag FOREIGN KEY(compAff) REFERENCES Compagnie(comp) ON UPDATE CASCADE--dans AvionCONSTRAINT fk_Avion_comp_Compag FOREIGN KEY(proprio) REFERENCES Compagnie(comp) ON UPDATE CASCADE--dans PiloteCONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa) REFERENCES Compagnie(comp) ON DELETE SET NULL ON UPDATE CASCADE
Web
4055_02_C02 Page 61 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
62 copy Eacuteditions Eyrolles
En reacutesumeacute
Le tableau suivant reacutesume les conditions requises pour modifier lrsquoeacutetat de la base de donneacutees enrespectant lrsquointeacutegriteacute reacutefeacuterentielle
Insertions agrave partir drsquoun fichier
Lrsquoimportation de donneacutees (au format fichier texte) dans une table peut ecirctre programmeacutee agravelrsquoaide de la directive LOAD DATA INFILE Un tel meacutecanisme lit un fichier dans un reacuteper-toire du serveur et insegravere tout ou partie des informations dans une table La syntaxe simplifieacuteede cette directive est la suivante
LOAD DATA INFILE nomEtCheminFichiertxt
[REPLACE | IGNORE] INTO TABLE nomTable
[FIELDS [TERMIATED BY string]
[[OPTIONALLY] ENCLOSED BY char]
[ESCAPED BY char ] ]
[LINES [STARTING BY string] [TERMINATED BY string] ]
[IGNORE number LINES]
REPLACE option agrave utiliser pour remplacer systeacutematiquement les anciens enregistrementspar les nouveaux (valeur de cleacute primaire ou drsquoindex unique)
IGNORE fait en sorte de ne pas inseacuterer des enregistrements de cleacute primaire ou drsquoindexunique deacutejagrave preacutesents dans la table
Tableau 2-17 Instructions SQL sur les cleacutes
Instructions Table laquo pegravere raquo Table laquo fils raquo
INSERT Correcte si la cleacute primaire (ou candidate) est unique
Correcte si la cleacute eacutetrangegravere est reacutefeacuterenceacutee dans la table laquo pegravere raquo ou est nulle (partiellement ou en totaliteacute)
UPDATE Correcte si lrsquoinstruction ne laisse pas drsquoenregistrements dans la table laquo fils raquo ayant une cleacute eacutetrangegravere non reacutefeacuterenceacutee
Correcte si la nouvelle cleacute eacutetrangegravere reacutefeacuterence un enregistrement laquo pegravere raquo existant
DELETE Correcte si aucun enregistrement de la table laquo fils raquo ne reacutefeacuterence le ou les enregistrements deacutetruits
Correcte sans condition
DELETE Cascade Correcte sans condition Sans objet
DELETE SET NULL Correcte sans condition Sans objet
UPDATE Cascade Correcte sans condition Sans objet
UPDATE SET NULL Correcte srsquoil nrsquoy a pas de NOT NULL dans la table laquo fils raquo
Sans objet
4055_02_C02 Page 62 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 63
chapitre ndeg 2 Manipulation des donneacutees
FIELDS deacutecrit comment sont formateacutees dans le fichier les valeur agrave inseacuterer dans la tableEn lrsquoabsence de cette clause TERMINATED BY vaut t ENCLOSED BY vaut etESCAPED BY vaut
ndash FIELDS TERMINATED BY deacutecrit le caractegravere qui seacutepare deux valeurs de colonnes
ndash FIELDS ENCLOSED BY permet de controcircler le caractegravere qui encadrera chaque valeurde colonne
ndash FIELDS ESCAPED BY permet de controcircler les caractegraveres speacuteciaux
LINES deacutecrit comment seront eacutecrites dans le fichier les lignes extraites de(s) table(s) Enlrsquoabsence de cette clause TERMINATED BY vaut n et STARTING BY vaut
IGNORE permet de ne pas importer les nb premiegraveres lignes du fichier (contenant des eacuteven-tuelles deacuteclarations)
Lisons le fichier laquo pilotestxt raquo situeacute dans le reacutepertoire laquo Ddev raquo (ouvert agrave lrsquoaide du Word-Pad dans la figure suivante) en important la totaliteacute des donneacutees dans la table Pilote2 creacuteeacutee agravecet effet (brevet VARCHAR(6) nom VARCHAR(16) nbHVol DECIMAL(72)compa CHAR(4) et PRIMARY KEY(brevet)) Notez lrsquoutilisation du double laquo raquo pour deacutesi-gner une arborescence Windows Le caractegravere NULL est importeacute par le caractegravere laquo N raquo
Une fois la table creacuteeacutee il est possible de lrsquointerroger
mysqlgt SELECT FROM Pilote2 ORDER BY compa nom
+--------+------------------+---------+-------+
| brevet | nom | nbHVol | compa |
+--------+------------------+---------+-------+
| PL-5 | Daniel Vielle | NULL | AF |
| PL-2 | Didier Donsez | 000 | AF |
| PL-1 | Gratien Viel | 45000 | AF |
| PL-4 | Placide Fresnais | 245000 | CAST |
| PL-3 | Richard Grin | 100000 | SING |
+--------+------------------+---------+-------+
Figure 2-12 Importation de donneacutees
LOAD DATA INFILE Ddevpilotestxt REPLACE INTO TABLE Pilote2FIELDS TERMINATED BY ENCLOSED BY LINES STARTING BY import -Pilote TERMINATED BY $ n
4055_02_C02 Page 63 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
64 copy Eacuteditions Eyrolles
Exercices
Les objectifs de ces exercices sont
drsquoinseacuterer des donneacutees dans les tables du scheacutema Parc Informatique
de creacuteer une seacutequence et drsquoinseacuterer des donneacutees en utilisant une seacutequence
de modifier des donneacutees
21 Insertion de donneacutees
Eacutecrire puis exeacutecuter le script SQL (que vous appellerez insParcsql) afin drsquoinseacuterer les donneacuteesdans les tables suivantes
Tableau 2-18 Donneacutees des tables
Table Donneacutees
Segment INDIP NOMSEGMENT ETAGE----------- -------------------- ----------13012080 Brin RDC13012081 Brin 1er eacutetage13012082 Brin 2e eacutetage
Salle NSALLE NOMSALLE NBPOSTE INDIP------- -------------------- ---------- -----------s01 Salle 1 3 13012080s02 Salle 2 2 13012080s03 Salle 3 2 13012080s11 Salle 11 2 13012081s12 Salle 12 1 13012081s21 Salle 21 2 13012082s22 Salle 22 0 13012083s23 Salle 23 0 13012083
Poste NPOSTE NOMPOSTE INDIP AD TYPEPOSTE NSALLE------- -------------------- ----------- --- --------- -------p1 Poste 1 13012080 01 TX s01p2 Poste 2 13012080 02 UNIX s01p3 Poste 3 13012080 03 TX s01p4 Poste 4 13012080 04 PCWS s02p5 Poste 5 13012080 05 PCWS s02p6 Poste 6 13012080 06 UNIX s03p7 Poste 7 13012080 07 TX s03p8 Poste 8 13012081 01 UNIX s11p9 Poste 9 13012081 02 TX s11p10 Poste 10 13012081 03 UNIX s12p11 Poste 11 13012082 01 PCNT s21p12 Poste 12 13012082 02 PCWS s21
4055_02_C02 Page 64 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 65
chapitre ndeg 2 Manipulation des donneacutees
22 Gestion drsquoune seacutequence
Dans ce mecircme script geacuterer la seacutequence associeacutee agrave la colonne numIns commenccedilant agrave la valeur 1 demaniegravere agrave inseacuterer les enregistrements suivants
Logiciel NLOG NOMLOG DATEACH VERSION TYPELOG PRIX ----- -------------------- ---------- ------- --------- --------log1 Oracle 6 1995-05-13 62 UNIX 3000log2 Oracle 8 1999-09-15 8i UNIX 5600log3 SQL Server 1998-04-12 7 PCNT 2700log4 Front Page 1997-06-03 5 PCWS 500log5 WinDev 1997-05-12 5 PCWS 750log6 SQLNet 20 UNIX 500log7 I I S 2002-04-12 2 PCNT 810log8 DreamWeaver 2003-09-21 20 BeOS 1400
Types TYPELP NOMTYPE--------- --------------------TX Terminal X-WindowUNIX Systegraveme UnixPCNT PC Windows NTPCWS PC WindowsNC Network Computer
Tableau 2-18 Donneacutees des tables (suite)
Table Donneacutees
Tableau 2-19 Donneacutees de la table Installer
Table Donneacutees
Installer NPOSTE NLOG NUMINS DATEINS DELAI------- --------- ------- -------- -------------------------p2 log1 1 2003-05-15p2 log2 2 2003-09-17p4 log5 3 p6 log6 4 2003-05-20p6 log1 5 2003-05-20p8 log2 6 2003-05-19p8 log6 7 2003-05-20p11 log3 8 2003-04-20p12 log4 9 2003-04-20p11 log7 10 2003-04-20p7 log7 11 2002-04-01
4055_02_C02 Page 65 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
Partie I SQL de base
66 copy Eacuteditions Eyrolles
23 Modification de donneacutees
Eacutecrire le script modificationsql qui permet de modifier (avec UPDATE) la colonne etage (pourlrsquoinstant nulle) de la table Segment afin drsquoaffecter un numeacutero drsquoeacutetage correct (0 pour le segment13012080 1 pour le segment 13012081 2 pour le segment 13012082)
Diminuer de 10 le prix des logiciels de type PCNT
Veacuterifier
SELECT FROM SegmentSELECT nLog typeLog prix FROM Logiciel
4055_02_C02 Page 66 Jeudi 2 mars 2006 201 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
67
Chapitre 3
Eacutevolution drsquoun scheacutema
Lrsquoeacutevolution drsquoun scheacutema est un aspect tregraves important agrave prendre en compte car il reacutepond auxbesoins de maintenance des applicatifs qui utilisent la base de donneacutees Nous verrons qursquoil estpossible de modifier une base de donneacutees drsquoun point de vue structurel (colonnes et index) maisaussi comportemental (contraintes)
Lrsquoinstruction principalement utiliseacutee est
ALTER TABLE
(commande du LDD) qui permetdrsquoajouter de renommer de modifier et de supprimer des colonnes drsquoune table Ellepermet aussi drsquoajouter et de supprimer des contraintes Avant de deacutetailler ces meacutecanis-mes eacutetudions la commande qui permet de renommer une table
Renommer une table (
RENAME
)
Lrsquoinstruction
RENAME
renomme une ou plusieurs tables ou vues Il faut posseacuteder le privilegravege
ALTER
et
DROP
sur la table drsquoorigine et
CREATE
sur la base
RENAME
[
nomBase
]
ancienNomTable
TO [
nomBase
]
nouveauNomTable
[[
nomBase
]
ancienNom2
TO [
nomBase
]
nouveauNom2
]]
Les contraintes drsquointeacutegriteacute index et preacuterogatives associeacutes agrave lrsquoancienne table sont automatique-ment transfeacutereacutes sur la nouvelle En revanche les vues et proceacutedures catalogueacutees sont invali-deacutees et doivent ecirctre recreacuteeacutees
Il est aussi possible drsquoutiliser lrsquooption
RENAME TO
de lrsquoinstruction
ALTER TABLE
pourrenommer une table existante Le tableau suivant deacutecrit comment renommer la table
Pilote
sans perturber lrsquointeacutegriteacute reacutefeacuterentielle
Tableau 3-1 Renommer une table
Commande RENAME Commande ALTER TABLE
RENAME
Pilote
TO
Naviguant
ALTER TABLE
Pilote
RENAME
TO
Naviguant
4055_03_C03 Page 67 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
Partie I SQL de base
68
copy Eacuteditions Eyrolles
Modifications structurelles (
ALTER TABLE
)
Consideacuterons la table suivante que nous allons faire eacutevoluer
Ajout de colonnes
La directive
ADD
de lrsquoinstruction
ALTER TABLE
permet drsquoajouter une nouvelle colonne agrave unetable Cette colonne est initialiseacutee agrave
NULL
pour tous les enregistrements (agrave moins de speacutecifierune contrainte
DEFAULT
auquel cas tous les enregistrements de la table sont mis agrave jour avecune valeur non nulle)
Il est possible drsquoajouter une colonne en ligne
NOT NULL
seulement si la table est vide ou si unecontrainte
DEFAULT
est deacutefinie sur la nouvelle colonne (dans le cas inverse il faudra utiliser
MODIFY
agrave la place de
ADD
)
Le script suivant ajoute trois colonnes agrave la table
Pilote
La premiegravere instruction insegravere lacolonne
nbHVol
en lrsquoinitialisant agrave
NULL
pour tous les pilotes (ici il nrsquoen existe qursquoune seule)La deuxiegraveme commande ajoute deux colonnes initialiseacutees agrave une valeur non nulle La colonne
ville
ne sera jamais nulle
ALTER TABLE
Pilote
ADD
(nbHVol DECIMAL(72))
ALTER TABLE
Pilote
ADD
(compa VARCHAR(4) DEFAULT AF
ville VARCHAR(30) DEFAULT Paris NOT NULL)
La table est deacutesormais la suivante
Figure 3-1
Table agrave modifier
CREATE TABLE Pilote (brevet VARCHAR(4) nom VARCHAR(20))
INSERT INTO Pilote VALUES (PL -1 Agnegraves Labat)
Pilote
brevet nom
PL-1 Agnegraves Labat
Figure 3-2
Table apregraves lrsquoajout de colonnes
Web
Pilote
brevet nom nbHVol compa ville
PL-1 Agnegraves Labat AF Paris
4055_03_C03 Page 68 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
69
chapitre ndeg 3 Eacutevolution drsquoun scheacutema
Renommer des colonnes
Il faut utiliser lrsquooption
CHANGE
de lrsquoinstruction
ALTER TABLE
pour renommer une colonneexistante Le nouveau nom de colonne ne doit pas ecirctre deacutejagrave utiliseacute dans la table Le type (avecune eacuteventuelle contrainte) doit ecirctre repreacuteciseacute La position de la colonne peut aussi ecirctre modi-fieacutee en mecircme temps La syntaxe geacuteneacuterale de cette option est la suivante
ALTER TABLE
[
nomBase
]
nomTable
CHANGE
[COLUMN]
ancienNom
nouveauNom
typeMySQL
[NOT NULL | NULL] [DEFAULT
valeur
]
[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
[COMMENT
chaine
] [REFERENCES ]
[FIRST|AFTER
nomColonne
]
Lrsquoinstruction suivante permet de renommer la colonne
ville
en
adresse
en la positionnantavant la colonne
compa
ALTER TABLE Pilote CHANGE ville adresse VARCHAR(30) AFTER nbHVol
Modifier le type des colonnes
Lrsquooption MODIFY de lrsquoinstruction ALTER TABLE modifie le type drsquoune colonne existantesans pour autant la renommer La syntaxe geacuteneacuterale de cette instruction est la suivante lesoptions sont les mecircmes que pour CHANGE
ALTER TABLE [nomBase]nomTable MODIFY [COLUMN] nomColonneAmodifier
typeMySQL [NOT NULL | NULL] [DEFAULT valeur]
[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
[COMMENT chaine] [REFERENCES ]
[FIRST|AFTER nomColonne]
Il est possible drsquoaugmenter la taille drsquoune colonne numeacuterique (largeur ou preacutecision) ndash ou drsquounechaicircne de caractegraveres (CHAR et VARCHAR) ndash ou de la diminuer si toutes les donneacutees preacutesentesdans la colonne peuvent srsquoadapter agrave la nouvelle taille
Attention agrave ne pas reacuteduire les colonnes indexeacutees agrave une taille infeacuterieure agrave celle deacuteclareacutee lors dela creacuteation de lrsquoindex
Les contraintes en ligne peuvent ecirctre aussi modifieacutees par cette instruction Une fois la colonnechangeacutee les nouvelles contraintes srsquoappliqueront aux mises agrave jour ulteacuterieures de la table et lesdonneacutees preacutesentes devront toutes veacuterifier cette nouvelle contrainte
4055_03_C03 Page 69 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
Partie I SQL de base
70 copy Eacuteditions Eyrolles
Le tableau suivant preacutesente diffeacuterentes modifications de colonnes
La table est deacutesormais la suivante
Valeurs par deacutefaut
Lrsquooption ALTER COLUMN de lrsquoinstruction ALTER TABLE modifie la valeur par deacutefaut drsquounecolonne existante La syntaxe geacuteneacuterale de cette instruction est la suivante
ALTER TABLE [nomBase]nomTable ALTER [COLUMN] nomColonneAmodifier
SET DEFAULT lsquochainersquo | DROP DEFAULT
Le script suivant deacutefinit une valeur par deacutefaut pour la colonne adresse puis supprime cellerelative agrave la colonne compa
ALTER TABLE Pilote ALTER COLUMN adresse SET DEFAULT Blagnac
ALTER TABLE Pilote ALTER COLUMN compa DROP DEFAULT
Supprimer des colonnes
Lrsquooption DROP de lrsquoinstruction ALTER TABLE permet de supprimer une colonne (aussi unindex ou une cleacute que nous eacutetudierons plus loin) La possibiliteacute de supprimer une colonne eacuteviteaux administrateurs drsquoexporter les donneacutees de recreacuteer une nouvelle table drsquoimporter les
Tableau 3-2 Modifications de colonnes
Instructions SQL Commentaires
ALTER TABLE Pilote MODIFY compa VARCHAR(6) DEFAULT SINGINSERT INTO Pilote (brevet nom) VALUES (PL-2 Laurent Boutrand)
Augmente la taille de la colonne compa et changela contrainte de valeur par deacutefaut puis insegravere unnouveau pilote
ALTER TABLE Pilote MODIFY compa CHAR(4) NOT NULL
Diminue la colonne et modifie eacutegalement son typede VARCHAR en CHAR tout en le deacuteclarant NOTNULL (possible car les donneacutees contenues dans lacolonne ne deacutepassent pas quatre caractegraveres)
ALTER TABLE Pilote MODIFY compa CHAR(4)
Rend possible lrsquoinsertion de valeur nulle dans lacolonne compa
Figure 3-3 Apregraves modification des colonnes
Pilote
brevet nom nbHVol adresse compa
PL-1 Agnegraves Labat Paris AF
PL-2 Laurent Boutrand Paris SING
CHAR(4)NULL possibleDeacutefaut lsquoSINGrsquo
4055_03_C03 Page 70 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 71
chapitre ndeg 3 Eacutevolution drsquoun scheacutema
donneacutees et de recreacuteer les eacuteventuels index et contraintes Lorsqursquoune colonne est supprimeacutee lesindex qui lrsquoutilisent sont mis agrave jour voire eacutelimineacutes si toutes les colonnes qui le composent sonteffaceacutees La syntaxe des ces options est la suivante
ALTER TABLE [nomBase]nomTable DROP [COLUMN] nomColonne | PRIMARY KEY
| INDEX nomIndex | FOREIGN KEY nomContrainte
Il nrsquoest pas possible de supprimer avec cette instruction
bull toutes les colonnes drsquoune table
bull les colonnes qui sont cleacutes primaires (ou candidates par UNIQUE) reacutefeacuterenceacutees par des cleacuteseacutetrangegraveres
La suppression de la colonne adresse de la table Pilote est programmeacutee par lrsquoinstructionsuivante
ALTER TABLE Pilote DROP COLUMN adresse
Modifications comportementales
Nous eacutetudions dans cette section les meacutecanismes drsquoajout de suppression drsquoactivation et dedeacutesactivation de contraintes
Faisons eacutevoluer le scheacutema suivant Les seules contraintes existantes sont les cleacutes primairesnommeacutees pk_Compagnie pour la table Compagnie et pk_Avion pour la table Avion
Ajout de contraintes
Jusqursquoagrave preacutesent nous avons creacuteeacute les contraintes en mecircme temps que les tables Il est possiblede creacuteer des tables sans contraintes (dans ce cas lrsquoordre de geacuteneacuteration nrsquoest pas important et on
Figure 3-4 Scheacutema agrave faire eacutevoluer
Web
Compagnie
comp nrue rue ville nomComp
AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL
Affreter compAff immat dateAff nbPax
AF F-WTSS 2003-05-13 85 SING F-GAFU 2003-02-05 155 AF F-WTSS 2003-05-15 82
Avion
immat typeAvion nbHVol proprio
F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING
4055_03_C03 Page 71 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
Partie I SQL de base
72 copy Eacuteditions Eyrolles
peut mecircme les eacutelaborer par ordre alphabeacutetique) puis drsquoajouter les contraintes Les outils deconception (WinrsquoDesign Designer ou PowerAMC) adoptent cette deacutemarche lors de la geacuteneacutera-tion automatique de scripts SQL
La directive ADD CONSTRAINT de lrsquoinstruction ALTER TABLE permet drsquoajouter une contrainteagrave une table Il est aussi possible drsquoajouter un index La syntaxe geacuteneacuterale est la suivante
ALTER TABLE [nomBase]nomTable ADD INDEX [nomIndex] [typeIndex] (nomColonne1) | CONSTRAINT nomContrainte typeContrainte
Trois types de contraintes sont possibles
UNIQUE (colonne1 [colonne2])
PRIMARY KEY (colonne1 [colonne2])
FOREIGN KEY (colonne1 [colonne2])
REFERENCES nomTablePegravere (col1 [col2])
[ON DELETE RESTRICT | CASCADE | SET NULL | NO ACTION]
[ON UPDATE RESTRICT | CASCADE | SET NULL | NO ACTION]
Uniciteacute
Ajoutons la contrainte drsquouniciteacute portant sur la colonne du nom de la compagnie Un index estautomatiquement geacuteneacutereacute sur cette colonne agrave preacutesent
ALTER TABLE Compagnie ADD CONSTRAINT un_nomC UNIQUE (nomComp)
Cleacute eacutetrangegravere
Ajoutons la cleacute eacutetrangegravere (indexeacutee) agrave la table Avion au niveau de la colonne proprio en luiassignant une contrainte NOT NULL
ALTER TABLE Avion ADD INDEX (proprio)
ALTER TABLE Avion ADD CONSTRAINT fk_Avion_comp_Compag
FOREIGN KEY(proprio) REFERENCES Compagnie(comp)
ALTER TABLE Avion MODIFY proprio CHAR(4) NOT NULL
Cleacute primaire
Ajoutons agrave la table Affreter en une seule instruction sa cleacute primaire et deux cleacutes eacutetrangegrave-res (une vers la table Avion et lrsquoautre vers Compagnie)
ALTER TABLE Affrete ADD (CONSTRAINT pk_Affreter PRIMARY KEY (compAff immat dateAff)CONSTRAINT fk_Aff_na_Avion FOREIGN KEY(immat) REFERENCES
Avion(immat)CONSTRAINT fk_Aff_comp_Compag FOREIGN KEY(compAff)
REFERENCES Compagnie(comp))
4055_03_C03 Page 72 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 73
chapitre ndeg 3 Eacutevolution drsquoun scheacutema
Pour que lrsquoajout ou la modification drsquoune contrainte soient possibles il faut que les donneacuteespreacutesentes dans la table concerneacutee ou reacutefeacuterenceacutee respectent la nouvelle contrainte
Les tables contiennent agrave preacutesent les contraintes suivantes
Suppression de contraintes
Il nrsquoexiste pas encore lrsquooption DROP CONSTRAINT agrave lrsquoinstruction ALTER TABLE poursupprimer une contrainte de nom donneacutee (peut-ecirctre parce que les contraintes CHECK ne sontpas encore consideacutereacutees et car la prise en compte des contraintes a eacuteteacute eacutetaleacutee au fil des versionssuccessives de MySQL) Il faut donc utiliser une directive diffeacuterente de lrsquoinstruction ALTERTABLE pour supprimer chaque type de contrainte
Contrainte NOT NULL
Il faut utiliser la directive MODIFY de lrsquoinstruction ALTER TABLE pour supprimer unecontrainte NOT NULL existant sur une colonne Dans notre exemple deacutetruisons la contrainteNOT NULL de la cleacute eacutetrangegravere proprio dans la table Avion
ALTER TABLE Avion MODIFY proprio CHAR(4) NULL
Contrainte UNIQUE
Il faut utiliser la directive DROP INDEX de lrsquoinstruction ALTER TABLE pour supprimer unecontrainte drsquouniciteacute Dans notre exemple effaccedilons la contrainte portant sur le nom de lacompagnie Lrsquoindex est eacutegalement deacutetruit
ALTER TABLE Compagnie DROP INDEX un_nomC
Figure 3-5 Apregraves ajout de contraintes
Web Compagnie
comp nrue rue ville nomComp
AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL
Affreter
compAff immat dateAff nbPax
AF F-WTSS 2003-05-13 85 SING F-GAFU 2003-02-05 155 AF F-WTSS 2003-05-15 82
Avion
immat typeAvion nbHVol proprio
F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING
referenced parent
referenced parent
dependent child dependent child NOT NULL
4055_03_C03 Page 73 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
Partie I SQL de base
74 copy Eacuteditions Eyrolles
Cleacute eacutetrangegravere
Lrsquooption DROP FOREIGN KEY de lrsquoinstruction ALTER TABLE permet de supprimer une cleacuteeacutetrangegravere drsquoune table La syntaxe geacuteneacuterale est la suivante
ALTER TABLE [nomBase]nomTable DROP FOREIGN KEY nomContrainte
Le nom de la contrainte est celui qui a eacuteteacute deacuteclareacute lors de la creacuteation de la table soit lors de samodification (dans CREATE TABLE ou ALTER TABLE)
Si la contrainte a eacuteteacute deacutefinie sans ecirctre nommeacutee son nom est geacuteneacutereacute par le moteur InnoDB etlrsquoinstruction SHOW CREATE TABLE [nomBase]nomTable permet de le deacutecouvrir
Deacutetruisons la cleacute eacutetrangegravere de la colonne proprio
ALTER TABLE Avion DROP FOREIGN KEY fk_Avion_comp_Compag
Cleacute primaire
Lrsquooption DROP PRIMARY KEY de lrsquoinstruction ALTER TABLE permet de supprimer une cleacuteprimaire Dans des versions preacuteceacutedentes de MySQL si aucune cleacute primaire nrsquoexistait lapremiegravere contrainte UNIQUE disparaissait agrave la place Ce nrsquoest plus le cas depuis la version 51
Si la colonne cleacute primaire agrave supprimer contient des cleacutes eacutetrangegraveres il faut drsquoabord retirer lescontraintes de cleacute eacutetrangegravere Si la cleacute primaire agrave supprimer est reacutefeacuterenceacutee par des cleacutes eacutetran-gegraveres drsquoautres tables il faut drsquoabord ocircter les contraintes de cleacute eacutetrangegravere de ces autres tables
Ainsi pour supprimer la cleacute primaire de la table Affreter il faut drsquoabord enlever les deuxcontraintes de cleacute eacutetrangegravere concernant des colonnes composant la cleacute primaire
ALTER TABLE Affreter DROP FOREIGN KEY fk_Aff_na_Avion
ALTER TABLE Affreter DROP FOREIGN KEY fk_Aff_comp_Compag
ALTER TABLE Affreter DROP PRIMARY KEY
La figure suivante illustre les contraintes qui restent actives les cleacutes primaires des tablesCompagnie et Avion et une contrainte de non nulliteacute
Aucun ordre particulier nrsquoest neacutecessaire pour supprimer ces trois contraintes car il nrsquoy a plusde contrainte reacutefeacuterentielle active
4055_03_C03 Page 74 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 75
chapitre ndeg 3 Eacutevolution drsquoun scheacutema
Concernant tout scheacutema il faut eacuteliminer drsquoabord les contraintes de cleacute eacutetrangegravere des tableslaquo fils raquo puis laquo pegravere raquo puis les contraintes de cleacute primaire Il suffit pour eacuteviter toute incoheacuterencede deacutetruire les contraintes dans lrsquoordre inverse drsquoapparition dans le script de creacuteation
Deacutesactivation des contraintes
La deacutesactivation des contraintes reacutefeacuterentielles peut ecirctre inteacuteressante pour acceacuteleacuterer des proceacute-dures de chargement drsquoimportation et drsquoexportation massives de donneacutees externes Ce meacuteca-nisme ameacuteliore aussi les performances de programmes batchs qui ne modifient pas desdonneacutees concerneacutees par lrsquointeacutegriteacute reacutefeacuterentielle ou pour lesquelles on veacuterifie la coheacuterence dela base agrave la fin En effet les index ne sont pas mis agrave jour pour chaque insertion ou modificationet aucun ordre nrsquoest requis pour inseacuterer ou supprimer des enregistrements
Syntaxe
Lrsquoinstruction SET FOREIGN_KEY_CHECKS=0 permet de deacutesactiver temporairement(jusqursquoagrave la reacuteactivation) toutes les contraintes reacutefeacuterentielles drsquoune base
Nrsquoessayez pas de deacutesactiver lrsquointeacutegriteacute reacutefeacuterentielle avec lrsquooption DISABLE KEYS de lrsquoinstruc-tion ALTER TABLE Cette option concerne les tables MyISAM et speacutecifie seulement de ne pasmettre agrave jour les index non uniques
Exemple
En consideacuterant lrsquoexemple suivant deacutesactivons les contraintes drsquointeacutegriteacute reacutefeacuterentielle ettentons drsquoinseacuterer des enregistrements ne respectant aucune contrainte (drsquointeacutegriteacute reacutefeacuterentielleet autres)
Figure 3-6 Apregraves suppression de contraintes
Compagnie
comp nrue rue ville nomComp
AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL
Affreter
compAff immat dateAff nbPax
AF F-WTSS 2003-05-13 85SING F-GAFU 2003-02-05 155
AF F-WTSS 2003-05-15 82
Avion
immat typeAvion nbHVol proprio
F-WTSS Concorde 6570 SING F-GAFU A320 3500 AF F-GLFS TB-20 2000 SING
NULL
4055_03_C03 Page 75 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
Partie I SQL de base
76 copy Eacuteditions Eyrolles
On remarque bien que seules les cleacutes eacutetrangegraveres ne sont plus veacuterifieacutees Toute autre contrainte(UNIQUE PRIMARY KEY et NOT NULL) reste active Lrsquoeacutetat de la base est deacutesormais commesuit
Bien qursquoil semble incoheacuterent de reacuteactiver les contraintes sans srsquooccuper au preacutealable desvaleurs ne respectant pas lrsquointeacutegriteacute reacutefeacuterentielle (donneacutees noteacutees en gras) nous verrons qursquoilest possible de le faire
Figure 3-7 Avant la deacutesactivation de contraintes
Web Compagnie
comp nrue rue ville nomComp
AF 10 Gambetta Paris Air France SING 7 Camparols Singapour Singapore AL
Affreter
compAff immat dateAff nbPax
AF F-WTSS 2003-05-13 85
Avion
immat typeAvion nbHVol proprio
F-WTSS Concorde 6570 SING
referenced parent
referenced parent
dependent child dependent child NOT NULL
UNIQUE
Tableau 3-3 Insertions apregraves la deacutesactivation de lrsquointeacutegriteacute reacutefeacuterentielle
Instructions valides Instructions non valides
mysqlgt SET FOREIGN_KEY_CHECKS=0
mysqlgt INSERT INTO Avion VALUES ( TB-22 500 Toto)Query OK 1 row affected (004 sec)
mysqlgt INSERT INTO Avion VALUES (Bidon1 TB-21 1000 AF)Query OK 1 row affected (010 sec)
mysqlgt INSERT INTO Affreter VALUES (AF Toto 2005-05-13 0)Query OK 1 row affected (010 sec)
mysqlgt INSERT INTO Affreter VALUES (GTI F-WTSS 2005-11-0710)Query OK 1 row affected (002 sec)
mysqlgt INSERT INTO Affreter VALUES (GTI Toto 2005-11-0740)Query OK 1 row affected (003 sec)
mysqlgt INSERT INTO Compagnie VALUES (GTR 1 Brassens Blagnac
)ERROR 1062 (23000) Duplicate entry Air France for key 2
mysqlgt INSERT INTO Avion VALUES (Bidon1 TB-20 2000 NULL)ERROR 1048 (23000) Column proprio cannot be null
mysqlgt INSERT INTO Avion VALUES ( TB-21 1000 AF)ERROR 1062 (23000) Duplicate entry F-GLFS for key 1
Web
F-GLFS AirFrance
F-GLFS
4055_03_C03 Page 76 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 77
chapitre ndeg 3 Eacutevolution drsquoun scheacutema
Reacuteactivation des contraintes
Lrsquoinstruction SET FOREIGN_KEY_CHECKS=1 permet de reacuteactiver toutes les contraintesreacutefeacuterentielles drsquoune base
Nrsquoessayez pas de deacutesactiver lrsquointeacutegriteacute reacutefeacuterentielle avec lrsquooption ENABLE KEYS de lrsquoinstructionALTER TABLE Cette option concerne les tables MyISAM et speacutecifie de mettre agrave jour les indexnon uniques
Syntaxe
La reacuteactivation totale de lrsquointeacutegriteacute reacutefeacuterentielle de la base se programme ainsi
mysqlgt SET FOREIGN_KEY_CHECKS=1
Lrsquointeacutegriteacute est assureacutee de nouveau mais ne concerne que les mises agrave jour agrave venir (ajoutsdrsquoenregistrements modifications de colonnes et suppressions drsquoenregistrements) Les eacuteven-tuelles donneacutees preacutesentes dans les tables qui ne veacuterifient pas lrsquointeacutegriteacute sont toujours en base
Reacutecupeacuteration de donneacutees erroneacutees
Il nrsquoexiste pas pour lrsquoheure de meacutethode de reacutecupeacuteration automatique comme Oracle lepropose par exemple avec la directive EXCEPTIONS INTO de lrsquoinstruction ALTER TABLEEn conseacutequence il faut programmer des requecirctes drsquoextraction (eacutetudieacutees au chapitre 4) quipermettent des recherches drsquoenregistrements sous critegraveres
Le tableau suivant deacutecrit les deux requecirctes agrave programmer afin drsquoextraire les enregistrementsposant problegraveme Ici nous extrayons les avions qui reacutefeacuterencent une compagnie inexistante etles affregravetements qui reacutefeacuterencent une compagnie inexistante ou un avion inexistant Une fois
Figure 3-8 Apregraves la deacutesactivation des contraintes reacutefeacuterentielles
Compagnie
comp nrue rue ville nomComp
AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL
Affreter
compAff immat dateAff nbPax
AF F-WTSS 2003-05-13 82 AF Toto 2005-05-13 0GTI F-WTSS 2005-11-07 10GTI Toto 2005-11-07 40
Avion
immat typeAvion nbHVol proprio
F-WTSS Concorde 6570 SING F-GLFS TB-22 500 Toto
4055_03_C03 Page 77 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
Partie I SQL de base
78 copy Eacuteditions Eyrolles
extraits il faudra statuer pour chacun drsquoeux entre une modification de telle ou telle colonne oubien une suppression Il apparaicirct que quatre enregistrements ne respectent pas des contraintes
Deacutesactivez de nouveau lrsquointeacutegriteacute reacutefeacuterentielle avant de modifier les enregistrements ne veacuteri-fiant pas les contraintes car sinon certaines modifications coheacuterentes ne pourraient avoir lieuagrave cause de la veacuterification reacutefeacuterentielle sur des valeurs erroneacutees (dans notre exemple si on veutmodifier la compagnie GTI du dernier affregravetement lrsquoerreur portera sur la colonne immat)
Dans notre exemple choisissons
Drsquoaffecter la compagnie AF aux avions appartenant agrave des compagnies non reacutefeacuterenceacuteesdans la table Avion Notez qursquoil faut compleacuteter par deux espaces le code compagnie(CHAR inutile srsquoil avait eacuteteacute VARCHAR) et qursquoon utilise la mecircme requecircte que preacuteceacutedem-ment
SET FOREIGN_KEY_CHECKS=0
UPDATE Avion SET proprio =
WHERE proprio
De modifier la compagnie GTI par la compagnie SING dans la table Affreter et touteimmatriculation drsquoavion inexistant en F-GLFS
UPDATE Affreter SET compAff =SING WHERE compAff =
UPDATE Affreter SET immat=F-GLFS
WHERE immat
Maintenant il conviendra de reacuteactiver lrsquointeacutegriteacute reacutefeacuterentielle Lrsquoeacutetat de la base avec lescontraintes reacuteactiveacutees est le suivant (les mises agrave jour sont en gras)
Tableau 3-4 Enregistrements posant problegraveme
Table Avion Table Affreter
mysqlgt SELECT immatproprio FROM Avion WHERE proprio NOT IN (SELECT comp FROM Compagnie)
+--------+---------+| immat | proprio |+--------+---------+| F-GLFS | Toto |+--------+---------+
mysqlgt SELECT compAffimmatdateAff FROM Affreter WHERE compAff NOT IN (SELECT comp FROM Compagnie) OR immat NOT IN (SELECT immat FROM Avion)+---------+--------+------------+| compAff | immat | dateAff |+---------+--------+------------+| GTI | F-WTSS | 2005-11-07 || AF | Toto | 2005-05-13 || GTI | Toto | 2005-11-07 |+---------+--------+------------+
AF
NOT IN (SELECT comp FROM Compagnie)
GTI
NOT IN (SELECT immat FROM Avion)
4055_03_C03 Page 78 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 79
chapitre ndeg 3 Eacutevolution drsquoun scheacutema
Contraintes diffeacutereacutees
Les contraintes que nous avons eacutetudieacutees jusqursquoagrave maintenant sont des contraintes immeacutediates(immediate) qui sont controcircleacutees apregraves chaque instruction Une contrainte est dite laquo diffeacutereacutee raquo(deferred) si elle deacuteclenche sa veacuterification seulement agrave la fin de la transaction (premiegravereinstruction commit rencontreacutee) Pour lrsquoheure MySQL avec InnoDB ne propose pas ce modede programmation
Figure 3-9 Tables apregraves modifications et reacuteactivation des contraintes
Compagnie
comp nrue rue ville nomComp
AF 10 Gambetta Paris Air FranceSING 7 Camparols Singapour Singapore AL
AffretercompAff immat dateAff nbPax
AF F-WTSS 2003-05-13 85 AF F-GLFS 2005-05-13 0SING F-WTSS 2005-11-07 10SING F-GLFS 2005-11-07 40
referenced parent
dependent child
NOT NULL Avion
immat typeAvion nbHVol proprio
F-WTSS Concorde 6570 SING F-GLFS TB-22 500 AF
dependent child
4055_03_C03 Page 79 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
Partie I SQL de base
80 copy Eacuteditions Eyrolles
Exercices
Les objectifs de ces exercices sont
drsquoajouter et de modifier des colonnes
drsquoajouter des contraintes
de traiter les erreurs
31 Ajout de colonnes
Eacutecrire le script eacutevolutionsql qui contient les instructions neacutecessaires pour ajouter les colonnessuivantes (avec ALTER TABLE) Le contenu de ces colonnes sera modifieacute ulteacuterieurement
Veacuterifier la structure et le contenu de chaque table avec DESCRIBE et SELECT
32 Modification de colonnes
Dans ce mecircme script rajouter les instructions neacutecessaires pour
bull augmenter la taille dans la table Salle de la colonne nomSalle (passer agrave VARCHAR(30))
bull diminuer la taille dans la table Segment de la colonne nomSegment agrave VARCHAR(15)
bull tenter de diminuer la taille dans la table Segment de la colonne nomSegment agrave VARCHAR(14)Pourquoi la commande nrsquoest-elle pas possible
Veacuterifier la structure et le contenu de chaque table avec DESCRIBE et SELECT
33 Ajout de contraintes
Ajouter la contrainte afin de srsquoassurer qursquoon ne puisse installer plusieurs fois le mecircme logiciel sur unposte de travail donneacute
Ajouter les contraintes de cleacutes eacutetrangegraveres pour assurer lrsquointeacutegriteacute reacutefeacuterentielle (avec ALTER TABLEhellipADD CONSTRAINThellip) entre les tables suivantes Adopter les conventions recommandeacutees dans lechapitre 1 (comme indiqueacute pour la contrainte entre Poste et Types)
Si lrsquoajout drsquoune contrainte reacutefeacuterentielle renvoie une erreur veacuterifier les enregistrements des tableslaquo pegraveres raquo et laquo fils raquo (notamment au niveau de la casse des chaicircnes de caractegraveres Tx est diffeacuterent deTX par exemple)
Tableau 3-5 Donneacutees de la table Installer
Table Nom type et signification des nouvelles colonnes
Segment nbSalle TINYINT(2) nombre de salles par deacutefaut = 0nbPoste TINYINT(2) nombre de postes par deacutefaut = 0
Logiciel nbInstall TINYINT(2) nombre drsquoinstallations par deacutefaut = 0
Poste nbLog TINYINT(2) nombre de logiciels installeacutes par deacutefaut = 0
4055_03_C03 Page 80 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 81
chapitre ndeg 3 Eacutevolution drsquoun scheacutema
Modifier le script SQL de destruction des tables (dropParcsql) en fonction des nouvelles contrain-tes Lancer ce script puis tous ceux eacutecrits jusqursquoici
34 Traitements des erreurs
Tentez drsquoajouter les contraintes de cleacutes eacutetrangegraveres entre les tables Salle et Segment et entreLogiciel et Types (en gras dans le scheacutema suivant)
Figure 3-10 Contraintes reacutefeacuterentielles agrave creacuteer
SegmentindIP nomSegment etage nbSalle nbPoste
SallenSalle nomSalle nbPoste indIP
PostenPoste nomPoste indIP ad typePoste nSalle nbLog
LogicielnLog nomLog dateAch version typeLog prix nbInstall
InstallernPoste nLog numIns dateIns delai
TypestypeLP nomType
fk_Poste_typePoste_Types
Figure 3-11 Contraintes reacutefeacuterentielles agrave creacuteer
SegmentindIP nomSegment etage nbSalle nbPoste
SallenSalle nomSalle nbPoste indIP
PostenPoste nomPoste indIP ad typePoste nSalle nbLog
LogicielnLog nomLog dateAch version typeLog prix nbInstall
InstallernPoste nLog numIns dateIns delai
TypestypeLP nomType
4055_03_C03 Page 81 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
Partie I SQL de base
82 copy Eacuteditions Eyrolles
La mise en place de ces contraintes doit renvoyer une erreur car
bull Il existe des salles (s22 et s23) ayant un numeacutero de segment inexistant dans la table Segment
bull Il existe un logiciel (log8) dont le type nrsquoest pas reacutefeacuterenceacute dans la table Types
Extraire les enregistrements qui posent problegraveme (numeacutero des salles pour le premier cas numeacutero delogiciel pour le second) Supprimer les enregistrements de la table Salle qui posent problegraveme Ajou-ter le type de logiciel (BeOS Systegraveme Be) dans la table Types
Exeacutecuter agrave nouveau lrsquoajout des deux contraintes de cleacute eacutetrangegravere Veacuterifier que les instructions nerenvoient plus drsquoerreur et que les deux requecirctes drsquoextraction ne renvoient aucune donneacutee
4055_03_C03 Page 82 Jeudi 2 mars 2006 202 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
83
Chapitre 4
Interrogation des donneacutees
Ce chapitre traite de lrsquoaspect le plus connu du langage SQL qui concerne lrsquoextraction desdonneacutees par requecirctes (nom donneacute aux instructions
SELECT
) Une requecircte permet de rechercherdes donneacutees dans une ou plusieurs tables ou vues agrave partir de critegraveres simples ou complexes Lesinstructions
SELECT
peuvent ecirctre exeacutecuteacutees dans lrsquointerface de commande (voir les exemples dece chapitre) ou au sein drsquoun programme SQL (proceacutedure catalogueacutee) PHP Java C etc
Geacuteneacuteraliteacutes
Lrsquoinstruction
SELECT
est une commande deacuteclarative (elle deacutecrit ce que lrsquoon cherche sans expli-quer le moyen drsquoopeacuterer) Agrave lrsquoinverse une instruction proceacutedurale (comme un programme)deacutevelopperait le moyen pour reacutealiser lrsquoextraction de donneacutees (comme le chemin agrave emprunter
entre des tables ou une iteacuteration pour parcourir un ensemble drsquoenregistrements)
La figure suivante scheacutematise les principales fonctionnaliteacutes de lrsquoinstruction
SELECT
Celle-ciest composeacutee drsquoune directive
FROM
qui preacutecise la (les) table(s) interrogeacutee(s) et drsquoune directive
WHERE
qui contient les critegraveres
Figure 4-1
Possibiliteacutes de lrsquoinstruction
SELECT
Pilote
Compagnie
Air France
Jointure1 (WHERE )
Restriction (WHERE )Projection (SELECT )
Jointure2
Avion
4055_04_C04 Page 83 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
84
copy Eacuteditions Eyrolles
La restriction qui est programmeacutee dans le
WHERE
de la requecircte permet de restreindre larecherche agrave une ou plusieurs lignes Dans notre exemple une restriction reacutepond agrave laquestion laquo
Quels sont les avions de type A320
raquo
La projection qui est programmeacutee dans le
SELECT
de la requecircte permet drsquoextraire une ouplusieurs colonnes Dans notre exemple elle reacutepond agrave la question laquo
Quels sont les numeacute-ros de brevet et les nombres drsquoheures de vol de tous les pilotes
raquo
La jointure qui est programmeacutee dans le
WHERE
de la requecircte permet drsquoextraire des donneacuteesde diffeacuterentes tables en les reliant deux agrave deux (le plus souvent agrave partir de contraintes reacutefeacute-rentielles) Dans notre exemple la premiegravere jointure reacutepond agrave la question laquo
Quels sont lesnumeacuteros de brevet et nombres drsquoheures de vol des pilotes de la compagnie de nom AirFrance
raquo La deuxiegraveme jointure reacutepond agrave la question laquo
Quels sont les avions de lacompagnie de nom Air France
raquo
En combinant ces trois fonctionnaliteacutes toute question logique devrait trouver en theacuteorie unereacuteponse par une ou plusieurs requecirctes Les questions trop complexes peuvent ecirctre program-meacutees agrave lrsquoaide des vues (chapitre 5) ou par traitement (programmes meacutelangeant requecirctes etinstructions proceacutedurales)
Syntaxe (
SELECT
)
Pour pouvoir extraire des enregistrements drsquoune table il faut que celle-ci soit dans votre baseou que vous ayez reccedilu le privilegravege
SELECT
sur la table
La syntaxe SQL simplifieacutee de lrsquoinstruction
SELECT
est la suivante
SELECT
[ DISTINCT | DISTINCTROW | ALL ]
listeColonnes
FROM
nomTable1
[
nomTable2
]
[ WHERE
condition
]
[
clauseRegroupement
]
[ HAVING
condition
]
[
clauseOrdonnancement
]
[ LIMIT [
rangDeacutepart
]
nbLignes
]
Nous deacutetaillerons chaque option agrave lrsquoaide drsquoexemples au cours de ce chapitre
Pseudotable
La pseudotable est une table qui nrsquoa pas de nom et qui est utile pour eacutevaluer une expression dela maniegravere suivante
laquo SELECT
expression
raquo
Les reacutesultats fournis seront uniques (siaucune jointure ou opeacuterateur ensembliste ne sont employeacutes dans lrsquointerrogation)
4055_04_C04 Page 84 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
85
chapitre ndeg 4 Interrogation des donneacutees
Projection (eacuteleacutements du
SELECT
)
Eacutetudions la partie de lrsquoinstruction
SELECT
qui permet de programmer lrsquoopeacuterateur de projec-tion (surligneacute dans la syntaxe suivante)
SELECT
FROM
nomTable
[
aliasTable
]
[
clauseOrdonnancement
]
[ LIMIT [
rangDeacutepart
]
nbLignes
]
DISTINCT
et
DISTINCTROW
jouent le mecircme rocircle agrave savoir ne pas inclure les duplicatas
ALL
prend en compte les duplicatas (option par deacutefaut)
listeColonnes
|
expression1
[[AS]
alias1
] [
expression2
[[AS]
alias2
]
ndash
extrait toutes les colonnes de la table
ndash
expression
nom de colonne fonction SQL constante ou calcul
ndash
alias
renomme lrsquoexpression (nom valable pendant la dureacutee de la requecircte)
FROM
deacutesigne la table (qui porte un alias ou non) agrave interroger
Tableau 4-1 Extraction drsquoexpressions
Besoin Requecircte et reacutesultat
Aucun utilisation proba-blement la plus superflue
mysqlgt SELECT Il reste encore beaucoup de pages+------------------------------------+| Il reste encore beaucoup de pages |+------------------------------------+| Il reste encore beaucoup de pages |+------------------------------------+
Jrsquoai oublieacute ma montre
mysqlgt SELECT SYSDATE() Maintenant +---------------------+| Maintenant |+---------------------+| 2005-11-07 091546 |+---------------------+
Pour les matheux qui vou-draient retrouver le reacutesul-tat de 2
14
le carreacute du cosi-nus de 3
π
sur 2 et e
1
mysqlgt SELECT POWER(214) POWER(COS(135314159265359180)2) Environ EXP(1)+-------------+------------------+----------------+| POWER(214) | Environ | EXP(1) |+-------------+------------------+----------------+| 16384 | 050000000000015 | 2718281828459 |+-------------+------------------+----------------+
[ DISTINCT | DISTINCTROW | ALL ] listeColonnes
4055_04_C04 Page 85 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
86
copy Eacuteditions Eyrolles
clauseOrdonnancement tri sur une ou plusieurs colonnes ou expressions
LIMIT pour limiter le nombre de lignes apregraves reacutesultat
Interrogeons la table suivante en utilisant chaque option
Extraction de toutes les colonnes
Lrsquoextraction de toutes les colonnes drsquoune table requiert lrsquoutilisation du symbole laquo raquo
Extraction de certaines colonnes
La liste des colonnes agrave extraire se trouve dans la clause SELECT
Figure 4-2 Table Pilote
VARCHAR(6) VARCHAR(16) DECIMAL(72) CHAR(4)
Pilote
brevet nom nbHVol compa
PL-1 Gratien Viel 450 AF PL-2 Didier Donsez 0 AF PL-3 Richard Grin 1000 SING PL-4 Placide Fresnais 2450 CAST PL-5 Daniel Vielle AF
Tableau 4-2 Utilisation de laquo raquo
Requecircte SQL Reacutesultat
mysqlgt SELECT FROM Pilote
+--------+------------------+---------+-------+| brevet | nom | nbHVol | compa |+--------+------------------+---------+-------+| PL-1 | Gratien Viel | 45000 | AF || PL-2 | Didier Donsez | 000 | AF || PL-3 | Richard Grin | 100000 | SING || PL-4 | Placide Fresnais | 245000 | CAST || PL-5 | Daniel Vielle | NULL | AF |+--------+------------------+---------+-------+
Web
Tableau 4-3 Liste de colonnes
Requecircte SQL Reacutesultat
SELECT compa brevet FROM Pilote
+-------+--------+| compa | brevet |+-------+--------+| AF | PL-1 || AF | PL-2 || SING | PL-3 || CAST | PL-4 || AF | PL-5 |+-------+--------+
Web
4055_04_C04 Page 86 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 87
chapitre ndeg 4 Interrogation des donneacutees
Alias
Les alias permettent de renommer des colonnes agrave lrsquoaffichage ou des tables dans la requecircte Lesalias de colonnes sont utiles pour les calculs
Lrsquoutilisation de la directive AS est facultative (pour se rendre conforme agrave SQL2)
Il faut preacutefixer les colonnes par lrsquoalias de la table lorsqursquoil existe
Il semble preacutefeacuterable drsquoutiliser la directive AS afin qursquoil nrsquoy ait pas drsquoambiguiumlteacute dans lrsquoexpression(oubli drsquoune virgule) SELECT col1 col2 FROM nomTable ougrave MySQL interpreacutetera la secondecolonne comme un alias de la premiegravere
Duplicatas
Les directives DISTINCT ou DISTINCTROW eacuteliminent les eacuteventuels duplicatas Pour ladeuxiegraveme requecircte les eacutecritures laquo DISTINCT compa raquo laquo DISTINCTROW(compa) raquo etlaquo DISTINCTROW compa raquo sont eacutequivalentes La notation entre parenthegraveses est neacutecessairelorsque lrsquoon deacutesire eacuteliminer des duplicatas par paires triplets etc
Tableau 4-4 Alias (colonnes et tables)
Alias de colonnes Alias de table
SELECT compa AS c1 nom AS NometPrenom brevet c3 FROM Pilote
+------+------------------+------+| c1 | NometPrenom | c3 |+------+------------------+------+| AF | Gratien Viel | PL-1 || AF | Didier Donsez | PL-2 || SING | Richard Grin | PL-3 || CAST | Placide Fresnais | PL-4 || AF | Daniel Vielle | PL-5 |+------+------------------+------+
SELECT aliasPilotescompa AS c1 aliasPilotesnom FROM Pilote aliasPilotes
+------+------------------+| c1 | nom |+------+------------------+| AF | Gratien Viel || AF | Didier Donsez || SING | Richard Grin || CAST | Placide Fresnais || AF | Daniel Vielle |+------+------------------+
Web
4055_04_C04 Page 87 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
88 copy Eacuteditions Eyrolles
Expressions et valeurs nulles
Il est possible drsquoeacutevaluer et drsquoafficher simultaneacutement des expressions dans la clause SELECT(types numeacuteriques DATE et DATETIME)
Les opeacuterateurs arithmeacutetiques sont eacutevalueacutes par ordre de prioriteacute ( + et -)
Le reacutesultat drsquoune expression comportant une valeur NULL est eacutevalueacute agrave NULL
Nous avons deacutejagrave eacutetudieacute les opeacuterations sur les dates et intervalles (chapitre 2) Dans lrsquoexemplesuivant lrsquoexpression 10nbHVol+52 est calculeacutee en multipliant par 10 le nombre drsquoheuresde vol puis en ajoutant le reacutesulat de 5 diviseacute par 2 Dans le second exemple on convertit lemoment actuel (anneacutee mois jour heures minutes et secondes) en un entier
Tableau 4-5 Gestion des duplicatas
Avec duplicata Sans duplicata
SELECT compa FROM Pilote
+-------+| compa |+-------+| AF || AF || SING || CAST || AF |+-------+
SELECT DISTINCT(compa) FROM Pilote
+-------+| compa |+-------+| AF || SING || CAST |+-------+
Web
Tableau 4-6 Expressions numeacuteriques
Requecircte Reacutesultat
SELECT brevet nbHVol nbHVolnbHVol AS auCarre 10nbHVol+52 FROM Pilote
+--------+---------+--------------+---------------+| brevet | nbHVol | auCarre | 10nbHVol+52 |+--------+---------+--------------+---------------+| PL-1 | 45000 | 2025000000 | 45025000 || PL-2 | 000 | 00000 | 25000 || PL-3 | 100000 | 10000000000 | 100025000 || PL-4 | 245000 | 60025000000 | 245025000 || PL-5 | NULL | NULL | NULL |+--------+---------+--------------+---------------+
SELECT SYSDATE()+0 +----------------+| SYSDATE()+0 |+----------------+| 20051107145522 |+----------------+
Web
4055_04_C04 Page 88 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 89
chapitre ndeg 4 Interrogation des donneacutees
Ordonnancement
Pour trier le reacutesultat drsquoune requecircte il faut speacutecifier la clause drsquoordonnancement par ORDERBY de la maniegravere suivante
ORDER BY
expression1 | position1 | alias1 [ASC | DESC]
[expr2 | position2 | alias2 [ASC | DESC]
expression nom de colonne fonction SQL constante calcul
position entier qui deacutesigne lrsquoexpression (au lieu de la nommer) dans son ordre drsquoappa-rition dans la clause SELECT
ASC ou DESC tri ascendant ou descendant (par deacutefaut ASC)
Dans lrsquoexemple suivant on remarque que la valeur NULL est consideacutereacutee comme plus petiteque 0
Concateacutenation
Lrsquoopeacuterateur de concateacutenation se programme agrave lrsquoaide de la fonction CONCAT qui admet deuxchaicircnes de caractegraveres en paramegravetre Cette fonction permet de concateacutener diffeacuterentes expres-sions (colonnes calculs reacutesultats de fonctions SQL ou constantes) sous reacuteserve drsquoeacuteventuellesconversions (casting) La colonne reacutesultante est consideacutereacutee comme une chaicircne de caractegraveres
Lrsquoexemple suivant preacutesente un alias dans lrsquoen-tecircte de colonne (Embauche) qui met enforme les reacutesultats La concateacutenation concerne deux colonnes et la constante vole pour
Tableau 4-7 Ordonnancement
Options par deacutefaut Ordre deacutecroissant (et NULL)
mysqlgt SELECT brevet nom FROM Pilote
+--------+------------------+| brevet | nom |+--------+------------------+| PL-5 | Daniel Vielle || PL-2 | Didier Donsez || PL-1 | Gratien Viel || PL-4 | Placide Fresnais || PL-3 | Richard Grin |+--------+------------------+
mysqlgt SELECT brevetnbHVol FROM Pilote
+--------+---------+| brevet | nbHVol |+--------+---------+| PL-4 | 245000 || PL-3 | 100000 || PL-1 | 45000 || PL-2 | 000 || PL-5 | |+--------+---------+
WebORDER BY nom ORDER BY nbHvol DESC
NULL
4055_04_C04 Page 89 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
90 copy Eacuteditions Eyrolles
Insertion multiligne
Nous pouvons maintenant deacutecrire lrsquoinsertion multiligne eacutevoqueacutee au chapitre preacuteceacutedent Danslrsquoexemple suivant il srsquoagit drsquoinseacuterer tous les pilotes de la table Pilote (en consideacuterant lenom le nombre drsquoheures de vol et la compagnie) dans la table NomsetHVoldesPilotes
Notez que les instructions (CREATE TABLE et INSERT) peuvent ecirctre programmeacutees en uneinstruction (option AS SELECT de la commande CREATE TABLE)
CREATE TABLE NomsetHVoldesPilotes AS SELECT nom nbHVol compa
FROM Pilote
Limitation du nombre de lignes
Pour limiter le nombre de lignes agrave extraire agrave partir du reacutesultat drsquoune requecircte il faut speacutecifier laclause LIMIT de la maniegravere suivante
LIMIT [rangDeacutepart] nbLignes
Tableau 4-8 Concateacutenation
Requecircte Reacutesultat
SELECT brevet AS Embauche FROM Pilote
+--------+---------------------------------+| brevet | Embauche |+--------+---------------------------------+| PL-1 | Gratien Viel vole pour AF || PL-2 | Didier Donsez vole pour AF || PL-3 | Richard Grin vole pour SING || PL-4 | Placide Fresnais vole pour CAST || PL-5 | Daniel Vielle vole pour AF |+--------+---------------------------------+
Web
CONCAT(nom vole pour compa)
Tableau 4-9 Insertion multiligne
Creacuteation et insertion Requecircte et reacutesultat
CREATE TABLE NomsetHVoldesPilotes (nom VARCHAR(16) nbHVol DECIMAL(72) compa CHAR(4))
INSERT INTO NomsetHVoldesPilotes
mysqlgt SELECT FROM NomsetHVoldesPilotes+------------------+---------+-------+| nom | nbHVol | compa |+------------------+---------+-------+| Gratien Viel | 45000 | AF || Didier Donsez | 000 | AF || Richard Grin | 100000 | SING || Placide Fresnais | 245000 | CAST || Daniel Vielle | NULL | AF |+------------------+---------+-------+
Web
SELECT nomnbHVolcompaFROM Pilote
4055_04_C04 Page 90 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 91
chapitre ndeg 4 Interrogation des donneacutees
Le premier entier preacutecise le rang de la premiegravere ligne seacutelectionneacutee (en fonction du tri du reacutesul-tat) Le second entier indique le nombre maximum de lignes agrave extraire La premiegravere ligne estconsideacutereacutee comme preacutesente au rang 0 Ainsi laquo LIMIT n raquo eacutequivaut agrave laquo LIMIT 0n raquoLrsquoexemple suivant illustre deux utilisations de la clause LIMIT
Restriction (WHERE)
Les eacuteleacutements de la clause WHERE drsquoune requecircte permettent de programmer lrsquoopeacuterateur derestriction Cette clause limite la recherche aux enregistrements qui respectent une conditionsimple ou complexe Cette section srsquointeacuteresse agrave la partie surligneacutee de lrsquoinstruction SELECTsuivante
SELECT [ DISTINCT | DISTINCTROW | ALL ] listeColonnes
FROM nomTable [aliasTable]
condition composeacutee de colonnes drsquoexpressions de constantes lieacutees deux agrave deux entredes opeacuterateurs
ndash de comparaison (gt = lt gt= lt= ltgt)
ndash logiques (NOT AND ou OR)
ndash inteacutegreacutes (BETWEEN IN LIKE IS NULL)
Interrogeons la table suivante en utilisant chaque cateacutegorie drsquoopeacuterateur
Tableau 4-10 Limitation des reacutesultats
Requecircte Reacutesultat
Deuxiegraveme et troisiegraveme (ordre de cleacute) pilote
SELECT FROM Pilote
+--------+---------------+---------+-------+| brevet | nom | nbHVol | compa |+--------+---------------+---------+-------+| PL-2 | Didier Donsez | 000 | AF || PL-3 | Richard Grin | 100000 | SING |+--------+---------------+---------+-------+
Les deux pilotes les plus expeacuterimenteacutes (par ordre du nombre drsquoheures de vol)
SELECT FROM Pilote ORDER BY nbHvol DESC
+--------+------------------+---------+-------+| brevet | nom | nbHVol | compa |+--------+------------------+---------+-------+| PL-4 | Placide Fresnais | 245000 | CAST || PL-3 | Richard Grin | 100000 | SING |+--------+------------------+---------+-------+
Web
LIMIT 12
LIMIT 2
[ WHERE condition ]
4055_04_C04 Page 91 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
92 copy Eacuteditions Eyrolles
Opeacuterateurs de comparaison
Le tableau suivant deacutecrit des requecirctes pour lesquelles la clause WHERE contient des opeacuterateursde comparaison
Les eacutecritures laquo prime=500 raquo et laquo (prime=500) raquo sont eacutequivalentes Les eacutecritureslaquo primeltgt500 raquo et laquo NOT (prime=500) raquo sont eacutequivalentes Les parenthegraveses sont utilespour composer des conditions
Notez lrsquoutilisation du simple guillemet pour comparer des chaicircnes de caractegraveres
Figure 4-3 Table Pilote
Web
Pilote
brevet nom nbHVol prime compa
PL-1 Gratien Viel 450 500 AF PL-2 Didier Donsez 0 AF PL-3 Richard Grin 1000 90 SING PL-4 Placide Fresnais 2450 500 CAST PL-5 Daniel Vielle 400 600 SING PL-6 Francoise Tort 0 CAST
Tableau 4-11 Eacutegaliteacute ineacutegaliteacute et comparaison
Eacutegaliteacute Comparaison et ineacutegaliteacute
SELECT brevet nom AS Prime 500 FROM Pilote WHERE +--------+------------------+| brevet | Prime 500 |+--------+------------------+| PL-1 | Gratien Viel || PL-4 | Placide Fresnais |+--------+------------------+
SELECT brevet nom de Air-France FROM Pilote WHERE +--------+---------------+| brevet | de Air-France |+--------+---------------+| PL-1 | Gratien Viel || PL-2 | Didier Donsez |+--------+---------------+
SELECT brevet nom prime FROM Pilote WHERE
+--------+----------------+-------+| brevet | nom | prime |+--------+----------------+-------+| PL-3 | Richard Grin | 90 || PL-6 | Francoise Tort | 0 |+--------+----------------+-------+
SELECT brevet nom prime FROM Pilote WHERE +--------+----------------+-------+| brevet | nom | prime |+--------+----------------+-------+| PL-3 | Richard Grin | 90 || PL-5 | Daniel Vielle | 600 || PL-6 | Francoise Tort | 0 |+--------+----------------+-------+
Webprime = 500
compa = AF
prime lt= 400
prime ltgt 500
4055_04_C04 Page 92 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 93
chapitre ndeg 4 Interrogation des donneacutees
Opeacuterateurs logiques
bull Lrsquoordre de prioriteacute des opeacuterateurs logiques est NOT AND et OR
bull Les opeacuterateurs de comparaison (gt = lt gt= lt= ltgt) sont prioritaires par rapport agrave NOT
bull Les parenthegraveses permettent de modifier ces regravegles de prioriteacute
La premiegravere requecircte de lrsquoexemple suivant contient une condition composeacutee de trois preacutedicatsqui sont eacutevalueacutes par ordre de prioriteacute (drsquoabord AND puis OR) La conseacutequence est lrsquoaffichagedes pilotes de la compagnie SING avec les pilotes de AF ayant moins de 500 heures de vol
La deuxiegraveme requecircte force la prioriteacute avec les parenthegraveses (AND et OR sur le mecircme pieddrsquoeacutegaliteacute) La conseacutequence est lrsquoaffichage des pilotes ayant moins de 500 heures de vol descompagnies SING et AF
Opeacuterateurs inteacutegreacutes
Les opeacuterateurs inteacutegreacutes sont BETWEEN IN LIKE et IS NULL
Tableau 4-12 Opeacuterateurs logiques
Requecircte Reacutesultat sous SQLPlus
SELECT brevet nom compa FROM Pilote WHERE (
+--------+---------------+-------+| brevet | nom | compa |+--------+---------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF || PL-3 | Richard Grin | SING || PL-5 | Daniel Vielle | SING |+--------+---------------+-------+
SELECT brevet nom compa FROM Pilote WHERE (( ) AND nbHVol lt 500)
+--------+---------------+-------+| brevet | nom | compa |+--------+---------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF || PL-5 | Daniel Vielle | SING |+--------+---------------+-------+
Web
compa = SING OR compa = AF AND nbHVol lt 500)
compa = SING OR compa = AF
4055_04_C04 Page 93 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
94 copy Eacuteditions Eyrolles
Tableau 4-13 Opeacuterateurs inteacutegreacutes
Opeacuterateur Exemple
BETWEEN limiteInf AND limiteSup teste lrsquoappartenance agrave un intervalle de valeurs
SELECT brevet nom nbHVol FROM Pilote WHERE nbHVol +--------+---------------+---------+| brevet | nom | nbHVol |+--------+---------------+---------+| PL-1 | Gratien Viel | 45000 || PL-3 | Richard Grin | 100000 || PL-5 | Daniel Vielle | 40000 |+--------+---------------+---------+
IN (listeValeurs) compare une expres-sion avec une liste de valeurs
SELECT brevet nom compa FROM Pilote WHERE compa +--------+------------------+-------+| brevet | nom | compa |+--------+------------------+-------+| PL-3 | Richard Grin | SING || PL-4 | Placide Fresnais | CAST || PL-5 | Daniel Vielle | SING || PL-6 | Francoise Tort | CAST |+--------+------------------+-------+
LIKE (expression) compare de maniegravere geacuteneacuterique des chaicircnes de caractegraveres agrave une expressionLe symbole remplace un ou plusieurs caractegraveresLe symbole _ remplace un caractegravereCes symboles peuvent se combinerUtilisez de preacutefeacuterence des colonnes VARCHAR ou compleacutetez si neacutecessaire par des blancs jusqursquoagrave la taille maximale pour des CHAR
SELECT brevet nom compa FROM Pilote WHERE compa +--------+------------------+-------+| brevet | nom | compa |+--------+------------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF || PL-4 | Placide Fresnais | CAST || PL-6 | Francoise Tort | CAST |+--------+------------------+-------+SELECT brevet nom compa FROM Pilote WHERE compa +--------+---------------+-------+| brevet | nom | compa |+--------+---------------+-------+| PL-1 | Gratien Viel | AF || PL-2 | Didier Donsez | AF |+--------+---------------+-------+
IS NULL compare une expression (colonne calcul constante) agrave la valeur NULLLa neacutegation srsquoeacutecrit soit laquo expression IS NOT NULL raquo soit laquo NOT (expression IS NULL) raquo
SELECT nom prime nbHVol FROM Pilote WHERE prime OR nbHVol +----------------+-------+--------+| nom | prime | nbHVol |+----------------+-------+--------+| Didier Donsez | NULL | 000 || Francoise Tort | 0 | NULL |+----------------+-------+--------+
WebBETWEEN 399 AND 1000
IN (CAST SING)
LIKE (A)
LIKE (A_)
IS NULL IS NULL
4055_04_C04 Page 94 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 95
chapitre ndeg 4 Interrogation des donneacutees
Alias
Il nrsquoest pas permis drsquoutiliser un alias de colonne dans la clause WHERE Cette recommandationde la norme srsquoexplique par le fait que certaines expressions pourraient ne pas ecirctre deacutetermineacuteespendant que la condition WHERE est eacutevalueacutee
Ainsi la requecircte suivante renvoie une erreur alors qursquoelle ne contient pourtant pas drsquoexpres-sion litigieuse Il faudra ici remplacer laquo c1 raquo par laquo aliasDesPilotescompa raquo
mysqlgt SELECT aliasDesPilotescompa AS c1 aliasDesPilotesnom
FROM Pilote aliasDesPilotes WHERE c1 = AF
ERROR 1054 (42S22) Unknown column c1 in where clause
Fonctions
MySQL propose un grand nombre de fonctions qui srsquoappliquent dans les clauses SELECT ouWHERE drsquoune requecircte La syntaxe geacuteneacuterale drsquoune fonction est la suivante
nomFonction(colonne1 | expression1 [colonne2 | expression2 hellip])
bull Une fonction monoligne agit sur une ligne agrave la fois et ramegravene un reacutesultat par ligne On distin-gue quatre familles de fonctions monolignes caractegraveres numeacuteriques dates et conversionsde types de donneacutees Ces fonctions peuvent se combiner entre elles (exemple MAX(COS(ABS(n))) deacutesigne le maximum des cosinus de la valeur absolue de la colonne n)
bull Une fonction multiligne (fonction drsquoagreacutegat) agit sur un ensemble de lignes pour ramener unreacutesultat (voir la section Regroupements)
Caractegraveres
Interrogeons la table suivante en utilisant des fonctions pour les caractegraveres
Figure 4-4 Table Pilote
Pilote
brevet prenom nom surnom compa
PL-1 Gratien viel dba AF PL-2 Didier donsez smith AFPL-3 richard Grin Faucon SING
PL-4 placide Fresnais cool CASTPL-5 Daniel vielle jones SINGPL-6 Francoise tort NormaleSup CAST
4055_04_C04 Page 95 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
96 copy Eacuteditions Eyrolles
La plupart des fonctions pour les caractegraveres acceptent une chaicircne de caractegraveres en paramegravetrede nature CHAR ou VARCHAR Le tableau suivant deacutecrit les principales fonctions
Tableau 4-14 Fonctions pour les caractegraveres
Fonction Objectif Exemple
ASCII(c) Retourne le carac-tegravere ASCII eacutequiva-lent
(A) donne 65
CHAR(n) Retourne le carac-tegravere eacutequivalent dans le jeu de caractegraveres en cours
(161) || (162) donne iacuteoacute
CONCAT(c1c2) Concategravene deux chaicircnes
SELECT Personnel FROM Pilote+------------------------------+| Personnel |+------------------------------+| viel travaille pour AF || |
FIELD(cc1c2hellip) Retourne lrsquoindex qui correspond agrave la premiegravere eacutegaliteacute entre c et c1 c et c2 etc 0 si aucune eacutegaliteacute nrsquoest trouveacutee
SELECT Attention agrave la casse
+-----------------------+| Attention agrave la casse |+-----------------------+| 1 |+-----------------------+
INSERT(c1postc2) Modifie la chaicircne c1 en inseacuterant t caractegraveres de la sous-chaicircne c2 agrave partir de la posi-tion pos
SELECT Qui
+---------------------+| Qui |+---------------------+| Compagnie Airbus |+---------------------+
INSTR(c1c2) Premier indice drsquoune sous-chaicircne c1 dans une chaicircne c2Exemple indice de Air dans la chaicircne
SELECT Indice
+--------+| Indice |+--------+| 7 |+--------+
ASCII
CHR CHR
CONCAT(CONCAT(nom vole pour ) compa)
FIELD(Air air AirbusAir)
INSERT(Compxxxie Airbus 5 3 agn)
INSTR(Infos-Air AirBus pourAir-FranceAir)
4055_04_C04 Page 96 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 97
chapitre ndeg 4 Interrogation des donneacutees
LOWER(c) Tout en minuscu-les
SELECT CONCAT( ) Etat civil FROM Pilote WHERE compa = SING+---------------+| Etat civil |+---------------+| richard grin || daniel vielle |
LOCATE(c1c2pos) Premier indice drsquoune sous-chaicircne c1 dans une chaicircne c2 agrave partir de la position posExemple indice de Air dans la chaicircne agrave partir du 9e caractegravere
SELECT Indice apregraves 9
+----------------+| Indice apregraves 9 |+----------------+| 13 |+----------------+
LENGTH(c) Longueur de la chaicircne
SELECT Taille
+-------+| Taille |+--------+| 35 |+--------+
LEFT(cn) Extrait les n pre-miers caractegraveres agrave c en partant de la gauche
SELECT Bye les Jumbo+----------------+| Bye les Jumbo |+----------------+| A380 agrave Blagnac |+----------------+
LPAD(c1nc2) Insertion agrave gauche de c2 dans c1 sur n caractegraveres
SELECT sur 20+----------------------+| sur 20 |+----------------------+| -----------Rien |+----------------------+
REPLACE(c1c2c3) Recherche les c2 preacutesentes dans c1 et les remplace par c3
SELECT Changement+----------------------+| Changement |+----------------------+| EADS et Aerospatiale |+----------------------+
Tableau 4-14 Fonctions pour les caractegraveres (suite)
Fonction Objectif Exemple
LOWER(prenom)LOWER(nom)
LOCATE(AirInfos-Air AirBuspour Air-France9)
LENGTH(Infos-Air AirBus pourAir-France)
LEFT(A380 agrave BlagnacB747B74714)
LPAD(Rien20--)
REPLACE(Matra et AerospatialeMatraEADS)
4055_04_C04 Page 97 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
98 copy Eacuteditions Eyrolles
REVERSE(c) Retourne la chaicircne renverseacutee
SELECT Miroir+----------------+| Miroir |+----------------+| A380 agrave Blagnac |+----------------+
RIGHT(cn) Extrait les n der-niers caractegraveres agrave c en partant de la droite
SELECT Bye les Jumbo+----------------+| Bye les Jumbo |+----------------+| A380 agrave Blagnac |+----------------+
RPAD(c1nc2) Insertion agrave droite de c2 dans c1 sur n caractegraveres
SELECT sur 19+---------------------+| sur 19 |+---------------------+| Rien---------- |+---------------------+
SOUNDEX(c) Extrait la phoneacuteti-que drsquoune expres-sion (in english only )
SELECT nom surnom compa FROM Pilote WHERE IN ( )+--------+--------+-------+| nom | surnom | compa |+--------+--------+-------+| donsez | smith | AF || vielle | jone | SING |+--------+--------+-------+
SUBSTR(cn[t]) Extraction de la sous-chaicircne c commenccedilant agrave la position n sur t caractegraveres
SELECT
Ougrave ccedila +-----------+| Ougrave ccedila |+-----------+| agrave Blagnac |+-----------+
Tableau 4-14 Fonctions pour les caractegraveres (suite)
Fonction Objectif Exemple
REVERSE(cangalB agrave 083A)
RIGHT(B747B747A380 agrave Blagnac14)
RPAD(Rien19--)
SOUNDEX(surnom)SOUNDEX(SMYTHE) SOUNDEX(John)
SUBSTR(Air France agrave Blagnac Con129)
4055_04_C04 Page 98 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 99
chapitre ndeg 4 Interrogation des donneacutees
Numeacuteriques
En plus des opeacuterateurs arithmeacutetiques disponibles dans les langages de programmation (+ - et DIV pour la division entiegravere) MySQL supporte un grand nombre de fonctions numeacuteriques
TRIM(c1 FROM c2) Enlegraveve les carac-tegraveres c1 agrave la chaicircne c2 (options LEADING et TRAILING pour preacuteciser le sens du deacutecoupage) Existent aussi LTRIM et RTRIM qui enlegravevent des espaces respecti-vement au deacutebut ou agrave la fin drsquoune chaicircne
SELECT
Bye les Jumbo
+----------------+| Bye les Jumbo |+----------------+| A380 agrave Blagnac |+----------------+
UPPER Tout en majuscu-les
SELECT CONCAT( ) Pilotes de CAST
FROM Pilote WHERE compa = CAST+------------------+| Pilotes de CAST |+------------------+| PLACIDE FRESNAIS || FRANCOISE TORT |+------------------+
Tableau 4-14 Fonctions pour les caractegraveres (suite)
Fonction Objectif Exemple
TRIM(B FROM BA380 agrave BlagnacBBBBB)
UPPER(prenom)UPPER(nom)
Tableau 4-15 Fonctions numeacuteriques
Fonction Objectif Exemple
ABS(n) Valeur absolue de n
ACOS(n) Arc cosinus (n de -1 agrave 1) retour exprimeacute en radians (de 0 agrave pi)
ATAN(n) Arc tangente (forall n) retour exprimeacute en radians ( de -pi2 agrave pi2)
CEIL(n) Plus petit entier ge agrave n retourne 16
COS(n) Cosinus de n exprimeacute en radians de 0 agrave 2 pi
retourne 05
COT(n) Cotangente de n exprimeacutee en radians retourne 17320508075689
DEGREES(n) Conversion de radians en degreacutes retourne 90
CEIL(157)
COS(60PI()180)
COT(30PI()180)
DEGREES(PI()2)
4055_04_C04 Page 99 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
100 copy Eacuteditions Eyrolles
Fonction pour les bits
Les opeacuterateurs suivants sont disponibles jusqursquoagrave 64 bits (BIGINT) On peut en utiliser certainsen passant des paramegravetres en base 10 en binaire ou de type chaicircne de caractegraveres
EXP(n) e (271828183) agrave la puissance n
FLOOR(n) Plus grand entier le agrave n retourne 15
LN(n) Logarithme neacutepeacuterien de n
LOG(n)(mn) Logarithme de n dans une base m
MOD(mn) Reste de la division entiegravere de m par n
POW(mn) m puissance n
RADIANS(n) Conversion de degreacutes en radians retourne 15707963267949
RAND() Flottant aleacuteatoire (agrave 14 deacutecimales) entre 0 et 1
retourne 1757
ROUND(mn) Arrondi agrave une ou plusieurs deacutecimales retourne 1757
SIGN(n) Retourne le signe drsquoun nombre (-1 0 ou 1)
SIN(n) Sinus de n exprimeacute en radians de 0 agrave 2 pi retourne 05
SINH(n) Sinus hyperbolique de n
SQRT(n) Racine carreacutee de n
TAN(n) Tangente de n exprimeacutee en radians de 0 agrave 2 pi
TRUNCATE(nm) Coupure de n agrave m deacutecimales retourne 157
Tableau 4-15 Fonctions numeacuteriques (suite)
Fonction Objectif Exemple
FLOOR(157)
RADIANS(90)
ROUND(175672)
ROUND(175672)
SIN(30PI()180)
TRUNC(15791)
Tableau 4-16 Fonctions pour les bits
Fonction Objectif Exemple
OR | OU bits agrave bits b0100 b1100 retourne 12
AND amp ET bits agrave bits b0100 b1100 retourne 4
XOR ^ OU exclusif bits agrave bits b0100 b1100 retourne 8
SHL ltlt Deacutecalage agrave gauche de n posi-tions
3 2 retourne 12
SHR gtgt Deacutecalage agrave droite de n positions b0100 2 retourne 1
Compleacutement agrave 1 ~ Inversion de chaque bit 3+(~3+1) retourne 1 (ici on pro-gramme le compleacutement agrave 2)
BIN(n) Chaicircne qui repreacutesente la valeur binaire de n
retourne 1100
|
amp
^
ltlt
gtgt
BIN(12)
4055_04_C04 Page 100 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 101
chapitre ndeg 4 Interrogation des donneacutees
Dates
Le tableau suivant deacutecrit les principales fonctions pour les dates
BIT_LENGTH(c) Taille de la chaicircne en bits retourne 24 (3 octets)
HEX(ns) Chaicircne en hexadeacutecimal repreacute-sentant ns (nombre ou chaicircne)
retourne FE
OCT(n) Chaicircne en octal repreacutesentant n retourne 14
OCTET_LENGTH(c) Synonyme de LENGTH()
UNHEX(c) Fonction inverse de HEX retourne SQL
Tableau 4-16 Fonctions pour les bits (suite)
Fonction Objectif Exemple
BIT_LENGTH(GTR)
HEX(254)
OCT(12)
UNHEX(53514C)
Tableau 4-17 Fonctions pour les dates
Fonction Objectif Retour
ADDDATE(daten) Ajoute n jours agrave une date (heure) DATE ou DATETIME
ADDTIME(date1date2) Ajoute les deux dates avec date1 TIME ou DATETIME et date2 TIME
TIME ou DATETIME
CURDATE() CURRENT_DATE ou CURRENT_DATE()
Date courante (YYYY-MM-DD ou YYYYM-MDD)
INT ou DATE
CURTIME() CURRENT_TIME ou CURRENT_TIME()
Heure courante (HHMMSS or HHMMSS) INT ou DATE
CURRENT_TIMESTAMP CURRENT_TIMES-TAMP()ou NOW()
Date et heure courantes (YYYY-MM-DD HHMMSS ou YYYYMMDDHHMMS)
INT ou DATETIME
DATE(datet) Extrait une date agrave partir drsquoune expression de type DATETIME
DATE
DATEDIFF(date1date2) Nombre entier de jours entre les 2 dates INT
DATE_ADD(dateINTERVAL expr type) Ajoute un intervalle agrave une date (heure) expr deacutesigne un intervalle type indique comment interpreacuteter le format de lrsquoexpres-sion (voir tableau suivant)
DATE ou DATETIME
DATE_FORMAT(dateformat) Preacutesente la date selon un format (voir tableau suivant)
VARCHAR
DATE_SUB(dateINTERVAL expr type) Soustrait un intervalle agrave une date (heure) Mecircmes paramegravetres que DATE_ADD
DATE ou DATETIME
DAYNAME(date) Nom du jour en anglais VARCHAR
DAY(date) ou DAYOFMONTH(date) Numeacutero du jour dans le mois (0 agrave 31) INT
DAYOFYEAR(date) Numeacutero du jour dans lrsquoanneacutee (0 agrave 366) INT
4055_04_C04 Page 101 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
102 copy Eacuteditions Eyrolles
EXTRACT(type FROM date) Extrait une partie drsquoune date selon un type drsquointervalle (comme pour DATE_ADD)
INT
FROM_DAYS(n) Retourne une date agrave partir drsquoun nombre de jours (le calendrier anneacutee 0 deacutebute agrave n=365)
DATE
FROM_UNIXTIME(nunix[format]) Retourne une date (heure) agrave partir drsquoune estampille Unix (nombre de jours depuis le 111970) Utilisation possible drsquoun format
INT ou DATETIME
HOUR(time) Extrait lrsquoheure drsquoun temps INT
LAST_DAY(date) Dernier jour du mois drsquoune date (heure) DATE
LOCALTIME LOCALTIME() LOCALTI-MESTAMP LOCALTIMESTAMP()
Synonymes de NOW()
MAKEDATE(anneenjour) Construit une date agrave partir drsquoune anneacutee et drsquoun nombre de jours (gt0 si njourgt365 lrsquoanneacutee srsquoincreacutemente automatiquement)
DATE
MAKETIME(heureminuteseconde) Construit une heure TIME
MICROSECOND(date) Extrait les microsecondes drsquoune date-heure
INT
MINUTE(time) Extrait les minutes drsquoun temps INT
MONTH(date) MONTHNAME(date) Retourne respectivement le numeacutero et le nom du mois drsquoune date-heure
INTVARCHAR
NOW() Date et heure courantes au format YYYY-MM-DD HHMMSS ou YYYYMMDDHHMMSS
DATETIME ou INT
PERIOD_DIFF(int1int2) Nombre de mois seacuteparant les deux dates au format YYMM or YYYYMM
INT
SECOND(time) Extrait les secondes drsquoun temps INT
SEC_TO_TIME(secondes) Construit une heure au format HHMMSS ou HHMMSS
TIME ouINT
STR_TO_DATE(cformat) Construit une date (heure) selon un certain format Crsquoest lrsquoinverse de DATE_FORMAT()
DATE ou DATETIME ou TIME
SUBDATE(daten) Retranche n jours agrave une date (heure) DATE ou DATETIME
SUBTIME(date1date2) Retranche date2 (TIME) agrave date1 (TIME ou DATETIME)
TIME ou DATETIME
SYSDATE() Date et heure courantes au format YYYY-MM-DD HHMMSS ou YYYYMMDDHHMMSS (diffeacuterence avec NOW voir chapitre 1)
DATETIME ou INT
TIME(datetime) Extrait le temps drsquoune date-heure TIME
Tableau 4-17 Fonctions pour les dates (suite)
Fonction Objectif Retour
4055_04_C04 Page 102 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 103
chapitre ndeg 4 Interrogation des donneacutees
TIMEDIFF(tdate1tdate2) Temps entre 2 temps ou 2 dates ou 2 dates-heure
TIME
TIMESTAMP(date) Construit une estampille agrave partir drsquoune date (heure)
TIMESTAMP
TIMESTAMPADD(intervalleintdate) Ajoute agrave la date (heure) un intervalle (int) du type FRAC_SECOND SECOND MINUTE HOUR DAY WEEK MONTH QUARTER ou YEAR
TIMESTAMP
TIMESTAMPDIF(intervalleintdate) Retranche agrave la date (heure) un intervalle du type (idem preacuteceacutedent)
TIMESTAMP
TIME_TO_SEC(time) Retourne le nombre de secondes eacutequiva-lent au temps
INT
TO_DAYS(date) Retourne un nombre de jours agrave partir drsquoune date (YYYY-MM-DD ou YYYYMMDD) Inverse de FROM_DAYS()
INT
UNIX_TIMESTAMP(date) Retourne le nombre de secondes depuis le 111970 jusqursquoagrave la date (heure) passeacutee en paramegravetre (ou entier au format YYMMDD YYYYMMDD) Inverse de FROM_UNIX-TIME()
INT
UTC_DATE() UTC_TIME() UTC_TIMES-TAMP()
Retournent respectivement la date lrsquoheure et lrsquoestampille au meacuteridien de Greenwich
DATETIMEDATETIME
WEEKDAY(date) Numeacutero du jour (0 lundi 1 mardi 6 dimanche) drsquoune date (heure)
INT
WEEKOFYEAR(date) Numeacutero de la semaine en cours (1 agrave 53) INT
Tableau 4-17 Fonctions pour les dates (suite)
Fonction Objectif Retour
4055_04_C04 Page 103 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
104 copy Eacuteditions Eyrolles
Tableau 4-18 Paramegravetres drsquointervalles pour les fonctions DATE_ADD et DATE_SUB
Paramegravetre type Paramegravetre expr
MICROSECOND nSECOND n
MINUTE n
HOUR nn
DAY nn
WEEK n
MONTH nn
YEAR nnnn
SECOND_MICROSECOND ssmicrosec
MINUTE_MICROSECOND mimicrosec
MINUTE_SECOND missS
HOUR_MICROSECOND hhmicrosec
HOUR_SECOND hhmiss
HOUR_MINUTE hhmi
DAY_MICROSECOND ddmicrosec
DAY_SECOND dd hhmiss
DAY_MINUTE dd hhmi
DAY_HOUR dd hh
YEAR_MONTH yyyy-mm
Tableau 4-19 Principaux formats pour les fonctions DATE_FORMAT et STR_TO_DATE
Format Description
a Nom du jour en anglais abreacutevieacute (SunSat)
b Nom du mois en anglais abreacutevieacute (JanDec)
c Mois (012)
e Jour du mois (031)
f Microsecondes (000000999999)
H Heures (0023)
i Minutes (0059)
j Jour de lrsquoanneacutee (001366)
M Nom du mois en anglais (JanuaryDecember)
s Secondes (0059)
T Time sur 24 heures (hhmmss)
u Numeacutero de semaine (0053)
W Nom du jour en anglais (SundaySaturday)
w Jour de la semaine (0=Sunday6=Saturday)
Y Anneacutee sur 4 positions
4055_04_C04 Page 104 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 105
chapitre ndeg 4 Interrogation des donneacutees
Quelques exemples drsquoutilisation (date du jour mercredi 9 novembre 2005) sont donneacutes dansle tableau suivant
Conversions
MySQL autorise des conversions de types implicites ou explicites
Implicites
Il est possible drsquoaffecter dans une expression ou dans une instruction SQL (INSERTUPDATE) une donneacutee de type numeacuterique (ou date-heure) agrave une donneacutee de type VARCHAR(ou CHAR) Il en va de mecircme pour lrsquoaffectation drsquoune colonne VARCHAR par une donneacutee de typedate-heure (ou numeacuterique) On parle ainsi de conversions implicites
Tableau 4-20 Exemples de fonctions pour les dates
Besoin et fonction Reacutesultat
Date dans 31 joursSELECT
+--------------------------+| ADDDATE(2005-11-9 31) |+--------------------------+| 2005-12-10 |+--------------------------+
1 jour et 1 microseconde apregraves le 9112005 11 heures 1 microsecondeSELECT
exemple ADDTIME
+----------------------------+| exemple ADDTIME |+----------------------------+| 2005-11-10 230000000000 |+----------------------------+
Rendez-vous dans 4 moisSELECT DATE_ADD(CURRENT_TIMESTAMP INTERVAL 4 MONTH) RDV
+---------------------+| RDV |+---------------------+| 2006-03-09 170733 |+---------------------+
Rendez-vous dans 7 jours 1 heure et 30 minutesSELECT
RDV 1sem 1h30
+---------------------+| RDV 1sem 1h30 |+---------------------+| 2005-11-16 185303 |+---------------------+
Aujourdrsquohui en anglaisSELECT
Y) Today in English
+----------------------------+| Today in English |+----------------------------+| Wednesday 09 November 2005 |+----------------------------+
Extraction au format numeacuterique du jour heures et minutesSELECT
DAY_MINUTE
+------------+| DAY_MINUTE |+------------+| 90102 |+------------+
WebADDDATE(2005-11-9 31)
ADDTIME(2005-11-092259599999991 000000001)
DATE_ADD(CURRENT_TIMESTAMPINTERVAL 7 013000 DAY_SECOND)
DATE_FORMAT(SYSDATE() W d MY)
EXTRACT(DAY_MINUTE FROM 2005-11-09010203)
4055_04_C04 Page 105 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
106 copy Eacuteditions Eyrolles
Pour preuve le script suivant ne renvoie aucune erreur
CREATE TABLE Test (c1 DECIMAL(63) c2 DATE c3 VARCHAR(1) c4
CHAR)
INSERT INTO Test VALUES (54845 20060116 3 5)
Explicites
Une conversion est dite laquo explicite raquo quand on utilise une fonction agrave cet effet Les fonctions deconversion les plus connues sont CAST et CONVERT (qui respectent la syntaxe de la normeSQL)
Les fonctions de conversion sont deacutecrites dans le tableau suivant
Comparaisons
MySQL compare deux variables entre elles en suivant les regravegles suivantes
bull Si lrsquoune des deux valeurs est NULL la comparaison retourne NULL (sauf pour lrsquoopeacuterateurlt=gt qui renvoie vrai si les deux valeurs sont NULL)
bull Si les deux valeurs sont des chaicircnes elles sont compareacutees en tant que telles
bull Si les deux valeurs sont des numeacuteriques elles sont compareacutees en tant que telles
bull Les valeurs hexadeacutecimales sont traiteacutees comme des chaicircnes de bits si elles ne sont pascompareacutees agrave des numeacuteriques
bull Si lrsquoune des valeurs est TIMESTAMP ou DATETIME et si lrsquoautre est une constante cette der-niegravere est convertie en TIMESTAMP
bull Dans les autres cas les valeurs sont compareacutees comme des numeacuteriques (flottants)
Tableau 4-21 Fonctions de conversion
Fonction Conversion Exemple
BINARY(expr) Lrsquoexpression en bits Pour le premier pilote de notre dernier exemple le test =
renverra faux
CAST(expression AS typeMySQL )
Lrsquoexpression dans le type en para-megravetre (BINARY CHAR DATE DATETIME DECIMAL SIGNED TIME UNSIGNED)
retourne 2
CONVERT(c jeu-car)
La chaicircne c dans le jeu de caractegrave-res passeacute en paramegravetre jeu de caractegravere DOS retourne
Ecirc Iacute
BINARY(brevet)BINARY(pl-1)
CAST(2 AS CHAR)
CONVERT(Auml Ecirc Iacute Oslash USINGcp850)
4055_04_C04 Page 106 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 107
chapitre ndeg 4 Interrogation des donneacutees
Eacutenumeacuterations
Nous avons vu au chapitre 2 comment manipuler les deux types drsquoeacutenumeacuterations que MySQLpropose (ENUM et SET) Eacutetudions agrave preacutesent quelques fonctions relatives agrave ces types
Type ENUM
Chaque valeur de lrsquoeacutenumeacuteration est associeacutee agrave un indice commenccedilant agrave 1 Ainsi il est possiblede retrouver la position drsquoune valeur au sein de son eacutenumeacuteration comme lrsquoillustre lrsquoexemplesuivant deacutecrit au chapitre 2
Lrsquoindice drsquoune valeur vide (colonne valueacutee agrave () ou dans lrsquoINSERT) est 0 celui drsquounevaleur NULL est NULL
Type SET
Il est possible drsquoextraire des enregistrements en comparant des ensembles entre eux ou entestant lrsquoappartenance drsquoeacuteleacutements au sein drsquoune eacutenumeacuteration SET Lrsquoexemple suivant (deacutecritau chapitre 2) illustre deux possibiliteacutes drsquoextraction
Tableau 4-22 Exemples drsquoextraction drsquoindices drsquoune eacutenumeacuteration ENUM
Table et donneacutees Extraction
Figure 4-5 Table et donneacutees colonne ENUM mysqlgt SELECT nom diplome FROM UnCursus
+-------------+---------+-----------+| nom | diplome | diplome+0 |+-------------+---------+-----------+| F Brouard | BTS | 1 || F Degrelle | Licence | 3 |+-------------+---------+-----------+
Web
UnCursus
num nom diplome
E1 F Brouard BTS E2 F Degrelle Licence
ENUM
BTS DUT Licence INSA
diplome+0
4055_04_C04 Page 107 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
108 copy Eacuteditions Eyrolles
Il est possible drsquoeacutecrire des extractions baseacutees sur lrsquoopeacuterateur LIKE (exemple laquo SELECT hellipFROM Cursus WHERE diplomes LIKE (Licence) raquo) Cela nrsquoest cependant pasrecommandeacute car le mot Licence peut ecirctre preacutesent dans lrsquoensemble non pas en tant qursquoeacuteleacute-ment mais en tant que sous-chaicircne drsquoun eacuteleacutement
Autres fonctions
Drsquoautres fonctions nrsquoappartenant pas agrave la classification preacuteceacutedente sont preacutesenteacutees dans letableau suivant
Tableau 4-23 Exemples drsquoextration drsquoune eacutenumeacuteration SET
Table et donneacutees Extraction
Figure 4-6 Table et donneacutees colonne SET SELECT nom diplomes FROM Cursus WHERE
+-------------+------------------+| nom | diplomes |+-------------+------------------+| F Brouard | BTSLicence || F Degrelle | DUTLicenceINSA |+-------------+------------------+
SELECT nom diplomes FROM Cursus WHERE diplomes = +------------+-------------+| nom | diplomes |+------------+-------------+| F Brouard | BTSLicence |+------------+-------------+
Web
Cursus
num nom diplomes
E1 F Brouard BTS Licence E2 F Degrelle Licence INSA DUT E0 F Peyrard INSA DUT
SET
BTS DUT Licence INSA
FIND_IN_SET(Licencediplomes)gt0
BTSLicence
Tableau 4-24 Autres fonctions
Fonction Objectif Exemple
DEFAULT(colonne) Valeur par deacutefaut drsquoune colonne (NULL si aucune)
FORMAT(numeri-quenb)
Formate un nombre arrondi agrave nb deacutecimales de la maniegravere suivante
retourne 12345679
GREATEST(expres-sion[ expres-sion])
Retourne la plus grande des expressions retourne X-Men
FORMAT(12345678901 1)
GREATEST(RaffarinChiracX-Men)
4055_04_C04 Page 108 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 109
chapitre ndeg 4 Interrogation des donneacutees
Regroupements
Cette section traite agrave la fois des regroupements de lignes (agreacutegats) et des fonctions de groupe(ou multilignes) Nous eacutetudierons les parties surligneacutees de lrsquoinstruction SELECT suivante
SELECT [ DISTINCT | DISTINCTROW | ALL ] listeColonnes
FROM nomTable [ WHERE condition ]
[ clauseOrdonnancement ]
[ LIMIT [rangDeacutepart] nbLignes ]
listeColonnes peut inclure des expressions (preacutesentes dans la clause de regroupe-ment) ou des fonctions de groupe
clauseRegroupement GROUP BY (expression1[expression2]) permetde regrouper des lignes selon la valeur des expressions (colonnes fonction constante calcul)
HAVING condition pour inclure ou exclure des lignes aux groupes (la condition nepeut faire intervenir que des expressions du GROUP BY)
ClauseOrdonnancement deacutejagrave eacutetudieacute (ORDER BY dans la section ProjectionOrdon-nancement)
Interrogeons la table suivante en composant des regroupements et en appliquant des fonctionsde groupe
LEAST(expression[ expression])
Retourne la plus petite des expressions retourne Sarkozy
NULLIF(expr1expr2) Si expr1 = expr2 retourne NULL sinon retourne expr1
retourne Raffarine
IFNULL(expr1expr2) Convertit expr1 susceptible drsquoecirctre nul en une valeur reacuteelle (expr2)
retourne Aucun si diplome est NULL
Tableau 4-24 Autres fonctions (suite)
Fonction Objectif Exemple
LEAST(VillepinSarkozyX-Men)
NULLIF(RaffarineParafine)
IFNULL(diplomeAucun )
Figure 4-7 Table Pilote
[ clauseRegroupement ]
[ HAVING condition ]
Web
Pilote
brevet nom nbHVol prime embauche typeAvion compa
PL-1 Gratien Viel 450 500 1965-02-05 A320 AF PL-2 Didier Donsez 0 1995-05-13 A320 AFPL-3 Richard Grin 1000 2001-09-11 A320 SING
PL-4 Placide Fresnais 2450 500 2001-09-21 A330 SING PL-5 Daniel Vielle 400 600 1965-01-16 A340 AF PL-6 Francoise Tort 0 2000-12-24 A340 CAST
4055_04_C04 Page 109 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
110 copy Eacuteditions Eyrolles
Fonctions de groupe
Nous eacutetudions dans cette section les fonctions usuelles Drsquoautres sont proposeacutees pour manipu-ler des cubes (datawarehouse)
Le tableau suivant preacutesente les principales fonctions Lrsquooption DISTINCT eacutevite les duplicatas(pris en compte sinon par deacutefaut) Agrave lrsquoexception de COUNT toutes les fonctions ignorent lesvaleurs NULL (il faudra utiliser IFNULL pour contrer cet effet)
Utiliseacutees sans GROUP BY ces fonctions srsquoappliquent agrave la totaliteacute ou agrave une seule partie drsquounetable comme le montrent les exemples suivants
Tableau 4-25 Fonctions de groupe
Fonction Objectif
AVG([DISTINCT] expr) Moyenne de expr (nombre)
COUNT( | [DISTINCT ] expr) Nombre de lignes ( toutes les lignes expr pour les colonnes non nulles)
GROUP_CONCAT(expr) Composition drsquoun ensemble de valeurs
MAX([DISTINCT] expr) Maximum de expr (nombre date chaicircne)
MIN([DISTINCT] expr) Minimum de expr (nombre date chaicircne)
STDDEV(expr) Eacutecart type de expr (nombre)
SUM([DISTINCT] expr) Somme de expr (nombre)
VARIANCE(expr) Variance de expr (nombre)
Tableau 4-26 Exemples de fonctions de groupe
Fonction Exemples
AVG Moyenne des heures de vol et des primes des pilotes de la compagnie AFSELECT FROM Pilote WHERE compa = AF+-------------+------------+| AVG(nbHVol) | AVG(prime) |+-------------+------------+| 283333333 | 5500000 |+-------------+------------+
COUNT Nombre de pilotes drsquoheures de vol et de primes (toutes et distinctes) recenseacutees dans la tableSELECT
FROM Pilote+----------+---------------+--------------+-----------------------+| COUNT() | COUNT(nbHVol) | COUNT(prime) | COUNT(DISTINCT prime) |+----------+---------------+--------------+-----------------------+| 6 | 5 | 4 | 3 |+----------+---------------+--------------+-----------------------+
WebAVG(nbHVol) AVG(prime)
COUNT() COUNT(nbHVol) COUNT(prime)COCOUNT(DISTINCT prime)
4055_04_C04 Page 110 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 111
chapitre ndeg 4 Interrogation des donneacutees
Eacutetudions agrave preacutesent ces fonctions dans le cadre de regroupements de lignes
Eacutetude du GROUP BY et HAVINGLe groupement de lignes dans une requecircte se programme au niveau surligneacute de lrsquoinstructionSQL suivante
SELECT col1[ col2hellip] fonction1Groupe(hellip)[fonction2Groupe(hellip)hellip]
FROM nomTable [ WHERE condition ]
[ORDER BY col1 | expr1 | position1 [ASC | DESC] [col1 ] ]
GROUP_CONCAT
Nom des pilotes de la compagnie AFSELECT compa FROM Pilote GROUP BY compa+-------+------------------------------------------+| compa | GROUP_CONCAT(nom) |+-------+------------------------------------------+| AF | Gratien VielDidier DonsezDaniel Vielle || CAST | Francoise Tort || SING | Richard GrinPlacide Fresnais |+-------+------------------------------------------+
MAX ndash MIN
Nombre drsquoheures de vol le plus eacuteleveacute date drsquoembauche la plus reacutecente Nombre drsquoheures de vol le moins eacuteleveacute date drsquoembauche la plus ancienneSELECT Date+
Date- FROM Pilote+-------------+------------+------------+------------+| MAX(nbHVol) | Date+ | MIN(prime) | Date- |+-------------+------------+------------+------------+| 245000 | 2001-09-21 | 0 | 1965-02-05 |+-------------+------------+------------+------------+
STDEV ndash SUM ndash VARIANCE
Eacutecart type des primes somme des heures de vol variance des primes des pilotes de la compagnie AFSELECT FROM Pilote WHERE compa = AF+---------------+-------------+-----------------+| STDDEV(prime) | SUM(nbHVol) | VARIANCE(prime) |+---------------+-------------+-----------------+| 500000 | 85000 | 25000000 |+---------------+-------------+-----------------+
Tableau 4-26 Exemples de fonctions de groupe (suite)
Fonction Exemples
GROUP_CONCAT(nom)
MAX(nbHVol) MAX(embauche) MIN(prime)MIN(embauche)
STDDEV(prime) SUM(nbHVol) VARIANCE(prime)
GROUP BY col1 | expr1 | position1 [col2 ]
[ HAVING condition ]
4055_04_C04 Page 111 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
112 copy Eacuteditions Eyrolles
La clause WHERE de la requecircte permet drsquoexclure des lignes pour chaque groupement ou derejeter des groupements entiers Elle srsquoapplique donc agrave la totaliteacute de la table
La clause GROUP BY liste les colonnes du groupement
La clause HAVING permet de poser des conditions sur chaque groupement
La clause ORDER BY permet de trier le reacutesultat (deacutejagrave eacutetudieacutee)
Les colonnes preacutesentes dans le SELECT doivent apparaicirctre dans le GROUP BY Seules desfonctions ou expressions peuvent exister en plus dans le SELECT
Les alias de colonnes ne peuvent pas ecirctre utiliseacutes dans la clause GROUP BY
Dans lrsquoexemple suivant en groupant sur la colonne compa trois ensembles de lignes (groupe-ments) sont composeacutes Il est alors possible drsquoappliquer des fonctions de groupe agrave chacun deces ensembles (dont le nombre nrsquoest pas preacuteciseacute dans la requecircte ni limiteacute par le systegraveme quiparcourt toute la table)
Il est aussi possible de grouper sur plusieurs colonnes (par exemple ici sur les colonnes compaet typeAvion pour classifier les pilotes selon ces deux critegraveres)
Utiliseacutees avec GROUP BY les fonctions srsquoappliquent deacutesormais agrave chaque regroupementcomme le montrent les exemples suivants
Figure 4-8 Groupement sur la colonne compa
Tableau 4-27 Exemples de fonctions de groupe avec GROUP BY
Fonction Exemples
AVG Moyenne des heures de vol et des primes pour chaque compagnieSELECT compa AVG(nbHVol) AVG(prime) FROM Pilote +-------+-------------+------------+| compa | AVG(nbHVol) | AVG(prime) |+-------+-------------+------------+| AF | 283333333 | 5500000 || CAST | NULL | 00000 || SING | 1725000000 | 5000000 |+-------+-------------+------------+
Pilote
brevet nom nbHVol prime embauche typeAvion compa
PL-1 Gratien Viel 450 500 1965-02-05 A320 AF
PL-2 Didier Donsez 0 1995-05-13 A320 AF
PL-5 Daniel Vielle 400 600 1965-01-16 A340 AF
PL-6 Francoise Tort 0 2000-12-24 A340 CAST
PL-3 Richard Grin 1000 2001-09-11 A320 SING
PL-4 Placide Fresnais 2450 500 2001-09-21 A330 SING
Web
GROUP BY(compa)
4055_04_C04 Page 112 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 113
chapitre ndeg 4 Interrogation des donneacutees
COUNT Nombre de pilotes (et ceux qui ont de lrsquoexpeacuterience du vol) par compagnieSELECT compa COUNT() COUNT(nbHVol) FROM Pilote +-------+----------+---------------+| compa | COUNT() | COUNT(nbHVol) |+-------+----------+---------------+| AF | 3 | 3 || CAST | 1 | 0 || SING | 2 | 2 |+-------+----------+---------------+
MAX Nombre drsquoheures de vol le plus eacuteleveacute date drsquoembauche la plus reacutecente pour cha-que compagnieSELECT compa MAX(nbHVol) MAX(embauche) Date+ FROM Pilote +-------+-------------+------------+| compa | MAX(nbHVol) | Date+ |+-------+-------------+------------+| AF | 45000 | 1995-05-13 || CAST | NULL | 2000-12-24 || SING | 245000 | 2001-09-21 |+-------+-------------+------------+
STDEV ndash SUM (avec WHERE)
Eacutecarts types des primes et sommes des heures de vol des pilotes volant sur A320 de chaque compagnieSELECT compa STDDEV(prime) SUM(nbHVol) FROM Pilote WHERE typeAvion = A320 +-------+---------------+-------------+| compa | STDDEV(prime) | SUM(nbHVol) |+-------+---------------+-------------+| AF | 00000 | 45000 || SING | NULL | 100000 |+-------+---------------+-------------+
Plusieurs colonnes dans le GROUP BY
Nombre de pilotes qualifieacutes par type drsquoappareil et par compagnieSELECT compatypeAvion COUNT(brevet) FROM Pilote +-------+-----------+---------------+| compa | typeAvion | COUNT(brevet) |+-------+-----------+---------------+| AF | A320 | 2 || AF | A340 | 1 || CAST | A340 | 1 || SING | A320 | 1 || SING | A330 | 1 |+-------+-----------+---------------+
Tableau 4-27 Exemples de fonctions de groupe avec GROUP BY (suite)
Fonction Exemples
GROUP BY(compa)
GROUP BY(compa)
GROUP BY(compa)
GROUP BY compatypeAvion
4055_04_C04 Page 113 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
114 copy Eacuteditions Eyrolles
Opeacuterateurs ensemblistes
Une des forces du modegravele relationnel repose sur le fait qursquoil est fondeacute sur une base matheacutema-tique (theacuteorie des ensembles) Le langage SQL devrait programmer les opeacuterations binaires(entre deux tables) suivantes
intersection qui extrait des donneacutees preacutesentes simultaneacutement dans les deux tables
union par les opeacuterateurs UNION et UNION ALL qui fusionnent des donneacutees des deuxtables
diffeacuterence qui extrait des donneacutees preacutesentes dans une table sans ecirctre preacutesentes dans ladeuxiegraveme table
produit carteacutesien par le fait de disposer de deux tables dans la clause FROM ce qui permetde composer des combinaisons agrave partir des donneacutees des deux tables
Restrictions
Seules des colonnes de mecircme type (CHAR VARCHAR DATE numeacuteriques etc) doivent ecirctrecompareacutees avec des opeacuterateurs ensemblistes
Lrsquointersection et la diffeacuterence ne sont pas encore disponibles sous MySQL La diffeacuterence seprogramme agrave lrsquoaide de DISTINCT et NOT IN lrsquointersection agrave lrsquoaide de DISTINCT et IN
Attention pour les colonnes CHAR agrave veiller agrave ce que la taille soit identique entre les deuxtables pour que la comparaison fonctionnne Le nom des colonnes nrsquoa pas drsquoimportance Il estpossible de comparer plusieurs colonnes de deux tables
GROUP BY et HAVING
Compagnies (et nombre de leurs pilotes) ayant plus drsquoun piloteSELECT compa COUNT(brevet) FROM Pilote +-------+---------------+| compa | COUNT(brevet) |+-------+---------------+| AF | 3 || SING | 2 |+-------+---------------+
Tableau 4-27 Exemples de fonctions de groupe avec GROUP BY (suite)
Fonction Exemples
GROUP BY(compa)HAVING COUNT(brevet)gt=2
4055_04_C04 Page 114 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 115
chapitre ndeg 4 Interrogation des donneacutees
Exemple
Eacutetudions agrave preacutesent chaque opeacuterateur agrave partir de lrsquoexemple composeacute des deux tables suivantes
AvionsdeAF(immat CHAR(6) typeAvion CHAR(10) nbHVol DECIMAL(102))
AvionsdeSING(immatriculation CHAR(6) typeAv CHAR(10) prixAchatDECIMAL(142))
Il est vraisemblable que seules les deux premiegraveres colonnes doivent ecirctre compareacutees Bien quepermises par MySQL la programmation de lrsquounion lrsquointersection ou la diffeacuterence entre lesprix des avions et les heures de vol (deux colonnes numeacuteriques) ne seraient pas valides drsquounpoint de vue seacutemantique
Intersection
Lrsquointersection entre deux ensembles homogegravenes se programme agrave lrsquoaide drsquoune requecircte du typeSELECT DISTINCT ensemble1 FROM Table1 WHERE ensemble1 IN (SELECT ensemble2FROM Table2) Comme lrsquoopeacuterateur drsquointersection cette requecircte est commutative (Table1 peutjouer le rocircle de Table2 et ensemble1 celui drsquoensemble2)
Notez qursquoagrave lrsquoaffichage le nom des colonnes est donneacute par la premiegravere requecircte La deuxiegravemefait apparaicirctre deux colonnes dans le SELECT
Figure 4-9 Tables pour les opeacuterateurs ensemblistes
Web
AviondeAF
immat typeAvion nbHVol
F-WTSS Concorde 6570 F-GLFS A320 3500 F-GTMP A340
AviondeSING
immatriculation typeAv PrixAchat
S-ANSI A320 104 500 S-AVEZ A320 156 000 S-SMILE A330 198 000 F-GTMP A340 204 500
Tableau 4-28 Exemples drsquointersections
Besoin Requecircte
Quels sont les types drsquoavions que lesdeux compagnies exploitent en com-mun
SELECT FROM AvionsdeAF WHERE typeAvion IN (SELECT typeAv FROM AvionsdeSING)+-----------+| typeAvion |+-----------+| A320 || A340 |+-----------+
WebDISTINCT typeAvion
4055_04_C04 Page 115 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
116 copy Eacuteditions Eyrolles
Si vous voulez continuer ce raisonnement en vous basant sur trois compagnies il suffit drsquoajou-ter une clause WHERE dans les requecirctes imbriqueacutees qui interrogera la troisiegraveme compagnie Ceprincipe se geacuteneacuteralise et pour n compagnies il faudra n imbrications de requecirctes
Opeacuterateurs UNION et UNION ALL
Les opeacuterateurs UNION et UNION ALL sont commutatifs Lrsquoopeacuterateur UNION permet drsquoeacuteviter lesduplicatas (comme DISTINCT dans un SELECT) UNION ALL ne les eacutelimine pas
Quels sont les avions qui sont exploi-teacutes par les deux compagnies en com-mun
SELECT FROM AvionsdeSING WHERE immatriculation IN (SELECT immat FROM AvionsdeAF) AND typeAv IN (SELECT typeAvion FROM AvionsdeAF)+-----------------+--------+| immatriculation | typeAv |+-----------------+--------+| F-GTMP | A340 |+-----------------+--------+
Tableau 4-28 Exemples drsquointersections (suite)
Besoin Requecircte
DISTINCT immatriculation typeAv
Tableau 4-29 Exemples avec les opeacuterateurs UNION
Besoin Requecircte
Quels sont tous les types drsquoavions que les deux compagnies exploitent
SELECT typeAvion FROM AvionsdeAF UNIONSELECT typeAv FROM AvionsdeSING+-----------+| typeAvion |+-----------+| A320 || A340 || Concorde || A330 |+-----------+
Web
4055_04_C04 Page 116 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 117
chapitre ndeg 4 Interrogation des donneacutees
Ce principe se geacuteneacuteralise agrave lrsquounion de n ensembles par n requecirctes relieacutees avec n-1 clausesUNION ou UNION ALL
Diffeacuterence
La diffeacuterence entre deux ensembles homogegravenes se programme agrave lrsquoaide drsquoune requecircte du typeSELECT DISTINCT ensemble1 FROM Table1 WHERE ensemble1 NOT IN (SELECT ensemble2FROM Table2) Comme lrsquoopeacuterateur ensembliste cette requecircte nrsquoest pas commutative car elleprogramme ensemble1-ensemble2
Mecircme requecircte avec les duplicatas On extraitles types de la compagnie AF suivis des typesde la compagnie SING
SELECT typeAvion FROM AvionsdeAF UNION ALLSELECT typeAv FROM AvionsdeSING+-----------+| typeAvion |+-----------+| A320 || A340 || Concorde || A340 || A320 || A320 || A330 |+-----------+
Tableau 4-29 Exemples avec les opeacuterateurs UNION (suite)
Besoin RequecircteWeb
Tableau 4-30 Exemples de diffeacuterences
Besoin Requecircte
Quels sont les types drsquoavions exploiteacutes par lacompagnie AF mais pas par SING
SELECT DISTINCT typeAvion FROM AvionsdeAF WHERE typeAvion NOT IN (SELECT typeAv FROM AvionsdeSING)+-----------+| typeAvion |+-----------+| Concorde |+-----------+
Quels sont les types drsquoavions exploiteacutes par lacompagnie SING mais pas par AF
SELECT DISTINCT typeAv FROM AvionsdeSING WHERE typeAv NOT IN (SELECT typeAvion FROM AvionsdeAF)+--------+| typeAv |+--------+| A330 |+--------+
Web
4055_04_C04 Page 117 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
118 copy Eacuteditions Eyrolles
Ce principe se geacuteneacuteralise agrave la diffeacuterence entre n ensembles par imbrication de n requecirctes (dansle bon ordre)
La directive NOT IN doit ecirctre utiliseacutee avec prudence car elle retourne faux si un membrerameneacute par la sous-interrogation est NULL
Ordonner les reacutesultats
Le reacutesultat drsquoune requecircte contenant des opeacuterateurs ensemblistes est trieacute par deacutefaut par ordrecroissant sauf avec lrsquoopeacuterateur UNION ALL
La clause ORDER BY nrsquoest utilisable qursquoune fois en fin drsquoune requecircte incluant des opeacuterateursensemblistes Cette clause accepte le nom des colonnes de la premiegravere requecircte ou la positionde ces colonnes
Le tableau suivant preacutesente trois eacutecritures diffeacuterentes de la mecircme requecircte ensembliste conte-nant une clause ORDER BY Le besoin est de connaicirctre tous les types drsquoavions que les deuxcompagnies exploitent (classement par ordre deacutecroissant)
Notez que la troisiegraveme requecircte produit le mecircme reacutesultat en faisant intervenir un SELECT(aliaseacute) dans le FROM Ce meacutecanisme permet de construire dynamiquement la table agrave interroger
Tableau 4-31 Exemples avec la clause ORDER BY
Technique Requecircte
Nom de la colonne SELECT typeAvion FROM AvionsdeAF UNIONSELECT typeAv FROM AvionsdeSING
Position de la colonne hellip
SELECT dans le FROM SELECT TtypeAvion FROM T ORDER BY TtypeAvion DESC
+-----------+| typeAvion |+-----------+| Concorde || A340 || A330 || A320 |+-----------+
Web
ORDER BY typeAvion DESC
ORDER BY 1 DESC
(SELECT typeAvion FROM AvionsdeAF UNION SELECT typeAv FROM AvionsdeSING)
4055_04_C04 Page 118 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 119
chapitre ndeg 4 Interrogation des donneacutees
Il faut affecter des alias aux expressions de la premiegravere requecircte pour pouvoir les utiliser dansle ORDER BY final
Pour illustrer cette restriction supposons que nous deacutesirions faire la liste des avions avec leurprix drsquoachat augmenteacute de 20 liste trieacutee en fonction de cette derniegravere hausse Le problegravemeest que la table AvionsdeAF ne possegravede pas une telle colonne Ajoutons donc au SELECT decette table dans le tableau suivant la valeur 0 pour rendre possible lrsquoopeacuterateur UNION
Produit carteacutesien
En matheacutematiques le produit carteacutesien de deux ensembles E et F est lrsquoensemble des couples(x y) ougrave x isin E et y isin F En transposant au modegravele relationnel le produit carteacutesien de deuxtables T1 et T2 est lrsquoensemble des enregistrements (x y) ougrave x isin T1 et y isin T2
Le produit carteacutesien total entre deux tables T1 et T2 se programme sous SQL en positionnantles deux tables dans la clause FROM sans ajouter de conditions dans la clause WHERE Si les conditions sont de la forme c1 opeacuterateur c2 avec c1 isin T1 et c2 isin T2 on parlera dejointure Si les conditions sont de la forme c1 opeacuterateur valeur1 ou c2 opeacuterateur valeur2on parlera de produit carteacutesien restreint
Le produit carteacutesien restreint illustreacute par lrsquoexemple suivant exprime les combinaisons drsquoeacutequi-pages qursquoil est possible de reacutealiser en consideacuterant les pilotes de la compagnie AF et les avionsde la table AviondeAF
Tableau 4-32 Alias pour ORDER BY
Requecircte Reacutesultat
SELECT immatriculation FROM Avions-deSINGUNION SELECT immat 0 FROM AvionsdeAF ORDER BY px DESC
+-----------------+------------+| immatriculation | px |+-----------------+------------+| F-GTMP | 245400000 || S-MILE | 237600000 || S-AVEZ | 187200000 || S-ANSI | 125400000 || F-GLFS | 0000 || F-GTMP | 0000 || F-WTSS | 0000 |+-----------------+------------+
Web12prixAchat px
4055_04_C04 Page 119 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
120 copy Eacuteditions Eyrolles
Le nombre drsquoenregistrements reacutesultant drsquoun produit carteacutesien est eacutegal au produit du nombredrsquoenregistrements des deux tables mises en relation
Dans le cadre de notre exemple le nombre drsquoenregistrements du produit carteacutesien sera de2 pilotes x 3 avions = 6 enregistrements Le tableau suivant deacutecrit la requecircte SQL permettantde construire le produit carteacutesien restreint de notre exemple Les alias distinguent les colonnessrsquoil advenait qursquoil en existe de mecircme nom entre les deux tables
Bilan
Seules les colonnes de mecircme type et repreacutesentant la mecircme seacutemantique peuvent ecirctre compareacuteesagrave lrsquoaide de termes ensemblistes Il est possible drsquoajouter des expressions (constantes oucalculs) agrave une requecircte pour rendre homogegravenes les deux requecirctes et permettre ainsi lrsquoutilisationdrsquoun opeacuterateur ensembliste
Parce qursquoil faut utiliser NOT IN avec prudence diffeacuterentes alternatives aux opeacuterateurs ensem-blistes existent sur la base de jointures de type SQL2 (qui sont deacutetailleacutees dans la prochainesection) elles sont deacutetailleacutees par Pierre Caboche et mises en ligne sur le site Web associeacute agravelrsquoouvrage
Figure 4-10 Produit carteacutesien drsquoenregistrements de tables
AviondeAF
immat typeAvion nbHVol
F-WTSS Concorde 6570 F-GLFS A320 3500 F-GTMP A340
Pilote
brevet nom nbHVol compa
PL-1 Gratien Viel 450 AF PL-2 Richard Grin 1000 SING PL-3 Placide Fresnais 2450 CAST PL-4 Daniel Vielle 5000 AF
Tableau 4-33 Produit carteacutesien
Besoin Requecircte
Quels sont les couples possibles (avion pilote)en consideacuterant les avions et les pilotes de lacompagnie AF
6 lignes extraites
SELECT pbrevet avAFimmat FROM WHERE pcompa = AF+--------+--------+| brevet | immat |+--------+--------+| PL-1 | F-GLFS || PL-1 | F-GTMP || PL-1 | F-WTSS || PL-4 | F-GLFS || PL-4 | F-GTMP || PL-4 | F-WTSS |+--------+--------+
WebPilote p AvionsdeAF avAF
4055_04_C04 Page 120 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 121
chapitre ndeg 4 Interrogation des donneacutees
Jointures
Les jointures permettent drsquoextraire des donneacutees issues de plusieurs tables Le processus denormalisation du modegravele relationnel est baseacute sur la deacutecomposition et a pour conseacutequencedrsquoaugmenter le nombre de tables drsquoun scheacutema Ainsi la majoriteacute des requecirctes utilisent desjointures neacutecessaires pour pouvoir extraire des donneacutees de tables distinctes
Une jointure met en relation deux tables sur la base drsquoune clause de jointure (comparaison decolonnes) Geacuteneacuteralement cette comparaison fait intervenir une cleacute eacutetrangegravere drsquoune table avecune cleacute primaire drsquoune autre table (car le modegravele relationnel est fondamentalement baseacute surles valeurs)
En consideacuterant les tables suivantes les seules jointures logiques doivent se faire sur lrsquoeacutegaliteacutesoit des colonnes comp et compa soit des colonnes brevet et chefPil Ces jointurespermettront drsquoafficher des donneacutees drsquoune table (ou des deux tables) tout en posant des condi-tions sur une table (ou les deux) Par exemple lrsquoaffichage du nom des compagnies (colonne dela table Compagnie) qui ont embaucheacute un pilote ayant moins de 500 heures de vol (conditionsur la table Pilote)
Classification
Une jointure peut srsquoeacutecrire dans une requecircte SQL de diffeacuterentes maniegraveres
laquo relationnelle raquo (aussi appeleacutee laquo SQL89 raquo pour rappeler la version de la norme SQL) laquo SQL2 raquo (aussi appeleacutee laquo SQL92 raquo) laquo proceacutedurale raquo (qui qualifie la structure de la requecircte) laquo mixte raquo (combinaison des trois approches preacuteceacutedentes)
Figure 4-11 Deux tables agrave mettre en jointure
Compagnie
comp nrue rue ville nomComp
AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL
CAST 1 G Brassens Blagnac Castanet AL
Pilote
brevet nom nbHVol compa chefPil
PL-1 Pierre Lamothe 450 AF PL-4 PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF
4055_04_C04 Page 121 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
122 copy Eacuteditions Eyrolles
Nous allons principalement eacutetudier les deux premiegraveres eacutecritures qui sont les plus utiliseacuteesNous parlerons en fin de section des deux derniegraveres
Jointure relationnelle
La forme la plus courante de la jointure est la jointure dite laquo relationnelle raquo (aussi appeleacuteeSQL89) caracteacuteriseacutee par une seule clause FROM contenant les tables et alias agrave mettre en join-ture deux agrave deux La syntaxe geacuteneacuterale suivante deacutecrit une jointure relationnelle
SELECT [alias1]col1 [alias2]col2hellip
FROM [nomBase]nomTable1 [alias1] [nomBase]nomTable2 [alias2]hellip
WHERE (conditionsDeJointure)
Cette forme est la plus utiliseacutee car elle est la plus simple agrave eacutecrire Un autre avantage de ce typede jointure est qursquoelle laisse le soin au SGBD drsquoeacutetablir la meilleure strateacutegie drsquoaccegraves (choix dupremier index agrave utiliser puis du deuxiegraveme etc) pour optimiser les performances
Afin drsquoeacuteviter les ambiguiumlteacutes concernant le nom des colonnes on utilise en geacuteneacuteral des alias detables pour suffixer les tables dans la clause FROM et preacutefixer les colonnes dans les clausesSELECT et WHERE
Jointures SQL2
Afin de se rendre conforme agrave la norme SQL2 MySQL propose aussi des directives qui permet-tent de programmer drsquoune maniegravere plus verbale les diffeacuterents types de jointures
SELECT [ALL | DISTINCT | DISTINCTROW ] listeColonnes
FROM [nomBase]nomTable1 [ INNER | LEFT | RIGHT [OUTER] ]
JOIN [nomBase]nomTable2 ON condition | USING ( colonne1 [ colonne2] )
| CROSS JOIN | NATURAL [ LEFT | RIGHT [OUTER] ]
JOIN [nomBase]nomTable2 hellip
[ WHERE condition ]
Cette eacutecriture est moins utiliseacutee que la syntaxe relationnelle Bien que plus concise pour desjointures agrave deux tables elle se complique pour des jointures plus complexes
4055_04_C04 Page 122 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 123
chapitre ndeg 4 Interrogation des donneacutees
Types de jointures
Bien que dans le vocabulaire courant on ne parle que de laquo jointures raquo en fonction de la naturede lrsquoopeacuterateur utiliseacute dans la requecircte de la clause de jointure et des tables concerneacutees ondistingue
Les jointures internes (inner joins)
ndash Lrsquoeacutequijointure (equi join) est la plus connue elle utilise lrsquoopeacuterateur drsquoeacutegaliteacute dans laclause de jointure La jointure naturelle est conditionneacutee en plus par le nom des colon-nes La non eacutequijointure utilise lrsquoopeacuterateur drsquoineacutegaliteacute dans la clause de jointure
ndash Lrsquoautojointure (self join) est un cas particulier de lrsquoeacutequijointure qui met en œuvre deuxfois la mecircme table (des alias de tables permettront de distinguer les enregistrementsentre eux)
La jointure externe (outer join) la plus compliqueacutee qui favorise une table (ditelaquo dominante raquo) par rapport agrave lrsquoautre (dite laquo subordonneacutee raquo) Les lignes de la table domi-nante sont retourneacutees mecircme si elles ne satisfont pas aux conditions de jointure
Le tableau suivant illustre cette classification sous la forme de quelques conditions appliqueacuteesagrave notre exemple
Pour mettre trois tables T1 T2 et T3 en jointure il faut utiliser deux clauses de jointures (uneentre T1 et T2 et lrsquoautre entre T2 et T3) Pour n tables il faut n-1 clauses de jointures Si vousoubliez une clause de jointure un produit carteacutesien restreint est geacuteneacutereacute
Eacutetudions agrave preacutesent chaque type de jointure avec les syntaxes laquo relationnelle raquo et laquo SQL2 raquo
Eacutequijointure
Une eacutequijointure utilise lrsquoopeacuterateur drsquoeacutegaliteacute dans la clause de jointure et compare geacuteneacuterale-ment des cleacutes primaires avec des cleacutes eacutetrangegraveres
En consideacuterant les tables suivantes les eacutequijointures se programment soit sur les colonnescomp et compa soit sur les colonnes brevet et chefPil Extrayons par exemple
Tableau 4-34 Exemples de conditions
Type de jointure Syntaxe de la condition
Eacutequijointure hellipWHERE comp compa
Autojointure hellipWHERE chefPil = brevet
Jointure externe hellipFROM Compagnie Pilote ON comp = compa
=
alias1 alias2
LEFT OUTER JOIN
4055_04_C04 Page 123 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
124 copy Eacuteditions Eyrolles
lrsquoidentiteacute des pilotes de la compagnie de nom Air France ayant plus de 500 heures de vol(requecircte R1)
les coordonneacutees des compagnies qui embauchent des pilotes de moins de 500 heures devol (requecircte R2)
La jointure qui reacutesoudra la premiegravere requecircte est illustreacutee dans la figure par les donneacutees griseacuteestandis que la deuxiegraveme jointure est repreacutesenteacutee par les donneacutees en gras
Eacutecriture laquo relationnelle raquo
bull MySQL recommande drsquoutiliser des alias de tables pour ameacuteliorer les performances
bull Les alias sont obligatoires quand des colonnes de diffeacuterentes tables portent le mecircme nomou dans le cas drsquoautojointures
Eacutecriture laquo SQL2 raquo
bull La clause JOIN hellip ON condition permet de programmer une eacutequijointure
bull Lrsquoutilisation de la directive INNER devant JOINhellip est optionnelle et est appliqueacutee par deacutefaut
Le tableau suivant deacutetaille ces requecirctes avec les deux syntaxes Les clauses de jointures sontgriseacutees
Figure 4-12 Eacutequijointures
Web
Compagnie
comp nrue rue ville nomComp
AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL
CAST 1 G Brassens Blagnac Castanet AL
Pilote
brevet nom nbHVol compa chefPil
PL-1 Pierre Lamothe 450 AF PL-4 PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF
4055_04_C04 Page 124 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 125
chapitre ndeg 4 Interrogation des donneacutees
Autojointure
Cas particulier de lrsquoeacutequijointure lrsquoautojointure relie une table agrave elle mecircme
Extrayons par exemple
lrsquoidentiteacute des pilotes placeacutes sous la responsabiliteacute des pilotes de nom Alquieacute(requecircte R3)
la somme des heures de vol des pilotes placeacutes sous la responsabiliteacute des chefs pilotes de lacompagnie de nom Air France (requecircte R4)
Ces requecirctes doivent ecirctre programmeacutees agrave lrsquoaide drsquoune autojointure car elles imposent deparcourir deux fois la table Pilote (examen de chaque pilote en le comparant agrave un autre)Les autojointures sont reacutealiseacutees entre les colonnes brevet et chefPil
La jointure de la premiegravere requecircte est illustreacutee dans la figure par les donneacutees surligneacutees enclair tandis que la deuxiegraveme jointure est mise en valeur par les donneacutees surligneacutees en fonceacute
Tableau 4-35 Exemples drsquoeacutequijointures
Requecircte Jointure relationnelle Jointure SQL2
R1 SELECT brevet nom FROM Pilote Compagnie AND nomComp = Air France AND nbHVol gt 500
SELECT brevet nom FROM Compagnie WHERE nomComp = Air France AND nbHVol gt 500
+--------+--------------+| brevet | nom |+--------+--------------+| PL-2 | Didier Linxe || PL-4 | Henri Alquieacute |+--------+--------------+
R2 SELECT cpgnomComp cpgnrue cpgrue cpgville FROM Pilote pil Compagnie cpg AND pilnbHVol lt 500
SELECT nomComp nrue rue ville FROM Compagnie WHERE nbHVol lt 500
+------------+------+------------+-------+| nomComp | nrue | rue | ville |+------------+------+------------+-------+| Air France | 124 | Port Royal | Paris |+------------+------+------------+-------+
Web
WHERE comp = compa JOIN Pilote ON comp = compa
WHERE cpgcomp = pilcompaINNER JOIN Pilote ON comp = compa
4055_04_C04 Page 125 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
126 copy Eacuteditions Eyrolles
Le tableau suivant deacutetaille ces requecirctes les clauses drsquoautojointures sont surligneacutees Dans lesdeux syntaxes il est impeacuteratif drsquoutiliser un alias de table Concernant lrsquoeacutecriture laquo SQL2 raquo onremarque que les clauses JOIN srsquoimbriquent (pour joindre plus de deux tables)
Figure 4-13 Autojointures
Compagnie
comp nrue rue ville nomComp
AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL
CAST 1 G Brassens Blagnac Castanet AL
Pilote
brevet nom nbHVol compa chefPil
PL-1 Pierre Lamothe 450 AF PL-4 PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF
Tableau 4-36 Exemples drsquoautojointures
Requecircte Jointure relationnelle Jointure SQL2
R3 SELECT p1brevet p1nom FROM Pilote p1 Pilote p2 AND p2nom LIKE Alquieacute
SELECT p1brevet p1nom FROM Pilote p1 WHERE p2nom LIKE Alquieacute
+--------+----------------+| brevet | nom |+--------+----------------+| PL-1 | Pierre Lamothe || PL-2 | Didier Linxe |+--------+----------------+
R4 SELECT SUM(p1nbHVol) FROM Pilote p1 Pilote p2 Compagnie cpg AND cpgnomComp = Air France
SELECT SUM(p1nbHVol) FROM Pilote p1 WHERE nomComp = Air France
+----------------+| SUM(p1nbHVol) |+----------------+| 135000 |+----------------+
Web
WHERE p1chefPil = p2brevet JOIN Pilote p2ON p1chefPil = p2brevet
WHERE p1chefPil = p2brevetAND cpgcomp = p2compa
JOIN Pilote p2ON p1chefPil = p2brevet
JOIN CompagnieON comp = p2compa
4055_04_C04 Page 126 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 127
chapitre ndeg 4 Interrogation des donneacutees
Ineacutequijointure
Les requecirctes drsquoineacutequijointures font intervenir tout type drsquoopeacuterateur (ltgt gt lt gt= lt= BETWEENLIKE IN) Agrave lrsquoinverse des eacutequijointures la clause drsquoune ineacutequijointure nrsquoest pas baseacutee surlrsquoeacutegaliteacute de cleacutes primaires (ou candidates) et de cleacutes eacutetrangegraveres
En consideacuterant les tables suivantes extrayons par exemple
les pilotes ayant plus drsquoexpeacuterience que le pilote de numeacutero de brevet PL-2 (requecircte R5)
le titre de qualification des pilotes en raisonnant sur la comparaison des heures de vol avecun ensemble de reacutefeacuterence ici la table HeuresVol (requecircte R6) Dans notre exemple ilsrsquoagit par exemple de retrouver le fait que le premier pilote est deacutebutant
La jointure qui reacutesoudra la deuxiegraveme requecircte est illustreacutee par les niveaux de gris
Le tableau suivant deacutetaille ces requecirctes les clauses drsquoineacutequijointures sont surligneacutees
Figure 4-14 Ineacutequijointures
Pilote
brevet nom nbHVol compa chefPil
PL-1 Pierre Lamothe 450 AF PL-4PL-2 Didier Linxe 900 AF PL-4PL-3 Christian Soutou 1000 SINGPL-4 Henri Alquieacute 3400 AF
HeuresVol
titre basnbHVol hautnbHVol
Deacutebutant 0 500Initieacute 501 1000Expert 1001 20000
Tableau 4-37 Exemples drsquoineacutequijointures
Requecircte Jointure relationnelle Jointure SQL2
R5 SELECT p1brevet p1nomp1nbHVol p2nbHVol Reacutefeacuterence FROM Pilote p1 Pilote p2
AND p2brevet = PL-2
SELECT p1brevet p1nom p1nbHVol p2nbHVol Reacutefeacuterence FROM Pilote p1 WHERE p2brevet = PL-2
+--------+------------------+---------+-----------+| brevet | nom | nbHVol | Reacutefeacuterence |+--------+------------------+---------+-----------+| PL-3 | Christian Soutou | 100000 | 90000 || PL-4 | Henri Alquieacute | 340000 | 90000 |+--------+------------------+---------+-----------+
Web
WHERE p1nbHVol gt p2nbHVolJOIN
Pilote p2 ON p1nbHVolgtp2nbHVol
4055_04_C04 Page 127 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
128 copy Eacuteditions Eyrolles
Jointures externes
Les jointures externes permettent drsquoextraire des enregistrements qui ne reacutepondent pas aux cri-tegraveres de jointure Lorsque deux tables sont en jointure externe une table est laquo dominante raquo parrapport agrave lrsquoautre (qui est dite laquo subordonneacutee raquo) Ce sont les enregistrements de la table domi-nante qui sont retourneacutes (mecircme srsquoils ne satisfont pas aux conditions de jointure)
Comme les jointures internes les jointures externes sont geacuteneacuteralement baseacutees sur les cleacutesprimaires et eacutetrangegraveres On distingue les jointures unilateacuterales qui considegraverent une table domi-nante et une table subordonneacutee et les jointures bilateacuterales pour lesquelles les tables jouent unrocircle symeacutetrique (pas de dominant)
Jointures unilateacuterales
En consideacuterant les tables suivantes une jointure externe unilateacuterale permet drsquoextraire
la liste des compagnies et leurs pilotes mecircme les compagnies nrsquoayant pas de pilote(requecircte R7) Sans une jointure externe la compagnie CAST ne peut ecirctre extraite
la liste des pilotes et leurs qualifications mecircme les pilotes nrsquoayant pas encore de qualifica-tion (requecircte R8)
La figure illustre les tables dominantes et subordonneacutees
R6 SELECT pilbrevet pilnom pilnbHVol hvtitre FROM Pilote pil HeuresVol hv
SELECT brevet nom nbHVol titre FROM Pilote
+--------+------------------+---------+----------+| brevet | nom | nbHVol | titre |+--------+------------------+---------+----------+| PL-1 | Pierre Lamothe | 45000 | Deacutebutant || PL-2 | Didier Linxe | 90000 | Initieacute || PL-3 | Christian Soutou | 100000 | Initieacute || PL-4 | Henri Alquieacute | 340000 | Expert |+--------+------------------+---------+----------+
Tableau 4-37 Exemples drsquoineacutequijointures (suite)
Requecircte Jointure relationnelle Jointure SQL2
WHERE pilnbHVol BETWEENhvbasnbHVol AND hvhautnbHVol
JOIN HeuresVol ON nbHVolBETWEEN basnbHVol AND hautnbHVol
4055_04_C04 Page 128 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 129
chapitre ndeg 4 Interrogation des donneacutees
Eacutecriture laquo SQL2 raquo
Le sens de la directive de jointure externe LEFT ou RIGHT de la clause OUTER JOIN deacutesignela table dominante
Le tableau suivant deacutetaille les requecirctes de notre exemple les clauses de jointures externesunilateacuterales sont griseacutees Les tables dominantes sont noteacutees en gras (Compagnie pour lapremiegravere requecircte et Pilote pour la deuxiegraveme)
Figure 4-15 Jointures externes unilateacuterales
Compagnie
comp nrue rue ville nomComp
AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL
CAST 1 G Brassens Blagnac Castanet AL
Pilote
brevet nom nbHVol compa
PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-3 Christian Soutou 1000 SING PL-4 Henri Alqu ieacute 3400 AF
Qualifs
brevet typeAv validite
PL-4 A320 2005-06-24 PL-4 A340 2005-06-24 PL-2 A320 2006-04-04 PL-3 A330 2006-05-13
dominantedominante
subordonneacutee
subordonneacutee
Tableau 4-38 Eacutecritures eacutequivalentes de jointures externes unilateacuterales
Requecircte Jointures relationnelles Jointures SQL2
R7 Sans objet SELECT nomComp brevet nom FROM Compagnie --eacutequivalent agraveSELECT nomComp brevet nom FROM Pilote
+--------------+--------+------------------+| nomComp | brevet | nom |+--------------+--------+------------------+| Air France | PL-1 | Pierre Lamothe || Air France | PL-2 | Didier Linxe || Air France | PL-4 | Henri Alquieacute || || Singapore AL | PL-3 | Christian Soutou |+--------------+--------+------------------+
WebLEFT OUTER JOIN Pilote ON comp = compa
RIGHT OUTER JOIN Compagnie ON comp = compa
Castanet AL | NULL | NULL
4055_04_C04 Page 129 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
130 copy Eacuteditions Eyrolles
Jointures bilateacuterales
Les deux tables jouent un rocircle symeacutetrique il nrsquoy a pas de table dominante Ce type de jointurepermet drsquoextraire des enregistrements qui ne reacutepondent pas aux critegraveres de jointure des deuxcocircteacutes de la clause de jointure
En consideacuterant les tables suivantes une jointure externe bilateacuterale permet drsquoextraire parexemple
la liste des compagnies et leurs pilotes incluant les compagnies nrsquoayant pas de pilote et lespilotes rattacheacutes agrave aucune compagnie (requecircte R9)
la liste des pilotes et leurs qualifications incluant les pilotes nrsquoayant pas encore drsquoexpeacute-rience et les qualifications associeacutees agrave des pilotes inconnus (requecircte R10)
R8 Sans objet SELECT quatypeAv pilbrevet pilnom FROM Qualifs qua --eacutequivalent agraveSELECT quatypeAv pilbrevet pilnom FROM Pilote pil
+--------+--------+------------------+| typeAv | brevet | nom |+--------+--------+------------------+| || A320 | PL-2 | Didier Linxe || A330 | PL-3 | Christian Soutou || A320 | PL-4 | Henri Alquieacute || A340 | PL-4 | Henri Alquieacute |+--------+--------+------------------+
Tableau 4-38 Eacutecritures eacutequivalentes de jointures externes unilateacuterales
Requecircte Jointures relationnelles Jointures SQL2
RIGHT OUTER JOIN Pilote pilON pilbrevet = quabrevet
LEFT OUTER JOIN Qualifs quaON pilbrevet = quabrevet
NULL | PL-1 | Pierre Lamothe
4055_04_C04 Page 130 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 131
chapitre ndeg 4 Interrogation des donneacutees
Eacutecriture laquo SQL2 raquo
La directive FULL OUTER JOIN permet drsquoignorer lrsquoordre (et donc le sens de la jointure) destables dans la requecircte
Le seul problegraveme crsquoest que
MySQL ne prend pas encore en charge en version 50 la directive FULL OUTER JOIN
Le tableau suivant deacutetaille les requecirctes de notre exemple les clauses de jointures externesbilateacuterales sont surligneacutees Les enregistrements qui ne respectent pas la condition de jointuresont surligneacutes
Figure 4-16 Jointures externes bilateacuterales
Compagnie
comp nrue rue ville nomComp
AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL
CAST 1 G Brassens Blagnac Castanet AL
Pilote
brevet nom nbHVol compa
PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF PL-5 Michel Castaings
Qualifs
brevet typeAv validite
PL-4 A320 2005-06-24 PL-2 A320 2006-04-04 PL-3 A330 2006-05-13 PL-7 A380 2007-07-20
4055_04_C04 Page 131 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
132 copy Eacuteditions Eyrolles
Jointures proceacutedurales
Les jointures proceacutedurales sont eacutecrites par des requecirctes qui contiennent des sous-interroga-tions (SELECT imbriqueacute) Chaque clause FROM ne contient qursquoune seule table
SELECT colonnesTable1 FROM [nomBase]nomTable1 WHERE colonne(s) | expression(s) IN | = | opeacuterateur (SELECT colonne(s)delaTable2 FROM [nomBase]nomTable2 WHERE colonne(s) | expression(s) IN | = | opeacuterateur (SELECT hellip) [AND (conditionsTable2)] ) [AND (conditionsTable1)]
Tableau 4-39 Jointures externes bilateacuterales
Requecircte Jointure relationnelle Jointures (theacuteoriques) SQL2
R9 Sans objet SELECT nomComp brevet nom FROM Pilote --eacutequivalent agraveSELECT nomComp brevet nom FROM Compagnie
NOMCOMP BREVET NOM--------------- ------ --------------------Air France PL-4 Henri AlquieacuteAir France PL-1 Pierre LamotheAir France PL-2 Didier LinxeSingapore AL PL-3 Christian Soutou
R10 Sans objet SELECT quatypeAv pilbrevet pilnom FROM Pilote pil --eacutequivalent agraveSELECT quatypeAv pilbrevet pilnom FROM Qualifs qua
TYPE BREVET NOM---- ------ --------------------A320 PL-4 Henri AlquieacuteA320 PL-2 Didier LinxeA330 PL-3 Christian Soutou
WebFULL OUTER JOIN Compagnie ON comp = compa
FULL OUTER JOIN Pilote ON comp = compa
Castanet AL PL-5 Michel Castaings
FULL OUTER JOIN Qualifs quaON pilbrevet = quabrevet
FULL OUTER JOIN Pilote pilON pilbrevet = quabrevet
A380 PL-1 Pierre Lamothe PL-5 Michel Castaings
4055_04_C04 Page 132 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 133
chapitre ndeg 4 Interrogation des donneacutees
Cette forme drsquoeacutecriture nrsquoest pas la plus utiliseacutee mais elle permet de mieux visualiser certainesjointures Elle est plus complexe agrave eacutecrire car lrsquoordre drsquoapparition des tables dans les clausesFROM a son importance
Seules les colonnes de la table qui se trouve au niveau du premier SELECT peuvent ecirctreextraites
La sous-interrogation doit ecirctre placeacutee entre parenthegraveses Elle ne doit pas comporter de clauseORDER BY mais peut inclure GROUP BY et HAVING
Le reacutesultat drsquoune sous-interrogation est utiliseacute par la requecircte de niveau supeacuterieur Une sous-interrogation est exeacutecuteacutee avant la requecircte de niveau supeacuterieur
Une sous-interrogation peut ramener une ou plusieurs lignes Les opeacuterateurs = gt lt gt= lt=permettent drsquoen extraire une les opeacuterateurs IN ANY et ALL permettent drsquoen ramenerplusieurs
Sous-interrogations monolignes
Le tableau suivant deacutetaille quelques sous-interrogations monolignes Nous nous basons surcertaines requecirctes deacutejagrave eacutetudieacutees (forme relationnelle et SQL2)
Tableau 4-40 Sous-interrogations monolignes
Opeacuterateur Besoin Requecircte
= pour les eacutequi-jointures ou auto-jointures (= teste une ligne)
R1 (Pilotes de la compagnie de nom Air France ayant plus de 500 heures de vol)
SELECT brevet nom FROM Pilote WHERE compa AND nbHVolgt500
R3 (Pilotes sous la respon-sabiliteacute du pilote de nom Alquieacute)
SELECT brevet nom FROM Pilote WHERE chefPil =
gt pour les ineacutequi-jointures
R5 (Pilotes ayant plus drsquoexpeacuterience que le pilote de brevet PL-2)
SELECT brevet nom nbHVol FROM Pilote WHERE nbHVol gt
Web=
(SELECT compFROM CompagnieWHERE nomComp = Air France)
(SELECT brevet FROM PiloteWHERE nom LIKE Alquieacute)
(SELECT nbHVol FROM PiloteWHERE brevet = PL-2)
4055_04_C04 Page 133 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
134 copy Eacuteditions Eyrolles
Sous-interrogations multilignes (IN ALL et ANY)
Les opeacuterateurs multilignes sont les suivants
bull IN compare un eacuteleacutement agrave une donneacutee quelconque drsquoune liste rameneacutee par la sous-interro-gation Cet opeacuterateur est utiliseacute pour les eacutequijointures et les autojointures (et les intersec-tions) Lrsquoopeacuterateur NOT IN sera employeacute pour les jointures externes (et les diffeacuterences)
bull ANY compare lrsquoeacuteleacutement agrave chaque donneacutee rameneacutee par la sous-interrogation Lrsquoopeacuterateurlaquo =ANY raquo eacutequivaut agrave IN Lrsquoopeacuterateur laquo ltANY raquo signifie laquo infeacuterieur agrave au moins une desvaleurs raquo donc laquo infeacuterieur au maximum raquo Lrsquoopeacuterateur laquo gtANY raquo signifie laquo supeacuterieur agrave aumoins une des valeurs raquo donc laquo supeacuterieur au minimum raquo
bull ALL compare lrsquoeacuteleacutement agrave tous ceux rameneacutes par la sous-interrogation Lrsquoopeacuterateur laquo ltALL raquosignifie laquo infeacuterieur au minimum raquo et laquo gtALL raquo signifie laquo supeacuterieur au maximum raquo
Le tableau suivant deacutetaille quelques sous-interrogations multilignes Le dernier exempleprogramme une partie drsquoune jointure externe
La directive NOT IN doit ecirctre utiliseacutee avec prudence car elle retourne faux si un membrerameneacute par la sous-interrogation est NULL
Tableau 4-41 Sous-interrogations multilignes
Opeacuterateur Besoin Requecircte
IN R2 Coordonneacutees des compagnies qui embauchent des pilotes de moins de 500 heures de vol
SELECT nomComp nrue rue ville FROM Compagnie WHERE comp (
= et IN R4 Somme des heures de vol des pilotes placeacutes sous la responsabiliteacute des chefs pilotes de la compagnie de nom Air France
SELECT SUM(nbHVol) FROM Pilote WHERE chefPil ( )
NOT IN Compagnies nrsquoayant pas de pilote SELECT nomComp nrue rue ville FROM Compagnie WHERE comp
Web
INSELECT compa FROM Pilote
WHERE nbHVol lt 500)
INSELECT brevet FROM PiloteWHERE compa =
(SELECT comp FROM CompagnieWHERE nomComp = Air France)
NOT IN(SELECT compa FROM PiloteWHERE compa IS NOT NULL)
4055_04_C04 Page 134 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 135
chapitre ndeg 4 Interrogation des donneacutees
Afin drsquoillustrer les opeacuterateurs ANY et ALL consideacuterons la table suivante Nous avons indiqueacuteen gras les nombres drsquoheures minimal et maximal des A320 en griseacute les nombres drsquoheuresminimal et maximal des avions de la compagnie AF
Le tableau suivant deacutetaille quelques jointures proceacutedurales utilisant les opeacuterateurs ALL etANY
Figure 4-17 Table Avion
Avions
immat typeAv nbHVol compa
A1 A320 1000 AF A2 A330 1500 AF A3 A320 550 SING A4 A340 1800 SING A5 A340 200 AF A6 A330 100 AF
Tableau 4-42 Opeacuterateurs ALL et ANY
Opeacuterateur Besoin Requecircte et reacutesultat
ANY R11 Avions dont le nombre drsquoheures de vol est infeacuterieur agrave celui de nrsquoimporte quel A320
SELECT immat typeAv nbHVol FROM Avion WHERE nbHVol +-------+--------+--------+| immat | typeAv | nbHVol |+-------+--------+--------+| A3 | A320 | 55000 || A5 | A340 | 20000 || A6 | A330 | 10000 |+-------+--------+--------+
R12 Compagnies et leurs avions dont le nombre drsquoheures de vol est supeacute-rieur agrave celui de nrsquoimporte quel avion de la compagnie de code SING
SELECT immat typeAv nbHVol compa FROM Avion WHERE nbHVol +-------+--------+---------+-------+| immat | typeAv | nbHVol | compa |+-------+--------+---------+-------+| A1 | A320 | 100000 | AF || A2 | A330 | 150000 | AF || A4 | A340 | 180000 | SING |+-------+--------+---------+-------+
lt ANY(SELECT nbHVol FROM AvionWHERE typeAv=A320)
gt ANY(SELECT nbHVol FROM AvionWHERE compa = SING)
4055_04_C04 Page 135 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
136 copy Eacuteditions Eyrolles
Jointures mixtes
Une jointure mixte combine des clauses de jointures relationnelles proceacutedurales (avec dessous-interrogations) ou des clauses de jointures SQL2
Jointure relationnelle proceacutedurale
La jointure mixte suivante combine une clause de jointure relationnelle (en gras) avec unejointure proceacutedurale (en surligneacute) pour programmer la requecircte R4
SELECT SUM(p1nbHVol)
FROM Pilote p1 Pilote p2
WHERE p1chefPil = p2brevet
AND
Ce type drsquoeacutecriture peut ecirctre inteacuteressant srsquoil nrsquoest pas neacutecessaire drsquoafficher des colonnes destables preacutesentes dans les sous-interrogations ou si lrsquoon deacutesire appliquer des fonctions agrave desregroupements
ALL R13 Avions dont le nombre drsquoheures de vol est infeacuterieur agrave tous les A320
SELECT immat typeAv nbHVol FROM Avion WHERE nbHVol +-------+--------+--------+| immat | typeAv | nbHVol |+-------+--------+--------+| A5 | A340 | 20000 || A6 | A330 | 10000 |+-------+--------+--------+
R14 Compagnies et leurs avions dont le nombre drsquoheures de vol est supeacute-rieur agrave tous les avions de la compagnie de code AF
SELECT immat typeAv nbHVol compa FROM Avion WHERE nbHVol +-------+--------+---------+-------+| immat | typeAv | nbHVol | compa |+-------+--------+---------+-------+| A4 | A340 | 180000 | SING |+-------+--------+---------+-------+
Tableau 4-42 Opeacuterateurs ALL et ANY (suite)
Opeacuterateur Besoin Requecircte et reacutesultat
lt ALL(SELECT nbHVol FROM AvionWHERE typeAv=A320)
gt ALL(SELECT nbHVol FROM AvionWHERE compa = AF)
p2compa = (SELECT comp FROM Compagnie WHERE nomComp =
Air France)
4055_04_C04 Page 136 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 137
chapitre ndeg 4 Interrogation des donneacutees
Sous-interrogation dans la clause FROM
Introduite dans SQL2 la possibiliteacute de construire dynamiquement une table dans la clauseFROM drsquoune requecircte est opeacuterationnelle sous MySQL
SELECT listeColonnes
FROM table1 aliasTable1 (SELECThellip FROM table2 WHEREhellip) aliasTable2
[ WHERE (conditionsTable1etTable2) ]
Consideacuterons la table suivante Le but est drsquoextraire le pourcentage partiel de pilotes parcompagnie Dans notre exemple il y a 5 pilotes dont 3 deacutependent de AF Pour cette compa-gnie le pourcentage partiel de pilotes est de 35 soit 60
La requecircte suivante construit dynamiquement deux tables (alias a et b) dans la clause FROMpour reacutepondre agrave cette question
Sous-interrogations synchroniseacutees
Une sous-interrogation est synchroniseacutee si elle manipule des colonnes drsquoune table du niveausupeacuterieur Une sous-interrogation synchroniseacutee est exeacutecuteacutee une fois pour chaque enregistre-
Figure 4-18 Table Pilote
Pilote
brevet nom nbHVol compa
PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-3 Christian Soutou 1000 SING PL-4 Henri Alquieacute 3400 AF PL-5 Michel Castaings
Tableau 4-43 SELECT dans un FROM
Requecircte et tables eacutevalueacutees dans le FROM Reacutesultat
SELECT acompa Comp anbpilbtotal100 Pilote FROM a b +------+---------+
| Comp | Pilote |+------+---------+| NULL | 200000 || AF | 600000 || SING | 200000 |+------+---------+
(SELECT compa COUNT() nbpilFROM Pilote GROUP BY compa)
(SELECT COUNT() total FROM Pilote)
a
compa nbpil
AF 3
SING 1
1
b
total
5
4055_04_C04 Page 137 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
138 copy Eacuteditions Eyrolles
ment extrait par la requecircte de niveau supeacuterieur Cette technique peut ecirctre aussi utiliseacutee dans lesordres UPDATE et DELETE La forme geacuteneacuterale drsquoune sous-interrogation synchroniseacutee est lasuivante Les alias des tables sont utiles pour pouvoir manipuler des colonnes de tables dediffeacuterents niveaux
Une sous-interrogation synchroniseacutee peut ramener une ou plusieurs lignes Diffeacuterents opeacutera-teurs peuvent ecirctre employeacutes (= gt lt gt= lt= EXISTS)
Opeacuterateur matheacutematique
Le tableau suivant deacutetaille un exemple drsquoopeacuterateur matheacutematique appliqueacute agrave une sous-interro-gation synchroniseacutee
Opeacuterateur EXISTS
Lrsquoopeacuterateur EXISTS permet drsquointerrompre la sous-interrogation degraves le premier enregistrementtrouveacute La valeur FALSE est retourneacutee si aucun enregistrement nrsquoest extrait par la sous-interro-gation
SELECT alias1c
FROM nomTable1 alias1
WHERE colonne(s) opeacuterateur (SELECT alias2zhellip
FROM nomTable2 alias2
WHERE alias1x opeacuterateur alias2y )
[AND ( conditionsTable1 )]
Tableau 4-44 Sous-interrogation synchroniseacutee
Besoin Requecircte et reacutesultat
R15 Avions dont le nombre drsquoheures de vol est supeacuterieur au nombre drsquoheures de vol moyen des avions de leur compagnie (ici 700 heures pour AF et 1115 heures pour SING)
SELECT avi1 FROM Avion avi1 WHERE avi1nbHVol
+-------+--------+---------+-------+| immat | typeAv | nbHVol | compa |+-------+--------+---------+-------+| A1 | A320 | 100000 | AF || A2 | A330 | 150000 | AF || A4 | A340 | 180000 | SING |+-------+--------+---------+-------+
gt(SELECT AVG(avi2nbHVol) FROM Avion avi2WHERE avi2compa = avi1compa)
4055_04_C04 Page 138 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 139
chapitre ndeg 4 Interrogation des donneacutees
Utilisons la table suivante pour deacutecrire lrsquoutilisation de lrsquoopeacuterateur EXISTS
La sous-interrogation synchroniseacutee est surligneacutee dans le script suivant
Opeacuterateur NOT EXISTS
Lrsquoopeacuterateur NOT EXISTS retourne la valeur TRUE si aucun enregistrement nrsquoest extrait par lasous-interrogation Cet opeacuterateur peut ecirctre utiliseacute pour eacutecrire des jointures externes
Figure 4-19 Utilisation de EXISTS
Pilote
brevet nom nbHVol compa chefPil
PL-1 Pierre Lamothe 450 AF PL-2 Didier Linxe 900 AF PL-4 PL-3 Christian Soutou 1000 SING PL-4 PL-4 Henri Alquieacute 3400 AF PL-5 Michel Castaings
Tableau 4-45 Opeacuterateur EXISTS
Besoin Requecircte et reacutesultat
R15 Pilotes ayant au moins un pilote sous leur responsabiliteacute
SELECT pil1brevet pil1nom pil1compa FROM Pilote pil1 WHERE
+--------+--------------+-------+| brevet | nom | compa |+--------+--------------+-------+| PL-4 | Henri Alquieacute | AF |+--------+--------------+-------+
WebEXISTS
(SELECT pil2 FROM Pilote pil2WHERE pil2chefPil = pil1brevet)
Tableau 4-46 Opeacuterateur NOT EXISTS
Besoin Requecircte et reacutesultat
Liste des compagnies nrsquoayant pas de pilote
SELECT cpg FROM Compagnie cpg WHERE NOT EXISTS
+------+------+-------------+---------+-------------+| comp | nrue | rue | ville | nomComp |+------+------+-------------+---------+-------------+| CAST | 1 | G Brassens | Blagnac | Castanet AL |+------+------+-------------+---------+-------------+
(SELECT compa FROM PiloteWHERE compa = cpgcomp)
4055_04_C04 Page 139 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
140 copy Eacuteditions Eyrolles
Autres directives SQL2
Eacutetudions enfin les autres options des jointures SQL2 (NATURAL JOIN USING et CROSSJOIN)
Consideacuterons le scheacutema suivant (des colonnes portent le mecircme nom) La colonne typeAvdans la table Navigant deacutesigne le type drsquoappareil sur lequel le pilote est instructeur
Opeacuterateur NATURAL JOIN
La jointure naturelle est programmeacutee par la clause NATURAL JOIN La clause de jointure estautomatiquement construite sur la base de toutes les colonnes portant le mecircme nom entre lesdeux tables
Les concepteurs devraient ainsi penser agrave nommer drsquoune maniegravere semblable cleacutes primaires etcleacutes eacutetrangegraveres Ce principe nrsquoest pas souvent appliqueacute aux bases volumineuses
Le tableau suivant deacutetaille deux eacutecritures possibles drsquoune jointure naturelle La clause de join-ture est baseacutee sur les colonnes (brevet typeAv) Une clause WHERE aurait pu aussi ecirctreprogammeacutee
Figure 4-20 Deux tables agrave mettre en jointure naturelle
Navigant
brevet nom nbHVol typeAv
PL-1 Pierre Lamothe 450 PL-2 Didier Linxe 900 A320 PL-3 Henri Alquieacute 3400 A380
VolsControle
brevet typeAv validite
PL-1 A320 2005-06-24 PL-2 A320 2006-04-04 PL-2 A330 2006-05-13 PL-3 A380 2007-07-20 PL-3 A320 2005-03-12
Tableau 4-47 Jointures naturelles
Besoin Jointures SQL2 et reacutesultat
Navigants qualifieacutes sur un type drsquoappareil et instructeurs sur ce mecircme type
SELECT brevet nom typeAv validite FROM Naviguant --eacutequivalent agraveSELECT brevet nom typeAv validite FROM VolsControle
NATURAL JOIN VolsControle
NATURAL JOIN Naviguant
4055_04_C04 Page 140 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 141
chapitre ndeg 4 Interrogation des donneacutees
Opeacuterateur USING
La directive USING(col1 col2hellip) de la clause JOIN programme une jointure naturelle res-treinte agrave un ensemble de colonnes Il ne faut pas utiliser drsquoalias de tables dans la liste descolonnes
Dans notre exemple on peut restreindre la jointure naturelle aux colonnes brevet outypeAv Si on les positionnait (brevet typeAv) dans la directive USING cela reviendraitagrave construire un NATURAL JOIN Le tableau suivant deacutetaille deux eacutecritures drsquoune jointurenaturelle restreinte
Opeacuterateur CROSS JOIN
La directive CROSS JOIN programme un produit carteacutesien qursquoon peut restreindre dans laclause WHERE
+--------+--------------+--------+------------+| brevet | nom | typeAv | validite |+--------+--------------+--------+------------+| PL-2 | Didier Linxe | A320 | 2006-04-04 || PL-3 | Henri Alquieacute | A380 | 2007-07-20 |+--------+--------------+--------+------------+
Tableau 4-47 Jointures naturelles (suite)
Besoin Jointures SQL2 et reacutesultat
Tableau 4-48 Jointures naturelles restreintes
Besoin Jointures SQL2 et reacutesultat
Nom des navigants avec leurs qualifications et dates de validiteacute
SELECT nom vtypeAv vvalidite FROM Naviguant
SELECT nom vtypeAv vvalidite FROM VolsControle v
+----------------+--------+------------+| nom | typeAv | validite |+----------------+--------+------------+| Pierre Lamothe | A320 | 2005-06-24 || Didier Linxe | A320 | 2006-04-04 || Didier Linxe | A330 | 2006-05-13 || Henri Alquieacute | A380 | 2007-07-20 || Henri Alquieacute | A320 | 2005-03-12 |+----------------+--------+------------+
WebJOIN VolsControle v USING(brevet)
JOIN Naviguant USING(brevet)
4055_04_C04 Page 141 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
142 copy Eacuteditions Eyrolles
Le tableau suivant preacutesente deux eacutecritures drsquoun produit carteacutesien (seul lrsquoordre drsquoaffichage descolonnes change)
Division
La division est un opeacuterateur algeacutebrique et non ensembliste Cet opeacuterateur est semblable sur leprincipe agrave lrsquoopeacuteration qursquoon apprend au CM2 (oublieacutee plus tard en terminale agrave cause descalculettes) La division est un opeacuterateur binaire comme la jointure car il srsquoagit de diviser unetable (ou partie de) par une autre table (ou partie de) Il est possible drsquoopeacuterer une division agravepartir drsquoune seule table en ce cas on divise deux parties de cette table (analogue aux autojoin-tures)
Lrsquoopeacuterateur de division nrsquoest pas fourni par MySQL (ni par aucun de ses concurrents drsquoailleurs)Il nrsquoexiste donc malheureusement pas drsquoinstruction DIVIDE
Est-ce la complexiteacute ou le manque drsquointeacuterecirct qui freinent les eacutediteurs de logiciels agrave programmerce concept La question reste en suspens alors si vous avez un avis agrave ce sujet faites-moi signe
Cet opeacuterateur permet de traduire le terme laquo pour tous les raquo des requecirctes qursquoon deacutesire pro-grammer en SQL
On peut aussi dire que lorsque vous voulez comparer un ensemble avec un groupe de reacutefeacute-rence il faut programmer une division
La division peut se programmer sous MySQL agrave lrsquoaide drsquoune diffeacuterence (NOT IN) et la fonctionNOT EXISTS
Tableau 4-49 Produit carteacutesien
Besoin Jointures SQL2 et reacutesultat
Combinaison de toutes les lignes des deux tables
SELECT FROM Naviguant -- eacutequivalent agraveSELECT FROM VolsControle
+--------+----------------+---------+--------+--------+--------+------------+| brevet | nom | nbHVol | typeAv | brevet | typeAv | validite |+--------+----------------+---------+--------+--------+--------+------------+| PL-1 | Pierre Lamothe | 45000 | NULL | PL-1 | A320 | 2005-06-24 || PL-2 | Didier Linxe | 90000 | A320 | PL-1 | A320 | 2005-06-24 || PL-3 | Henri Alquieacute | 340000 | A380 | PL-1 | A320 | 2005-06-24 || PL-1 | Pierre Lamothe | 45000 | NULL | PL-2 | A320 | 2006-04-04 |15 rows in set
WebCROSS JOIN VolsControle
CROSS JOIN Naviguant
4055_04_C04 Page 142 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 143
chapitre ndeg 4 Interrogation des donneacutees
La figure suivante illustre lrsquoopeacuterateur de division dans sa plus simple expression (je ne parlepas du contenu des tables bien sucircrhellip) Le scheacutema fait plus apparaicirctre le deuxiegraveme aspect reacuteveacute-lateur eacutenonceacute ci-avant agrave savoir comparer un ensemble (la table T1) avec un ensemble de reacutefeacute-rence (la table T2)
Deacutefinition
La division de la table T1[a1anb1bn] par la table T2[b1bn] (la structure de T2 estincluse dans la structure de T1) donne la table T3[a1an] qui contient les enregistrements tiveacuterifiant ti isin T3 (de structure [a1an]) tj isin T2 (tj de structure [b1bn]) et titj isin T1 (titj destructure [a1anb1bn])
Classification
Consideacuterons lrsquoexemple suivant pour deacutecrire la requecircte agrave construire Il srsquoagit de reacutepondre agrave laquestion laquo Quels sont les avions affreacuteteacutes par toutes les compagnies franccedilaises raquo Lrsquoensem-ble de reacutefeacuterence (A) est constitueacute des codes des compagnies franccedilaises Lrsquoensemble agrave compa-rer (B) est formeacute des codes des compagnies pour chaque avion
Deux cas sont agrave envisager suivant la maniegravere de comparer les deux ensembles
Division inexacte (le reste nrsquoest pas nul) un ensemble est seulement inclus dans un autre(A isin B) La question agrave programmer serait laquo Quels sont les avions affreacuteteacutes par toutes lescompagnies franccedilaises raquo sans preacuteciser si les avions ne doivent pas ecirctre aussi affreacuteteacutes pardes compagnies eacutetrangegraveres Lrsquoavion (A3 Mercure) reacutepondrait agrave cette question que laderniegravere ligne de la table Affretements soit preacutesente ou pas
Division exacte (le reste est nul) les deux ensembles sont eacutegaux (B=A) La question agraveprogrammer serait laquo Quels sont les avions affreacuteteacutes exactement (ou uniquement) partoutes les compagnies franccedilaises raquo Lrsquoavion (A3 Mercure) reacutepondrait agrave cette questionsi la derniegravere ligne de la table Affretements eacutetait inexistante Les lignes concerneacuteesdans les deux tables sont griseacutees
Figure 4-21 Division
T1
Jospin Juppeacute Juppeacute Baudis Baudis Baudis Chirac Chirac Chirac
T2
Quotient
Chirac
Quels sont les enregistrements de T1 qui sont associeacutes agrave laquo tous les raquo enregistrements de T2 Reacuteponse Chirac
Quotient=(T1ndashReste)T2(ici Reste nrsquoest pas nul)
4055_04_C04 Page 143 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
144 copy Eacuteditions Eyrolles
Lrsquoopeacuterateur de diffeacuterence (programmeacute avec NOT IN) combineacute agrave la fonction EXISTS permetde programmer ces deux comparaisons (un ensemble inclus dans un autre et une eacutegaliteacutedrsquoensembles) Il existe drsquoautres solutions agrave base de regroupements et de sous-interrogations(synchroniseacutees ou pas) que nous nrsquoeacutetudierons pas parce qursquoelles me semblent plus compli-queacutees Eacutecrivons agrave preacutesent ces deux divisions agrave lrsquoaide de requecirctes SQL
Division inexacte
Pour programmer le fait qursquoun ensemble est seulement inclus dans un autre (ici A sub B) il fautqursquoil nrsquoexiste pas drsquoeacuteleacutement dans lrsquoensemble A-B La diffeacuterence se programme agrave lrsquoaide delrsquoopeacuterateur NOT IN lrsquoinexistence drsquoeacuteleacutement se programme agrave lrsquoaide de la fonction NOTEXISTS comme le montre la requecircte suivante
Division exacte
Pour programmer le fait qursquoun ensemble est strictement eacutegal agrave un autre (ici A=B) il faut qursquoilnrsquoexiste ni drsquoeacuteleacutement dans lrsquoensemble A-B ni dans lrsquoensemble B-A La traduction matheacute-matique est la suivante A=BhArr(A-B=empty et B-A=empty) Les opeacuterateurs se programment de lamecircme maniegravere que pour la requecircte preacuteceacutedente Le laquo et raquo se programme avec un AND
Figure 4-22 Divisions agrave programmer
Web
Affretements
immat typeAv compa dateAff
A1 A320 SING 1965-05-13 A2 A340 AF 1968-06-22 A3 Mercure AF 1965-02-05A4 A330 ALIB 1965-01-16
A3 Mercure ALIB 1942-03-05 A3 Mercure SING 1987-03-01
Compagnie
comp nomComp pays
AF Air France FALIB Air Lib F SING Singapore AL SG
Reacutesultat
immat typeAv
A3 Mercure
SELECT DISTINCT immat typeAv FROM Affretements aliasAff
WHERE NOT EXISTS
(SELECT DISTINCT comp FROM Compagnie WHERE pays = F
AND comp NOT IN
(SELECT compa FROM Affr etements WHERE immat = aliasAffimmat ))
Ensemble A de reacutefeacuterence
Ensemble B agrave comparer
Parcours de tous les avions
4055_04_C04 Page 144 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 145
chapitre ndeg 4 Interrogation des donneacutees
Reacutesulats en HTML ou XML
Les options laquo --html raquo et laquo --xml raquo (eacutetudieacutees dans lrsquointroduction) permettent de formater lereacutesultat des extractions au standard du Web Cela peut ecirctre inteacuteressant si vous voulez rapide-ment publier des pages (qui seront statiques bien sucircr) ou composer des fichiers destineacutes agravelrsquoeacutechange de donneacutees provenant de votre base Ainsi la requecircte preacuteceacutedente fournira les eacutetats desortie suivants Concernant XML la balise de plus haut niveau contient un attribut deacutecrivantla requecircte
SELECT DISTINCT immat typeAv FROM Affregravetements aliasAff WHERE NOT EXISTS (SELECT comp FROM Compagnie WHERE pays = F AND comp NOT IN (SELECT compa FROM Affretements WHERE immat = aliasAffimmat )) AND NOT EXISTS (SELECT compa FROM Affretements WHERE immat = aliasAffimmat AND compa NOT IN (SELECT comp FROM Compagnie WHERE pays = F ))
A-B
Parcours de tous les avions
B-A
Tableau 4-50 Reacutesultats formateacutes pour le Web
Connexion avec --hmtl Connexion avec --xml
ltTABLE BORDER=1gtltTRgtltTHgtimmatltTHgtltTHgttypeAvltTHgtltTRgtltTRgtltTDgtA3ltTDgtltTDgtMercureltTDgtltTRgtltTABLEgt
ltresultset statement=SELECT DISTINCT immat typeAv FROM Affretements alia-sAff WHERE NOT EXISTS (SELECT comp FROM Compagnie WHERE pays = F AND comp NOT IN (SELECT compa FROM Affre-tements WHERE immat = alia-sAffimmat)) AND NOT EXISTS (SELECT compa FROM Affretements WHERE immat = aliasAffimmat AND compa NOT IN (SELECT comp FROM Compagnie WHERE pays = F))gt ltrowgt ltfield name=immatgtA3ltfieldgt ltfield name=typeAvgtMercureltfieldgt ltrowgtltresultsetgt
Web
4055_04_C04 Page 145 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
146 copy Eacuteditions Eyrolles
Eacutecriture dans un fichier
Meacutecanisme inverse agrave LOAD DATA INFILE eacutetudieacute au chapitre 2 lrsquoexportation de donneacutees (auformat de fichiers) extraites agrave lrsquoaide drsquoune requecircte peut ecirctre programmeacutee agrave lrsquoaide de la direc-tive INTO OUTFILE de lrsquoinstruction SELECT Une telle requecircte eacutecrit dans un fichier dans unreacutepertoire du serveur Le privilegravege FILE est requis Le fichier cible doit ecirctre inexistant avantdrsquoexeacutecuter son chargement La syntaxe simplifieacutee de cette directive est la suivante
SELECT [ DISTINCT | DISTINCTROW | ALL ] listeColonnes
FROM nomTable1 [nomTable2] [ WHERE condition ]
FIELDS deacutecrit comment seront formateacutees dans le fichier les colonnes extraites de(s)table(s) En lrsquoabsence de cette clause TERMINATED BY vaut t ENCLOSED BY vaut et ESCAPED BY vaut ndash FIELDS TERMINATED BY deacutecrit le caractegravere qui seacutepare deux valeurs de colonnesndash FIELDS ENCLOSED BY permet de controcircler le caractegravere qui encadrera chaque valeur
de colonnendash FIELDS ESCAPED BY permet de controcircler les caractegraveres speacuteciaux
LINES deacutecrit comment seront eacutecrites dans le fichier les lignes extraites de(s) table(s) Enlrsquoabsence de cette clause TERMINATED BY vaut n et STARTING BY vaut
Creacuteons le fichier laquo pilotestxt raquo situeacute dans le reacutepertoire laquo Ddev raquo en exportant la tota-liteacute des enregistrements de la table Pilote (SELECT ) deacutecrite au deacutebut du chapitre Lefichier est ensuite ouvert agrave lrsquoaide du WordPad Notez lrsquoutilisation du double laquo raquo pour deacutesi-gner une arborescence Windows Le caractegravere NULL est exporteacute par le caractegravere laquo N raquo
Figure 4-23 Creacuteation drsquoun fichier
INTO OUTFILE cheminEtNomFichier
[FIELDS [TERMINATED BY string]
[[OPTIONALLY] ENCLOSED BY char]
[ESCAPED BY char ] ]
[LINES [STARTING BY string]
[TERMINATED BY string] ]
SELECT INTO OUTFILE Ddevpilotestxt FIELDS TERMINATED BY ENCLOSED BY
FROM Pilote LINES STARTING BY import-Pilote TERMINATED BY $n
4055_04_C04 Page 146 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 147
chapitre ndeg 4 Interrogation des donneacutees
Exercices
Les objectifs de ces exercices sont
de creacuteer dynamiquement des tables et leurs donneacutees
drsquoeacutecrire des requecirctes monotables et multitables
de reacutealiser des modifications synchroniseacutees
de composer des jointures et des divisions
41 Creacuteation dynamique de tables
Eacutecrire le script creacuteaDynamiquesql permettant de creacuteer les tables Softs et PCSeuls suivan-tes (en utilisant la directive AS SELECT de la commande CREATE TABLE) Vous ne poserezaucune contrainte sur ces tables Penser agrave modifier le nom des colonnes
La table Softs sera construite sur la base de tous les enregistrements de la table Logiciel quevous avez creacuteeacutee et alimenteacutee preacuteceacutedemment La table PCSeuls doit seulement contenir les enregis-trements de la table Poste qui sont de type PCWS ou PCNT Veacuterifier
SELECT FROM Softs
SELECT FROM PCSeuls
42 Requecirctes monotables
Eacutecrire le script requecirctessql permettant drsquoextraire agrave lrsquoaide drsquoinstructions SELECT les donneacuteessuivantes
1 Type du poste p8
2 Noms des logiciels UNIX
3 Noms adresses IP numeacuteros de salle des postes de type UNIX ou PCWS
4 Mecircme requecircte pour les postes du segment 13012080 trieacutes par numeacuteros de salles deacutecroissants
5 Numeacuteros des logiciels installeacutes sur le poste p6
6 Numeacuteros des postes qui heacutebergent le logiciel log1
7 Noms et adresses IP complegravetes (ex 1301208001) des postes de type TX (utiliser la fonctionde concateacutenation)
Figure 4-24 Structures des nouvelles tables
SoftsnomSoft version prix
PCSeulsnP nomP seg ad typeP salle
4055_04_C04 Page 147 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
Partie I SQL de base
148 copy Eacuteditions Eyrolles
43 Fonctions et groupements
8 Pour chaque poste le nombre de logiciels installeacutes (en utilisant la table Installer)
9 Pour chaque salle le nombre de postes (agrave partir de la table Poste)
10 Pour chaque logiciel le nombre drsquoinstallations sur des postes diffeacuterents
11 Moyenne des prix des logiciels UNIX
12 Plus reacutecente date drsquoachat drsquoun logiciel
13 Numeacuteros des postes heacutebergeant 2 logiciels
14 Nombre de postes heacutebergeant 2 logiciels (utiliser la requecircte preacuteceacutedente en faisant un SELECTdans la clause FROM)
44 Requecirctes multitables
Opeacuterateurs ensemblistes
15 Types de postes non recenseacutes dans le parc informatique (utiliser la table Types)
16 Types existant agrave la fois comme types de postes et de logiciels
17 Types de postes de travail nrsquoeacutetant pas des types de logiciels
Jointures proceacutedurales
18 Adresses IP complegravetes des postes qui heacutebergent le logiciel log6
19 Adresses IP complegravetes des postes qui heacutebergent le logiciel de nom Oracle 8
20 Noms des segments posseacutedant exactement trois postes de travail de type TX
21 Noms des salles ou lrsquoon peut trouver au moins un poste heacutebergeant le logiciel Oracle 6
22 Nom du logiciel acheteacute le plus reacutecent (utiliser la requecircte 12)
Jointures relationnelles
Eacutecrire les requecirctes 18 19 20 21 avec des jointures de la forme relationnelle Numeacuteroter ces nouvellesrequecirctes de 23 agrave 26
27 Installations (nom segment nom salle adresse IP complegravete nom logiciel date drsquoinstallation) trieacuteespar segment salle et adresse IP
Jointures SQL2
Eacutecrire les requecirctes 18 19 20 21 avec des jointures SQL2 (JOIN NATURAL JOIN JOIN USING)Numeacuteroter ces nouvelles requecirctes de 28 agrave 31
4055_04_C04 Page 148 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 149
chapitre ndeg 4 Interrogation des donneacutees
45 Modifications synchroniseacutees
Eacutecrire le script modifSynchroniseacuteessql pour ajouter les lignes suivantes dans la tableInstaller
Eacutecrire les requecirctes UPDATE synchroniseacutees de la forme suivante
UPDATE table1 alias1
SET colonne = (
Pour mettre agrave jour automatiquement les colonnes rajouteacutees
bull nbSalle dans la table Segment (nombre de salles traverseacutees par le segment)
bull nbPoste dans la table Segment (nombre de postes du segment)
bull nbInstall dans la table Logiciel (nombre drsquoinstallations du logiciel)
bull nbLog dans la table Poste (nombre de logiciels installeacutes par poste)
Veacuterifier le contenu des tables modifieacutees (Segment Logiciel et Poste)
46 Opeacuterateurs existentiels
Rajouter au script requecirctessql les instructions SELECT pour extraire les donneacutees suivantes
Sous-interrogation synchroniseacutee
32 Noms des postes ayant au moins un logiciel commun au poste p6 (on doit trouver les postes p2p8 et p10)
Divisions
33 Noms des postes ayant les mecircmes logiciels que le poste p6 (les postes peuvent avoir plus de logi-ciels que p6) On doit trouver les postes p2 et p8 (division inexacte)
34 Noms des postes ayant exactement les mecircmes logiciels que le poste p2 (division exacte) on doittrouver p8
Figure 4-25 Lignes agrave ajouter
Installer nPoste nLog numIns dateIns delai
p2 log6 SYSDATE() NULL p8 log1 SYSDATE () NULL p10 log1
seacutequence
SYSDATE () NULL
SELECT COUNT()
FROM table2 alias2
WHERE alias2colonneA = alias1colonneB)
4055_04_C04 Page 149 Jeudi 2 mars 2006 203 14 gt Apogee FrameMaker Noir
4055_07a_P03 Page 288 Jeudi 2 mars 2006 206 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
151
Chapitre 5
Controcircle des donneacutees
Comme dans tout systegraveme multi-utilisateur lrsquousager drsquoun SGBD doit ecirctre identifieacute avant depouvoir utiliser des ressources Les accegraves aux informations et agrave la base de donneacutees doivent ecirctrecontrocircleacutes agrave des fins de seacutecuriteacute et de coheacuterence La figure suivante illustre un groupe drsquoutilisa-teurs dans lequel existe une classification entre ceux qui peuvent consulter mettre agrave joursupprimer des enregistrements voire les tables
Nous verrons dans cette section les aspects du langage SQL qui concernent le controcircle desdonneacutees et des accegraves Nous eacutetudierons
la gestion des utilisateurs qui manipuleront des bases de donneacutees dans lequelles se trouventdes objets tels que des tables index seacutequences (pour lrsquoinstant impleacutementeacutees par des colon-nes
AUTO_INCREMENT
) vues proceacutedures etc
la gestion des privilegraveges qui permettent de donner des droits sur la base de donneacutees (privi-legraveges systegraveme) et sur les donneacutees de la base (privilegraveges objet)
la gestion des vues
lrsquoutilisation du dictionnaire des donneacutees (base de donneacutees
information_schema
)
Le chapitre 9 deacutetaille lrsquooutil graphique
MySQL Administrator
qui permet de srsquoaffranchirdrsquoeacutecrire des instructions SQL
Figure 5-1
Conseacutequences de lrsquoaspect multi-utilisateur
Peut creacuteer des pilotes
Peut consulter les vols
Peut supprimer un vol
Peut deacutetruire la base MySQLTCP-IP
4055_05_C05 Page 151 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
152
copy Eacuteditions Eyrolles
Gestion des utilisateurs
Preacutesenteacute rapidement agrave lrsquointroduction nous verrons qursquoun utilisateur (
user
) est identifieacute parMySQL par son nom et celui de la machine agrave partir de laquelle il se connecte Cela fait ilpourra acceacuteder agrave diffeacuterents objets (tables vues seacutequences index proceacutedures etc) drsquoune oude plusieurs bases sous reacuteserve drsquoavoir reccedilu un certain nombre de privilegraveges
Classification
Les types drsquoutilisateurs leurs fonctions et leur nombre peuvent varier drsquoune base agrave une autreNeacuteanmoins pour chaque base de donneacutees en activiteacute on peut classifier les utilisateurs de lamaniegravere suivante
Le DBA (
DataBase
Administrator
) Il en existe au moins un Une petite base peut nrsquoavoirqursquoun seul administrateur Une base importante peut en regrouper plusieurs qui se parta-gent les tacircches suivantes
ndash installation et mises agrave jour de la base et des outils eacuteventuels
ndash gestion de lrsquoespace disque et des espaces pour les donneacutees
ndash gestion des utilisateurs et de leurs objets (srsquoils ne les gegraverent pas eux-mecircmes)
ndash optimisation des performances
ndash sauvegardes restaurations et archivages
ndash contact avec le support technique
Lrsquoadministrateur reacuteseau (qui peut ecirctre le DBA) se charge de la configuration des couchesclient pour les accegraves distants
Les deacuteveloppeurs qui conccediloivent et mettent agrave jour la base Ils peuvent aussi agir sur leursobjets (creacuteation et modification des tables index seacutequences etc) Ils transmettent auDBA leurs demandes speacutecifiques (stockage optimisation seacutecuriteacute)
Les administrateurs drsquoapplication qui gegraverent les donneacutees manipuleacutees par la ou les applica-tions Pour les petites et les moyennes bases le DBA joue ce rocircle
Les utilisateurs qui se connectent et interagissent avec la base agrave travers les applications ouagrave lrsquoaide drsquooutils (interrogations pour la geacuteneacuteration de rapports ajouts modifications ousuppressions drsquoenregistrements)
Tous seront des utilisateurs (au sens MySQL) avec des privilegraveges diffeacuterents
Creacuteation drsquoun utilisateur (
CREATE USER
)
Pour pouvoir creacuteer un utilisateur vous devez posseacuteder le privilegravege
CREATE
USER
ou
INSERT
sur la base systegraveme
mysql
(car crsquoest la table
mysqluser
qui stockera lrsquoexistence de cenouvel arrivant)
4055_05_C05 Page 152 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
153
chapitre ndeg 5 Controcircle des donneacutees
La syntaxe de creacuteation drsquoun utilisateur est la suivante
CREATE USER
utilisateur
[IDENTIFIED BY [PASSWORD]
motdePasse
]
[
utilisateur2
[IDENTIFIED BY [PASSWORD]
motdePasse2
] ]
IDENTIFIED BY
motdePasse
permet drsquoaffecter un mot de passe (16 caractegraveres maximumsensibles agrave la casse) agrave un utilisateur (16 caractegraveres maximum sensibles aussi agrave la casse)
Le tableau suivant deacutecrit la creacuteation drsquoun utilisateur (agrave exeacutecuter en eacutetant connecteacute en local entant que
root
)
Par deacutefaut les utilisateurs une fois creacuteeacutes nrsquoont aucun droit sur aucune base de donneacutees (agrave parten lecture eacutecriture sur la base
test
et en lecture seule sur la base
information_schema
)La section
Privilegraveges
eacutetudie ces droits
Un utilisateur bien connu
Lors de lrsquoinstallation vous avez ducirc noter la preacutesence de lrsquoutilisateur
root
(mot de passe saisiagrave lrsquoinstallation) Cet utilisateur est le DBA que MySQL vous offre Il vous permettra drsquoeffec-tuer vos tacircches administratives en ligne de commande ou par une console graphique (creacuteer desutilisateurs par exemple)
Liste des utilisateurs
Agrave propos de
root
on le retrouve dans la table
user
de la base
mysql
(
mysqluser
)Lrsquoextraction des colonnes
User
et
Host
restitue la liste des utilisateurs connus du serveur Si
root
nrsquoavait pas seacutelectionneacute la base
mysql
la commande agrave exeacutecuter aurait eacuteteacute laquo
SELECTUserHost FROM mysqluser
raquo
(rootlocalhost) [mysql] mysqlgt SELECT UserHost FROM user
+--------+-----------+
| User | Host |
+--------+-----------+
| | |
| | localhost |
| root | localhost |
| soutou | localhost |
+--------+-----------+
Tableau 5-1 Creacuteation drsquoun utilisateur
Instruction SQL Reacutesultat
CREATE USER
soutoulocalhost IDENTIFIED BY iut
soutou
est deacuteclareacute laquo utilisateur agrave accegraves local raquo il devra se connecter agrave lrsquoaide de son mot de passe
4055_05_C05 Page 153 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
154
copy Eacuteditions Eyrolles
Vous devez posseacuteder une table similaire Il apparaicirct quatre accegraves potentiels Lrsquoutilisateur vide
correspond agrave une connexion anonyme La machine deacutesigneacutee par laquo
raquo indique que laconnexion est autoriseacutee agrave partir de tout site (en supposant qursquoun client MySQL est installeacute etqursquoil est relieacute au serveur par TCP-IP) La machine deacutesigneacutee par laquo
localhost
raquo speacutecifie quela connexion est autoriseacutee en local
Ici la table fait eacutetat que lrsquoaccegraves anonyme (restreint toutefois agrave la base
test
voir la section
Table
mysqldb
) est permis en local et agrave partir de tout site et que
soutou
comme
root
nepeuvent se connecter qursquoen local
Modification drsquoun utilisateur
Le mot de passe drsquoun utilisateur peut ecirctre modifieacute sans parler de privilegraveges Nous verrons plustard qursquoil est possible de restreindre le nombre de requecirctes (
SELECT
) de modifications(
UPDATE
) de connexions par heure et de connexions simultaneacutees agrave un serveur
Puisqursquoil nrsquoexiste pas de commande
ALTER USER
pour changer un mot de passe il faut doncmodifier la table
user
par la seule commande SQL capable de le faire
UPDATE
Lrsquoinstruction suivante modifie le mot de passe de lrsquoutilisateur
soutou
pour lrsquoaccegraves en localNotez lrsquoutilisation de la fonction
PASSWORD()
qui code le mot de passe agrave affecter agrave lacolonne
Password
de la table
user
Il est plus prudent drsquoutiliser ensuite
FLUSH PRIVI-LEGES
qui recharge les tables systegraveme de maniegravere agrave rendre la manipulation effective surlrsquoinstant (un peu comme un
COMMIT
sur des donneacutees)
UPDATE
mysqluser
WHERE User = soutou
AND Host = localhost
FLUSH
PRIVILEGES
Une fois cette modification reacutealiseacutee si soutou tente une connexion avec son ancien mot depasse il vient lrsquoerreur classique laquo ERROR 1045 (28000) Access denied for usersoutoulocalhost (using password xx) raquo (xx valant YES si soutou seconnecte avec son ancien mot de passe NO srsquoil nrsquoen donne pas)
Chaque utilisateur peut changer son propre mot de passe agrave lrsquoaide de cette instruction srsquoil en ale privilegravege Mais attention Le fait de lui donner ce droit (nous verrons plus loin comment lefaire) implique eacutegalement qursquoil puisse aussi modifier les mots de passe de ses copains ainsique celui du root
Renommer un utilisateur (RENAME USER)
Pour pouvoir renommer un utilisateur vous devez posseacuteder le privilegravege CREATE USER (ou leprivilegravege UPDATE sur la base de donneacutees mysql) La syntaxe SQL est la suivante
RENAME USER utilisateur TO nouveauNom
SET Password = PASSWORD(eyrolles)
4055_05_C05 Page 154 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 155
chapitre ndeg 5 Controcircle des donneacutees
Penser agrave speacutecifier lrsquoaccegraves complet agrave renommer (usermachine) Les privilegraveges et le mot depasse ne changent pas Le tableau suivant deacutecrit trois opeacuterations de renommage drsquoutilisateurs(qui reviennent drsquoailleurs agrave lrsquoeacutetat initial)
Suppression drsquoun utilisateur (DROP USER)
Pour pouvoir supprimer un utilisateur vous devez posseacuteder le privilegravege CREATE USER (ou leprivilegravege DELETE sur la base de donneacutees mysql) La syntaxe SQL est la suivante
DROP USER utilisateur [utilisateur2 ]
Il faut speacutecifier lrsquoaccegraves agrave eacuteliminer (usermachine) Tous les privilegraveges relatifs agrave cet accegravessont deacutetruits Si lrsquoutilisateur est connecteacute dans le mecircme temps sa suppression ne sera effectiveqursquoagrave la fin de sa (derniegravere) session
Aucune donneacutee drsquoaucune table que lrsquoutilisateur aura mis agrave jour durant toutes ses connexionsne sera supprimeacutee Il nrsquoy a pas de notion drsquoappartenance drsquoobjets (tables index proceacutedureetc) agrave un utilisateur Tout ceci est relatif agrave la base de donneacutees (database)
Pour supprimer le compte soutou en local la commande agrave lancer est
DROP USER
Gestion des bases de donneacutees
Abordeacutee briegravevement agrave lrsquointroduction une base de donneacutees (database) regroupe essentielle-ment des tables sur lesquelles lrsquoadministrateur affectera des autorisations agrave des utilisateursCette notion de database srsquoapparente plutocirct agrave celle de scheacutema (connu des utilisateursdrsquoOracle) Drsquoailleurs dans lrsquoinstruction de creacuteation les deux mots peuvent ecirctre utiliseacutes
Tableau 5-2 Renommer un utilisateur
Instruction SQL Commentaire
RENAME USER localhost TO localhost
Lrsquoaccegraves soutou en local est renommeacute christiansoutou en local
RENAME USER christiansoutoulocalhost TO christiansoutou
Lrsquoaccegraves christiansoutou en local est renommeacute christiansoutou en accegraves distant
RENAME USER TO
Lrsquoaccegraves est renommeacute complegravetement
soutouchristiansoutou
1945322712
christiansoutou1945322712soutoulocalhost
soutoulocalhost
4055_05_C05 Page 155 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
156 copy Eacuteditions Eyrolles
Creacuteation drsquoune base (CREATE DATABASE)
Pour pouvoir creacuteer une base de donneacutees vous devez posseacuteder le privilegravege CREATE sur lanouvelle base (ou au niveau global pour creacuteer toute table)CREATE DATABASE | SCHEMA [IF NOT EXISTS] nomBase
[ [DEFAULT] CHARACTER SET nomJeu ]
[ [DEFAULT] COLLATE nomCollation ]
IF NOT EXISTS eacutevite une erreur dans le cas ougrave la base de donneacutees existe deacutejagrave (auquelcas elle ne sera pas remplaceacutee)
nomBase deacutesigne le nom de la base (64 caractegraveres maximum caractegraveres compris par lesystegraveme de gestion de fichier du systegraveme drsquoexploitation notamment respectant les regraveglesde nommage des reacutepertoires) Les caractegraveres laquo raquo laquo raquo ou laquo raquo sont proscrits
CHARACTER SET indique le jeu de caractegraveres associeacute aux donneacutees qui reacutesideront dans lestables de la base
COLLATE deacutefinit la collation1 du jeu de caractegraveres en question La collation dans le jargoninformatique permet de deacutefinir la position des caractegraveres dans le jeu Par exemple il serapossible de diffeacuterencier laquo agrave raquo de laquo a raquo ou pas (sensibiliteacute diacritique) Le but eacutetant desrsquoadapter aux diffeacuterentes regravegles et langues de notre petite planegravete
Une fois creacuteeacutee vous constaterez lrsquoexistence drsquoun reacutepertoire portant le nom de votre nouvellebase (par deacutefaut sous CProgram FilesMySQLMySQL Server 5ndatanouvel-leBase dans le cas de Windows) Ce reacutepertoire contiendra les donneacutees des tables qui serontconstitueacutees dans la nouvelle base Si vous concevez manuellement un reacutepertoire (mkdir rep1par exemple) dans le reacutepertoire de data de MySQL rep1 sera consideacutereacute comme une base dedonneacutees avec le jeu de caractegraveres par deacutefaut (visible avec laquo SHOW DATABASES raquo)
Nrsquoeffacez pas le fichier dbopt qui stocke les caracteacuteristiques de la base Vous pouvezlrsquoouvrir avec un eacutediteur de texte pour connaicirctre le jeu de caractegraveres par deacutefaut que MySQLaffectera agrave vos bases en lrsquoabsence de clause CHARACTER SET Souhaitons que ce ne soit pasgb2312 associeacute par deacutefaut agrave la collation gb2312_chinese_ci qui vous ferait dire que jevous parle chinois Crsquoest pourtant quelquefois ce que je ressens quand mes eacutetudiants meregardent avec des yeux de poisson en utilisant le langage des carpeshellip
Le tableau suivant deacutecrit la creacuteation de deux bases de donneacutees
1 Action de comparer entre eux des textes des documents Petit Larousse
Tableau 5-3 Creacuteation de bases
Instruction SQL Reacutesultat
CREATE DATABASE bdnouvelle DEFAULT CHARACTER SET ascii COLLATE ascii_general_ci
La base bdnouvelle est creacuteeacutee le jeu de caractegraveres par deacutefaut est ASCII
CREATE DATABASE bdnouvelle2 DEFAULT CHARACTER SET gb2312
La base bdnouvelle2 est creacuteeacutee pour les Chinois
4055_05_C05 Page 156 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 157
chapitre ndeg 5 Controcircle des donneacutees
Le jeu de caractegraveres par deacutefaut est deacutefini dans myini agrave lrsquoaide de la variable default-character-set Il est donc possible de creacuteer des bases de donneacutees associeacutees agrave diffeacuterentsjeux de caractegraveres au sein drsquoun mecircme serveur Le jeu de caractegraveres drsquoune base deacutefinit celui destables qui seront constitueacutees dedans agrave moins que la table ne soit combineacutee agrave un autre jeu (creacuteeacuteavec la directive [DEFAULT] CHARACTER SET jeu [COLLATE nomCollation])
Notons enfin qursquoil est mecircme possible drsquoaffecter un jeu de caractegraveres agrave une colonne drsquounetable Lrsquoexemple suivant construit la table testChap5 dans la base bdnouvelle2 (pardeacutefaut chinoise) en speacutecifiant que la colonne col1 sera associeacutee au jeu cp850 DOS WestEuropean tandis que le reste de la table (pour lrsquoinstant de porteacutee col2) sera appliqueacute au jeulatin1 cp1252 West European Inseacuterons une ligne
CREATE TABLE bdnouvelle2testChap5
( col2 CHAR(4))
CHARACTER SET latin1
INSERT INTO bdnouvelle2testChap5 VALUES (GTRIUT)
Seacutelection drsquoune base de donneacutees (USE)
Ceux qui ont travailleacute sous Dbase se souviennent de lrsquoinstruction USE qui deacutesignait la tablecourante dans un programme Pour MySQL USE seacutelectionne une base de donneacutees qui devientactive dans une session
USE nomBase
Si vous deacutesirez travailler simultaneacutement dans diffeacuterentes bases de donneacutees faites toujourspreacutefixer le nom des tables par celui de la base par la notation pointeacutee (nomBasenomTable)
Lrsquoexemple suivant exeacutecute une jointure sur deux tables situeacutees dans deux bases distinctes
col CHAR(5) CHARACTER SET cp850
Tableau 5-4 Seacutelection de bases
Instruction SQL Reacutesultat
CREATE TABLE bdnouvelletestUSE (col3 CHAR(5) col4 CHAR(4)) CHARACTER SET latin1INSERT INTO bdnouvelletestUSE VALUES (ACTMPIUT)
Creacuteation drsquoune table dans la base
Insertion drsquoune ligne
USE bdnouvelle2 Seacutelection de la base bdnouvelle2
SELECT col col3 FROM testChap5 WHERE col2 = col4+------+-------+| col | col3 |+------+-------+| GTR | ACTMP |+------+-------+
Jointure de la table testChap5 situeacutee dans la base active (bdnouvelle2) avec testUSE situeacutee dans la base bdnouvelle
bdnouvelletestUSEbdnouvelletestUSEbdnouvelletestUSE
4055_05_C05 Page 157 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
158 copy Eacuteditions Eyrolles
Modification drsquoune base (ALTER DATABASE)
ALTER DATABASE vous permet de modifier le jeu de caractegraveres par deacutefaut drsquoune base dedonneacutees Pour pouvoir changer ainsi une base vous devez avoir le privilegravege ALTER sur la basede donneacutees en question
ALTER DATABASE nomBase
[ [DEFAULT] CHARACTER SET nomJeu ]
[ [DEFAULT] COLLATE nomCollation ]
Lrsquoinstruction suivante modifie la base laquo chinoise raquo en lui affectant le jeu de caractegraveres de typeDOS
ALTER DATABASE bdnouvelle2
Suppression drsquoune base (DROP DATABASE)
Pour pouvoir supprimer une base de donneacutees vous devez posseacuteder le privilegravege DROP sur labase (ou au niveau global pour effacer toute base) Cette commande deacutetruit tous les objets(tables index etc) et le reacutepertoire contenus dans la base
DROP DATABASE | SCHEMA [IF EXISTS] nomBase
IF EXISTS eacutevite une erreur dans le cas ougrave la base de donneacutees nrsquoexisterait pas
Cette instruction retourne le nombre de tables qui on eacuteteacute supprimeacutees (fichiers agrave lrsquoextensionlaquo frm raquo)
Disons agrave preacutesent adios agrave la base laquo chinoise raquo
DROP DATABASE bdnouvelle2
Privilegraveges
Depuis le deacutebut du livre nous avons parleacute de privilegraveges Il est temps agrave preacutesent de preacuteciser ceque recouvre ce terme Un privilegravege (sous-entendu utilisateur) est un droit drsquoexeacutecuter unecertaine instruction SQL (on parle de privilegravege systegraveme) ou un droit relatif aux donneacutees destables situeacutees dans diffeacuterentes bases (on parle de privilegravege objet) La connexion par exemplesera consideacutereacutee comme un privilegravege systegraveme bien que nrsquoeacutetant pas une commande SQL
Les privilegraveges systegraveme diffegraverent sensiblement drsquoun SGBD agrave un autre Chez Oracle il y en aplus drsquoune centaine MySQL est plus modeste en nrsquoen proposant qursquoune vingtaine En revan-che on retrouvera les mecircmes privilegraveges objet (exemple autorisation de modifier la colonnenomComp de la table Compagnie) qui sont attribueacutes ou retireacutes par les instructions GRANT etREVOKE
DEFAULT CHARACTER SET cp850
4055_05_C05 Page 158 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 159
chapitre ndeg 5 Controcircle des donneacutees
Niveaux de privilegraveges
La figure suivante illustre les diffeacuterents niveaux de privilegraveges que lrsquoon peut rencontrer
Global level privilegraveges srsquoappliquant agrave toutes les bases du serveur Ces privilegraveges sontstockeacutes dans la table mysqluser (exemple drsquoattribution drsquoun privilegravege global GRANTCREATE hellip)
Database level privilegraveges srsquoappliquant agrave tous les objets drsquoune base de donneacutees en particu-lier Ces privilegraveges sont stockeacutes dans les tables mysqldb et mysqlhost (exempledrsquoattribution drsquoun privilegravege database GRANT SELECT hellip)
Table level privilegraveges srsquoappliquant agrave la globaliteacute drsquoune table drsquoune base de donneacutees enparticulier Ces privilegraveges sont stockeacutes dans la table mysqltables_priv (exempledrsquoattribution drsquoun privilegravege table GRANT INSERT hellip)
Column level privilegraveges srsquoappliquant agrave une des colonnes drsquoune table drsquoune base dedonneacutees en particulier Ces privilegraveges sont stockeacutes dans la table mysqlcolumns_priv(exemple drsquoattribution drsquoun privilegravege column GRANT UPDATE( )ON
hellip)
Routine level privilegraveges globaux ou au niveau drsquoune base (CREATE ROUTINE ALTERROUTINE EXECUTE et GRANT) srsquoappliquant aux proceacutedures catalogueacutees (eacutetudieacutees auchapitre 7) Ces privilegraveges sont stockeacutes dans la table mysqlprocs_priv de la basemysql (exemple drsquoattribution drsquoun privilegravege routine GRANT EXECUTE ON
hellip)
Tables de la base mysqlCinq tables de la base de donneacutees mysql suffisent agrave MySQL pour stocker les privilegraveges(systegraveme et objet) de tous les utilisateurs La figure suivante illustre comment MySQL deacuteduittoutes ces preacuterogatives toujours en fonction des accegraves (couple utilisateur machine)
Figure 5-2 Niveaux de privilegraveges
Jules Paul
mysql test
information_schema
bdjules bdpaul
Routine level
Global level
Database level
Table level
Column level
ON
ON bdpaul
ON bdpaulAvion
nomCompbdpaulCompagnie
PROCEDUREbdpaulsp1
4055_05_C05 Page 159 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
160 copy Eacuteditions Eyrolles
La colonne Db est en plus dans les tables host tables_priv et columns_priv car elle estneacutecessaire pour deacutesigner la base de donneacutees sur laquelle portera le droit ou la famille de droits
Supposons pour nos exemples que lrsquoutilisateur Paul (accegraves en local) et la base de donneacuteesbdpaul soient creacuteeacutes
CREATE DATABASE bdpaul
CREATE USER Paullocalhost IDENTIFIED BY iut
Table mysqluserPreacutesenteacute briegravevement au deacutebut du chapitre Cette table est composeacutee de 37 colonnes qui deacutecriventles privilegraveges au niveau global du serveur Nous deacutetaillons ici la signification des principales
Privilegraveges objet (LMD) sur toutes les bases de donneacutees
La requecircte suivante extrait les preacuterogatives de Paul (et des autres) Pour lrsquoinstant le caractegravereN eacutetant dans toutes les colonnes il ne peut ni interroger une table (Select_priv) ni inseacute-rer dans une table (Insert_priv) ni en modifier (Update_priv) ni en supprimer(Delete_priv) et ce quelle que soit la base de donneacutees (excepteacute les bases systegraveme test etinformation_schema) sur laquelle il voudra se connecterSELECT Host User FROM mysqluser+-----------+------+-------------+-------------+-------------+-------------+| Host | User | Select_priv | Insert_priv | Update_priv | Delete_priv |+-----------+------+-------------+-------------+-------------+-------------+| localhost | root | Y | Y | Y | Y || localhost | | Y | Y | Y | Y || | | N | N | N | N || |+-----------+------+-------------+-------------+-------------+-------------+
Figure 5-3 Stockage des preacuterogatives
Table user db host tables_priv columns_priv procs_priv+----------- +------+------------- +-------- +-------- +------------- +------
| Host | User | hellip | droit1 | droit2 | familledroit1 | hellip
+----------- +------+----------- --+-------- +-------- +---------- -----+----
| localhost | root | | Y | Y | Y | hellip
| hellip | | | | | |
| hellip | | | | | |
| localhost | Paul | | N | Y | N | hellip
+----------- +------+------------- +-------- +-------- +------------ ---+----
Paul possegravede le privilegravege droit2sur une base table objet Paul
root possegravede tous les privilegraveges sur une base table objet
root
Select_priv Insert_priv Update_priv Delete_priv
localhost | Paul | N | N | N | N
4055_05_C05 Page 160 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 161
chapitre ndeg 5 Controcircle des donneacutees
Vous pouvez par analogie pour cet exemple et pour les suivants deacutecouvrir les preacuterogativesdes autres accegraves (ici root et anonyme)
Privilegraveges objet (LDD) sur toutes les bases de donneacutees
La requecircte suivante extrait les preacuterogatives agrave propos des instructions LDD Pour lrsquoinstant lecaractegravere N eacutetant dans toutes les colonnes Paul ne peut ni creacuteer une table ou une base(Create_priv) ni en supprimer (Drop_priv) ni creacuteer ou supprimer un index (Index_priv) ni modifier la structure drsquoune table la renommer ou modifier une base (Alter_priv) et ce quelle que soit la base de donneacutees (excepteacute les bases systegraveme test etinformation_schema)
SELECT Host User FROM mysqluser+-----------+------+-------------+-----------+------------+------------+| Host | User | Create_priv | Drop_priv | Index_priv | Alter_priv |+-----------+------+-------------+-----------+------------+------------+| localhost | root | Y | Y | Y | Y || localhost | | Y | Y | Y | Y || | | N | N | N | N || |+-----------+------+-------------+-----------+------------+------------+
Privilegraveges systegraveme (LCD) sur toutes les bases de donneacutees
La requecircte suivante extrait les preacuterogatives agrave propos des instructions LCD Pour lrsquoinstant lecaractegravere N eacutetant dans toutes les colonnes Paul ne peut ni creacuteer un utilisateur (Create_user_priv) ni transmettre des droits qursquoil aura lui-mecircme reccedilus (Grant_priv) ni lister lesbases de donneacutees existantes (Show_db_priv) et ce quelle que soit la base de donneacutees
SELECT HostUser FROM mysqluser+-----------+------+------------------+------------+--------------+| Host | User | Create_user_priv | Grant_priv | Show_db_priv |+-----------+------+------------------+------------+--------------+| localhost | root | Y | Y | Y || localhost | | N | Y | Y || | | N | N | N || |+-----------+------+------------------+------------+--------------+
Privilegraveges agrave propos des vues sur toutes les bases de donneacutees
La requecircte suivante extrait les preacuterogatives agrave propos des instructions relatives aux vues (viewsdeacutetailleacutees dans la section suivante) Pour lrsquoinstant le caractegravere N eacutetant dans toutes lescolonnes Paul ne peut ni creacuteer une vue (Create_view_priv) ni lister les vues existantes(Show_view_priv) et ce quelle que soit la base de donneacutees
Create_priv Drop_privIndex_priv Alter_priv
localhost | Paul | N | N | N | N
Create_user_priv Grant_priv Show_db_priv
localhost | Paul | N | N | N
4055_05_C05 Page 161 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
162 copy Eacuteditions Eyrolles
SELECT HostUser FROM mysqluser
+-----------+------+------------------+----------------+
| Host | User | Create_view_priv | Show_view_priv |
+-----------+------+------------------+----------------+
| localhost | root | Y | Y |
| localhost | | N | N |
| | | N | N |
| localhost | Paul | N | N |
+-----------+------+------------------+----------------+
Privilegraveges agrave propos des proceacutedures catalogueacutees sur toutes les bases de donneacutees
La requecircte suivante extrait les preacuterogatives agrave propos des proceacutedures catalogueacutees (deacutetailleacuteesdans le chapitre 7) Pour lrsquoinstant le caractegravere N eacutetant dans toutes les colonnes Paul nepeut ni creacuteer une proceacutedure (Create_routine_priv) ni en modifier (Alter_routine_priv) ni en exeacutecuter (Execute_priv) et ce quelle que soit la base de donneacuteesSELECT HostUser FROM mysqluser+-----------+------+---------------------+--------------------+--------------+| Host | User | Create_routine_priv | Alter_routine_priv | Execute_priv |+-----------+------+---------------------+--------------------+--------------+| localhost | root | Y | Y | Y || localhost | | N | N | Y || | | N | N | N || localhost | Paul | N | N | N |+-----------+------+---------------------+--------------------+--------------+
Privilegraveges agrave propos des restrictions drsquoutilisateur
La requecircte suivante extrait les preacuterogatives agrave propos des restrictions qursquoon peut deacutefinir paraccegraves Pour lrsquoinstant le chiffre eacutetant agrave 0 dans toutes les colonnes aucun accegraves (utilisateur)nrsquoest limiteacute concernant le nombre de requecirctes (max_questions) de modifications (max_updates) de connexions par heure (max_connections) et de connexions simultaneacutees(max_user_connections) agrave un serveur
SELECT Host User Requetes Modifs
Connexions Cx simult FROM mysqluser+-----------+------+----------+--------+------------+------------+| Host | User | Requetes | Modifs | Connexions | Cx simult |+-----------+------+----------+--------+------------+------------+| localhost | root | 0 | 0 | 0 | 0 || localhost | | 0 | 0 | 0 | 0 || | | 0 | 0 | 0 | 0 || localhost | Paul | 0 | 0 | 0 | 0 |+-----------+------+----------+--------+------------+------------+
Create_view_priv Show_view_priv
Create_routine_priv Alter_routine_priv Execute_priv
max_questions max_updates
max_connections max_user_connections
4055_05_C05 Page 162 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 163
chapitre ndeg 5 Controcircle des donneacutees
Privilegraveges non abordeacutes
Drsquoautres colonnes de la table mysqluser sont inteacuteressantes mais sortent un peu du cadrede ce livre Jrsquoai donc fait lrsquoimpasse sur Create_tmp_table_priv (sert agrave creacuteer des tablestemporaires) Lock_tables_priv (pose des verrous explicites) Shutdown_priv (arrecircteet redeacutemarre le serveur) Process_priv et Super_priv (gegraverent les processus) File_priv (accegravede aux fichiers du systegraveme drsquoexploitation) Repl_slave_priv et Repl_client_priv (utiliseacutes pour des aspects de reacuteplication de donneacutees)
Nul doute que vous saurez vous servir de ces privilegraveges en temps voulu par analogie avecceux que nous allons eacutetudier
Le privilegravege References_priv nrsquoest pas opeacuterationnel encore Il permettrait de beacuteneacuteficier delrsquointeacutegriteacute reacutefeacuterentielle entre deux tables appartenant agrave deux bases distinctes (par exemple latable Avion dans bd1 ferait reacutefeacuterence par cleacute eacutetrangegravere agrave la table Compagnie dans bd2)
Avant de preacutesenter les autres tables (db host tables_priv columns_priv et procs_priv) de la base mysql eacutetudions les intructions relatives agrave lrsquoattribution drsquoun privilegravege(GRANT) qursquoil soit systegraveme ou objet et celles relatives agrave la reacutevocation drsquoun privilegravege (REVOKE)
Attribution de privilegraveges (GRANT)
La figure suivante illustre le contexte qui va servir drsquoexemple agrave lrsquoattibution de preacuterogatives
Syntaxe
Lrsquoinstruction GRANT permet drsquoattribuer un (ou plusieurs) privilegravege(s) agrave propos drsquoun objet agrave un(ou plusieurs) beacuteneacuteficiaire(s) Lrsquoutilisateur qui exeacutecute cette commande doit avoir reccedilu lui-mecircme le droit de transmettre ces privilegraveges (reccedilu avec la directive GRANT OPTION) Dans lecas de root aucun problegraveme car il a implicitement tous les droits
Figure 5-4 Attribution de privilegraveges
mysql test
information_schema
bdjules bdpaul
sp1() sp2()
PaulJules
Livre
CREATE
Restrictions de connexion SELECT(titre) INSERT - UPDATE(ISBN)
DELETE - SELECTCREATEDROP
Execute sp1() sp2() Modif sp1()
4055_05_C05 Page 163 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
164 copy Eacuteditions Eyrolles
GRANT privilegravege [ (col1 [ col2])] [privilegravege2 ]
ON [ TABLE | FUNCTION | PROCEDURE ]
nomTable | | | nomBase
TO utilisateur [IDENTIFIED BY [PASSWORD] password]
[utilisateur2 ]
[ WITH [ GRANT OPTION ]
[ MAX_QUERIES_PER_HOUR nb ]
[ MAX_UPDATES_PER_HOUR nb2 ]
[ MAX_CONNECTIONS_PER_HOUR nb3 ]
[ MAX_USER_CONNECTIONS nb4 ] ]
privilegravege description du privilegravege (ex SELECT DELETE etc) voir le tableau suivant
col preacutecise la ou les colonnes sur lesquelles se portent les privilegraveges SELECT INSERT ouUPDATE (exemple UPDATE(typeAvion) pour nrsquoautoriser que la modification de lacolonne typeAvion)
GRANT OPTION permet de donner le droit de retransmettre les privilegraveges reccedilus agrave unetierce personne
Le tableau suivant reacutesume la signification des principaux privilegraveges agrave accorder ou agrave reacutevoquer
Tableau 5-5 Privilegraveges principaux pour GRANT et REVOKE
privilege Commentaire
ALL [PRIVILEGES] Tous les privilegraveges
ALTER Modification de basetable
ALTER ROUTINE Modification de proceacutedure
CREATE Creacuteation de basetable
CREATE ROUTINE Creacuteation de proceacutedure
CREATE USER Creacuteation drsquoutilisateur
CREATE VIEW Creacuteation de vue
DELETE Suppression de donneacutees de table
DROP Suppression de basetable
EXECUTE Exeacutecution de proceacutedure
INDEX CreacuteationSuppression drsquoindex
INSERT Insertion de donneacutees de table
SELECT Extraction de donneacutees de table
SHOW DATABASES Lister les bases
SHOW VIEW Lister les vues drsquoune base
SUPER Gestion des deacuteclencheurs
UPDATE Modification de donneacutees de table
USAGE Synonyme de laquo sans privilegravege raquo USAGE est utiliseacute pour conserver les privilegraveges preacuteceacutedemment deacutefinis tout en les restreignant avec des options
4055_05_C05 Page 164 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 165
chapitre ndeg 5 Controcircle des donneacutees
Exemples
Le tableau suivant deacutecrit lrsquoaffectation de quelques privilegraveges en donnant les explications asso-cieacutees
Tout ce que vous avez le droit de faire doit ecirctre explicitement autoriseacute par la commande GRANTCe qui nrsquoest pas dit par GRANT nrsquoest pas permis Par exemple Jules peut creacuteer des bases maispas en deacutetuire Paul peut modifier le numeacutero ISBN drsquoun livre mais pas son titre etc
Voir les privilegraveges
La commande SHOW GRANTS FOR liste les diffeacuterentes instructions GRANT eacutequivalentes agrave toutesles preacuterogatives drsquoun utilisateur donneacute Crsquoest bien utile quand vous avez attribueacute un certain nombrede privilegraveges agrave un utilisateur sans avoir penseacute agrave les consigner dans un fichier de commande
SHOW GRANTS FOR utilisateur
Tableau 5-6 Affectation de privilegraveges
Instruction faite par root Explication
GRANT CREATE DROP ON TO
Privilegravege systegraveme database level
Paul (en accegraves local) peut creacuteer ousupprimer des tables dans la base bdpaul
GRANT INSERT SELECT DELETE UPDATE(ISBN) ON TO
Privilegravege objet table level
Paul peut inseacuterer extraire supprimer etmodifier la colonne ISBN de la table Livrecontenue dans la base bdpaul
GRANT ALTER ON TO
Privilegravege systegraveme table level
Paul peut modifier la structure ou lescontraintes de la table Livre contenuedans la base bdpaul
GRANT SELECT(titre) ON TO WITH GRANT OPTION
Privilegravege objet column level
Jules peut extraire seulement la colonnetitre de la table Livre contenue dans labase bdpaul Il pourra par la suiteretransmettre eacuteventuellement ce droit
GRANT CREATE ON TO
Privilegravege systegraveme global level
Jules peut creacuteer des bases de donneacutees
GRANT USAGE ON TO WITH MAX_QUERIES_PER_HOUR 50 MAX_UPDATES_PER_HOUR 20 MAX_CONNECTIONS_PER_HOUR 6 MAX_USER_CONNECTIONS 3
Privilegravege systegraveme database level
Jules ne peut lancer chaque heure que50 SELECT 20 UPDATE se connecter 6 fois(dont 3 connexions simultaneacutees) sur la basede donneacutees bdpaul
bdpaulPaullocalhost
bdpaulLivrePaullocalhost
bdpaulLivrePaullocalhost
bdpaulLivreJuleslocalhost
Juleslocalhost
bdpaulJuleslocalhost
4055_05_C05 Page 165 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
166 copy Eacuteditions Eyrolles
Utilisons cette commande pour extraire les profils de Jules de Paul et de lrsquoadministrateuren chef (accegraves en local) Jrsquoavoue avoir un peu retravailleacute lrsquoeacutetat de sortie (sans en modifier uneligne quand mecircme)
SHOW GRANTS FOR Juleslocalhost+---------------------------------------------------------------------------+| Grants for Juleslocalhost |+---------------------------------------------------------------------------+| GRANT CREATE ON TO Juleslocalhost IDENTIFIED BY PASSWORD 6AE163FB9EE8BB011EB2E87316AA5BE563A6CDB7 WITH MAX_QUERIES_PER_HOUR 50 MAX_UPDATES_PER_HOUR 20 MAX_CONNECTIONS_PER_HOUR 6 MAX_USER_CONNECTIONS 3 || GRANT SELECT (titre) ON `bdpaul``Livre` TO Juleslocalhost WITH GRANT OPTION |+---------------------------------------------------------------------------+
On remarque que MySQL a regroupeacute deux privilegraveges en une instruction GRANT (CREATE etles restrictions de connexions) Par lagrave mecircme on se rend compte que les preacuterogatives deconnexion sont au niveau global bien qursquoon les ait speacutecifieacutees au niveau database
SHOW GRANTS FOR Paullocalhost+---------------------------------------------------------------------------+| Grants for Paullocalhost |+---------------------------------------------------------------------------+| GRANT USAGE ON TO Paullocalhost IDENTIFIED BY PASSWORD 6AE163FB9EE8BB011EB2E87316AA5BE563A6CDB7 || GRANT CREATE DROP ON `bdpaul` TO Paullocalhost || GRANT SELECT INSERT UPDATE (ISBN) DELETE ALTER ON `bdpaul``Livre` TO Paullocalhost |+---------------------------------------------------------------------------+
On remarque que MySQL a regroupeacute tous les privilegraveges sur la table Livre en une instructionGRANT La premiegravere exprime le fait que Paul peut se connecter agrave toutes les bases (par USEnomBase) mais qursquoil ne pourra travailler en reacutealiteacute que dans bdpaul
SHOW GRANTS FOR rootlocalhost+---------------------------------------------------------------------------+| Grants for rootlocalhost |+---------------------------------------------------------------------------+| GRANT ALL PRIVILEGES ON TO rootlocalhost IDENTIFIED BY PASSWORD 387E25FE2CF7ED941E43A76AD9402825401698FC WITH GRANT OPTION |+---------------------------------------------------------------------------+
On remarque que MySQL nrsquoattribue qursquoun seul droit mais le plus fort Tous les droits (ALLPRIVILEGES) sur toutes les bases () avec en prime la clause GRANT OPTION quipermet de retransmettre nrsquoimporte quoi agrave nrsquoimporte qui ou de tout reacutevoquer
Interrogeons agrave nouveau la table user de la base mysql stockant les preacuterogatives au niveauglobal du moment Le droit de creacuteation en local de Jules apparaicirct sur toutes les bases
4055_05_C05 Page 166 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 167
chapitre ndeg 5 Controcircle des donneacutees
SELECT HostUser Create_privDrop_privIndex_privAlter_priv FROM mysqluser+-----------+-------+-------------+-----------+------------+------------+| Host | User | Create_priv | Drop_priv | Index_priv | Alter_priv |+-----------+-------+-------------+-----------+------------+------------+| hellip| localhost | Paul | N | N | N | N || | N | N | N |+-----------+-------+-------------+-----------+------------+------------+
Les colonnes suivantes permettent de stocker les restrictions sur les connexions
SELECT HostUser max_questions Requetes max_updates Modifs max_connections Connexions max_user_connections Cx simult FROM mysqluser+-----------+-------+----------+--------+------------+------------+| Host | User | Requetes | Modifs | Connexions | Cx simult |+-----------+-------+----------+--------+------------+------------+| hellip| localhost | Paul | 0 | 0 | 0 | 0 || |+-----------+-------+----------+--------+------------+------------+
Analysons les autres tables de la base mysql pour deacutecouvrir les preacuterogatives des autresniveaux (database table column et routine)
Table mysqldbLa table mysqldb deacutecrit les preacuterogatives au niveau database Ainsi la colonne Db indique labase de donneacutees
SELECT Host User Db Create_priv Drop_priv Alter_priv FROM mysqldb+-----------+------+---------+-------------+-----------+------------+| Host | User | Db | Create_priv | Drop_priv | Alter_priv |+-----------+------+---------+-------------+-----------+------------+| | | test_ | Y | Y | Y || | | test | Y | Y | Y || |+-----------+------+---------+-------------+-----------+------------+
Notez la possibiliteacute de Paul avec lrsquoaccegraves local de creacuteeacuter et de supprimer des tables dans labase bdpaul Notez eacutegalement la possibiliteacute de creacuteer de supprimer de modifier des tablespar un accegraves distant anonyme sur la base test
Table mysqlhostCette table est eacutetudieacutee agrave la section Accegraves distants
localhost | Jules | Y
localhost | Jules | 50 | 20 | 6 | 3
localhost | Paul | bdpaul | Y | Y | N
4055_05_C05 Page 167 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
168 copy Eacuteditions Eyrolles
Table mysqltables_privLa table mysqltables_priv deacutecrit les preacuterogatives objet au niveau table Ainsi lacolonne Table_name indique la table concerneacutee la colonne Grantor preacutecise lrsquoutilisateurayant donneacute le droit La colonne Table_priv est un SET contenant la liste des droits delrsquoutilisateur sur la table
SELECT CONCAT(UserHost) Compte CONCAT(DbTable_name) Objet Grantor Table_priv FROM mysqltables_priv+-----------------+--------------+----------------+---------------------------+| Compte | Objet | Grantor | Table_priv |+-----------------+--------------+----------------+---------------------------+| Juleslocalhost | bdpaulLivre | rootlocalhost | Grant || Paullocalhost | bdpaulLivre | rootlocalhost | SelectInsertDeleteAlter|+-----------------+--------------+----------------+---------------------------+
On retrouve les quatre privilegraveges de Paul et celui de Jules (GRANT OPTION de SELECTsur la table)
Cette table possegravede aussi une colonne de nom Timestamp stockant lrsquoinstant au cours duquelsrsquoest deacuterouleacutee lrsquoattribution (ou la reacutevocation)
Table mysqlcolumns_privLa table mysqlcolumns_priv deacutecrit les preacuterogatives objet au niveau column Ainsi lacolonne Table_name indique la table concerneacutee la colonne Column_name preacutecise lacolonne concerneacutee par le droit La colonne Column_priv est un SET contenant la liste desdroits de lrsquoutilisateur sur la colonne de la table
SELECT CONCAT(UserHost) Compte CONCAT(DbTable_name) Objet Column_name Column_priv FROM mysqlcolumns_priv+-----------------+--------------+-------------+-------------+| Compte | Objet | Column_name | Column_priv |+-----------------+--------------+-------------+-------------+| Juleslocalhost | bdpaulLivre | titre | Select || Paullocalhost | bdpaulLivre | ISBN | Update |+-----------------+--------------+-------------+-------------+
On retrouve le privilegravege de Paul et celui de Jules (portant ici sur la mecircme table)
Table mysqlprocs_privLa table mysqlprocs_priv deacutecrit les preacuterogatives des proceacutedures et des fonctionscatalogueacutees au niveau routine
4055_05_C05 Page 168 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 169
chapitre ndeg 5 Controcircle des donneacutees
Les privilegraveges CREATE ROUTINE ALTER ROUTINE EXECUTE et GRANT srsquoappliquent surles sous-programmes catalogueacutes et peuvent ecirctre attribueacutes au niveau global et database ALTERROUTINE EXECUTE et GRANT peuvent ecirctre assigneacutes aussi au niveau routine
En supposant que la base bdpaul contient la proceacutedure catalogueacutee sp1() et la fonctionsp2() toutes deux eacutecrites par root le tableau suivant exprime lrsquoaffectation de quelquesprivilegraveges en donnant les explications associeacutees
La colonne Routine_name de la table mysqlprocs_priv deacutesigne le nom du sous-programme catalogueacute La colonne Routine_type preacutecise le type du sous-programme cata-logueacute (fonction ou proceacutedure) La colonne Grantor indique lrsquoutilisateur ayant compileacute lesous-programme La colonne Proc_priv est un SET contenant la liste des droits de lrsquoutilisa-teur sur le sous-programme de la base
Extrayons les privilegraveges relatifs aux sous-programmes au niveau database
SELECT CONCAT(UserHost) Compte Db Create_routine_priv create routine Alter_routine_priv alter routine Execute_priv exec routine FROM mysqldb+----------------+---------+----------------+---------------+---------------+| Compte | Db | create routine | alter routine | exec routine |+----------------+---------+----------------+---------------+---------------+| | test_ | N | N | N || | test | N | N | N || | N | N |+----------------+---------+----------------+---------------+---------------+
On retrouve le privilegravege de Paul Extrayons enfin les privilegraveges relatifs aux sous-programmesau niveau routine
Tableau 5-7 Affectation de privilegraveges
Instruction faite par root Explication
GRANT CREATE ROUTINE ON TO Paullocalhost
Privilegravege systegraveme database level
Paul (en accegraves local) peut creacuteer ou supprimerdes sous-programmes catalogueacutes dans la basebdpaul
GRANT ALTER ROUTINE ON TO Paullocalhost
Privilegravege systegraveme routine level
Paul peut modifier la proceacutedure sp1 contenuedans la base bdpaul
GRANT EXECUTE ON TO Juleslocalhost
GRANT EXECUTE ON TO Juleslocalhost
Privilegraveges systegraveme routine level
Jules peut exeacutecuter la proceacutedure sp1 et lafonction sp2 contenues dans la base bdpaul
bdpaul
PROCEDURE bdpaulsp1
PROCEDURE bdpaulsp1
FUNCTION bdpaulsp2
Paullocalhost | bdpaul | Y
4055_05_C05 Page 169 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
170 copy Eacuteditions Eyrolles
SELECT CONCAT(UserHost) Compte CONCAT(Routine_nameRoutine_type) Objet Grantor Proc_priv FROM mysqlprocs_priv+-----------------+----------------------+----------------+---------------+| Compte | Objet | Grantor | Proc_priv |+-----------------+----------------------+----------------+---------------+| Juleslocalhost | bdpaulsp1PROCEDURE | rootlocalhost | Execute || Juleslocalhost | bdpaulsp2FUNCTION | rootlocalhost | Execute || Paullocalhost | bdpaulsp1PROCEDURE | rootlocalhost | Alter Routine |+-----------------+----------------------+----------------+---------------+
On retrouve le privilegravege en modification de sp1 pour Paul et les deux privilegraveges drsquoexeacutecutionde Jules
Reacutevocation de privilegraveges (REVOKE)
La reacutevocation drsquoun ou de plusieurs privilegraveges est reacutealiseacutee par lrsquoinstruction REVOKE Pourpouvoir reacutevoquer un privilegravege vous devez deacutetenir (avoir reccedilu) au preacutealable ce mecircme privilegravegeavec lrsquooption WITH GRANT OPTION
Syntaxe
Dans la syntaxe suivante les options sont les mecircmes que pour la commande GRANT
REVOKE privilegravege [ (col1 [ col2])] [privilegravege2 ]
ON [ TABLE | FUNCTION | PROCEDURE ]
nomTable | | | nomBase
FROM utilisateur [utilisateur2 ]
Exemples
Le tableau suivant deacutecrit la reacutevocation de certains privilegraveges acquis des utilisateurs Paul et Jules
Tableau 5-8 Reacutevocation de privilegraveges
Instruction faite par root Explication
REVOKE CREATE ON FROM
Privilegravege systegraveme database level
Paul (en accegraves local) ne peut plus creacuteer de tables dansla base bdpaul
REVOKE ALTERINSERTUPDATE(ISBN) ON FROM
Privilegravege objet table level
Paul ne peut plus modifier la structure (ou lescontraintes) inseacuterer et modifier la colonne ISBN de latable Livre contenue dans la base bdpaul
GRANT USAGE ON bdpaul TO WITH MAX_QUERIES_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0
Privilegravege systegraveme database level
Jules nrsquoest plus limiteacute en requecirctes SELECT et UPDATEsur la base de donneacutees bdpaul Ici crsquoest un GRANT qursquoilfaut faire car il srsquoagit plus drsquoune restriction de connexionque drsquoune instruction SQL
bdpaulPaullocalhost
bdpaulLivrePaullocalhost
Juleslocalhost
4055_05_C05 Page 170 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 171
chapitre ndeg 5 Controcircle des donneacutees
Veacuterifications
Une fois ces actualisations reacutealiseacutees les cinq tables de la base mysql contiennent un peu plusle caractegravere N qursquoauparavant Les colonnes SET des tables mysqltables_privmysqlcolumns_priv et mysqlprocs_priv sont eacutegalement mises agrave jour Ainsilrsquoextraction du profil actuel de Paul au niveau table fait apparaicirctre les deux seuls droits qursquoillui reste
SELECT CONCAT(UserHost) CompteCONCAT(DbTable_name)
Objet
Grantor Table_priv FROM mysqltables_priv
WHERE User=Paul AND Host=localhost
+----------------+--------------+----------------+---------------+
| Compte | Objet | Grantor | Table_priv |
+----------------+--------------+----------------+---------------+
| Paullocalhost | bdpaulLivre | rootlocalhost | SelectDelete |
+----------------+--------------+----------------+---------------+
Lrsquoextraction du profil actuel de Jules au niveau database fait apparaicirctre que les deux limita-tions de connexion sur les SELECT et UPDATE ont disparu
SELECT HostUser max_questions Requetes max_updates Modifs max_connections Connexions max_user_connections Cx simult FROM mysqluser WHERE User=Jules AND Host=localhost+-----------+-------+----------+--------+------------+------------+| Host | User | Requetes | Modifs | Connexions | Cx simult |+-----------+-------+----------+--------+------------+------------+| localhost | Jules | | 6 | 3 |+-----------+-------+----------+--------+------------+------------+
Tout en une fois
Il existe une instruction qui reacutevoque tous les droits en une fois Vous en avez assez drsquoun utili-sateur qui ne cesse de vous casser les pieds utilisez REVOKE ALL PRIVILEGES Pensezquand mecircme agrave sauvegarder au preacutealable le profil de Jules (SHOW GRANT FOR) pourpouvoir le faire travailler de nouveau quand vous serez calmeacute
Selon la documentation officielle la syntaxe suivante permet de supprimer toutes les preacuteroga-tives aux niveaux global database table et column Et les privilegraveges routine me direz-vous Ils ont ducirc lrsquooublier dans la documentation mais ils sont aussi effaceacutes ne vous inquieacutetez pas jelrsquoai testeacute
REVOKE ALL PRIVILEGES GRANT OPTION FROM utilisateur [ utilisateur2 ]
Pour pouvoir annihiler ainsi un utilisateur il faut deacutetenir le privilegravege CREATE USER au niveauglobal ou le privilegravege UPDATE au niveau database sur la base mysql
0 | 0
4055_05_C05 Page 171 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
172 copy Eacuteditions Eyrolles
Ne confondez pas suppression de tous les droits drsquoun accegraves et suppression de lrsquoutilisateur Paranalogie les politiciens qui se voient retirer le droit de vote ne sont pas encore guillotineacutes (queje sache) Eacutenervons-nous contre Jules
REVOKE ALL PRIVILEGES GRANT OPTION FROM Juleslocalhost
Attributions et reacutevocations laquo sauvages raquo
Le caractegravere open de MySQL fait des fois bien les choses mais dans ce cas preacutecis je netrouve pas Ici mon billet drsquohumeur conteste la possibiliteacute qui est donneacutee de modifier lescinq tables de la base mysql pour affecter tantocirct un N par-ci tantocirct un Y par-lagrave ou encorepour mettre agrave jour un SET contenant SELECT par exemple etc Bref un UPDATE rateacute unINSERT dans la mauvaise colonne un DELETE sans WHERE et vous mettez une panique noire(comme la couleur par deacutefaut de lrsquointerface de commande) dans vos bases Vous pouvez vous-mecircme empecirccher toute connexion (mecircme celle du root)
Sous Oracle les commandes GRANT et REVOKE mettent agrave jour des tables systegraveme que vouspouvez interroger mais que vous ne pouvez pas modifier Crsquoest heureux
En conclusion je ne deacutecrirai aucune de ces manipulations drsquoabord parce que je nrsquoai pas enviede me tromper en faisant des tests et bouleverser ainsi inutilement ma configuration Ensuiteparce si vous voulez laquo bidouiller raquo allez consulter des sites Web ou drsquoautres ouvrages quirecopient la documentation sans quelquefois changer ni tester les exemples vous mrsquoen direzdes nouvelles
Vous voulez donner des droits utilisez GRANT les reprendre utilisez REVOKE car
bull Ils sont programmeacutes preacuteciseacutement pour ccedila
bull Les deux instructions sont dans la norme SQL
Ne pas les employer crsquoest comme acheter une quatre cylindres chez BMW (le motoriste estspeacutecialiste des six en ligne) et verser en cachette du colza dans le reacuteservoir chez lrsquoagriculteurdu coin en croyant eacuteconomiser
La seule utilisation acceptable parce qursquoon nrsquoa pas le choix de faire autrement concerne lamise agrave jour de la table mysqlhost (deacutecrite dans la section suivante) Agrave configuration avan-ceacutee programmeur averti
Accegraves distants
La figure suivante illustre la configuration de mon test Un client est en 1921684173 surlequel sont installeacutees les couches MySQL (Complete Package ou Essentials Package) Unserveur est en 1921684118 eacutequipeacute de MySQL Complete Package Sur le serveur root creacutee
4055_05_C05 Page 172 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 173
chapitre ndeg 5 Controcircle des donneacutees
un accegraves agrave Paul en preacutecisant lrsquoadresse de la machine client et lui attribue un droit drsquoextrac-tion de la table Livre sur la base bdPaul
CREATE USER Paul1921684173 IDENTIFIED BY pauldistant
GRANT SELECT ON bdpaulLivre TO Paul1921684173
Connexion par lrsquointerface de commande
Sur le client Paul se connecte au serveur dans une fenecirctre de commande en preacutecisantlrsquoadresse de la machine serveur puis donne son mot de passe distant Pensez agrave enlever lespare-feu Windows sur le client et le serveur (bloquant le port 3306)
mysql -h 1921684118 -u Paul -p
Paul peut agrave preacutesent seulement interroger la table distante comme le montre la copie drsquoeacutecransuivante
Table mysqlhostLa table mysqlhost est utiliseacutee conjointement avec mysqldb et concerne les accegravesdistants (plusieurs machines) Cette table nrsquoest employeacutee que pour les preacuterogatives au niveau
Figure 5-5 Accegraves distant par lrsquointerface de commande MySQL
Paullocalhost
1921684118
1921684173root
Paul1921684173
TCP-IP
bdpaul
mysql
mysql
rootlocalhostPaul
Livre
Figure 5-6 Interrogation distante par lrsquointerface de commande MySQL
4055_05_C05 Page 173 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
174 copy Eacuteditions Eyrolles
database indeacutependamment des utilisateurs La structure est la mecircme que celle de mysqldbagrave lrsquoexception de la colonne User qui nrsquoest pas preacutesente Le couple de colonnes (Host Db)est unique
MySQL lit et trie les tables db (sur les colonnes Host Db et User) et host (sur les colonnesHost et Db) en mecircme temps qursquoil parcourt la table user Pour les opeacuterations relatives auxbases (INSERT UPDATE etc) MySQL interroge la table user Si lrsquoaccegraves nrsquoy est pas deacutecritla recherche se poursuit dans les tables db et host Si la colonne Host de la table db estrenseigneacutee en fonction de lrsquoaccegraves lrsquoutilisateur reccediloit ses privilegraveges
Si la colonne Host de la table db nrsquoest pas renseigneacutee ( ) cela signifie que la table hosteacutenumegravere les machines qui sont autoriseacutees agrave acceacuteder agrave une base de donneacutees en particulier Si lamachine ne correspond pas lrsquoaccegraves nrsquoest pas permis Dans le cas contraire les privilegraveges sontvalueacutes agrave Y agrave partir drsquoune intersection (et pas drsquoune union) entre les tables db et host sur lecouple (Host Db)
La table mysqlhost nrsquoest mise agrave jour ni par GRANT ni par REVOKE Il faudra directement inseacute-rer (par INSERT) modifier (par UPDATE) ou supprimer (par DELETE) les lignes de cette tableElle nrsquoest pas utiliseacutee par la plupart des serveur MySQL car elle est deacutedieacutee agrave des usages tregravesspeacutecifiques (pour geacuterer un ensemble de machines agrave accegraves seacutecuriseacute par exemple) Elle peutaussi ecirctre utiliseacutee pour deacutefinir un ensemble de machines agrave accegraves non seacutecuriseacute
En supposant que vous deacuteclariez une machine agrave accegraves non seacutecuriseacute camparolsgtrfr Ilest possible drsquoautoriser lrsquoaccegraves seacutecuriseacute agrave toutes les autres machines du reacuteseau local Ceci enajoutant des enregistrements par INSERT dans la table mysqlhost comme suit
+------------------+----+----------------------------
| Host | Db |
+------------------+----+-----------------------------
| camparolsgtrfr | | (tous les privilegraveges agrave N)
| gtrfr | | (tous les privilegraveges agrave Y)
+------------------+----+-----------------------------
Vous deacuteclareriez lrsquoinverse des conditions initiales en remplaccedilant les N par des Y et reacutecipro-quement Dans tous les cas il sera neacutecessaire de mettre agrave jour les autres tables pour affiner lesprivilegraveges
Tableau 5-9 Tables pour les accegraves distants
Caractegravere Signification pour mysqldb Signification pour mysqlhost
colonne Host colonne Db colonne Host colonne Db
toute machine toute base toute machine toute base
(chaicircne vide)
consultez la table mysqlhost
toute base toute machine toute base
4055_05_C05 Page 174 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 175
chapitre ndeg 5 Controcircle des donneacutees
Vues
Outre le controcircle de lrsquoaccegraves aux donneacutees (privilegraveges) la confidentialiteacute des informations est unaspect important qursquoun SGBD relationnel doit prendre en compte Depuis la version 5 de MySQLla confidentialiteacute est renforceacutee par lrsquoutilisation de vues (views) qui agissent comme des fenecirctres surla base de donneacutees Cette section deacutecrit les diffeacuterents types de vues qursquoon peut rencontrer
Les vues correspondent agrave ce qursquoon appelle laquo le niveau externe raquo qui reflegravete la partie visible dela base de donneacutees pour chaque utilisateur
Seules les tables contiennent des donneacutees et pourtant pour lrsquoutilisateur une vue apparaicirctcomme une table En theacuteorie les utilisateurs ne devraient acceacuteder aux informations qursquoenquestionnant des vues Ces derniegraveres masquant la structure des tables interrogeacutees En pratiquela plupart des applications se passent de ce concept en manipulant directement les tables
La figure suivante illustre ce qui a eacuteteacute dit en preacutesentant trois utilisateurs Ils travaillent chacunsur une base de donneacutees contenant des vues formeacutees agrave partir de diffeacuterentes tables
Une vue est consideacutereacutee comme une table virtuelle car elle nrsquoa pas drsquoexistence propre Seule sastructure est stockeacutee dans le dictionnaire Ses donneacutees seront extraites de la meacutemoire agrave partirdes tables source agrave la demande
Une vue est creacuteeacutee agrave lrsquoaide drsquoune instruction SELECT appeleacutee laquo requecircte de deacutefinition raquo Cetterequecircte interroge une (ou plusieurs) table(s) ou vue(s) Une vue se recharge chaque foisqursquoelle est interrogeacutee
Outre le fait drsquoassurer la confidentialiteacute des informations une vue est capable de reacutealiser descontrocircles de contraintes drsquointeacutegriteacute et de simplifier la formulation de requecirctes complexes
Figure 5-7 Les vues
Niveau externe
Table1 Table2
Vue1 Vue2
Vue3
Vue1Vue2
Vue3
Niveau physique
scheacutema1 scheacutema2
Jules
Louise
Paul
4055_05_C05 Page 175 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
176 copy Eacuteditions Eyrolles
Dans certains cas la deacutefinition drsquoune vue temporaire est neacutecessaire pour eacutecrire une requecircteqursquoil ne serait pas possible de construire agrave partir des tables seules Attribueacutees comme des privi-legraveges (GRANT) les vues ameacuteliorent la seacutecuriteacute des informations stockeacutees
Creacuteation drsquoune vue (CREATE VIEW)
Pour pouvoir creacuteer une vue dans une base vous devez posseacuteder le privilegravege CREATE VIEW etles privilegraveges en SELECT des tables preacutesentes dans la requecircte de deacutefinition de la vue Lasyntaxe SQL de creacuteation drsquoune vue est la suivante
CREATE [OR REPLACE] [ALGORITHM = UNDEFINED | MERGE | TEMPTABLE]
VIEW [nomBase]nomVue [(listecolonnes)]
AS requecircteSELECT
[WITH [CASCADED | LOCAL] CHECK OPTION]
OR REPLACE remplace la vue par la nouvelle deacutefinition mecircme si elle existait deacutejagrave (eacutevitede deacutetruire la vue avant de la recreacuteer) Vous devez avoir le privilegravege DELETE sur la basepour beacuteneacuteficier de cette directive
ALGORITHM=MERGE la deacutefinition de la vue et sa requecircte sont fusionneacutees en interne
ALGORITHM=TEMPTABLE les reacutesultats sont extraits dans une table temporaire (TEMPO-RARY) qui est utiliseacutee par la suite Inteacuteressant si les tables source sont sujettes agrave de nombreuxverrous qui ne gecircnent plus la manipulation de la vue utilisant elle une table temporaire
Aucune option ou ALGORITHM=UNDEFINED MySQL choisit la politique agrave adoptersouvent en faveur de MERGE la seule qui convient aux vues modifiables
nomBase deacutesigne le nom de la base de donneacutees qui heacutebergera la vue En lrsquoabsence de ceparamegravetre la vue est creacuteeacutee dans la base en cours drsquoutilisation
requecircteSELECT requecircte de deacutefinition interrogeant une (ou des) table(s) ou vue(s) pourcharger les donneacutees dans la vue
bull La requecircte de deacutefinition ne peut interroger une table temporaire ni contenir de paramegravetresou de variables de session
bull Si la requecircte de deacutefinition seacutelectionne toutes les colonnes drsquoun objet source (SELECT FROMhellip) et si des colonnes sont ajouteacutees par la suite agrave cet objet la vue ne contiendra pasces colonnes deacutefinies ulteacuterieurement agrave elle Il faudra recreacuteer la vue pour prendre en comptelrsquoeacutevolution structurelle de lrsquoobjet source
WITH CHECK OPTION garantit que toute mise agrave jour de la vue par INSERT ou UPDATEsrsquoeffectuera conformeacutement au preacutedicat contenu dans la requecircte de deacutefinition
Les paramegravetres LOCAL et CASCADED (par deacutefaut) determinent la porteacutee de la veacuterificationquand une vue est deacutefinie agrave partir drsquoune autre vue LOCAL restreint la veacuterification du preacutedi-cat agrave la vue elle-mecircme CASCADED permet drsquoeacutetendre eacuteventuellement les veacuterifications auxautres vues source de la vue qui vient drsquoecirctre deacutefinie
4055_05_C05 Page 176 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 177
chapitre ndeg 5 Controcircle des donneacutees
Classification
On distingue les vues simples des vues complexes en fonction de la nature de la requecircte dedeacutefinition Le tableau suivant reacutesume ce que nous allons deacutetailler au cours de cette section
Une vue monotable est deacutefinie par une requecircte SELECT ne comportant qursquoune seule table danssa clause FROM
Vues monotables
Les meacutecanismes preacutesenteacutes ci-apregraves srsquoappliquent aussi pour la plupart aux vues multitables(eacutetudieacutees plus loin) Consideacuterons les deux vues illustreacutees par la figure suivante et deacuteriveacutees dela table Pilote La vue PilotesAF deacutecrit les pilotes drsquoAir France agrave lrsquoaide drsquoune restriction(eacuteleacutements du WHERE) La vue Etat_civil est constitueacutee par une projection de certainescolonnes (eacuteleacutements du SELECT)
Une fois creacuteeacutee une vue srsquointerroge comme une table par tout utilisateur sous reacuteserve qursquoil aitobtenu le privilegravege en lecture directement (GRANT SELECT ON nomVue TOhellip) Le tableausuivant preacutesente une interrogation des deux vues
Tableau 5-10 Classification des vues
Requecircte de deacutefinition Vue simple Vue complexe
Nombre de tables 1 1 ou plusieurs
Fonction non oui
Regroupement non oui
Mises agrave jour possibles oui pas toujours
Figure 5-8 Deux vues drsquoune table
Web
Pilote
brevet nom nbHVol adresse compa
PL-1 Soutou 890 Castanet CAST
PL-2 Laroche 500 Montauban CAST
PL-3 Lamothe 1200 Ramonville AF
PL-4 Albaric 500 Vieille-Toulouse AF
PL-5 Bidal 120 Paris ASO
PL-6 Labat 120 Pau ASO
PL-7 Tauzin 100 Bas-Mauco ASO
CREATE VIEW PilotesAF
AS SELECT FROM Pilote
WHERE compa = AF
CREATE VIEW Etat_civil AS SELECT nom nbHVol adresse compa FROM Pilote
4055_05_C05 Page 177 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
178 copy Eacuteditions Eyrolles
Agrave partir de cette table et de ces vues nous allons eacutetudier drsquoautres options de lrsquoinstructionCREATE VIEW
AliasLes alias srsquoils sont utiliseacutes deacutesignent le nom de chaque colonne de la vue Ce meacutecanismepermet de mieux controcircler les noms de colonnes Quand un alias nrsquoest pas preacutesent la colonneprend le nom de lrsquoexpression renvoyeacutee par la requecircte de deacutefinition Ce meacutecanisme sert agravemasquer les noms des colonnes de lrsquoobjet source
Les vues suivantes sont creacuteeacutees avec des qui masquent le nom des colonnes de la tablesource Les deux eacutecritures sont eacutequivalentes
Vue drsquoune vueLrsquoobjet source drsquoune vue est en geacuteneacuteral une table mais peut aussi ecirctre une vue La vuesuivante est deacutefinie agrave partir de la vue preacuteceacutedemment creacuteeacutee Notez qursquoilaurait eacuteteacute possible drsquoutiliser des alias pour renommer les colonnes de la nouvelle vue
Tableau 5-11 Interrogation drsquoune vue
Besoin et requecircte ReacutesultatSomme des heures de vol des pilotes dAir FranceSELECT SUM(nbHVol) FROM PilotesAF
+-------------+| SUM(nbHVol) |+-------------+| 170000 |+-------------+
Nombre de pilotesSELECT COUNT() FROM Etat_civil
+----------+| COUNT() |+----------+| 7 |+----------+
Web
alias
Tableau 5-12 Vue avec alias
Eacutecriture 1 Eacutecriture 2CREATE OR REPLACE VIEW PilotesPasAF ( ) AS SELECT FROM Pilote WHERE NOT (compa = AF)
CREATE OR REPLACE VIEW PilotesPasAF AS SELECT brevet nom nbHVol adresse compa FROM Pilote WHERE NOT (compa = AF)
Contenu de la vue +---------+---------+-----------+------------+---------+| |+---------+---------+-----------+------------+---------+| PL-1 | Soutou | 89000 | Castanet | CAST || PL-2 | Laroche | 50000 | Montauban | CAST || PL-5 | Bidal | 12000 | Paris | ASO || PL-6 | Labat | 12000 | Pau | ASO || PL-7 | Tauzin | 10000 | Bas-Mauco | ASO |+---------+---------+-----------+------------+---------+
Web
codepilnomPilheuresPiladressePil societe
codepil nomPilheuresPil adressePil
societe
codepil | nomPil | heuresPil | adressePil | societe
PilotesPasAF
4055_05_C05 Page 178 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 179
chapitre ndeg 5 Controcircle des donneacutees
Vues en lecture seuleLrsquooption ALGORITHM=TEMPTABLE deacuteclare la vue non modifiable par INSERT UPDATE ouDELETE
Redeacutefinissons une vue des pilotes nrsquoeacutetant pas drsquoAir France agrave lrsquoaide de cette option Les messa-ges drsquoerreur induits par la clause de lecture seule geacuteneacutereacutes par MySQL sont tregraves parlants
Vues modifiables
Lorsqursquoil est possible drsquoexeacutecuter des instructions INSERT UPDATE ou DELETE sur une vuecette derniegravere est dite laquo modifiable raquo (updatable view) Vous pouvez creacuteer une vue qui estmodifiable intrinsegravequement
Pour mettre agrave jour une vue il doit exister une correspondance biunivoque entre les lignes de lavue et celles de lrsquoobjet source De plus certaines conditions doivent ecirctre remplies
Si une vue nrsquoest pas modifiable en soi il nrsquoest pas encore possible de programmer un deacuteclen-cheur de type instead of qui prenne le pas sur lrsquoinstruction de modification de la vue en speacuteci-fiant un bloc drsquoinstructions agrave effectuer agrave la place Les mises agrave jour de la vue seraient ainsiautomatiquement reacutepercuteacutees au niveau drsquoune ou de plusieurs tables Notons que ce type dedeacuteclencheur nrsquoest arriveacute qursquoassez tardivement sous Oracle DB2 et SQL Server
Tableau 5-13 Vue drsquoune vue
Creacuteation Contenu de la vue
CREATE OR REPLACE VIEW EtatCivilPilotesPasAF AS SELECT nomPilheuresPiladressePil FROM
+---------+-----------+------------+| nomPil | heuresPil | adressePil |+---------+-----------+------------+| Soutou | 89000 | Castanet || Laroche | 50000 | Montauban || Bidal | 12000 | Paris || Labat | 12000 | Pau || Tauzin | 10000 | Bas-Mauco |+---------+-----------+------------+
Web
PilotesPasAF
Tableau 5-14 Vue en lecture seule
Creacuteation Opeacuterations impossibles
CREATE OR REPLACE VIEW PilotesPasAFRO AS SELECT FROM Pilote WHERE NOT (compa = AF)
INSERT INTO PilotesPasAFRO VALUES (PL-8Ferry5ParisASO)ERROR 1288 (HY000) The target table PilotesPasAFRO of the INSERT is not updatableUPDATE PilotesPasAFRO SET nbHvol=nbHvol+2ERROR 1288 (HY000) The target table PilotesPasAFRO of the UPDATE is not updatableDELETE FROM PilotesPasAFROERROR 1288 (HY000) The target table PilotesPasAFRO of the DELETE is not updatable
Web
ALGORITHM=TEMPTABLE
4055_05_C05 Page 179 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
180 copy Eacuteditions Eyrolles
Pour qursquoune vue simple soit modifiable sa requecircte de deacutefinition doit respecter les critegraveres suivants
bull pas de directive DISTINCT de fonction (AVG COUNT MAX MIN SUM ou VARIANCE)drsquoexpression dans le SELECT
bull pas de GROUP BY ORDER BY ou HAVING
Dans notre exemple nous constatons qursquoil sera quand mecircme possible drsquoajouter un pilote agrave la vueEtat_civil bien que la cleacute primaire de la table source ne soit pas renseigneacutee MySQL insegravere agravela place en lrsquoabsence de valeur par deacutefaut de la cleacute primaire la chaicircne vide ( ) si la cleacute avaiteacuteteacute une seacutequence les insertions se feraient normalement Cette opeacuteration ne pourra donc se faireqursquoune seule fois apregraves cela sera contradictoire avec la condition de correspondance biunivo-que
En revanche il sera possible de modifier les colonnes de cette vue On pourra aussi ajoutermodifier (sous reacuteserve de respecter les eacuteventuelles contraintes issues des colonnes de la tablesource) ou supprimer des pilotes en passant par la vue PilotesAF
La derniegravere instruction est paradoxale car elle permet drsquoajouter un pilote de la compagnieASO en passant par la vue des pilotes de la compagnie AF La directive WITH CHECKOPTION permet drsquoeacuteviter ces effets de bord indeacutesirables pour lrsquointeacutegriteacute de la base
Tableau 5-15 Mises agrave jour de vues
Opeacuterations possibles Opeacuterations non conseilleacutees et impossibles
Suppression des pilotes de ASO
DELETE FROM WHERE compa = ASOLe pilote Lamothe double ses heuresUPDATE SET nbHVol = nbHVol2 WHERE nom = Lamothe
Ajout drsquoun pilote (pas conseilleacute)INSERT INTO VALUES(Raffarin10PoitiersASO)
Ajout drsquoun autre pilote impossibleINSERT INTO Etat_civil VALUES (Lebur20BordeauxASO)ERROR 1062 (23000) Duplicate entry for key 1
Ajout drsquoun piloteINSERT INTO VALUES (PL-8Ferry5 ParisAF)ModificationUPDATE SET nbHVol = nbHVol2SuppressionDELETE FROM WHERE nom=FerryAjout drsquoun pilote qui nrsquoest pas de AF INSERT INTO VALUES (PL-9Caboche 600RennesASO)
Toute mise agrave jour qui ne respecterait pas les contraintes de la table Pilote
Web
Etat_civil
Etat_civil
Etat_civil
PilotesAF
PilotesAF
PilotesAF
PilotesAF
4055_05_C05 Page 180 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 181
chapitre ndeg 5 Controcircle des donneacutees
Directive CHECK OPTION
La directive WITH CHECK OPTION empecircche un ajout ou une modification non conformes agrave ladeacutefinition de la vue
Interdisons lrsquoajout (ou la modification de la colonne compa) drsquoun pilote au travers de la vuePilotesAF si le pilote nrsquoappartient pas agrave la compagnie de code AF Il est neacutecessaire deredeacutefinir la vue PilotesAF Le script suivant deacutecrit la redeacutefinition de la vue lrsquoajout drsquounpilote et les tentatives drsquoajout et de modification ne respectant pas les caracteacuteristiques de lavue Les messages sont tregraves clairs
Vues complexes
Une vue complexe est caracteacuteriseacutee par le fait qursquoelle contient dans sa deacutefinition plusieurstables (jointures) et une fonction appliqueacutee agrave des regroupements ou agrave des expressions La miseagrave jour de telles vues nrsquoest pas toujours possible
Pour pouvoir modifier une vue complexe les restrictions sont les suivantes
bull La requecircte de deacutefinition ne doit pas contenir de sous-interrogation (jointure proceacutedurale)
bull Il nrsquoest pas possible drsquoutiliser drsquoopeacuterateur ensembliste (sauf UNION [ALL])
La figure suivante preacutesente deux vues complexes qui ne sont pas modifiables La vue multita-ble Pilotes_multi_AF est creacuteeacutee agrave partir drsquoune jointure entre les tables Compagnie etPilote La vue Moyenne_Heures_Pil est creacuteeacutee agrave partir drsquoun regroupement de la tablePilote
Tableau 5-16 Vue avec CHECK OPTION
Opeacuterations possibles Opeacuterations impossibles
Recreacuteation de la vueCREATE OR REPLACE VIEW PilotesAF AS SELECT FROM pilote WITH CHECK OPTION
Nouveau piloteINSERT INTO PilotesAF VALUES(PL-11Teste900RevelAF)Query OK 1 row affected (003 sec)
Ajout drsquoun piloteINSERT INTO PilotesAF VALUES (PL-9Caboche600RennesASO)ERROR 1369 (HY000) CHECK OPTION failedbdsoutouPilotesAF
Modification de pilotesUPDATE PilotesAF SET compa=ASOERROR 1369 (HY000) CHECK OPTION failedbdsoutouPilotesAF
Web
WHERE compa = AF
Web
4055_05_C05 Page 181 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
182 copy Eacuteditions Eyrolles
Mises agrave jour
Il semblerait qursquoon ne puisse inseacuterer aucun enregistrement dans ces vues du fait de la coheacute-rence qursquoil faudrait eacutetablir du sens vue vers tables Les messages drsquoerreur geacuteneacutereacutes par MySQLsont diffeacuterents suivant la nature de la vue (monotable ou multitable) Nous verrons commentreacutesoudre lrsquoerreur du deuxiegraveme cas
On pourrait croire qursquoil en est de mecircme pour les modifications Ce nrsquoest pas le cas Alors quela vue monotable Moyenne_Heures_Pil nrsquoest pas modifiable ni par UPDATE ni parDELETE (message drsquoerreur 1288) la vue multitable Pilotes_multi_AF est transformabledans une certaine mesure car la table Pilote (qui entre dans sa composition) est ditelaquo proteacutegeacutee par cleacute raquo (key preserved) Nous verrons dans le prochain paragraphe la significa-tion de cette notion
Figure 5-9 Vues complexes
Compagnie
comp nrue rue ville nomComp
AF 124 Port Royal Paris Air FranceSING 7 Camparols Singapour Singapore AL
Pilote
brevet nom nbHVol compa
PL-1 Louise Ente 450 AF PL-2 Jules Ente 900 AF PL-3 Paul Soutou 1000 SING
CREATE VIEW Pilotes_multi_AF
AS SELECT pbrevet pnom pnbHVol cville cnomComp FROM Pilote p Compagnie c WHERE pcompa = ccomp AND pcompa = AF
CREATE VIEW Moyenne_Heures_Pil AS SELECT compa
AVG(nbHVol) moyenne FROM Pilote GROUP BY compa
compa moyenne
AF 675 SING 1000
Tableau 5-17 Tentatives drsquoinsertions dans des vues complexes
Vue monotable Vue multitable
INSERT INTO Moyenne_Heures_Pil VALUES (TAT50)ERROR 1288 (HY000) The targettable Moyenne_Heures_Pil of theINSERT is not updatable
INSERT INTO Pilotes_multi_AF VALUES(PL-4Test400CastanetCastanet AL)ERROR 1394 (HY000) Can not insert into joinview bdsoutouPilotes_multi_AF without fields list
Web
4055_05_C05 Page 182 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 183
chapitre ndeg 5 Controcircle des donneacutees
Les colonnes de la vue correspondant agrave la table proteacutegeacutee par cleacute ne sont pas les seules agrave pou-voir ecirctre modifieacutees Ici nbHVol peut ecirctre mise agrave jour car elle appartient agrave la table proteacutegeacutee ville qui nrsquoappartient pas agrave une table proteacutegeacutee peut aussi ecirctre modifeacutee
Les suppressions ne se reacutepercutent pas sur les enregistrements de la table proteacutegeacutee par cleacute(Pilote)
Modifions et tentons de supprimer des enregistrements agrave travers la vue multitable Pilotes_multi_AF
Tableau 5-18 Mise agrave jour drsquoune vue multitable
Mise agrave jour Reacutesultats
-- Multiplie par 2 le nombre drsquoheuresUPDATE SET nbHVol = nbHVol 2
Query OK 2 rows affectedRows matched 2 Changed 2 Warnings 0
SELECT brevetnomnbHVol FROM Pilotes_multi_AF+--------+-------------+---------+| brevet | nom | nbHVol |+--------+-------------+---------+| PL-1 | Louise Ente | 90000 || PL-2 | Paul Ente | 180000 |+--------+-------------+---------+
-- Modif de la ville de la compagnieUPDATE SET ville = Orly
SELECT brevetnomville FROM Pilotes_multi_AF+--------+-------------+-------+| brevet | nom | ville |+--------+-------------+-------+| PL-1 | Louise Ente | Orly || PL-2 | Paul Ente | Orly |+--------+-------------+-------+
SELECT compvillenomComp FROM Compagnie+------+-----------+--------------+| comp | ville | nomComp |+------+-----------+--------------+| AF | Orly | Air France || SING | Singapour | Singapore AL |+------+-----------+--------------+
--Pas possible DELETE FROM ERROR 1395 (HY000) Can not delete
from join view bdsoutouPilotes_multi_AF
WebPilotes_multi_AF
Pilotes_multi_AF
Pilotes_multi_AF
4055_05_C05 Page 183 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
184 copy Eacuteditions Eyrolles
Tables proteacutegeacutees (key preserved tables)
Une table est dite proteacutegeacutee par sa cleacute (key preserved) si sa cleacute primaire est preacuteserveacutee dans laclause de jointure et se retrouve en tant que colonne de la vue multitable (elle peut jouer le rocirclede cleacute primaire de la vue)
En consideacuterant les donneacutees initiales pour la vue multitable Vue_Multi_Comp_Pil la tablepreacuteserveacutee est la table Pilote car la colonne brevet identifie chaque enregistrement extraitde la vue alors que la colonne comp ne le fait pas
Cela ne veut pas dire pour autant que cette vue est modifiable Eacutetudions agrave preacutesent les condi-tions qui reacutegissent ces limitations
Critegraveres
Une vue multitable modifiable (updatable join view ou modifiable join view) est une vue quinrsquoest pas deacutefinie avec lrsquooption ALGORITHM=TEMPTABLE et qui est telle que la requecircte dedeacutefinition contient plusieurs tables dans la clause FROM
Aucune suppression nrsquoest possible
Les insertions sont permises seulement en isolant toutes les colonnes drsquoune seule table source
Attention aux effets de bord quand vous modifiez une colonne provenant drsquoune table non pro-teacutegeacutee par cleacute Il est plus naturel de modifier directement la table en question
Modifions de diffeacuterentes maniegraveres la vue multitable Vue_Multi_Comp_Pil La premiegraveretente une suppression les deux suivantes modifient tantocirct une colonne de la table proteacutegeacuteetantocirct une colonne de la table non proteacutegeacutee Les deux derniegraveres instructions insegraverent danschacune des deux tables
Tableau 5-19 Vue multitable
Creacuteation de la vue Reacutesultats
CREATE VIEW
AS SELECT ccomp cnomComp pnom pnbHVol FROM Pilote p Compagnie c WHERE pcompa=ccomp
+------+--------------+--------+-------------+---------+| comp | nomComp | brevet | nom | nbHVol |+------+--------------+--------+-------------+---------+| AF | Air France | PL-1 | Louise Ente | 45000 || AF | Air France | PL-2 | Paul Ente | 90000 || SING | Singapore AL | PL-3 | Paul Soutou | 100000 |+------+--------------+--------+-------------+---------+
WebVue_Multi_Comp_Pil
pbrevet
4055_05_C05 Page 184 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 185
chapitre ndeg 5 Controcircle des donneacutees
Autres utilisations de vues
Les vues peuvent eacutegalement servir pour simplifier lrsquoeacutecriture de requecirctes complexes renforcerla confidentialiteacute et une certaine inteacutegriteacute
Tableau 5-20 Mises agrave jour
Mise agrave jour Reacutesultats
DELETE FROM Vue_Multi_Comp_Pil WHERE comp=AF
ERROR 1395 (HY000) Can not delete from join view bdsoutouVue_Multi_Comp_Pil
UPDATE Vue_Multi_Comp_Pil SET nbHVol = nbHVol 3Query OK 3 rows affected (010 sec)
Warnings 0
SELECT brevet nbHVol FROM Pilote+--------+---------+| brevet | nbHVol |+--------+---------+| PL-1 | 135000 || PL-2 | 270000 || PL-3 | 300000 |+--------+---------+
UPDATE Vue_Multi_Comp_Pil SET nomComp = Dupond Query OK 2 rows affected (038 sec)
Warnings 0
(SELECT compvillenomComp FROM Compagnie+------+-----------+---------+| comp | ville | nomComp |+------+-----------+---------+| AF | Paris | Dupond || SING | Singapour | Dupond |+------+-----------+---------+
INSERT INTO Vue_Multi_Comp_Pil VALUES (PL-5 Jean2500)
SELECT brevetnomnbHVol FROM Pilote+--------+-------------+---------+| brevet | nom | nbHVol |+--------+-------------+---------+| PL-1 | Louise Ente | 135000 || PL-2 | Paul Ente | 270000 || PL-3 | Paul Soutou | 300000 || |+--------+-------------+---------+
INSERT INTO Vue_Multi_Comp_Pil VALUES (TAT Test)
SELECT compvillenomComp FROM Compagnie+------+-----------+---------+| comp | ville | nomComp |+------+-----------+---------+| AF | Paris | Dupond || SING | Singapour | Dupond || |+------+-----------+---------+
Web
Rows matched 3 Changed 3
Rows matched 3 Changed 2
(brevetnomnbHVol)
PL-5 | Jean | 250000
(compnomComp)
TAT | Paris | Test
4055_05_C05 Page 185 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
186 copy Eacuteditions Eyrolles
Simplifier les noms
Une vue permet de simplifier la manipulation drsquoune table ayant un nom long ou des colonnesportant des noms compliqueacutes Consideacuterons par exemple la table COLLATION_CHARACTER_SET_APPLICABILITY[COLLATION_NAMECHARACTER_SET_NAME] qui deacutecrit les colla-tions des jeux de caractegraveres disponibles et qui est situeacutee dans la base de donneacutees stockant ledictionnaire des donneacutees (INFORMATION_SCHEMA) Nous eacutetudierons dans la prochainesection les diffeacuterentes tables de cette base systegraveme Supposons que lrsquoon deacutesire souvent acceacutederagrave cette table pour connaicirctre les diffeacuterentes collations possibles pour les jeux de caractegraveres latins
Creacuteons la vue CollationsLatines qui simplifie lrsquoaccegraves agrave cette table au niveau du nommais aussi au niveau des colonnes Interrogeons cette vue de maniegravere agrave connaicirctre les collationsspeacutecifiques agrave la langue de Moliegravere ou agrave celle de Goethe
On dira que MySQL est plus laquo brancheacute raquo par la nouveauteacute Goethe eacutetant neacute 76 ans apregraves ledeacutecegraves de Moliegravere Aucun french dans la base donc
Contraintes de veacuterification
Nous avons deacutecrit au chapitre 1 les contraintes de veacuterification (CHECK) qui ne sont pas encoretotalement prises en charge Il est possible de programmer ce type de contraintes par des vues
Consideacuterons la table Pilote illustreacutee ci-apregraves et programmons par lrsquointermeacutediaire de la vueVueGradePilotes la contrainte veacuterifiant qursquoun pilote
ne peut ecirctre commandant de bord qursquoagrave la condition qursquoil ait entre 1 000 et 4 000 heures de vol
ne peut ecirctre copilote qursquoagrave la condition qursquoil ait entre 100 et 1 000 heures de vol
ne peut ecirctre instructeur qursquoagrave partir de 3 000 heures de vol
Les regravegles conseilleacutees pour manipuler les enregistrements drsquoune vue v1 deacutecrivant des con-traintes de veacuterification sur une table t1 sont les suivantes
bull modification et insertion par la vue v1
bull suppression et lecture par la table t1
Tableau 5-21 Vue pour simplifier les noms
Creacuteation Interrogation
CREATE VIEW CollationsLatines (collationjeu) AS SELECT FROM INFORMATION_SCHEMAcrarr COLLATION_CHARACTER_SET_APPLICABILITY WHERE CHARACTER_SET_NAME LIKE Latin
SELECT FROM CollationsLatines WHERE collation LIKE french OR collation LIKE german+-------------------+--------+| collation | jeu |+-------------------+--------+| latin1_german1_ci | latin1 || latin1_german2_ci | latin1 |+-------------------+--------+
Web
4055_05_C05 Page 186 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 187
chapitre ndeg 5 Controcircle des donneacutees
Manipulons agrave preacutesent la vue de notre exemple
Confidentialiteacute
La confidentialiteacute est une des vocations premiegraveres des vues Outre lrsquoutilisation de variablesdrsquoenvironnement il est possible de restreindre lrsquoaccegraves agrave des tables en fonction de momentspreacutecis
Les vues suivantes limitent temporellement les accegraves en lecture et en eacutecriture agrave des tables
Notez qursquoil est possible en plus de limiter lrsquoaccegraves agrave un utilisateur particulier en utilisant unevariable drsquoenvironnement (exemple rajout de la condition AND CURRENT_USER() =Paullocalhost agrave une vue)
Figure 5-10 Vue simulant la contrainte CHECK
Web Pilote
brevet nom nbHVol grade
PL-1 Daniel Vielle 1000 CDB PL-2 Benoit Treilhou 450 COPI PL-3 Pierre Filoux 9000 INST PL-4 Philippe Minier 1000 COPI
CREATE VIEW VueGradePilotesAS SELECT brevetnomnbHVolgradeFROM PiloteWHERE (grade =CDB
AND nbHVol BETWEEN 1000 AND 4000) OR (grade = COPI
AND nbHVol BETWEEN 100 AND 1000) OR (gr ade = INST AND nb HVol gt 3000)
WITH CHECK OPTION
Tableau 5-22 Manipulations des vues pour lrsquointeacutegriteacute reacutefeacuterentielle
Mises agrave jour possibles Mises agrave jour non valides ERROR 1369 (HY000) CHECK OPTION failed bdsoutouVueGradePilotes
INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-1Daniel Vielle )INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-2Benoit Treihlou )INSERT INTO VueGradePilotes(brevetnomnbHVolgrade) VALUES (PL-3Pierre Filoux )INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-4Philippe Minier )
INSERT INTO VueGradePilotes (brevetnomnbHVolgrade)VALUES (PL-5Trop jeune )INSERT INTO VueGradePilotes (brevetnomnbHVolgrade) VALUES (PL-6Inexperimente )
UPDATE VueGradePilotes SET WHERE brevet = PL-2
UPDATE VueGradePilotes SET WHERE brevet = PL-4
UPDATE VueGradePilotes SET WHERE brevet = PL-3
Web
1000CDB
450COPI
9000INST
1000COPI
100CDB
2999INST
grade =INST
grade =CDB nbHVol= 50
4055_05_C05 Page 187 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
188 copy Eacuteditions Eyrolles
Transmission de droits
Les meacutecanismes de transmission et de reacutevocation de privilegraveges que nous avons eacutetudieacutes srsquoappli-quent eacutegalement aux vues Ainsi si un utilisateur deacutesire transmettre des droits sur une partiedrsquoune de ses tables il utilisera une vue Seules les donneacutees appartenant agrave la vue seront acces-sibles aux beacuteneacuteficiaires
Les privilegraveges objet qursquoil est possible drsquoattribuer sur une vue sont les mecircmes que ceux appli-cables sur les tables (SELECT INSERT UPDATE sur une ou plusieurs colonnes DELETE)
Modification drsquoune vue (ALTER VIEW)
Vous devez au moins posseacuteder les privilegraveges CREATE VIEW et DELETE au niveau drsquoune vuepour pouvoir la modifier La syntaxe SQL est la suivante
ALTER [ALGORITHM = UNDEFINED | MERGE | TEMPTABLE]
VIEW [nomBase]nomVue [(listecolonnes)]
AS requecircteSELECT
[WITH [CASCADED | LOCAL] CHECK OPTION]
Tableau 5-23 Vues pour restreindre lrsquoaccegraves agrave des moments preacutecis
Deacutefinition de la vue Accegraves
CREATE VIEW VueDesCompagniesJoursFeries AS SELECT FROM Compagnie WHERE
Restriction en lecture de la table Compagnie lessamedis et dimanches Mises agrave jour possibles agravetout moment
CREATE VIEW VueDesPilotesJoursOuvrables AS SELECT FROM Pilote WHERE AND DATE_FORMAT(SYSDATE()W) NOT IN (Sunday Saturday) WITH CHECK OPTION
Restriction en lecture et en eacutecriture (agrave cause deWITH CHECK OPTION) de la table Pilote lesjours ouvrables de 8h30 agrave 17h30
Web
DATE_FORMAT(SYSDATE()W)IN (SundaySaturday)
CURTIME()+0BETWEEN 83000 AND 173000
Tableau 5-24 Privilegraveges sur les vues
Attribution du privilegravege Signification
GRANT SELECT ON VueDesCompagniesJoursFeries TO Paullocalhost
Accegraves en local de lrsquoutilisateur Paul en lec-ture sur la vue VueDesCompagniesJoursFeacuterieacutes
GRANT INSERT ON VueDesPilotesJoursOuvrables TO Juleslocalhost
Accegraves en local de lrsquoutilisateur Jules eneacutecriture sur la vue VueDesCompagniesJoursFeacuterieacutes
4055_05_C05 Page 188 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 189
chapitre ndeg 5 Controcircle des donneacutees
Les transformations peuvent concerner toutes les parties drsquoune vue existante la politique decreacuteation (ALGORITHM) la liste des colonnes la requecircte etc Voir la section Creacuteation drsquoune vue
Visualisation drsquoune vue (SHOW CREATE VIEW)
Pour pouvoir visualiser la requecircte de deacutefinition drsquoune vue lrsquoinstruction que MySQL proposeest la suivante
SHOW CREATE VIEW [nomBase]nomVue
En arrangeant lrsquoeacutetat de sortie vous pouvez deacutecouvrir comment MySQL stocke la deacutefinition dela vue preacuteceacutedemment creacuteeacutee
SHOW CREATE VIEW VueDesCompagniesJoursFeries+-----------------------------+-----------------------------------------------+| View | Create View |+-----------------------------+-----------------------------------------------+| VueDesCompagniesJoursFeries | CREATE ALGORITHM=UNDEFINED || | DEFINER=`root``localhost` SQL SECURITY || | DEFINER VIEW `VueDesCompagniesJoursFeries` AS || | select sql_no_cache `Compagnie``comp` AS || | `comp``Compagnie``nrue` AS || | `nrue``Compagnie``rue` AS || | `rue``Compagnie``ville` AS || | `ville``Compagnie``nomComp` AS `nomComp` || | from `Compagnie` where || | (date_format(sysdate()_latin1W) in || | (_latin1Sunday_latin1Saturday)) |+-----------------------------+-----------------------------------------------+
Suppression drsquoune vue (DROP VIEW)
Vous devez posseacuteder le privilegravege DROP sur une vue pour pouvoir la supprimer
La suppression drsquoune vue nrsquoentraicircne pas la destruction des donneacutees qui reacutesident toujours dansles tables
La syntaxe SQL est la suivante
DROP VIEW [IF EXISTS]
[nomBase]nomVue [nomBase2]nomVue2
[RESTRICT | CASCADE]
IF EXISTS eacutevite une erreur dans le cas ougrave la vue nrsquoexiste pas
RESTRICT et CASCADE ne sont pas encore opeacuterationnels il concerneront probablement lareacutepercussion de la suppression entre vues interdeacutependantes
4055_05_C05 Page 189 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
190 copy Eacuteditions Eyrolles
Dictionnaire des donneacutees
Le dictionnaire des donneacutees (metadata ou data dictionary) est une partie majeure drsquoune basede donneacutees MySQL qursquoon peut assimiler agrave une structure centraliseacutee
Pour MySQL 16 vues sont issues de tables systegraveme non visibles Ces vues qui sont appeleacuteestables par abus de langage (dans la documentation officielle dans les livres et sur les forums1)et qui sont situeacutees dans la base INFORMATION_SCHEMA suffisent agrave stocker toutes lesinformations deacutecrivant tous les objets contenus dans toutes les bases de donneacutees MySQL serapproche davantage de DB2 et de SQL Server que drsquoOracle (qui possegravede 600 vues) Lesnoms des vues sont similaires et se rapprochent de la speacutecification ANSIISO SQL2003standard Part 11 Schemata
Constitution
Le dictionnaire des donneacutees contient
la deacutefinition des tables vues index seacutequences proceacutedures fonctions et deacuteclencheurs
la description de lrsquoespace disque alloueacute et occupeacute par chaque objet
les valeurs par deacutefaut des colonnes (DEFAULT)
la description des contraintes drsquointeacutegriteacute reacutefeacuterentielle (de veacuterification agrave venir)
le nom des utilisateurs de la base
les privilegraveges pour chaque utilisateur
des informations drsquoaudit (accegraves aux objets) et drsquoautre nature (commentaires par exemple)
Toutes les tables du dictionnaire des donneacutees ne sont accessibles qursquoen lecture seulementElles appartiennent agrave la base de donneacutees INFORMATION_SCHEMA Lrsquointerrogation du diction-naire des donneacutees est permise agrave tout utilisateur (qui ne verra que les objets qui lui sont toute-fois accessibles avec ses propres privilegraveges) et peut se faire au travers de requecirctes SELECT oupar le biais de la commande SHOW
Toutes les informations contenues dans les tables du dictionnaire des donneacutees sont codeacutees enminuscules
Le dictionnaire des donneacutees est mis automatiquement agrave jour apregraves chaque instruction SQL duLMD (INSERT UPDATE DELETE LOCK TABLE)
Les avantages drsquointerroger le dictionnaire des donneacutees par des requecirctes sont les suivants
1 Je conserve le vocable de laquo vue raquo pour ecirctre plus pregraves de la reacutealiteacute Cependant parler de table ou de vue est eacutequiva-lent puisqursquoelles sont interrogeables de la mecircme maniegravere par SELECT
4055_05_C05 Page 190 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 191
chapitre ndeg 5 Controcircle des donneacutees
Conforme aux regravegles drsquoEF Codd (le pegravere du modegravele relationnel) toutes les manipula-tions sont reacutealiseacutees agrave lrsquoaide des opeacuterateurs relationnels sur des tables
Inutile drsquoapprendre de nouvelles instructions (SHOW paramegravetres) proprieacutetaires deMySQL La migration vers un autre SGBD est ainsi faciliteacutee
Les possibiliteacutes drsquoextraction sont quasiment illimiteacutees du fait du grand nombre de tables etde jointures (ou drsquoautres opeacuterateurs) possible
Vous avez tellement souffert au chapitre 4 que vous avez ici lrsquooccasion de mettre agravelrsquoeacutepreuve vos connaissances dans un contexte plus laquo systegraveme raquo
Modegravele graphique du dictionnaire des donneacutees
Le diagramme suivant ndash qui srsquoapparente plus au niveau logique car les cleacutes eacutetrangegraveresapparaissent ndash tireacute de httpmysqldevelopmentcom deacutecrit la structure des vues du diction-naire des donneacutees
Deacutemarche agrave suivre
La deacutemarche agrave suivre afin drsquointerroger correctement le dictionnaire des donneacutees agrave propos drsquounobjet est la suivante
trouver le nom de la vue (ou des vues) pertinente(s) agrave partir du scheacutema preacuteceacutedent
choisir les colonnes de la vue (ou des vues) agrave seacutelectionner (soit agrave partir du graphique soiten affichant la structure de la vue par la commande DESCRIBE)
interroger la vue (ou les vues) en exeacutecutant une instruction SELECT contenant les colonnesinteacuteressantes
Recherche du nom drsquoune vue
Il nrsquoy a pas de moyen automatique de trouver le nom de la vue pertinente Cela dit il nrsquoy en aque 16 et vous en aurez vite fait le tour
Choisir les colonnes
Le choix des colonnes drsquoune vue du dictionnaire des donneacutees srsquoeffectue apregraves avoir listeacute lastructure de cette vue (par DESCRIBE) Le nom de la colonne est en geacuteneacuteral assez parlantDans notre exemple la vue contient huit colonnes Il apparaicirct que la clause de deacutefinition dechaque vue est contenue dans la colonne VIEW_DEFINITION La colonne CHECK_OPTIONdoit indiquer en principe le fait que la vue est deacuteclareacutee avec une contrainte de veacuterificationMais quelle colonne renseigne donc le nom de ladite vue
4055_05_C05 Page 191 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
192 copy Eacuteditions Eyrolles
Figure 5-11 Modegravele graphique du dictionnaire des donneacutees
4055_05_C05 Page 192 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 193
chapitre ndeg 5 Controcircle des donneacutees
DESCRIBE INFORMATION_SCHEMAVIEWS
+-----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| TABLE_CATALOG | varchar(512) | YES | | NULL | |
| TABLE_SCHEMA | varchar(64) | NO | | | |
| TABLE_NAME | varchar(64) | NO | | | |
| VIEW_DEFINITION | longtext | NO | | | |
| CHECK_OPTION | varchar(8) | NO | | | |
| IS_UPDATABLE | varchar(3) | NO | | | |
| DEFINER | varchar(77) | NO | | | |
| SECURITY_TYPE | varchar(7) | NO | | | |
+-----------------+--------------+------+-----+---------+-------+
Interroger la vue
Lrsquointerrogation de la vue sur les colonnes choisies est lrsquoeacutetape finale de la recherche de donneacuteesdans le dictionnaire Il convient drsquoeacutecrire une requecircte monotable ou multitable (jointures) quiextrait des donneacutees contenues dans la vue Ces donneacutees sont en fait contenues dans des tablessystegraveme qui ne sont pas accessibles pour des raisons seacutecuritaires
Supposons que je sois root en local et que je deacutesire connaicirctre le nom lrsquoemplacement et lecaractegravere contraint de toutes les vues existantes
SELECT TABLE_SCHEMATABLE_NAMECHECK_OPTION FROM INFORMATION_SCHEMAVIEWS+--------------+-----------------------------+--------------+| TABLE_SCHEMA | TABLE_NAME | CHECK_OPTION |+--------------+-----------------------------+--------------+| bdnouvelle | VueDesSocietes | NONE || bdsoutou | VueDesPilotesJoursOuvrables | CASCADED |+--------------+-----------------------------+--------------+
Si jrsquoavais voulu connaicirctre les vues contenues seulement dans la base bdsoutou il suffisaitdrsquoajouter la condition (WHERE TABLE_SCHEMA=bdsoutou)
Vous pouvez noter que MySQL utilise
La colonne TABLE_SCHEMA pour deacutesigner une database
La colonne TABLE_NAME pour stocker le nom de chaque vue des diffeacuterents scheacutemas Ici lanorme SQL doit y ecirctre pour quelque chose (Oracle nomme la colonne VIEW_NAME)
La colonne CHECK_OPTION pour indiquer le caractegravere restreint de chaque vue (lapremiegravere nrsquoest pas restreinte la seconde lrsquoest)
Classification des vues
Le tableau suivant classifie les vues selon leur fonctionnaliteacute Notez qursquoaucune redondance nide synonyme nrsquoexistent (si vous voulez reacutealiser une extraction pour deacutecouvrir quelque choseil nrsquoy aura pas beaucoup de requecirctes diffeacuterentes possibles)
4055_05_C05 Page 193 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
194 copy Eacuteditions Eyrolles
Interrogeons agrave preacutesent quelques-unes de ces vues dans le cadre drsquoexemples concrets
Bases de donneacutees du serveur
La requecircte suivante interroge la vue SCHEMATA et permet de retrouver les caracteacuteristiques(jeux de caractegraveres) des bases de donneacutees heacutebergeacutees par le serveur
SELECT SCHEMA_NAME AS Base de donnees
AS Jeu caracteres
AS Collation
FROM INFORMATION_SCHEMASCHEMATA
+--------------------+----------------+-------------------+
| Base de donnees | Jeu caracteres | Collation |
+--------------------+----------------+-------------------+
| information_schema | utf8 | utf8_general_ci |
| bdnouvelle | ascii | ascii_general_ci |
| bdsoutou | latin1 | latin1_swedish_ci |
| mysql | latin1 | latin1_swedish_ci |
| test | latin1 | latin1_swedish_ci |
+--------------------+----------------+-------------------+
Tableau 5-25 Vues du dictionnaire des donneacutees
Nature de lrsquoobjet Vues
Serveur SCHEMATA caracteacuteristiques du serveur (jeux de caractegraveres utiliseacutes)CHARACTER_SETS informations sur les colonnes pour lesquelles lrsquoutilisa-teur a reccedilu une autorisationCOLLATIONS et COLLATION_CHARACTER_SET_APPLICABILITY rela-tifs aux jeux de caractegraveres
Privilegraveges SCHEMA_PRIVILEGES liste des preacuterogatives au niveau databaseTABLE_PRIVILEGES liste des preacuterogatives au niveau tableUSER_PRIVILEGES liste des preacuterogatives au niveau userCOLUMN_PRIVILEGES liste des preacuterogatives au niveau columns
Tables et seacutequences TABLES caracteacuteristiques des tables (et seacutequences) dans les bases
Colonnes COLUMNS colonnes des tables et vues
Index STATISTICS description des index
Contraintes TABLE_CONSTRAINTS deacutefinition des contraintes de tablesKEY_COLUMN_USAGE composition des contraintes (colonnes)
Vues VIEWS description des vues
Sous-programmes ROUTINES description des sous-programmes stockeacutesTRIGGERS description des deacuteclencheurs
DEFAULT_CHARACTER_SET_NAME
DEFAULT_COLLATION_NAME
4055_05_C05 Page 194 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 195
chapitre ndeg 5 Controcircle des donneacutees
Notez que MySQL utilise
la colonne DEFAULT_CHARACTER_SET_NAME pour deacutesigner le jeu de caractegraveres drsquounedatabase Le dictionnaire est lui-mecircme codeacute en utf8
la colonne DEFAULT_COLLATION_NAME pour deacutesigner la collation du jeu de caractegraveres
Les colonnes CATALOG_NAME et SQL_PATH ne sont pas encore renseigneacutees Elles proviennenttoutes deux de la speacutecification de la norme SQL La premiegravere est relative au concept descheacutema (qursquoon peut assimiler agrave une collection de bases) et la seconde concerne un nom sym-bolique qursquoon pourrait associer agrave une routine (sous-programme)
Composition drsquoune base
La requecircte suivante interroge la vue TABLES et deacutecrit la composition des bases de donneacuteesutilisateur (jrsquoai filtreacute volontairement les lignes qui correspondent aux bases de MySQL)
SELECT TABLE_SCHEMATABLE_NAME FROM INFORMATION_SCHEMATABLES WHERE TABLE_SCHEMA NOT IN (information_schematestmysql)+--------------+-----------------------------+------------+-------------------+| TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | DATE(CREATE_TIME) |+--------------+-----------------------------+------------+-------------------+| bdnouvelle | VueDesSocietes | VIEW | NULL || bdsoutou | Installer | BASE TABLE | 2005-11-30 || bdsoutou | Logiciel | BASE TABLE | 2005-11-30 || bdsoutou | PCSeuls | BASE TABLE | 2005-11-30 || bdsoutou | Pilote | BASE TABLE | 2005-11-30 || bdsoutou | Poste | BASE TABLE | 2005-11-30 || bdsoutou | Salle | BASE TABLE | 2005-11-30 || bdsoutou | Segment | BASE TABLE | 2005-11-30 || bdsoutou | Softs | BASE TABLE | 2005-11-30 || bdsoutou | Types | BASE TABLE | 2005-11-30 || bdsoutou | VueDesPilotesJoursOuvrables | VIEW | NULL |+--------------+-----------------------------+------------+-------------------+
Vous pouvez remarquer que MySQL utilise
la colonne TABLE_TYPE pour deacutesigner le type de la structure de stockage (les tablestemporaires si elles existent nrsquoapparaissent pas)
la colonne CREATE_TIME pour deacutesigner la date de creacuteation de lrsquoobjet
Deacutetail de stockage drsquoune base
En utilisant la mecircme vue du dictionnaire inteacuteressons-nous agrave la table Installer dans la basebdsoutou qui fait partie du scheacutema des exercices de ce livre La requecircte suivante extrait desinformations inteacuteressantes
TABLE_TYPEDATE(CREATE_TIME)
4055_05_C05 Page 195 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
196 copy Eacuteditions Eyrolles
SELECT FROM INFORMATION_SCHEMATABLES WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+--------+----------------+------------+----------------+-------------+| ENGINE | AUTO_INCREMENT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH |+--------+----------------+------------+----------------+-------------+| InnoDB | 15 | 14 | 1170 | 16384 |+--------+----------------+------------+----------------+-------------+
Notez que MySQL utilise
la colonne ENGINE pour deacutesigner le type de moteur de stockage de la table en question
la colonne AUTO_INCREMENT pour deacutesigner la prochaine valeur de la seacutequence
la colonne TABLE_ROWS pour donner le nombre drsquoenregistrements de la table (ici crsquoestbien coheacuterent avec la seacutequence qui fait office de cleacute primaire)
la colonne AVG_ROW_LENGTH pour deacutesigner la taille moyenne drsquoune ligne en octets
la colonne DATA_LENGTH pour deacutesigner la taille de la table en octets
Citons pour en terminer avec cette vue les colonnes
TABLE_COLLATION qui indique le jeu de caractegraveres de la table
TABLE_COMMENT qui renseigne notamment agrave propos des reacutefeacuterences entre tables par lescleacutes eacutetrangegraveres
Structure drsquoune table
Inteacuteressons-nous agrave preacutesent agrave la vue COLUMNS qui deacutecrit la structure des tables au niveaucolumn level
Structure au premier niveau
La requecircte suivante deacutecrit en partie la table Installer Notez que ccedila ressemble assez auDESCRIBE (normal car lrsquoinstruction a eacuteteacute programmeacutee agrave lrsquoaide drsquoune requecircte analogue)
SELECT FROM INFORMATION_SCHEMACOLUMNS WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+-------------+-----------+------------------+-------------------+------------+| COLUMN_NAME | DATA_TYPE | ORDINAL_POSITION | COLUMN_DEFAULT | COLUMN_KEY |+-------------+-----------+------------------+-------------------+------------+| nPoste | varchar | 1 | NULL | || nLog | varchar | 2 | NULL | || numIns | int | 3 | NULL | PRI || dateIns | timestamp | 4 | CURRENT_TIMESTAMP | || delai | time | 5 | NULL | |+-------------+-----------+------------------+-------------------+------------+
ENGINEAUTO_INCREMENTTABLE_ROWSAVG_ROW_LENGTHDATA_LENGTH
COLUMN_NAMEDATA_TYPEORDINAL_POSITIONCOLUMN_DEFAULTCOLUMN_KEY
4055_05_C05 Page 196 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 197
chapitre ndeg 5 Controcircle des donneacutees
Remarquez que MySQL utilise
COLUMN_NAME pour renseigner le nom de chaque colonne
DATA_TYPE pour donner le typeMySQL
ORDINAL_POSITION pour renseigner lrsquoordre des colonnes dans la table (utiliseacute en cas deSELECT )
COLUMN_DEFAULT pour preacuteciser la valeur par deacutefaut de chaque colonne
COLUMN_KEY pour donner la composition de la cleacute primaire
Extraction des colonnes caractegraveres
La requecircte suivante deacutecrit en deacutetail les colonnes chaicircnes de caractegraveres de la table Installer
SELECT AS Taille max FROM INFORMATION_SCHEMACOLUMNS WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer AND NUMERIC_PRECISION IS NULL AND DATA_TYPE NOT IN (timestamptimedate)+-------------+-----------+------------+-------------+| COLUMN_NAME | DATA_TYPE | Taille max | IS_NULLABLE |+-------------+-----------+------------+-------------+| nPoste | varchar | 7 | YES || nLog | varchar | 5 | YES |+-------------+-----------+------------+-------------+
Vous pouvez noter que MySQL utilise
IS_NULLABLE pour renseigner le fait qursquoune colonne puisse ecirctre nulle
CHARACTER_OCTET_LENGTH pour renseigner la taille des chaicircnes de caractegraveres pourchaque colonne
Extraction des colonnes numeacuteriques
La requecircte suivante deacutetaille les colonnes numeacuteriques de la table Installer
SELECT COLUMN_NAMEDATA_TYPE AS Taille max
AS Preacutecision
FROM INFORMATION_SCHEMACOLUMNS
WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer
AND CHARACTER_MAXIMUM_LENGTH IS NULL
AND DATA_TYPE NOT IN (timestamptimedate)
+-------------+-----------+------------+-----------+
| COLUMN_NAME | DATA_TYPE | Taille max | Preacutecision |
+-------------+-----------+------------+-----------+
| numIns | int | 10 | 0 |
+-------------+-----------+------------+-----------+
COLUMN_NAMEDATA_TYPECHARACTER_OCTET_LENGTH IS_NULLABLE
NUMERIC_PRECISION
NUMERIC_SCALE
4055_05_C05 Page 197 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
198 copy Eacuteditions Eyrolles
Vous pouvez notez que MySQL utilise
NUMERIC_PRECISION pour renseigner la taille des numeacuteriques pour chaque colonne
NUMERIC_SCALE pour renseigner la preacutecision des numeacuteriques
Extraction des colonnes date-heure
La requecircte suivante extrait toutes les colonnes de type date-heure de la table Installer
SELECT COLUMN_NAMEDATA_TYPECOLUMN_DEFAULT
FROM INFORMATION_SCHEMACOLUMNS
WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer
AND CHARACTER_MAXIMUM_LENGTH IS NULL
AND )
+-------------+-----------+-------------------+
| COLUMN_NAME | DATA_TYPE | COLUMN_DEFAULT |
+-------------+-----------+-------------------+
| dateIns | timestamp | CURRENT_TIMESTAMP |
| delai | time | NULL |
+-------------+-----------+-------------------+
Citons pour en terminer avec cette vue les colonnes
CHARACTER_SET_NAME et COLLATION_NAME qui renseignent sur le jeu de caractegraverespour chaque colonne de la table
COLUMN_COMMENT qui renseigne sur les eacuteventuels commentaires sur chaque colonne
Recherche des contraintes drsquoune table
La vue TABLE_CONSTRAINTS deacutecrit la nature des contraintes La requecircte suivante deacutetailleles contraintes contenues dans la table Installer de la base bdsoutou
SELECT FROM INFORMATION_SCHEMATABLE_CONSTRAINTS WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+-------------------+----------------------------+-----------------+| CONSTRAINT_SCHEMA | CONSTRAINT_NAME | CONSTRAINT_TYPE |+-------------------+----------------------------+-----------------+| bdsoutou | PRIMARY | PRIMARY KEY || bdsoutou | un_installation | UNIQUE || bdsoutou | fk_Installer_nLog_Logiciel | FOREIGN KEY || bdsoutou | fk_Installer_nPoste_Poste | FOREIGN KEY |+-------------------+----------------------------+-----------------+
MySQL utilise
CONSTRAINT_SCHEMA pour indiquer la base de donneacutees qui contient la contrainte (quipeut ecirctre situeacutee dans une autre base de donneacutees que la table elle-mecircme)
DATA_TYPE IN (timestamptimedate
CONSTRAINT_SCHEMACONSTRAINT_NAMECONSTRAINT_TYPE
4055_05_C05 Page 198 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 199
chapitre ndeg 5 Controcircle des donneacutees
CONSTRAINT_NAME pour renseigner le nom de la contrainte Notez ici que MySQLnrsquoextrait pas le nom de ma contrainte (pk_Installer) sans doute est-ce le fait qursquoelleest deacuteclareacutee eacutegalement AUTO_INCREMENT
CONSTRAINT_TYPE pour renseigner le type de chaque contrainte
La valeur CHECK dans la colonne CONSTRAINT_TYPE nrsquoest pas encore prise en charge Vouspouvez toutefois creacuteer des tables avec des contraintes CHECK rien ne se passera si vousinseacuterez des donneacutees non valides et le dictionnaire restera coheacuterent en nrsquoextrayant pas cesinformations
Composition des contraintes drsquoune table
La vue KEY_COLUMN_USAGE deacutecrit la composition des contraintes
Positions
La requecircte suivante permet drsquoextraire la composition des contraintes de la table Installerdans la base bdsoutou et en particulier celle de lrsquouniciteacute du couple (nPostenLog)
SELECT CONSTRAINT_NAME COLUMN_NAME AS Position
AS Position index FROM INFORMATION_SCHEMAKEY_COLUMN_USAGE WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer+----------------------------+-------------+----------+----------------+| CONSTRAINT_NAME | COLUMN_NAME | Position | Position index |+----------------------------+-------------+----------+----------------+| PRIMARY | numIns | 1 | NULL || un_installation | nPoste | 1 | NULL || un_installation | nLog | 2 | NULL || fk_Installer_nLog_Logiciel | nLog | 1 | 1 || fk_Installer_nPoste_Poste | nPoste | 1 | 1 |+----------------------------+-------------+----------+----------------+
MySQL utilise
ORDINAL_POSITION qui indique la position de la colonne dans la contrainte (deacutebutantagrave 1)
POSITION_IN_UNIQUE_CONSTRAINT est eacutevalueacutee agrave NULL pour les index (unique et cleacuteprimaire) Pour les cleacutes eacutetrangegraveres composites elle indique la position de la colonne dansla contrainte
Deacutetails des contraintes reacutefeacuterentielles
Cette mecircme vue permet eacutegalement de retrouver la nature de la reacutefeacuterence pour chaque cleacuteeacutetrangegravere
ORDINAL_POSITION
POSITION_IN_UNIQUE_CONSTRAINT
4055_05_C05 Page 199 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
200 copy Eacuteditions Eyrolles
SELECT CONSTRAINT_NAME COLUMN_NAME AS Cle AS Base cible
AS Table pere
AS Col pere FROM INFORMATION_SCHEMAKEY_COLUMN_USAGE WHERE TABLE_SCHEMA = bdsoutou AND TABLE_NAME=Installer AND REFERENCED_TABLE_SCHEMA IS NOT NULL+----------------------------+--------+------------+------------+----------+| CONSTRAINT_NAME | Cle | Base cible | Table pere | Col pere |+----------------------------+--------+------------+------------+----------+| fk_Installer_nLog_Logiciel | nLog | bdsoutou | logiciel | nLog || fk_Installer_nPoste_Poste | nPoste | bdsoutou | poste | nPoste |+----------------------------+--------+------------+------------+----------+
MySQL utilise
REFERENCED_TABLE_SCHEMA qui indique la base de donneacutees heacutebergeant la tablelaquo pegravere raquo Ici la base donneacutees contient les tables laquo fils raquo et laquo pegraveres raquo mais il se peut que cestables soient dans deux bases distinctes
REFERENCED_TABLE_NAME qui indique le nom de la table laquo pegravere raquo
REFERENCED_COLUMN_NAME qui indique le nom de la colonne reacutefeacuterenceacutee dans la tablelaquo pegravere raquo Ici les noms des colonnes des tables laquo fils raquo et laquo pegravere raquo sont identiques mais il sepeut qursquoils diffegraverent
Recherche du code source drsquoun sous-programme
La vue ROUTINES deacutecrit la composition des sous-programmes (proceacutedures et fonctions cata-logueacutees) La requecircte suivante permet drsquoextraire le code source des sous-programmes stockeacutesdans la base test
SELECT FROM INFORMATION_SCHEMAROUTINES WHERE ROUTINE_SCHEMA = test+--------------+--------------+-----------------------------------------------+| ROUTINE_NAME | ROUTINE_TYPE | ROUTINE_DEFINITION |+--------------+--------------+-----------------------------------------------+| sp1 | PROCEDURE | BEGIN DECLARE v_brevet CHAR(6) SET v_brevet = PROC END || sp2 | FUNCTION | BEGIN DECLARE v_brevet CHAR(3) SET v_brevet = FCT RETURN v_brevet END |+--------------+--------------+-----------------------------------------------+
REFERENCED_TABLE_SCHEMA
REFERENCED_TABLE_NAME
REFERENCED_COLUMN_NAME
ROUTINE_NAMEROUTINE_TYPEROUTINE_DEFINITION
4055_05_C05 Page 200 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 201
chapitre ndeg 5 Controcircle des donneacutees
MySQL utilise
ROUTINE_SCHEMA qui indique le nom de la base heacutebergeant le sous-programme
ROUTINE_NAME qui indique le nom du sous-programme
ROUTINE_TYPE qui indique la nature du sous-programme
ROUTINE_DEFINITION qui liste le code MySQL du sous-programme
Citons pour en terminer avec cette vue les colonnes
SECURITY_TYPE qui renseigne sur les privilegraveges associeacutes agrave la vue lors de son exeacutecution(soit les privilegraveges de lrsquoutilisateur creacuteateur definer soit ceux de lrsquoutilisateur qui lancelrsquoexeacutecution invoker)
CREATED et LAST_ALTERED pour stocker la date de creacuteation du sous-programme etlrsquoinstant de la derniegravere compilation
DEFINER qui indique lrsquoidentiteacute de lrsquoutilisateur qui a creacuteeacute le sous-programme
ROUTINE_COMMENT qui stocke un eacuteventuel commentaire relatif au sous-programme(initialiseacute lors de la compilation)
Privilegraveges des utilisateurs drsquoune base de donneacutees
On retrouve les diffeacuterents niveaux de privilegraveges eacutetudieacutes en deacutebut de chapitre
Au niveau global
La vue USER_PRIVILEGES liste les privilegraveges des accegraves utilisateurs au niveau global (lesdonneacutees viennent de la table mysqluser) La requecircte suivante extrait les privilegraveges dePaul et de Jules (en accegraves distant ou en local) Non vous ne recircvez pas trois simples quotessont neacutecessaires pour tester la valeur de la colonne GRANTEE
SELECT
FROM INFORMATION_SCHEMAUSER_PRIVILEGES
WHERE GRANTEE LIKE Paul OR GRANTEE LIKE Jules
+------------------------+----------------+--------------+
| GRANTEE | PRIVILEGE_TYPE | IS_GRANTABLE |
+------------------------+----------------+--------------+
| Paullocalhost | USAGE | NO |
| Juleslocalhost | USAGE | NO |
| Paul1921684173 | SELECT | NO |
| Paul1921684173 | CREATE | NO |
+------------------------+----------------+--------------+
GRANTEEPRIVILEGE_TYPEIS_GRANTABLE
4055_05_C05 Page 201 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
202 copy Eacuteditions Eyrolles
MySQL utilise
GRANTEE qui indique le nom de lrsquoaccegraves utilisateur
PRIVILEGE_TYPE qui indique le type du privilegravege
IS_GRANTABLE qui renseigne sur la possibiliteacute que lrsquoaccegraves utilisateur puisse retransmet-tre le privilegravege acquis (reccedilu avec WITH GRANT OPTION)
Au niveau database
La vue SCHEMA_PRIVILEGES possegravede la mecircme structure que la preacuteceacutedente en ajoutant lacolonne TABLE_SCHEMA Celle-ci donne le nom de la base de donneacutees concerneacutee par lesprivilegraveges des accegraves utilisateurs (les donneacutees viennent de la table dbuser) La requecirctesuivante extrait les privilegraveges au niveau database de Paul en accegraves distant ou local
SELECT GRANTEEPRIVILEGE_TYPEIS_GRANTABLE FROM INFORMATION_SCHEMASCHEMA_PRIVILEGES WHERE GRANTEE LIKE Paul+--------------+------------------------+----------------+--------------+| TABLE_SCHEMA | GRANTEE | PRIVILEGE_TYPE | IS_GRANTABLE |+--------------+------------------------+----------------+--------------+| bdpaul | Paul1921684173 | SELECT | NO || bdpaul | Paullocalhost | DROP | NO || bdpaul | Paullocalhost | CREATE ROUTINE | NO |+--------------+------------------------+----------------+--------------+
Au niveau table
La vue TABLE_PRIVILEGES possegravede la mecircme structure que la preacuteceacutedente en ajoutant lacolonne TABLE_NAME Celle-ci donne le nom de la table concerneacutee par les privilegraveges desaccegraves utilisateurs (les donneacutees viennent de la table mysqltables_priv) La requecirctesuivante extrait les privilegraveges au niveau table de Paul en accegraves distant ou local
SELECT AS BaseTable GRANTEEPRIVILEGE_TYPE AS Privilege FROM INFORMATION_SCHEMATABLE_PRIVILEGES WHERE GRANTEE LIKE Paul+--------------------------------------+------------------------+-----------+| | GRANTEE | Privilege |+--------------------------------------+------------------------+-----------+| bdsoutouVueDesCompagniesJoursFeries | Paullocalhost | SELECT || bdpaulLivre | Paul1921684173 | SELECT || bdpaulLivre | Paullocalhost | SELECT || bdpaulLivre | Paullocalhost | DELETE |+--------------------------------------+------------------------+-----------+
TABLE_SCHEMA
CONCAT(TABLE_SCHEMATABLE_NAME)
BaseTable
4055_05_C05 Page 202 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 203
chapitre ndeg 5 Controcircle des donneacutees
Au niveau column
La vue COLUMN_PRIVILEGES possegravede la mecircme structure que la preacuteceacutedente en ajoutant lacolonne COLUMN_NAME Celle-ci preacutecise le nom de la colonne concerneacutee par les privilegravegesdes accegraves utilisateurs (les donneacutees viennent de la table mysql columns_priv) La requecirctesuivante extrait les privilegraveges au niveau column de Paul en accegraves distant ou local sur la basebdpaul
SELECT CONCAT(TABLE_NAME ) AS Tablecolonne
GRANTEEPRIVILEGE_TYPE AS Privilege
FROM INFORMATION_SCHEMACOLUMN_PRIVILEGES
WHERE TABLE_SCHEMA=bdpaul
+---------------+--------------------+-----------+
| Tablecolonne | GRANTEE | Privilege |
+---------------+--------------------+-----------+
| LivreISBN | Paullocalhost | UPDATE |
+---------------+--------------------+-----------+
Au niveau routine
Se reporter au niveau database
Commande SHOWLa commande SHOW permet drsquoextraire facilement des informations provenant du dictionnairedes donneacutees Elle est bien sucircr agrave lrsquoinverse plus limiteacutee que lrsquoeacutecriture drsquoune requecircte SELECT ndashqui pourra toujours extraire les mecircmes informations mais en interrogeant les vues adeacutequatesLa copie drsquoeacutecran suivante illustre la commande SHOW TABLES qui restitue une reacuteponse agrave laquestion laquo Quelles sont les tables et les vues preacutesentes dans la base de donneacutees en coursdrsquoutilisation raquo
COLUMN_NAME
Figure 5-12 Exemple de SHOW pour lister les tables drsquoun scheacutema
4055_05_C05 Page 203 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
204 copy Eacuteditions Eyrolles
Le tableau suivant deacutecrit quelques exemples qui vous seront peut-ecirctre utiles
Tableau 5-26 Exemples de SHOW
Commande Reacutesultat
SHOW COLUMNS FROM Installer FROM bdsoutou LIKE n
Liste des colonnes dont le nom commence parn dans la table Installer de la basebdsoutou
SHOW CREATE DATABASE bdsoutou Options de creacuteation de la base bdsoutou
SHOW CREATE TABLE bdsoutouInstaller Description totale de lrsquoinstruction permettant decreacuteer la table Installer de la base bdsou-tou
SHOW DATABASES Liste des bases preacutesentes sur le serveur
SHOW ENGINES Liste des moteurs de stockage utilisables sur leserveur
SHOW ERRORS Libelleacute de lrsquoerreur SQL courante
SHOW GRANTS FOR Paullocalhost Pour un accegraves utilisateur liste de ses privilegravegesaux niveaux global database column et rou-tine
SHOW INDEX FROM Installer FROM bdsoutou Description des index de la table Installerde la base bdsoutou
SHOW PRIVILEGES Liste de tous les privilegraveges possibles
SHOW TABLE STATUS FROM bdsoutou LIKE S
Caracteacuteristiques physiques des tables dont lenom commence par S dans la base bdsoutou
SHOW TABLES FROM mysql Liste des tables de la base mysql
SHOW TRIGGERS Caracteacuteristiques des deacuteclencheurs preacutesentssur le serveur
4055_05_C05 Page 204 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 205
chapitre ndeg 5 Controcircle des donneacutees
Exercices
Les objectifs de ces exercices sont
de creacuteer des vues monotables et multitables
drsquoinseacuterer des enregistrements dans des vues
drsquoeffectuer une mise agrave jour conditionneacutee via une vue
51 Vues monotables
Vues sans contraintes
Eacutecrire le script vuessql permettant de creacuteer
bull La vue LogicielsUnix qui contient tous les logiciels de type UNIX (toutes les colonnes sontconserveacutees) Veacuterifier la structure et le contenu de la vue (DESCRIBE et SELECT)
bull La vue Poste_0 de structure (nPos0 nomPoste0 nSalle0 TypePoste0 indIP ad0) quicontient tous les postes du rez-de-chausseacutee (etage=0 au niveau de la table Segment) Faireune jointure proceacutedurale sinon la vue sera consideacutereacutee comme une vue multitable Veacuterifier la struc-ture et le contenu de la vue
Inseacuterer deux nouveaux postes dans la vue tels qursquoun poste soit connecteacute au segment du rez-de-chausseacutee et lrsquoautre agrave un segment drsquoun autre eacutetage Veacuterifier le contenu de la vue et celui de la tableConclusion
Supprimer ces deux enregistrements de la table Poste
Reacutesoudre une requecircte complexe
Creacuteer la vue SallePrix de structure (nSalle nomSalle nbPoste prixLocation) quicontient les salles et leur prix de location pour une journeacutee (en fonction du nombre de postes) Lemontant de la location drsquoune salle agrave la journeacutee sera drsquoabord calculeacute sur la base de 100 euro par posteServez-vous de lrsquoexpression 100nbPoste dans la requecircte de deacutefinition
Veacuterifier le contenu de la vue puis afficher les salles dont le prix de location deacutepasse 150 euro
Ajouter la colonne tarif de type SMALLINT(4) agrave la table Types Mettre agrave jour cette table demaniegravere agrave inseacuterer les valeurs suivantes
Tableau 5-27 Tarifs des postes
Type du poste Tarif en euro
TX 50
PCWS 100
PCNT 120
UNIX 200
NC 80
BeOS 400
4055_05_C05 Page 205 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie I SQL de base
206 copy Eacuteditions Eyrolles
Creacuteer la vue SalleIntermediaire de structure (nSalle typePoste nombre tarif) detelle sorte que le contenu de la vue reflegravete le tarif ajusteacute des salles en fonction du nombre et du typedes postes de travail Il srsquoagit de grouper par salle type et tarif (tout en faisant une jointure avec la tableTypes pour les tarifs) et de compter le nombre de postes pour avoir le reacutesultat suivant
+--------+-----------+--------+-------+
| nSalle | typePoste | nombre | tarif |
+--------+-----------+--------+-------+
| s01 | TX | 2 | 50 |
| s01 | UNIX | 2 | 200 |
| s02 | PCWS | 2 | 100 |
| s03 | TX | 1 | 50 |
| |
Agrave partir de la vue SalleIntermediaire creacuteer la vue SallePrixTotal(nSalle PrixReel)qui reflegravete le prix reacuteel de chaque salle (par exemple la s01 sera factureacutee 250 + 1200 = 300 euro) Veacuteri-fier le contenu de cette vue
Afficher les salles les plus eacuteconomiques agrave la location
Vues avec contraintes
Remplacer la vue Poste0 en rajoutant lrsquooption de controcircle (CHECK OPTION) Tenter drsquoinseacuterer unposte appartenant agrave un eacutetage diffeacuterent du rez-de-chausseacutee
Creacuteer la vue Installer0 de structure (nPoste nLog dateIns) ne permettant de travaillerqursquoavec les postes du rez-de-chausseacutee tout en interdisant lrsquoinstallation drsquoun logiciel de type PCNTTenter drsquoinseacuterer deux postes dans cette vue ne correspondant pas agrave ces deux contraintes un postedrsquoun eacutetage puis un logiciel de type PCNT Inseacuterer lrsquoenregistrement p6 log2 qui doit passer agrave traversla vue
52 Vue multitable
Creacuteer la vue SallePoste de structure (nomSalle nomPoste adrIP nomTypePoste)permettant drsquoextraire toutes les installations sous la forme suivante
SELECT FROM SallePoste
+----------+----------+---------------+-------------------+
| nomSalle | nomPoste | adrIP | nomTypePoste |
+----------+----------+---------------+-------------------+
| Salle 1 | Poste 1 | 1301208001 | Terminal X-Window |
| Salle 1 | Poste 2 | 1301208002 | Systegraveme Unix |
| Salle 1 | Poste 3 | 1301208003 | Terminal X-Window |
| |
4055_05_C05 Page 206 Jeudi 2 mars 2006 204 14 gt Apogee FrameMaker Noir
Partie II
Programmation proceacutedurale
4055_07a_P03 Page 288 Jeudi 2 mars 2006 206 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
209
Chapitre 6
Bases du langage
de programmation
Ce chapitre deacutecrit les caracteacuteristiques geacuteneacuterales du langage proceacutedural de programmation deMySQL
structure drsquoun programme
deacuteclaration et affectation de variables
structures de controcircle (
si
tant que
reacutepeacuteter
pour
)
meacutecanismes drsquointeraction avec la base
programmation de transactions
Geacuteneacuteraliteacutes
Les structures de controcircle habituelles drsquoun langage (
IF
WHILE
hellip) ne font pas partie inteacute-grante de la norme SQL Elles apparaissent dans une sous-partie optionnelle de la norme(ISOIEC 9075-51996
Flow-control statements
) MySQL les prend en compte
Le langage proceacutedural de MySQL est une extension de SQL car il permet de faire cohabiterles habituelles structures de controcircle (
si
pour
et
tant que
pour les plus connues) avec desinstructions SQL (principalement
SELECT
INSERT
UPDATE
et
DELETE
)
Environnement client-serveur
Dans un environnement client-serveur chaque instruction SQL donne lieu agrave lrsquoenvoi drsquounmessage du client vers le serveur suivi de la reacuteponse du serveur vers le client Il est preacutefeacuterablede travailler avec un sous-programme (qui sera stockeacute en fait cocircteacute serveur) plutocirct qursquoavecune suite drsquoinstructions SQL susceptibles drsquoencombrer le trafic reacuteseau En effet un bloc donnelieu agrave un seul eacutechange sur le reacuteseau entre le client et le serveur Les reacutesultats intermeacutediairessont traiteacutes cocircteacute serveur et seul le reacutesultat final est retourneacute au client
4055_06_C06 Page 209 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
Partie II Programmation proceacutedurale
210
copy Eacuteditions Eyrolles
Avantages
Les principaux avantages drsquoutiliser des sous-programmes (proceacutedures ou fonctions catalo-gueacutees qui sont stockeacutees cocircteacute serveur) sont
La modulariteacute un sous-programme peut ecirctre composeacute drsquoautres blocs drsquoinstructions Unsous-programme peut aussi ecirctre reacuteutilisable car il peut ecirctre appeleacute par un autre
La portabiliteacute un sous-programme est indeacutependant du systegraveme drsquoexploitation qui heacutebergele serveur MySQL En changeant de systegraveme les applicatifs nrsquoont pas agrave ecirctre modifieacutes
Lrsquointeacutegration avec les donneacutees des tables on retrouvera avec ce langage proceacutedural tousles types de donneacutees et drsquoinstructions disponibles sous MySQL des meacutecanismes pourparcourir des reacutesultats de requecirctes (curseurs) pour traiter des erreurs (
handlers
) et pourprogrammer des transactions (
COMMIT
ROLLBACK
SAVEPOINT
)
La seacutecuriteacute car les sous-programmes srsquoexeacutecutent dans un environnement
a priori
seacutecuriseacute(SGBD) ougrave il est plus facile de garder la maicirctrise sur les ordres SQL exeacutecuteacutes et donc surles agissements des utilisateurs
Structure drsquoun bloc
Un bloc drsquoinstructions est composeacute de
BEGIN
(section obligatoire) contient le code incluant ou non des directives SQL se termi-nant par le symbole laquo raquo
DECLARE
(directive optionnelle) deacuteclare une variable un curseur une exception etc
END
ferme le bloc
Un bloc peut ecirctre imbriqueacute dans un autre bloc Pour tester un bloc nous verrons dans lasection
Tests des exemples
qursquoil faut lrsquoinclure dans une proceacutedure catalogueacutee MySQL neprend pas encore en charge les proceacutedures anonymes (sans nom)
Figure 6-1
Trafic sur le reacuteseau drsquoinstructions SQL
CALL Bloc
SGBDExeacutecution globale
SELECT hellip
UPDATE hellip
INSERT INTO helliphellip
SGBDExeacutecution requecircte par requecircte
Client
Bloc
Suitedrsquoinstructions Serveur
BEGINSELECT hellip
UPDATE hellip
INSERT INTOhelliphellipEND
4055_06_C06 Page 210 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
211
chapitre ndeg 6 Bases du langage de programmation
Porteacutee des objets
La porteacutee drsquoun objet (variable curseur ou exception) est la zone du programme qui peut yacceacuteder Un objet deacuteclareacute dans un bloc est accessible dans les sous-blocs En revanche unobjet deacuteclareacute dans un sous-bloc nrsquoest pas visible du bloc supeacuterieur (principe des accolades deslangages C et Java)
Casse et lisibiliteacute
Comme SQL les sous-programmes sont capables drsquointerpreacuteter les caractegraveres alphanumeacuteri-ques du jeu de caractegraveres seacutelectionneacute Aucun objet manipuleacute par programme nrsquoest sensible agrave lacasse (
not case sensitive
) Ainsi
numeroBrevet
et
NumeroBREVET
deacutesignent le mecircmeidentificateur (tout est traduit en minuscules au niveau du dictionnaire des donneacutees) Lesregravegles drsquoeacutecriture classiques concernant lrsquoindentation et les espaces entre variables mots-cleacuteset instructions doivent ecirctre respecteacutees dans un souci de lisibiliteacute
Figure 6-2
Structure drsquoun bloc drsquoinstructions MySQL
BEGIN[DECLARE deacuteclaration]hellip-- codehellip
hellipEND
BEGIN[DECLARE deacuteclaration ]-- codehellipEND
BEGIN[DECLARE deacuteclaration ]-- codehellipEND
Figure 6-3
Visibiliteacute des objets
BEGINDECLARE v_brevet CHAR(6)hellip-- v_brevet accessible
hellip
END
BEGINDECLARE v_nom VARCHAR (20)-- v_brevet et v_nom accessibleshellipEND
v_nom inaccessible
Tableau 6-1 Lisibiliteacute du code
Peu lisible Crsquoest mieux
IF xgty THEN SET max=xELSE SET max=yEND IF IF xgty THEN SET max=xELSE SET max=yEND IF
4055_06_C06 Page 211 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
Partie II Programmation proceacutedurale
212
copy Eacuteditions Eyrolles
Identificateurs
Avant de parler des diffeacuterents types de variables MySQL deacutecrivons comment il est possiblede nommer les objets des sous-programmes Un identificateur commence par une lettre (ou unchiffre) Un identificateur nrsquoest pas limiteacute en nombre de caractegraveres Les autres signes pourtantconnus du langage sont interdits comme le montre le tableau suivant
Commentaires
MySQL prend en charge deux types de commentaires monolignes commenccedilant au symbolelaquo
--
raquo et finissant agrave la fin de la ligne et multilignes commenccedilant par laquo
raquo
et finissant parlaquo
raquo
Le tableau suivant deacutecrit quelques exemples
Variables
Un sous-programme est capable de manipuler des variables qui sont deacuteclareacutees (et eacuteventuelle-ment initialiseacutees) par la directive
DECLARE
Ces variables permettent de transmettre desvaleurs agrave des sous-programmes via des paramegravetres ou drsquoafficher des eacutetats de sortie souslrsquointerface Deux types de variables sont disponibles sous MySQL
scalaires recevant une seule valeur drsquoun type SQL (ex colonne drsquoune table)
externes deacutefinies dans la session et qui peuvent servir de paramegravetres drsquoentreacutee ou de sortie
Tableau 6-2 Identificateurs
Autoriseacutes Interdits
t2code_brevet2nombresMysql_t
moiamptoi
(symbole laquo amp raquo)
debit-credit
(symbole laquo - raquo)
onoff
(symbole laquo raquo)
code brevet
(symbole espace)
Tableau 6-3 Commentaires
Sur une ligne Sur plusieurs lignes
SELECT nbHVol INTO v_nbHVol FROM Pilote WHERE nom = Gratien VielSET v_bonus = v_nbHVol015
SELECT salaire INTO v_salaire FROM Pilote
WHERE nom = Thierry Albaric
SET v_bonus = v_salaire015
-- Lecture de la table Pilote
ndash- Extraction heures de vol
-- Calcul
Lecture de la table Pilote
Extraction du salairepour calculer le bonus
Calcul
4055_06_C06 Page 212 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles
213
chapitre ndeg 6 Bases du langage de programmation
Variables scalaires
La deacuteclaration drsquoune variable scalaire est de la forme suivante
DECLARE
nomVariable1
[
nomVariable2
]
typeMSQL
[DEFAULT
expression
]
DEFAULT
permet drsquoinitialiser la (ou les) variable(s) ndash pas forceacutement agrave lrsquoaide drsquoune cons-tante Le tableau suivant deacutecrit quelques exemples
Affectations
Il existe plusieurs possibiliteacutes pour affecter une valeur agrave une variable
lrsquoaffectation comme on la connaicirct dans les langages de programmation (
SET
variable
expression) Vous pouvez aussi utiliser le symbole laquo = raquo mais il est plus prudentde le reacuteserver agrave la programmation de conditions
la directive DEFAULT
la directive INTO drsquoune requecircte (SELECT hellip INTO variable FROM hellip)
Restrictions
Le type tableau (array) nrsquoest pas encore preacutesent dans le langage de MySQL Cela peut ecirctrepeacutenalisant quand on deacutesire travailler en interne avec des reacutesultats drsquoextractions de taillemoyenne
Il est impossible drsquoutiliser un identificateur dans une expression srsquoil nrsquoest pas deacuteclareacute au preacutea-lable Ici la deacuteclaration de la variable v_maxi est incorrecte
DECLARE v_maxi INT DEFAULT 2 v_mini
DECLARE v_mini INT DEFAULT 15
Tableau 6-4 Deacuteclarations
Deacuteclarations Commentaires
DECLARE v_dateNaissance DATE Deacuteclare la variable sans lrsquoinitialiser Eacutequivalent agrave SET v_dateNaissance = NULL
DECLARE v_capacite SMALLINT(4) DEFAULT 999 Initialise la variable agrave 999
DECLARE v_trouve BOOLEAN DEFAULT TRUE Initialise la variable agrave vrai (1)
DECLARE v_Dans2jours DATE DEFAULT ADDDATE(SYSDATE()2)
Initialise la variable agrave dans 2 jours
=
4055_06_C06 Page 213 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
Partie II Programmation proceacutedurale
214 copy Eacuteditions Eyrolles
Comme la plupart des langages reacutecents les deacuteclarations multiples sont permises Celle qui suitest juste
DECLARE INT
Reacutesolution de noms
Lors des conflits potentiels de noms (variables ou colonnes) dans des instructions SQL (prin-cipalement INSERT UPDATE DELETE et SELECT) le nom de la variable est prioritairementinterpreacuteteacute au deacutetriment de la colonne de la table (de mecircme nom)
Dans lrsquoexemple suivant lrsquoinstruction DELETE supprime tous les pilotes de la table (et non passeulement le pilote de nom Placide Fresnais) car MySQL considegravere les deux identificateurscomme eacutetant la mecircme variable et non pas comme colonne de la table et variable
DECLARE nom VARCHAR(16) DEFAULT Placide Fresnais
DELETE FROM Pilote WHERE
Pour se preacutemunir de tels effets de bord une seule solution existe elle consiste agrave nommertoutes les variables diffeacuteremment des colonnes (en utilisant un preacutefixe par exemple) Uneautre solution serait drsquoutiliser une eacutetiquette de bloc (block label) pour lever drsquoeacuteventuellesambiguiumlteacutes Bien qursquoil soit possible drsquoemployer des eacutetiquettes de blocs (aussi disponibles pourles structures de controcircle) on ne peut pas encore preacutefixer des variables pour en distinguer unede mecircme nom entre diffeacuterents blocs
Opeacuterateurs
Les opeacuterateurs SQL eacutetudieacutes au chapitre 4 (logiques arithmeacutetiques de concateacutenationhellip) sontdisponibles au sein drsquoun sous-programme Les regravegles de prioriteacute sont les mecircmes que dans lecas de SQL
Lrsquoopeacuterateur IS NULL permet de tester une formule avec la valeur NULL Toute expressionarithmeacutetique contenant une valeur nulle est eacutevalueacutee agrave NULL
Le tableau suivant illustre quelques utilisations possibles drsquoopeacuterateurs logiques
i j k
nom = nom
Tableau 6-5 Eacuteviter les ambiguiumlteacutes
Preacutefixer les variables Eacutetiquette de bloc (preacutefixe pas opeacuterationnel)
DECLARE v_nom VARCHAR(16) DEFAULT Placide FresnaishellipDELETE FROM Pilote WHERE --ouDELETE FROM Pilote WHERE
DECLARE nom VARCHAR(16) DEFAULT Placide Fresnais DELETE FROM Pilote WHERE principalnom = nom
nom = v_nom
v_nom = nom
principal BEGIN
END principal
4055_06_C06 Page 214 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 215
chapitre ndeg 6 Bases du langage de programmation
Variables de session
Il est possible de passer en paramegravetres drsquoentreacutee drsquoun bloc des variables externes Ces variablessont dites de session (user variables) Elles nrsquoexistent que durant la session On deacuteclare cesvariables en ligne de commande agrave lrsquoaide du symbole laquo raquo
SET [ var2 = expression2]
Le tableau suivant illustre un exemple de deux variables de session on extrait le nom et lenombre drsquoheures de vol drsquoun pilote (table deacutecrite au deacutebut du chapitre 4) augmenteacute drsquounnombre en paramegravetre Son numeacutero de brevet et la dureacutee du vol sont lus au clavier Ces varia-bles de session ne sont bien sucircr pas agrave deacuteclarer dans le bloc
Conventions recommandeacutees
Adoptez les conventions drsquoeacutecriture suivantes pour que vos programmes MySQL soient plusfacilement lisibles et maintenables
Tableau 6-6 Utilisation drsquoopeacuterateurs
Code MySQL Commentaires
DECLARE v_compteur INT(3) DEFAULT 0DECLARE v_boolean BOOLEANDECLARE v_nombre INT(3)
Trois deacuteclarations dont une avec initialisation
SET v_compteur = v_compteur+1 Increacutementation de v_compteur (opeacuterateur +)
SET v_boolean = (v_compteur=v_nombre) v_boolean reccediloit NULL car la condition est fausse
SET v_boolean = (v_nombre IS NULL) v_boolean reccediloit TRUE (1 en fait) car la condi-tion est vraie
var1 = expression1
Tableau 6-7 Variables de session
Code MySQL Reacutesultat
hellipBEGIN DECLARE v_nom CHAR(16) DECLARE v_nbHVol DECIMAL(72) SELECT nomnbHVol INTO v_nom v_nbHVol FROM Pilote WHERE brevet = SET v_nbHVol = v_nbHVol + SELECT v_nom v_nbHVolEND
+------------------+----------+| v_nom | v_nbHVol |+------------------+----------+| Placide Fresnais | 246500 |+------------------+----------+
WebSET vs_num = PL-4$SET vs_hvol = 15$
vs_numvs_hvol
4055_06_C06 Page 215 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
Partie II Programmation proceacutedurale
216 copy Eacuteditions Eyrolles
Test des exemples
Parce qursquoil nrsquoest pas encore possible drsquoexeacutecuter des blocs anonymes (sous-programme sansnom et qui nrsquoest pas stockeacute dans la base) vous devez les inclure dans une proceacutedure catalo-gueacutee que vous appellerez dans lrsquointerface de commande
Lrsquoexemple suivant extrait le nombre drsquoheures de vol du pilote de nom Placide FresnaisPensez agrave redeacutefinir le deacutelimiteur agrave laquo $ raquo (par exemple) pour pouvoir utiliser dans le bloc lesymbole laquo raquo pour terminer chaque instruction
Le reacutesultat dans lrsquointerface de commande est le suivant Allez-y tester vos exemples mainte-nant
Tableau 6-8 Conventions
Objet Convention Exemple
Variable v_nomVariable v_compteur
Constante c_nomConstante c_pi
Variable de session (globale) vs_nomVariable vs_brevet
Tableau 6-9 Tester un exemple de bloc
Preacutefixer les variables Commentaire
delimiter $SET vs_nom = Placide Fresnais$
Deacuteclaration du deacutelimiteur et drsquoune variable de session
DROP PROCEDURE sp1$ Suppression de la proceacutedure
CREATE PROCEDURE sp1() Creacuteation de la proceacutedure
BEGIN DECLARE v_nbHVol DECIMAL(72) SELECT nbHVol INTO v_nbHVol FROM Pilote WHERE nom = vs_nom SELECT v_nbHVolEND$
Bloc drsquoinstructions
Trace du reacutesultatFin du bloc
CALL sp1()$ Appel de la proceacutedure
Web
4055_06_C06 Page 216 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 217
chapitre ndeg 6 Bases du langage de programmation
Structures de controcircle
En tant que langage proceacutedural MySQL offre la possibiliteacute de programmer
les structures conditionnelles si et cas (IFhellip et CASE)
des structures reacutepeacutetitives tant que reacutepeacuteter et boucle sans fin (WHILE REPEAT et LOOP)
Pas de structure FOR pour lrsquoinstant Deux directives suppleacutementaires qui sont toutefois agrave utiliseravec modeacuteration LEAVE qui sort drsquoune boucle (ou drsquoun bloc eacutetiqueteacute) et ITERATE qui force leprogramme agrave refaire un tour de boucle depuis le deacutebut
Structures conditionnelles
MySQL propose deux structures pour programmer des actions conditionneacutees la structure IFet la structure CASE
Trois formes de IF
Suivant les tests agrave programmer on peut distinguer trois formes de structure IF IF-THEN (si-alors) IF-THEN-ELSE (avec le sinon agrave programmer) et IF-THEN-ELSEIF (imbricationsde conditions)
Le tableau suivant donne lrsquoeacutecriture des diffeacuterentes structures conditionnelles IF Notezlaquo END IF raquo en fin de structure et non pas laquo ENDIF raquo Lrsquoexemple affiche un message diffeacute-rent selon la nature du numeacutero de teacuteleacutephone contenu dans la variable v_telephone
Figure 6-4 Exeacutecution drsquoun bloc
4055_06_C06 Page 217 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
Partie II Programmation proceacutedurale
218 copy Eacuteditions Eyrolles
Conditions booleacuteennes
Les tableaux suivants preacutecisent le reacutesultat drsquoopeacuterateurs logiques qui mettent en jeu des varia-bles booleacuteennes pouvant prendre trois valeurs (TRUE FALSE NULL) Bien sucircr en lrsquoabsencedrsquoun vrai type booleacuteen MySQL repreacutesente TRUE avec 1 et FALSE avec 0 Il est agrave noter que laneacutegation de NULL (NOT NULL) renvoie une valeur nulle
Structure CASE
Comme lrsquoinstruction IF la structure CASE permet drsquoexeacutecuter une seacutequence drsquoinstructions enfonction de diffeacuterentes conditions La structure CASE est utile lorsqursquoil faut eacutevaluer une mecircmeexpression et proposer plusieurs traitements pour diverses conditions
Tableau 6-10 Structures IF
IF-THEN IF-THEN-ELSE IF-THEN-ELSEIF
IF condition THEN instructionsEND IF
IF condition THEN instructionsELSE instructionsEND IF
IF condition1 THEN instructionsELSEIF condition2 THEN instructions2 ELSE instructions3END IF
BEGIN DECLARE v_telephone CHAR(14) DEFAULT 06-76-85-14-89 SELECT Cest un portable ELSE SELECT Cest un fixe END IFEND
IF SUBSTR(v_telephone12)=06 THEN
Tableau 6-11 Opeacuterateur AND
AND TRUE FALSE NULL
TRUE TRUE FALSE NULL
FALSE FALSE FALSE FALSE
NULL NULL FALSE NULL
Tableau 6-12 Opeacuterateur OR
OR TRUE FALSE NULL
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL
4055_06_C06 Page 218 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 219
chapitre ndeg 6 Bases du langage de programmation
Selon la nature de lrsquoexpression et des conditions une des deux eacutecritures suivantes peut ecirctreutiliseacutee
Le tableau suivant nous livre lrsquoeacutecriture avec IF drsquoune programmation qursquoil est plus rationneldrsquoeffectuer avec une structure CASE (de type searched)
Structures reacutepeacutetitives
Eacutetudions agrave preacutesent les trois structures reacutepeacutetitives tant que reacutepeacuteter et boucle sans fin
Structure tant que
La structure tant que se programme agrave lrsquoaide de la syntaxe suivante Avant chaque iteacuteration (etnotamment avant la premiegravere) la condition est eacutevalueacutee Si elle est vraie la seacutequence drsquoinstruc-tions est exeacutecuteacutee puis la condition est reacuteeacutevalueacutee pour un eacuteventuel nouveau passage dans la
Tableau 6-13 Structures CASE
CASE searched CASE
CASE variable WHEN expr1 THEN instructions1 WHEN expr2 THEN instructions2 hellip WHEN exprN THEN instructionsN [ELSE instructionsN+1]END CASE
CASE WHEN condition1 THEN instructions1 WHEN condition2 THEN instructions2 hellip WHEN conditionN THEN instructionsN [ELSE instructionsN+1]END CASE
Tableau 6-14 Diffeacuterentes programmations
IF CASE
BEGINDECLARE v_mention CHAR(2)DECLARE v_note DECIMAL(42) DEFAULT 98
IF v_note gt= 16 THEN SET v_mention = TB ELSEIF v_note gt= 14 THEN SET v_mention = B ELSEIF v_note gt= 12 THEN SET v_mention = AB ELSEIF v_note gt= 10 THEN SET v_mention = P ELSE END IF
CASE WHEN v_note gt= 16 THEN SET v_mention = TB WHEN v_note gt= 14 THEN SET v_mention = B WHEN v_note gt= 12 THEN SET v_mention = AB WHEN v_note gt= 10 THEN SET v_mention = P ELSE SET v_mention = REND CASE
Web
SET v_mention = R
4055_06_C06 Page 219 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
Partie II Programmation proceacutedurale
220 copy Eacuteditions Eyrolles
boucle Ce processus continue jusqursquoagrave ce que la condition soit fausse pour passer en seacutequenceapregraves le END WHILE Quand la condition nrsquoest jamais fausse on dit que le programme bouclehellip
[etiquette] WHILE condition DO
instructions
END WHILE [etiquette]
Le tableau suivant deacutecrit la programmation de deux tant que Le premier calcule la somme des100 premiers entiers Le second recherche le premier numeacutero 4 dans une chaicircne de caractegraveres
Cette structure est la plus puissante car elle permet de programmer aussi un reacutepeacuteter uneboucle sans fin et mecircme un pour (qui nrsquoest pas encore opeacuterationnel) Elle doit ecirctre utiliseacuteequand il est neacutecessaire de tester une condition avant drsquoexeacutecuter les instructions contenues dansla boucle
Structure reacutepeacuteter
La structure reacutepeacuteter se programme agrave lrsquoaide de la syntaxe REPEAThellip UNTIL
Enfin un reacutepeacuteter qui se programme comme il faut (agrave savoir laquo reacutepeacuteterhellip jusqursquoagrave condition raquo) Leslangages C et Java nous avaient deacuteformeacute cette traduction par do hellip while(condition)qui neacutecessite drsquoeacutecrire lrsquoinverse de la condition du jusqursquoagrave de lrsquoalgorithmique Ouf MySQL(comme Oracle) a bien programmeacute la structure reacutepeacuteter en traduisant ce fameux jusqursquoagrave par ladirective until et non plus par ce facirccheux while
Tableau 6-15 Structures tant que
Condition simple Condition composeacutee
DECLARE v_somme INT DEFAULT 0DECLARE v_entier SMALLINT DEFAULT 1
SET v_somme = v_somme+v_entier SET v_entier = v_entier+1
SELECT v_somme
+---------+| v_somme |+---------+| 5050 |+---------+
DECLARE v_telephone CHAR(14) DEFAULT 06-76-85-14-89DECLARE v_trouve BOOLEAN DEFAULT FALSEDECLARE v_indice SMALLINT DEFAULT 1
IF SUBSTR(v_telephonev_indice1) = 4 THEN SET v_trouve = TRUE ELSE SET v_indice = v_indice + 1 END IF
IF v_trouve THEN SELECT CONCAT(Trouveacute 4 agrave lindice v_indice)END IF
Trouveacute 4 agrave lindice 11
Web
WHILE (v_entier lt= 100) DO
END WHILEWHILE (v_indice lt= 14 AND NOT v_trouve) DO
END WHILE
4055_06_C06 Page 220 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 221
chapitre ndeg 6 Bases du langage de programmation
[etiquette] REPEAT
instructions
UNTIL condition END REPEAT [etiquette]
La particulariteacute de cette structure est que la premiegravere iteacuteration est effectueacutee quelles que soientles conditions initiales La condition nrsquoest eacutevalueacutee qursquoen fin de boucle
Si la condition est fausse la seacutequence drsquoinstructions est de nouveau exeacutecuteacutee Ce processuscontinue jusqursquoagrave ce que la condition soit vraie pour passer en seacutequence apregraves le END REPEAT
Quand la condition nrsquoest jamais vraie on dit aussi que le programme bouclehellip
Le tableau suivant deacutecrit la programmation de la somme des 100 premiers entiers et de larecherche du premier numeacutero 4 dans une chaicircne de caractegraveres agrave lrsquoaide de la structure reacutepeacuteterLes variables sont les mecircmes qursquoau tableau preacuteceacutedent
Cette structure doit ecirctre utiliseacutee quand il nrsquoest pas neacutecessaire de tester la condition avec lesdonneacutees initiales avant drsquoexeacutecuter les instructions contenues dans la boucle
Structure boucle sans fin
La syntaxe geacuteneacuterale de cette structure est programmeacutee par la directive LOOP Elle devient sansfin si vous nrsquoutilisez pas lrsquoinstruction LEAVE qui passe en seacutequence du END LOOP
[etiquette] LOOP
instructions
END LOOP [etiquette]
Le tableau suivant donne lrsquoeacutecriture du calcul de la somme des 100 premiers entiers en utilisantdeux boucles sans fin (qui se terminent toutefois car tout a une fin mais celles-lagrave je lesprogramme avec LEAVE) Jrsquoen profite pour preacutesenter ITERATE qui force agrave reprendrelrsquoexeacutecution au deacutebut de la boucle
Tableau 6-16 Structures reacutepeacuteter
Condition simple Condition composeacutee
REPEATSET v_somme = v_somme + v_entierSET v_entier = v_entier + 1
UNTIL END REPEAT
REPEAT IF SUBSTR(v_telephonev_indice1) = 4 THEN SET v_trouve = TRUE ELSE SET v_indice = v_indice + 1 END IFUNTIL END REPEATIF v_trouve THEN SELECT CONCAT(Trouveacute 4 agrave lindice v_indice)END IF
Web
v_entier gt 100
(v_indice gt 14 OR v_trouve)
4055_06_C06 Page 221 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
Partie II Programmation proceacutedurale
222 copy Eacuteditions Eyrolles
Il est agrave noter que LEAVE peut ecirctre aussi utiliseacute pour sortir drsquoun bloc (srsquoil est eacutetiqueteacute) LEAVEet ITERATE peuvent aussi ecirctre employeacutes au sein de structures REPEAT ou WHILE
Redirection (GOTO)Ceacutelegravebre pour faire tendre un programme vers une configuration plutocirct de feu drsquoartifice que decours drsquoeau tranquille lrsquoinstruction GOTO est bien connue mais souvent mal utiliseacutee Elle peutecirctre pratique dans certains cas pour sortir drsquoune boucle ou drsquoun bloc Il nrsquoest pas souhaitableque vous utilisiez GOTO agrave moins que vous eacutecriviez vos algorithmes avec des organigrammes
Dans son livre blanc (httpdevmysqlcomtech-resourcesarticlesmysql-storedprocedu-reshtml) Peter Gulutzan parle de laquo GOTO etiquette raquo et de laquo LABEL etiquette raquo Cetarticle est sorti alors que la version becircta de MySQL 50 nrsquoen eacutetait qursquoagrave ses deacutebuts Cette fonc-tionnaliteacute semble avoir eacuteteacute supprimeacutee dans la version de production Agrave suivre donc
Structure pourRenommeacutee pour les parcours de vecteurs tableaux et matrices en tout genre la structure pourse caracteacuterise par la connaissance a priori du nombre drsquoiteacuterations que le programmeur souhaitefaire effectuer agrave son algorithme La syntaxe geacuteneacuterale de cette structure est programmeacutee danstous les langages par lrsquoinstruction for
Absente pour lrsquoinstant de MySQL elle peut se programmer par un reacutepeacuteter un tant que ouencore par une boucle sans fin Dans tous ces cas il faudra deacutefinir un indice allant drsquoune valeurinitiale agrave une valeur finale tout en increacutementant ce mecircme indice en fin de boucle
Interactions avec la base
Cette section deacutecrit les meacutecanismes que MySQL offre pour interfacer un sous-programmeavec une base de donneacutees
Tableau 6-17 TStructures boucle sans fin
Avec LEAVE Avec ITERATE
SET v_somme = v_somme + v_entier SET v_entier = v_entier + 1 IF v_entier gt 100 THEN END IF
SET v_somme = v_somme + v_entier SET v_entier = v_entier + 1 IF v_entier lt= 100 THEN END IF
Webboucle1 LOOP
LEAVE boucle1
END LOOP boucle1
boucle1 LOOP
ITERATE boucle1
LEAVE boucle1END LOOP boucle1
4055_06_C06 Page 222 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 223
chapitre ndeg 6 Bases du langage de programmation
Extraire des donneacutees
La principale instruction capable drsquoextraire des donneacutees contenues dans des tables estSELECT Eacutetudieacutee au chapitre 4 dans un contexte SQL la particulariteacute de cette instruction auniveau drsquoun sous-programme est la directive INTO qui permet de charger des variables agrave partirde valeurs de colonnes comme le montre la syntaxe suivante
SELECT col1 [col2 ]INTO variable1 [variable2 ]
FROM nomTable
Cette instruction peut aussi ecirctre utiliseacutee agrave lrsquoexteacuterieur drsquoun bloc pour charger une variable desession par exemple
Veillez agrave ne reacutecupeacuterer qursquoun seul enregistrement agrave lrsquoaide du WHERE de la requecircte Crsquoest logi-que puisque vous deacutesirez ne charger qursquoune valeur par variable
bull Si vous en extrayez plusieurs vous verrez lrsquoerreur laquo ERROR 1172 (42000) Resultconsisted of more than one row raquo
bull Si vous nrsquoen extrayez aucun (no data found) aucune erreur nrsquoest souleveacutee et la variable estinchangeacutee (elle reste initialiseacutee agrave la valeur preacutesente avant la requecircte)
Colonnes simples
Le tableau suivant deacutecrit lrsquoextraction de la colonne compa pour le pilote de code PL-2 dansdiffeacuterents contextes
Tableau 6-18 Extraction de donneacutees
Code MYSQL Commentaires
BEGIN DECLARE v_comp VARCHAR(15) SELECT FROM Pilote WHERE brevet=PL-2 END
Chargement drsquoune variable locale agrave un blocNeacutecessiteacute drsquoappeler par la suite cette proceacute-dure (CALL)
SET vs_compa=$SELECT compa FROM Pilote WHERE brevet=PL-2$
Chargement drsquoune variable de session horsdrsquoun sous-programme
SET vs_compa=$CREATE PROCEDURE sp1() BEGIN SELECT FROM Pilote WHERE brevet=PL-2 END
Chargement drsquoune variable de session dans unsous-programme
compa INTO v_comp
INTO vs_compa
compa INTO vs_compa
4055_06_C06 Page 223 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
Partie II Programmation proceacutedurale
224 copy Eacuteditions Eyrolles
Pour traiter des requecirctes renvoyant plusieurs enregistrements il faudra utiliser des curseurs(eacutetudieacutes au chapitre suivant)
Fonctions SQL
Il est naturel que les fonctions SQL (mono et multilignes) eacutetudieacutees au chapitre 4 soienteacutegalement disponibles dans un sous-programme agrave condition de les utiliser au sein drsquouneinstruction SELECT Deux exemples sont deacutecrits dans le tableau suivant le premier char-gera la variable avec le nom du pilote de code PL-1 en majuscules (table deacutecrite au deacutebutdu chapitre 4) le second affectera agrave la variable le maximum du nombre drsquoheures de voltous pilotes confondus
Manipuler des donneacutees
Les principales instructions disponibles pour manipuler par un sous-programme leseacuteleacutements drsquoune base de donneacutees sont les mecircmes que celles proposeacutees par SQL agrave savoirINSERT UPDATE et DELETE Pour libeacuterer les verrous au niveau drsquoun enregistrement (etdes tables) il faudra ajouter les instructions COMMIT ou ROLLBACK (aspects eacutetudieacutes en finde chapitre)
Insertions
Le tableau suivant deacutecrit lrsquoinsertion de diffeacuterents enregistrements sous plusieurs eacutecritures (ilest aussi possible drsquoutiliser des variables de session)
Comme sous SQL il faut respecter les noms types et domaines de valeurs des colonnes Demecircme les contraintes de veacuterification (CHECK qui nrsquoest pas encore opeacuterationel et NOT NULL)et drsquointeacutegriteacute (PRIMARY KEY et FOREIGN KEY) doivent ecirctre valides
Dans le cas inverse une exception qui preacutecise la nature du problegraveme est leveacutee et peut ecirctreintercepteacutee par la directive HANDLER (voir chapitre suivant) Si une telle directive nrsquoexiste pas
Tableau 6-19 Utilisation de fonctions
Monoligne Multiligne
BEGIN DECLARE v_nomEnMAJUSCULES CHAR(20) SELECT FROM Pilote WHERE brevet = PL-1SELECT v_nomEnMAJUSCULESEND
BEGIN DECLARE v_plusGrandHVol DECIMAL(72) SELECT FROM PiloteSELECT v_plusGrandHVol END
+-------------------+| v_nomEnMAJUSCULES |+-------------------+| GRATIEN VIEL |+-------------------+
+-----------------+| v_plusGrandHVol |+-----------------+| 245000 |+-----------------+
Web
UPPER(nom)INTO v_nomEnMAJUSCULES
MAX(nbHVol) INTO v_plusGrandHVol
4055_06_C06 Page 224 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 225
chapitre ndeg 6 Bases du langage de programmation
dans le bloc qui contient lrsquoinstruction INSERT la premiegravere exception fera srsquointerrompre leprogramme
Modifications
Concernant la mise agrave jour de colonnes par UPDATE la clause SET peut ecirctre ambigueuml dans lesens ougrave lrsquoidentificateur agrave gauche de lrsquoopeacuterateur drsquoaffectation est toujours une colonne de basede donneacutees alors que celui agrave droite de lrsquoopeacuterateur peut correspondre agrave une colonne ou agrave unevariable
UPDATE nomTable
SET col1 = variable1 | expression1 | autrecol | (requecircte)
[col2 = ]
[WHERE ]
Si aucun enregistrement nrsquoest modifieacute aucune erreur ne se produit et aucune exception nrsquoestleveacutee
Alors que les affectations dans le code MYSQL (SET hellip) peuvent srsquoeacutecrire par les symboleslaquo = raquo ou laquo = raquo les comparaisons ou affectations SQL neacutecessitent le symbole laquo = raquo
Le tableau suivant deacutecrit la modification de diffeacuterents enregistrements (il est aussi possibledrsquoemployer des variables de session)
Tableau 6-20 Insertion drsquoenregistrements
Code MySQL Commentaires
BEGIN DECLARE v_brevet VARCHAR(6) DEFAULT PL-7 DECLARE v_nom VARCHAR(6) DECLARE v_HVol DECIMAL(72) DEFAULT 0 DECLARE v_comp VARCHAR(6)
Deacuteclaration des variables locales aubloc
INSERT INTO Pilote VALUES
Insertion drsquoun enregistrement en rensei-gnant les colonnes par des constantes
SET v_nom = Fabrice Peyrard SET v_comp = SING INSERT INTO Pilote VALUES END
Insertion drsquoun enregistrement en rensei-gnant les colonnes par des variableslocales
Web
(PL-6 Jules Ente 3000 AF)
(v_brevetv_nomv_HVolv_comp)
4055_06_C06 Page 225 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
Partie II Programmation proceacutedurale
226 copy Eacuteditions Eyrolles
Suppressions
La suppression par DELETE peut ecirctre ambigueuml (mecircme raison que pour lrsquoinstruction UPDATE)au niveau de la clause WHERE
DELETE FROM nomTable
[WHERE col1 = variable1 | expression1 | autrecol | (requecircte)
[col2 = ] ]
Si aucun enregistrement nrsquoest modifieacute aucune erreur ne se produit et aucune exception nrsquoestleveacutee
Le tableau suivant deacutecrit la suppression de diffeacuterents enregistrements (il est aussi possibledrsquoutiliser des variables de session)
Tableau 6-21 Modifications drsquoenregistrements
Code MySQL Commentaires
BEGIN DECLARE v_dureeVol DECIMAL(31) DEFAULT 48
Deacuteclaration
UPDATE Pilote SET WHERE brevet= PL-6
Modification drsquoun enregistrement de la table Pilote en utilisant une variable
UPDATE Pilote SET WHERE compa = AFEND
Modification de plusieurs enregistrements de la table Pilote en utilisant une cons-tante
Web
nbHVol= nbHVol + v_dureeVol
nbHVol= nbHVol + 10
Tableau 6-22 Suppression drsquoenregistrements
Code MYSQL Commentaires
BEGIN DECLARE v_hVolMini DECIMAL(72) DEFAULT 100000
DELETE FROM Pilote WHERE nbHVol lt
DELETE FROM Pilote WHERE Supprime les enregistrements dela table Pilote dont le nombredrsquoheures de vol est infeacuterieur agrave1 000Supprime un pilote
DELETE FROM Pilote WHERE END
Ne supprime aucun pilote
Web
v_hVolMini
brevet = PL-3
brevet = NULL
4055_06_C06 Page 226 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 227
chapitre ndeg 6 Bases du langage de programmation
Transactions
Une transaction est un bloc drsquoinstructions LMD faisant passer la base de donneacutees drsquoun eacutetatcoheacuterent agrave un autre eacutetat coheacuterent Si un problegraveme logiciel ou mateacuteriel survient au cours drsquounetransaction aucune des instructions contenues dans la transaction nrsquoest effectueacutee quel quesoit lrsquoendroit de la transaction ougrave est intervenue lrsquoerreur
On peut supposer que la majoriteacute des transactions sous MySQL sont programmeacutees dans lelangage du serveur Les langages plus eacutevolueacutes permettent aussi de deacutevelopper des transactionsagrave travers des API (par exemple la meacutethode commit est comprise dans le paquetagejavasql)
Lrsquoexemple typique drsquoune transaction est celui du transfert drsquoun compte eacutepargne vers uncompte courant Imaginez qursquoapregraves une panne votre compte eacutepargne a eacuteteacute deacutebiteacute de la sommede 500 euro sans que votre compte courant soit creacutediteacute du mecircme montant Vous ne seriez pastregraves content des services de votre banque (agrave moins que lrsquoerreur ne soit intervenue dans lrsquoautresens) Le meacutecanisme transactionnel empecircche un tel sceacutenario en invalidant toutes les opeacutera-tions faites depuis le deacutebut de la transaction si une panne survient au cours de cette mecircmetransaction
Caracteacuteristiques
Une transaction assure
lrsquoatomiciteacute des instructions qui sont consideacutereacutees comme une seule opeacuteration (principe dutout ou rien)
la coheacuterence (passage drsquoun eacutetat coheacuterent de la base agrave un autre eacutetat coheacuterent)
lrsquoisolation des transactions entre elles (lecture consistante meacutecanisme deacutecrit plus loin)
la durabiliteacute des opeacuterations (les mises agrave jour perdurent mecircme si une panne se produit apregravesla transaction)
Figure 6-5 Transaction
TRANSFERT(500euro) Deacutebut Transaction hellip UPDATE Codevi( -500euro) UPDATE CompteCourant(+500euro) Fin Transaction
Eacutetat coheacuterent
TEMPS
PANNE
Eacutetat coheacuterent
4055_06_C06 Page 227 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
Partie II Programmation proceacutedurale
228 copy Eacuteditions Eyrolles
Deacutebut et fin drsquoune transaction
Deux instructions sont disponibles pour marquer le deacutebut drsquoune transaction START TRAN-SACTION ou BEGIN Ainsi entre BEGIN et END drsquoun programme MySQL il est possibledrsquoeacutecrire plusieurs transactions Le fait de commencer une transaction termine implicitementcelle qui preacuteceacutedait ladite transaction
Une transaction se termine explicitement par les instructions SQL COMMIT ou ROLLBACK Ellese termine implicitement
bull agrave la premiegravere commande SQL du LDD ou du LCD rencontreacutee (CREATE ALTER DROPhellip)
bull agrave la fin normale drsquoune session utilisateur avec deacuteconnexion
bull agrave la fin anormale drsquoune session utilisateur (sans deacuteconnexion)
Nous deacutetaillons ici les principes de base drsquoune transaction MySQL sans entrer dans des deacutetailsplus techniques (veacuterouillages accegraves concurrents et transactions reacuteparties) qui sortent du cadrede cet ouvrage
Mode de validation
Deux modes de fonctionnement sont possibles celui par deacutefaut (autocommit) qui validesysteacutematiquement toutes les instructions reccedilues par la base Dans ce mode point de salut car ilvous sera impossible de revenir en arriegravere afin drsquoannuler une instruction Le mode agrave utiliserpour programmer des transactions est celui inverse (autocommit off) qui se deacuteclare agrave lrsquoaide duparamegravetre 0 dans lrsquoinstruction suivante
SET AUTOCOMMIT = 0 | 1
Le tableau suivant preacutecise la validiteacute de la transaction en fonction des eacuteveacutenements possibles
Votre premiegravere transaction
Vous pouvez tester rapidement une transaction en eacutecrivant le bloc suivant qui insegravere une lignedans une de vos tables
Tableau 6-23 Validiteacute drsquoune transaction
Eacuteveacutenement Validiteacute
COMMIT Transaction valideacutee
ROLLBACKCommande SQL (LDD ou LCD)Fin anormale drsquoune session
Transaction non valideacutee
4055_06_C06 Page 228 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir
copy Eacuteditions Eyrolles 229
chapitre ndeg 6 Bases du langage de programmation
delimiter $
DROP PROCEDURE sp1$
CREATE PROCEDURE sp1()
BEGIN
SET AUTOCOMMIT = 0
INSERT INTO TableaVous VALUES ()
END
$
--appel de la transaction
CALL sp1()$
SELECT FROM TableaVous$
Exeacutecutez ce bloc dans lrsquointerface puis deacuteconnectez-vous soit en cassant la fenecirctre (icocircne enhaut agrave droite) soit proprement avec exit Reconnectez-vous et constatez que lrsquoenregistre-ment nrsquoest pas preacutesent dans votre table Mecircme quand la fin du programme est normale la tran-saction nrsquoest pas valideacutee (car il manque COMMIT) Relancez le bloc en ajoutant cetteinstruction apregraves lrsquoinsertion Notez que lrsquoenregistrement est preacutesent deacutesormais dans votretable mecircme apregraves une deacuteconnexion douce ou dure
Controcircle des transactions
Il est inteacuteressant de pouvoir deacutecouper une transaction en inseacuterant des points de validation(savepoints) qui rendent possible lrsquoannulation de tout ou partie des opeacuterations composantladite transaction
La figure suivante illustre une transaction deacutecoupeacutee en trois parties Lrsquoinstruction ROLLBACKpeut srsquoeacutecrire sous diffeacuterentes formes Ainsi ROLLBACK TO SAVEPOINTPointvalidation1 invalidera les UPDATE et le DELETE tout en laissant la possibiliteacute deconfirmer lrsquoinstruction INSERT (en fonction des commandes se trouvant apregraves ce ROLLBACKrestreint et de la maniegravere dont la session se terminera)
Web
Figure 6-6 Points de validation
Deacutebut Transaction INSERThellipPoint validation 1 UPDATEhellip UPDATEhellipPoint validation 2 DELETE hellip hellip
Fin Transaction
ROLLBACK
ROLLBACK TO SAVEPOINTPoint validation1
ROLLBACK TO SAVEPOINTPoint validation2
4055_06_C06 Page 229 Jeudi 2 mars 2006 205 14 gt Apogee FrameMaker Noir