CHEZ LE MÊME ÉDITEUR Documents...ÉDITIONS EYROLLES 61, bd Saint-Germain 75240 Paris Cedex 05 Le...

418

Transcript of CHEZ LE MÊME ÉDITEUR Documents...ÉDITIONS EYROLLES 61, bd Saint-Germain 75240 Paris Cedex 05 Le...

  • CHEZ LE MÊME ÉDITEUR

    Du même auteur

    C. SOUTOU. – De UML à SQL.N°11098, 2002, 500 pages.

    C. SOUTOU. – SQL pour Oracle – 2e édition.N°11697, 2005, 480 pages.

    Autour de SQL et MySQL

    P. J. PRATT – Initiation à SQL.N°9285, 2001, 328 pages.

    A.G. TAYLOR. – SQL Web Training.N°25413, 2002, 428 pages.

    R. LENTZNER. – 300 astuces pour SQL et MySQL.N°25359, 2001, 254 pages.

    M. KOFLER. – MySQL 5. Guide de lʼadministrateur et du développeur.N°11633, 2005, 672 pages.

    J.-M. AQUILINA. – Aide-mémoire MySQL.N°25451, 2002, 384 pages.

    J.-M. DEFRANCE. – PHP/MySQL avec Flash MX 2004.N°11468, 2005, 710 pages.

    P. CHALÉAT, D. CHARNAY et J.-R. ROUET. – Les Cahiers du programmeur PHP/MySQL et JavaScript.N°11678, 2005, 212 pages.

    J.-M. DEFRANCE. – PHP/MySQL avec Dreamweaver 2004 (best of).N°11709, 2005, 550 pages.

  • ����������������

    ���������

    ��� ���������

    ��������������������������

  • ÉDITIONS EYROLLES61, bd Saint-Germain75240 Paris Cedex 05

    www.editions-eyrolles.com

    Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressément la photocopie à usage collectif sans autorisation des ayants droit. Or, cette pratique s’est généralisée notamment dans les établissements d’enseignement, provoquant une baisse brutale des achats de livres, au point que la possibilité même pour les auteurs de créer des œuvres nouvelles et de les faire éditer correctement est aujourd’hui menacée.En application de la loi du 11 mars 1957, il est interdit de reproduire intégralement ou partiellement le

    présent ouvrage, sur quelque support que ce soit, sans autorisation de l’éditeur ou du Centre Français d’Exploitation du Droit de Copie, 20, rue des Grands-Augustins, 75006 Paris.© Groupe Eyrolles, 2006, ISBN : 2-212-11915-1

    http://www.editions-eyrolles.com

  • Pour Aurélia, mon chat aux yeux si bleus, si verts, si gris.

    Pour René et Lydie, Jean et Denise qui sont devenus mes parents.

    4055_00a_Dedi Page V Jeudi, 2. mars 2006 2:12 14 > Apogee FrameMaker Noir

  • 4055_00a_Dedi Page VI Jeudi, 2. mars 2006 2:12 14 > Apogee FrameMaker Noir

  • © Éditions Eyrolles

    VII

    Table des matières

    Remerciements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XVII

    Avant-propos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XIX

    Guide de lecture

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXPremière partie : SQL de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXDeuxième partie : programmation procédurale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXTroisième partie : langages et outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXAnnexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XX

    Typographie

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXI

    Contact avec l’auteur – Corrigés des exercices

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXII

    Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

    SQL, une norme, un succès

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

    Modèle de données

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Tables et données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Les clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    MySQL

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3Un peu d’histoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Offre du moment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5Licences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Et la concurrence ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Notion de schéma (database) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Notion d’hôte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Aspects étudiés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    Mise en œuvre de MySQL (sous Windows)

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Désinstallation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Reconfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    Premiers pas

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10L’interface de commande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Création d’un utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Connexion au serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12Vérification de la version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12Options de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13Batch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14Votre prompt, et vite ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14Commandes de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    4055_00b_TDM.fm Page VII Jeudi, 2. mars 2006 2:12 14 > Apogee FrameMaker Noir

  • Apprendre SQL avec MySQL Table des matières

    VIII

    © Éditions Eyrolles

    Partie I SQL de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    1 Définition des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    Tables relationnelles

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Création d’une table (

    CREATE TABLE

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Délimiteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Sensibilité à la casse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21Premier exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22Contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Conventions recommandées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Types des colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Structure d’une table (

    DESCRIBE

    ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    Index

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30Arbres balancés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Création d’un index (

    CREATE INDEX

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Bilan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    Destruction d’un schéma

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33Suppression d’une table (

    DROP TABLE

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33Ordre des suppressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    Exercices

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    2 Manipulation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

    Insertions d’enregistrements (

    INSERT

    )

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37Renseigner toutes les colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Renseigner certaines colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Plusieurs enregistrements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39Ne pas respecter des contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39Données binaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40Énumérations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40Dates et heures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    Séquences

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Utilisation en tant que clé primaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Modification d’une séquence. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45Utilisation en tant que clé étrangère . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

    Modifications de colonnes

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47Syntaxe (

    UPDATE

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47Modification d’une colonne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48Modification de plusieurs colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48Modification de plusieurs enregistrements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48Ne pas respecter les contraintes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    4055_00b_TDM.fm Page VIII Jeudi, 2. mars 2006 2:12 14 > Apogee FrameMaker Noir

  • © Éditions Eyrolles

    IX

    Table des matières Apprendre SQL avec MySQL

    Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50Dates et intervalles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    Remplacement d’un enregistrement

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    Suppressions d’enregistrements

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54Instruction

    DELETE

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54Instruction

    TRUNCATE

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    Intégrité référentielle

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56Cohérences assurées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56Contraintes côté « père » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57Contraintes côté « fils » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58Clés composites et nulles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58Cohérence du fils vers le père. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59Cohérence du père vers le fils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60En résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    Insertions à partir d’un fichier

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    Exercices

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

    3 Évolution d’un schéma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    Renommer une table (

    RENAME

    )

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    Modifications structurelles (

    ALTER TABLE

    )

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Ajout de colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Renommer des colonnes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69Modifier le type des colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69Valeurs par défaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70Supprimer des colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

    Modifications comportementales

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71Ajout de contraintes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71Suppression de contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73Désactivation des contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75Réactivation des contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77Contraintes différées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

    Exercices

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

    4 Interrogation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

    Généralités

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83Syntaxe (

    SELECT

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84Pseudotable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

    Projection (éléments du

    SELECT

    )

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85Extraction de toutes les colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86Extraction de certaines colonnes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86Alias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87Duplicatas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

    4055_00b_TDM.fm Page IX Jeudi, 2. mars 2006 2:12 14 > Apogee FrameMaker Noir

  • Apprendre SQL avec MySQL Table des matières

    X

    © Éditions Eyrolles

    Expressions et valeurs nulles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88Ordonnancement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89Concaténation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89Insertion multiligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Limitation du nombre de lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

    Restriction (

    WHERE

    )

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91Opérateurs de comparaison . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92Opérateurs logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93Opérateurs intégrés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93Alias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

    Fonctions

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95Caractères. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95Numériques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99Fonction pour les bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100Dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101Conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105Comparaisons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106Énumérations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107Autres fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

    Regroupements

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109Fonctions de groupe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110Étude du

    GROUP BY

    et

    HAVING

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

    Opérateurs ensemblistes

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115Intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115Opérateurs

    UNION

    et

    UNION ALL

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116Différence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117Ordonner les résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118Produit cartésien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119Bilan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

    Jointures

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121Jointure relationnelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122Jointures SQL2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122Types de jointures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123Équijointure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123Autojointure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125Inéquijointure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127Jointures externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128Jointures procédurales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132Jointures mixtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136Sous-interrogations synchronisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137Autres directives SQL2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

    4055_00b_TDM.fm Page X Jeudi, 2. mars 2006 2:12 14 > Apogee FrameMaker Noir

  • © Éditions Eyrolles

    XI

    Table des matières Apprendre SQL avec MySQL

    Division

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143Division inexacte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144Division exacte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

    Résulats en HTML ou XML

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

    Écriture dans un fichier

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

    Exercices

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

    5 Contrôle des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

    Gestion des utilisateurs

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152Création d’un utilisateur (

    CREATE USER

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152Modification d’un utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154Renommer un utilisateur (

    RENAME USER

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154Suppression d’un utilisateur (

    DROP USER

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

    Gestion des bases de données

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155Création d’une base (

    CREATE DATABASE

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156Sélection d’une base de données (

    USE

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157Modification d’une base (

    ALTER DATABASE

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158Suppression d’une base (

    DROP DATABASE

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

    Privilèges

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158Niveaux de privilèges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159Tables de la base

    mysql

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159Table

    mysql.user

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160Attribution de privilèges (

    GRANT

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163Table

    mysql.db

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167Table

    mysql.host

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167Table

    mysql.tables_priv

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168Table

    mysql.columns_priv

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168Table

    mysql.procs_priv

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168Révocation de privilèges (

    REVOKE

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170Attributions et révocations « sauvages ». . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172

    Accès distants

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172Connexion par l’interface de commande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173Table

    mysql.host

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

    Vues

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175Création d’une vue (

    CREATE VIEW

    ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176Classification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177Vues monotables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177Vues complexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181Autres utilisations de vues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185Transmission de droits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188Modification d’une vue (

    ALTER VIEW

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

    4055_00b_TDM.fm Page XI Jeudi, 2. mars 2006 2:12 14 > Apogee FrameMaker Noir

  • Apprendre SQL avec MySQL Table des matières

    XII

    © Éditions Eyrolles

    Visualisation d’une vue (

    SHOW CREATE VIEW

    ) . . . . . . . . . . . . . . . . . . . . . . . . . . 189Suppression d’une vue (

    DROP VIEW

    ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

    Dictionnaire des données

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190Constitution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190Modèle graphique du dictionnaire des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191Démarche à suivre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191Classification des vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193Bases de données du serveur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194Composition d’une base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195Détail de stockage d’une base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195Structure d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196Recherche des contraintes d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198Composition des contraintes d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199Recherche du code source d’un sous-programme . . . . . . . . . . . . . . . . . . . . . . . . . . 200Privilèges des utilisateurs d’une base de données . . . . . . . . . . . . . . . . . . . . . . . . . . 201Commande

    SHOW

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

    Exercices

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

    Partie II Programmation procédurale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207

    6 Bases du langage de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209

    Environnement client-serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209Avantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210Structure d’un bloc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210Portée des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211Casse et lisibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211Identificateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212Commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

    Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212Variables scalaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213Affectations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213Résolution de noms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214Opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214Variables de session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215Conventions recommandées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

    Test des exemples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216Structures de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

    Structures conditionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Structures répétitives. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

    Interactions avec la base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222Extraire des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223Manipuler des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

    4055_00b_TDM.fm Page XII Jeudi, 2. mars 2006 2:12 14 > Apogee FrameMaker Noir

  • © Éditions Eyrolles XIII

    Table des matières Apprendre SQL avec MySQL

    Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227Caractéristiques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227Début et fin d’une transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228Mode de validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228Votre première transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228Contrôle des transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229Transactions imbriquées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

    Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231

    7 Programmation avancée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233Sous-programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

    Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233Procédures cataloguées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234Fonctions cataloguées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235Structure d’un sous-programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236Exemples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236Fonction n’interagissant pas avec la base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239Appel d’un sous-programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239Récursivité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241Sous-programmes imbriqués . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242Modification d’un sous-programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243Destruction d’un sous-programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

    Curseurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245Parcours d’un curseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246Accès concurrents (FOR UPDATE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

    Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250Exceptions avec EXIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250Exceptions avec CONTINUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254Gestion des autres erreurs (SQLEXCEPTION) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255Même erreur sur différentes instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257Exceptions nommées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260

    Déclencheurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262À quoi sert un déclencheur ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262Mécanisme général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263Déclencheurs LMD (de lignes) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264

    4055_00b_TDM.fm Page XIII Jeudi, 2. mars 2006 2:12 14 > Apogee FrameMaker Noir

  • Apprendre SQL avec MySQL Table des matières

    XIV © Éditions Eyrolles

    Appel de sous-programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271Dictionnaire des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272Programmation d’une contrainte de vérification . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273Invalidation dans le déclencheur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275Tables mutantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278Suppression d’un déclencheur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278

    SQL dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279Exemples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281

    Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284

    Partie III Langages et outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287

    8 Utilisation avec Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289JDBC avec Connector/J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289

    Classification des pilotes (drivers). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290Le paquetage java.sql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291Structure d’un programme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291Test de votre configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292

    Connexion à une base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293Base Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294Base MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295Interface Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295

    États d’une connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296Interfaces disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296Méthodes génériques pour les paramètres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296États simples (interface Statement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297Méthodes à utiliser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298

    Correspondances de types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298Manipulations avec la base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300

    Suppression de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300Ajout d’enregistrements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301Modification d’enregistrements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

    Extraction de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301Curseurs statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302Curseurs navigables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303

    Curseurs modifiables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307Suppressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309Modifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310Insertions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310

    4055_00b_TDM.fm Page XIV Jeudi, 2. mars 2006 2:12 14 > Apogee FrameMaker Noir

  • © Éditions Eyrolles XV

    Table des matières Apprendre SQL avec MySQL

    Gestion des séquences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311Méthode getGeneratedKeys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312Curseur modifiable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312

    Interface ResultSetMetaData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313Interface DatabaseMetaData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314Instructions paramétrées (PreparedStatement) . . . . . . . . . . . . . . . . . . . . . . . . 316

    Extraction de données (executeQuery). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316Mises à jour (executeUpdate). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317Instruction LDD (execute) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317

    Procédures cataloguées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318Exemple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

    Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320Points de validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321

    Traitement des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322Affichage des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323Traitement des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323

    Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325

    9 Utilisation avec PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327Configuration adoptée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327

    Logiciels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327Fichiers de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327Test d’Apache et de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328Test d’Apache, de PHP et de MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329

    API de PHP pour MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329Connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330Interactions avec la base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330Extractions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332Instructions paramétrées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335Gestion des séquences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337Traitement des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337Procédures cataloguées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339Métadonnées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340

    Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344

    10 Outils graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349MySQL Administrator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349

    Connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349Connexion nommée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350Liste des accès utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351Gestion des privilèges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351Caractéristiques système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352Options scripts SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353Composition d’une base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354

    4055_00b_TDM.fm Page XV Jeudi, 2. mars 2006 2:12 14 > Apogee FrameMaker Noir

  • Apprendre SQL avec MySQL Table des matières

    XVI © Éditions Eyrolles

    Composition d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355Composition des index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356Modification d’un schéma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356Restriction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358

    MySQL Query Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359Fenêtre principale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359Extraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360Modification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361

    phpMyAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362Composition de la base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363Structure d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364Administrer une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364Extractions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365Rechercher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366Exporter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367Utilisateurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368

    TOAD for MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369Instructions en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370Développement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371Création d’objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371Recherche d’objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373Exportations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374

    Navicat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374Création d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375Définition d’une contrainte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376Création d’une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377Importation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378Gestion des utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378

    MySQL Manager. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379Création d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380Création d’une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382Procédures cataloguées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382Gestion des utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383Gestion des privilèges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383

    Bilan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384

    Annexe : bibliographie et webographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385

    Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387

    4055_00b_TDM.fm Page XVI Jeudi, 2. mars 2006 2:12 14 > Apogee FrameMaker Noir

  • © Éditions Eyrolles

    XVII

    Remerciements

    Je n’ai que deux personnes à remercier. Il s’agit de deux jeunes informaticiens rencontrés auhasard d’un forum. Ils sont talentueux et désintéressés, ce qui devient tellement rare dans cemonde d’individualisme exacerbé. Le premier recherchait un emploi à la période de la rédac-tion, souhaitons qu’il trouve clavier à ses mains. Le second dirige la rubrique MySQL du siteDeveloppez.com.

    Merci, Pierre Caboche, pour la lecture de la première moitié de l’ouvrage, pour tes remarquesque j’ai (presque) toutes prises en compte, pour les compléments en ligne à propos des opéra-teurs ensemblistes dans les requêtes.

    Merci, Guillaume Lebur, pour tous tes commentaires de qualité et pour tes corrections àpropos de la programmation sous MySQL. Merci pour ton activité et tes tutoriels mis en lignesur le site de Developpez.com.

    4055_00c_Lim Page XVII Jeudi, 2. mars 2006 2:13 14 > Apogee FrameMaker Noir

  • 4055_00c_Lim Page XVIII Jeudi, 2. mars 2006 2:13 14 > Apogee FrameMaker Noir

  • © Éditions Eyrolles

    XIX

    Avant-propos

    Nombre d’ouvrages traitent de SQL et de MySQL ; certains résultent d’une traduction hasar-deuse et sans vocation pédagogique, d’autres ressemblent à des Bottin téléphoniques ouproviennent de la traduction de la documentation officielle en moins bien. Les survivants nesont peut-être plus vraiment à jour.

    Ce livre a été rédigé avec une volonté de concision et de progression dans sa démarche ; il estillustré par ailleurs de nombreux exemples et figures. Bien que la source principale d’informa-tions fût la documentation officielle de MySQL (http://dev.mysql.com/doc), l’ouvrage neconstitue pas un condensé de commandes SQL. Chaque notion importante est introduite parun exemple simple et que j’espère démonstratif. En fin de chaque chapitre des exercices vouspermettront de tester vos connaissances.

    La documentation en ligne de MySQL (

    MySQL 5 Reference Manual

    ) représente une dizainede mégaoctets au format HTML. Tous les concepts s’y trouvant ne pourraient pas être icidécemment expliqués, sauf peut-être si cet ouvrage ressemblait à un annuaire. J’ai tenté d’enextraire seulement les aspects fondamentaux sous la forme d’une synthèse.

    Vous n’y trouverez donc pas des considérations à propos d’aspects avancés du langage ou duserveur comme l’optimisation de requêtes, la restauration d’une base, la réplication, la versiondu serveur à partir de laquelle telle ou telle fonction est apparue, etc.

    Ce livre résulte de mon expérience de l’enseignement dans le domaine des bases de donnéesen premier, deuxième et troisième cycles universitaires dans des cursus d’informatique àvocation professionnelle (IUT, licences et masters professionnels).

    Cet ouvrage s’adresse principalement aux novices désireux de découvrir SQL en program-mant sous MySQL

    .

    Les étudiants et enseignants trouveront des exemples pédagogiques pour chaque conceptabordé, ainsi que des exercices thématiques.

    Les développeurs PHP ou Java découvriront des moyens de stocker leurs données.

    4055_00c_Lim Page XIX Jeudi, 2. mars 2006 2:13 14 > Apogee FrameMaker Noir

    http://dev.mysql.com/doc

  • Apprendre SQL avec MySQL

    XX

    © Éditions Eyrolles

    Guide de lecture

    Ce livre s’organise autour de trois parties distinctes mais complémentaires. La première inté-ressera le lecteur débutant en la matière, car elle concerne les instructions SQL et les notionsde base de MySQL. La deuxième partie décrit la programmation avec le langage procéduralde MySQL. La troisième partie attirera l’attention des programmeurs qui envisagent d’utiliserMySQL à l’aide d’outils natifs, ou tout en programmant avec des langages évolués ou via desinterfaces Web (PHP ou Java).

    Première partie : SQL de base

    Cette partie présente les différents aspects du langage SQL de MySQL, en étudiant en détailles instructions de base. À partir d’exemples, j’explique notamment comment déclarer, mani-puler, faire évoluer et interroger des tables avec leurs différentes caractéristiques et leurséléments associés (contraintes, index, vues, séquences). Nous étudions aussi SQL dans uncontexte multi-utilisateur (droits d’accès), et au niveau du dictionnaire de données.

    Deuxième partie : programmation procédurale

    Cette partie décrit les caractéristiques du langage procédural de MySQL. Le chapitre 6 traitedes éléments de base (structure d’un programme, variables, structures de contrôle, interactionsavec la base et transactions). Le chapitre 7 traite des sous-programmes, des curseurs, de lagestion des exceptions, des déclencheurs et de l’utilisation du SQL dynamique.

    Troisième partie : langages et outils

    Cette partie intéressera les programmeurs qui envisagent d’exploiter une base MySQL enutilisant un langage de programmation. Le chapitre 8 détaille l’API JDBC 3.0 qui permet demanipuler une base MySQL 5 par l’intermédiaire d’un programme Java. Le chapitre 9 décritles principales fonctions de l’API

    mysqli

    qui permet d’interfacer un programme PHP 5 avecune base MySQL 5.

    Le chapitre 10 synthétise les fonctionnalités de plusieurs outils graphiques tels que

    MySQLAdministrator

    ,

    MySQL Query Browser

    et

    phpMyAdmin

    . D’autres consoles graphiquesd’administration sont étudiées, à savoir

    Toad

    for MySQL

    ,

    Navicat

    et

    EMS SQL Manager

    .

    Annexe

    L’annexe contient une bibliographie et des adresses Web.

    4055_00c_Lim Page XX Jeudi, 2. mars 2006 2:13 14 > Apogee FrameMaker Noir

  • © Éditions Eyrolles

    XXI

    Avant-propos

    Typographie

    La police

    courrier

    est utilisée pour souligner les instructions SQL, noms de types, tables,contraintes, etc. (ex :

    SELECT nom FROM Pilote

    ).

    Les majuscules sont employées pour les directives SQL, et les minuscules pour les autreséléments. Les noms des tables, index, vues, fonctions, procédures… sont précédés d’unemajuscule (exemple : la table

    CompagnieAerienne

    contient la colonne

    nomComp

    ).

    Les termes de MySQL (bien souvent traduits littéralement de l’anglais) sont notés en italique,exemple :

    trigger

    ,

    table

    ,

    column

    , etc.

    Dans une instruction SQL, les symboles { } désignent une liste d’éléments, et le symbole « | »un choix (exemple

    CREATE

    {

    TABLE

    |

    VIEW

    }. Les symboles « [ » et « ] » précisent le carac-tère optionnel d’une directive au sein d’une commande (exemple :

    CREATE[UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ONtable_name (index_col_name,…)

    ).

    Ce sigle introduit une définition, un concept ou une remarque importante. Il apparaît soit dansune partie théorique soit dans une partie technique pour souligner des instructions importantes

    ou la marche à suivre avec SQL.

    Ce sigle annonce soit une impossibilité de mise en œuvre d’un concept soit une mise en garde.Il est principalement utilisé dans la partie consacrée à SQL.

    J’en profite pour faire passer le message suivant : si vous travaillez en version 4 de MySQL,certaines instructions décrites dans ce livre ne fonctionneront pas. Cet ouvrage n’est pas unguide de référence ! Vous trouverez sur le Web des ressources pour connaître la compatibilité

    de telle ou telle fonction SQL.

    Ce sigle indique que le code source est téléchargeable à partir du site des éditions Eyrolles(www.eyrolles.com). Cela est valable pour les exercices corrigés 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 2:13 14 > Apogee FrameMaker Noir

    http://www.eyrolles.com

  • Apprendre SQL avec MySQL

    XXII

    © Éditions Eyrolles

    Contact avec l’auteur – Corrigés des exercices

    Si vous avez des remarques à formuler sur le contenu de cet ouvrage, n’hésitez pas à m’écrireà l’adresse

    [email protected]

    . Ne me demandez pas de déboguer votre procédurecataloguée ou d’optimiser une de vos requêtes… Seules les remarques relatives à l’ouvragetrouveront une réponse.

    Par ailleurs, un site d’accompagnement de l’ouvrage (

    errata

    , corrigés des exercices, sourcedes exemples et compléments) est en ligne et accessible via www.editions-eyrolles.com.

    4055_00c_Lim Page XXII Jeudi, 2. mars 2006 2:13 14 > Apogee FrameMaker Noir

    mailto:[email protected]://www.editions-eyrolles.com

  • © Éditions Eyrolles

    1

    Introduction

    Dans cette introduction, nous présentons, tout d’abord, le cadre général dans lequel cetouvrage se positionne (SQL, le modèle de données et l’offre MySQL). Nous décrivons, pourfinir, la procédure d’installation de MySQL sous Windows et l’utilisation de l’interface decommande en ligne pour que vous puissiez programmer en SQL dès le chapitre 1.

    SQL, une norme, un succès

    C’est IBM,

    à tout seigneur tout honneur

    , qui, avec System-R, a implanté le modèle relationnelau travers du langage SEQUEL (

    Stuctured English as QUEry Language

    ), rebaptisé par lasuite SQL (

    Structured Query Language

    ).

    La première norme (SQL1) date de 1987. Elle était le résultat de compromis entre construc-teurs, mais elle était fortement influencée par le dialecte d’IBM. SQL2 a été normalisée en1992. Elle définit quatre niveaux de conformité : le niveau d’entrée (

    entry level

    ), les niveauxintermédiaires (

    transitional

    et

    intermediate levels

    ) et le niveau supérieur (

    full level

    ). Leslangages SQL des principaux éditeurs sont tous conformes au premier niveau et ont beaucoupde caractéristiques relevant des niveaux supérieurs. Depuis 1999, la norme est appelée SQL3.Elle comporte de nombreuses parties (concepts objets, entrepôts de données, séries temporel-les, accès à des sources non SQL, réplication des données, etc.).

    Le succès que connaissent les éditeurs de SGBD relationnels a plusieurs origines et reposenotamment sur SQL :

    Le langage est une norme depuis 1986, qui s’enrichit au fil du temps.

    SQL peut s’interfacer avec des langages de troisième génération comme C ou Cobol, maisaussi avec des langages plus évolués comme C++, Java ou C#. Certains considèrent ainsique le langage SQL n’est pas assez complet (le dialogue entre la base et l’interface n’estpas direct), et la littérature parle de « défaut d’impédance » (

    impedance mismatch

    ).

    Les SGBD rendent indépendants programmes et données (la modification d’une structure dedonnées n’entraîne pas forcément une importante refonte des programmes d’application).

    Ces systèmes sont bien adaptés aux grandes applications informatiques de gestion (archi-tectures type client-serveur et Internet) et ont acquis une maturité sur le plan de la fiabilitéet des performances.

    Ils intègrent des outils de développement comme les précompilateurs, les générateurs decode, d’états, de formulaires.

    4055_00d_Intro Page 1 Jeudi, 2. mars 2006 1:59 13 > Apogee FrameMaker Noir

  • Apprendre SQL avec MySQL

    2

    © Éditions Eyrolles

    Ils offrent la possibilité de stocker des informations non structurées (comme le texte,l’image, etc.) dans des champs appelés LOB (

    Large Object Binary

    ).

    Nous étudierons les principales instructions SQL de MySQL qui sont classifiées dans letableau suivant :

    Modèle de données

    Le modèle de données relationnelles repose sur une théorie rigoureuse bien qu’adoptant desprincipes simples. La table relationnelle (

    relational table

    ) est la structure de données de basequi contient des enregistrements appelés aussi « lignes » (

    rows

    ). Une table est composée decolonnes (

    columns

    ) qui décrivent les enregistrements.

    Tables et données

    Considérons la figure suivante qui présente deux tables relationnelles permettant de stockerdes compagnies, des pilotes et le fait qu’un pilote soit embauché par une compagnie :

    Tableau 0-1 Classification des ordres SQL

    Ordres SQL Aspect du langage

    CREATE – ALTER – DROP - RENAME – TRUNCATE

    Définition des données (LDD)

    INSERT – UPDATE – DELETE - LOCK TABLE

    Manipulation des données (LMD)

    SELECT

    Interrogation des données (LID)

    GRANT – REVOKE – COMMIT – ROLLBACK – SAVEPOINT - SET TRANSACTION

    Contrôle des données (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 1:59 13 > Apogee FrameMaker Noir

  • © Éditions Eyrolles

    3

    Introduction

    Les clés

    La clé primaire (

    primary key

    ) d’une table est l’ensemble minimal de colonnes qui permet

    d’identifier de manière unique chaque enregistrement.

    Dans la figure précédente, les colonnes « clés primaires » sont notées en gras. La colonne

    comp

    représente le code de la compagnie et la colonne

    brevet

    décrit le numéro du brevet.

    Une clé est dite « candidate » (

    candidate key

    ) si elle peut se substituer à la clé primaire à tout

    instant. Une table peut contenir plusieurs clés candidates ou aucune.

    Dans notre exemple, les colonnes

    nomComp

    et

    nom

    peuvent être des clés candidates si onsuppose qu’aucun homonyme n’est permis.

    Une clé étrangère (

    foreign key

    ) référence dans la majorité des cas une clé primaire d’une autretable (sinon une clé candidate sur laquelle un index unique aura été défini). Une clé étrangèreest composée d’une ou de plusieurs colonnes. Une table peut contenir plusieurs clés étrangè-

    res ou aucune.

    Dans notre exemple, la colonne

    compa

    (notée en italique dans la figure) est une clé étrangère,car elle permet de référencer un enregistrement unique de la table

    Compagnie

    via la cléprimaire

    comp

    .

    Le modèle relationnel est ainsi fondamentalement basé sur les valeurs. Les associations entretables sont toujours binaires et assurées par les clés étrangères. Les théoriciens considèrentcelles-ci comme des pointeurs logiques. Les clés primaires et étrangères seront définies dansles tables en SQL à l’aide de contraintes.

    MySQL

    MySQL est à la fois le nom du SGBD et le nom de la société (qui se nomme en faitMySQL AB, décrite sur http://www.mysql.com) dont le siège se trouve en Suède à Uppsala –compter une cinquantaine de kilomètres au nord de Stockholm. Selon leurs dires, leur serveurde données, qui est écrit en C et C++, serait installé de façon opérationnelle sur plus de sixmillions de sites. D’un point de vue coût, l’utilisation du SGBD sur des projets importants(entre 250 000

    et 500 000

    ) ferait économiser 90 % sur le prix des licences du serveur,60 % sur les ressources système, 70 % sur le prix du matériel, 50 % sur les tâches d’adminis-tration et de support.

    4055_00d_Intro Page 3 Jeudi, 2. mars 2006 1:59 13 > Apogee FrameMaker Noir

    http://www.mysql.com

  • Apprendre SQL avec MySQL

    4

    © Éditions Eyrolles

    Par analogie avec les systèmes d’exploitation, depuis 1999, MySQL connaît le succès deLinux. Téléchargée près d’un million de fois en trois semaines (en octobre 2005), la version

    production

    de MySQL doit sa popularité du fait de son caractère

    open source

    , de ses fonction-nalités de plus en plus riches, de ses performances, de son ouverture à tous les principauxlangages du marché, de son fonctionnement sur les systèmes les plus courants (les distribu-tions classiques de Linux, Windows, Mac OS, BSD, Novell et les dérivés d’Unix) et de safacilité d’utilisation pour des applications Web de taille moyenne.

    Un peu d’histoire

    Le tableau suivant résume l’historique des fonctionnalités importantes du serveur de donnéesMySQL. Une version majeure comme 3.23 se décline au fil des mois en différentes sous-versions, en fonction des diverses phases de développement :

    alpha

    correspond à la phase active, de nouvelles fonctionnalités sont ajoutées.

    bêta

    correspond à l’implémentation des nouvelles fonctionnalités de la phase

    alpha

    , sansapport important de code.

    gamma

    correspond au terme

    release candidate

    (après résolution des bugs de la version

    bêta

    ).

    production

    est l’étape suivante aussi appelée GA (

    Generally Available

    ). Les bugs sontrésolus s’ils ne modifient pas le comportement général du serveur.

    old

    correspond à la précédente version de production (par rapport à la courante).

    Ainsi, en septembre 2005, la version 4.1.14 était mise en production et en octobre 2005, laversion 5.0 l’était aussi.

    Ce qui est planifié à moyen terme concerne un enrichissement général des commandes SQL,la prise en compte des types manquants de SQL2 et de ODBC3, la programmation des requê-tes hiérarchiques (interrogation de structures en arbres) en s’inspirant de ce qu’a fait Oracle enla matière (directive

    CONNECT BY

    dans un

    SELECT

    ).

    Tableau 0-2 Dates importantes pour MySQL

    Année – versions Caractéristiques principales

    1999 – 3.23.

    x

    Réplication – Recherches textuelles – Transactions et Intégrité référentielle tables InnoDB (2002 – 3.23.44)

    2001 – 4.0.

    x

    Cache de requêtes – Sécurisation SSL – Sauvegarde à chaud

    2003 – 4.1.

    x

    Support de Unicode – Données géographiques – SQL dynamique

    2004 – 5.0.

    x

    Vues – Curseurs – Procédures cataloguées – Déclencheurs – Dictionnaire des données – Transactions distribuées (XA)

    À venir – 5.1.

    x

    Jointure externe – Contraintes

    CHECK

    – Sauvegarde à chaud et Intégrité référentielle tables MyISAM

    4055_00d_Intro Page 4 Jeudi, 2. mars 2006 1:59 13 > Apogee FrameMaker Noir

  • © Éditions Eyrolles

    5

    Introduction

    Ce qui n’est pas encore planifié reste la prise en charge du stockage de données au formatXML et les extensions objets de SQL3 (principalement les types abstraits, les héritage et lesméthodes).

    Les changements opérés sont présentés en détail et par version à l’adresse http://dev.mysql.com/doc/refman/

    x.y

    /en/news.html (

    x.y

    étant le numéro de version majeure, parexemple actuellement 5.1)

    Offre du moment

    La figure suivante (merci au passage à http://www.iconarchive.com) présente la majeurepartie des fonctionnalités de MySQL qui se positionnent au sein du serveur de données(SGBD).

    Les API permettent d’intégrer SQL dans des programmes de différents langages. Le langageSQL sera utilisé par tous ceux (manuellement ou par un outil) travaillant sur la base dedonnées (administrateur, développeur, utilisateur). Le langage procédural de MySQL permetd’incorporer nativement tout ordre SQL dans un programme.

    Concrètement, une fois téléchargé et installé, vous avez accès à 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 àtélécharger puis à installer séparément.

    Figure 0-2

    Offre MySQL

    API : C, JDBC, ODBC, .NET, PHP, Python, Perl, Ruby, Microsoft VB

    Pool de connexions Authentification – Réutilisation de processus – Cache – …

    Utilitaires Sauvegarde Restauration Réplication Migrat ion Cluster …

    SQL LDD – LMD LCD - Vues Procédures Déclencheurs …

    Analyseur Requêtes Privilèges

    Optimiseur Accès Statistiques

    Cache Buffers

    Moteurs de stockage Mémoire - Index

    MyISAM InnoDB Archive Cluster Federated ...

    Serveur MysQL

    Système de fichiers NTFS – NFS – SAN - NAS

    Fichiers et logs Données – index - …

    4055_00d_Intro Page 5 Jeudi, 2. mars 2006 1:59 13 > Apogee FrameMaker Noir

    http://dev.mysql.com/doc/refman/http://dev.mysql.com/doc/refman/http://www.iconarchive.com

  • Apprendre SQL avec MySQL

    6

    © Éditions Eyrolles

    Licences

    Deux types de licences sont proposés par MySQL : commerciale et GPL. Dans le cadre d’undéveloppement d’application entièrement sous licence GPL, MySQL est gratuit. Il en va demême s’il n’est pas copié, modifié, distribué ou employé pour une utilisation en combinaisonavec un serveur Web (si vous développez l’application Web vous-même).

    Dans tous les autres cas, il est nécessaire d’obtenir 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 l’

    open source

    etceux qui engrangent des dollars à tour de bras.

    Dans la première catégorie, citons principalement Interbase 6 et Firebird de Borland,PostgreSQL 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 éditeurs s’ouvrent à la distribution gratuite. Ces produits nécessitent de solides confi-gurations, ce que n’exigent pas les éditeurs de la première catégorie :

    Fin 2004, Microsoft proposait

    SQL Server 2005 Express Edition

    qui est limité d’un seulCPU, 1 Go de mémoire et 4 Go de données.

    Fin 2004, Sybase offrait

    ASE Express Edition

    . Plusieurs instances peuvent cohabiter surune machine tout en n’utilisant pas plus d’un processeur, moins de 2 Go de RAM et pasplus de 5 Go de données.

    Oracle annonçait, en novembre 2005, une version gratuite avec

    Oracle Database XE

    (

    Express Edition

    ). Version toutefois « limitée » à un processeur, moins de 1 Go de RAM,une seule instance par système et pas plus de 4 Go de données.

    Peu de temps avant, IBM avait aussi annoncé 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 n’est donc pas finie. Bien malinqui pourra prédire qui gagnera sur ce terrain.

    Notion de schéma (database)

    MySQL appelle

    database

    un regroupement logique d’objets (tables, index, vues, déclen-cheurs, procédures cataloguées, etc.) pouvant être stockés à différents endroits de l’espacedisque. Je ferai donc souvent référence au terme « base de données » pour parler de cettenotion.

    On peut aussi assimiler ce concept à la notion de schéma, pour ceux qui connaissent Oracle.Là où MySQL et d’autres SGBD diffèrent, c’est sur la notion d’utilisateur (

    user

    ).

    4055_00d_Intro Page 6 Jeudi, 2. mars 2006 1:59 13 > Apogee FrameMaker Noir

  • © Éditions Eyrolles

    7

    Introduction

    Pour tous, un utilisateur sera associé à un mot de passe pour pouvoir se connecter et mani-puler des tables (s’il en a le droit, bien sûr).

    Pour MySQL, il n’y a pas de notion d’appartenance d’un objet (table, index, etc.) à unutilisateur. Un objet appartient à son schéma (

    database

    ). Ainsi, deux utilisateurs distincts(

    Jules

    et

    Paul) se connectant sur la même base (database) ne pourront pas créer chacunune table de nom Compagnie. S’ils doivent le faire, ce sera dans deux bases différentes(bdjules et bdpaul).

    ● Pour Oracle ou d’autres SGBD, chaque objet appartient à un schéma (user). Ainsi, deuxutilisateurs distincts Jules et Paul se connectant à la base (qui est un ensemble de sché-mas) pourront créer chacun une table de nom Compagnie (la première sera référencéeJules.Compagnie, la seconde Paul.Compagnie).

    La figure suivante illustre deux utilisateurs travaillant sur différentes bases par une interfacequi peut être la fenêtre de commande en ligne (dans la majeure partie des enseignements), ouun langage de programmation comme C, Java ou PHP (utilisation d’une API). Notez déjàl’existence de trois bases initiales (mysql, test et information_schema) que nousdétaillerons au chapitre 5.

    Notion d’hôteMySQL dénomme host la machine hébergeant le SGBD. MySQL diffère aussi à ce niveau desautres SGBD, car il est possible de distinguer des accès d’un même utilisateur suivant qu’il seconnecte à partir d’une machine ou d’une autre. La notion d’identité est basée sur le couplenom d’utilisateur MySQL (user) côté serveur, machine cliente.

    Identités

    Ainsi l’utilisateur Paul, se connectant depuis la machine camparols, peut ne pas être lemême que celui se connectant depuis la machine gambetta. S’il s’agit du même, il faudra, auniveau du serveur, éventuellement composer un ensemble de prérogatives équivalent pour lesdeux accès (voir le chapitre 5). S’il s’agit de deux personnes différentes, il faudra distinguer

    Figure 0-3 Notions de base et d’utilisateur MySQL

    Interface

    MySQL

    Jules Paul

    mysql test

    information_schema

    bdjules bdpaul

    4055_00d_Intro Page 7 Jeudi, 2. mars 2006 1:59 13 > Apogee FrameMaker Noir

  • Apprendre SQL avec MySQL

    8 © Éditions Eyrolles

    les attributions des différents droits. La figure suivante illustre le fait que deux utilisateurspeuvent se connecter par deux accès différents. Trois identités seront donc à prévoir côtéserveur.

    Nous verrons au chapitre 5 comment configurer le serveur et les clients. Nous étudierons auchapitre 9 des outils graphiques d’aide à l’administration.

    Accès à MySQL

    Une fois que vous aurez installé MySQL sur votre ordinateur, vous serez libre de choisirl’accès qui vous convient. Ce livre utilise essentiellement l’interface de commande en lignefournie avec le SGBD, mais aussi Java via JDBC, et le navigateur Web au travers de PHP.

    Aspects étudiésNous n’étudierons pas tous les éléments d’une base, car certains sont assez spécifiques etsortent du cadre traditionnel de l’enseignement, même supérieur. Le tableau suivant indiquedans quel chapitre du livre les principaux éléments d’un schéma sont étudiés :

    Figure 0-4 Notion d’hôte MySQL

    brassens

    Jules

    Paul

    mysql test

    jules@gambetta

    paul@camparols

    ...

    camparols

    gambetta

    Paul paul@gambetta

    TCP-IP

    Tableau 0-3 Éléments d’une base MySQL

    Éléments étudiés – Chapitre Aspects non étudiés

    Déclencheurs (triggers) – 7Fonctions et procédures – 7Tables et index – 1Séquences – 2, 5Vues (views) et utilisateurs – 5

    Clusters – Moteurs de stockage (storage engine) – Partitionnement – Données spatiales

    4055_00d_Intro Page 8 Jeudi, 2. mars 2006 1:59 13 > Apogee FrameMaker Noir

  • © Éditions 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 créer un point de restauration Windows pour pouvoir revenir à votre dernièrebonne configuration connue. Extraire l’archive téléchargée sur le site officiel de MySQL AB(http://dev.mysql.com/downloads/) dans un répertoire temporaire (exemple : C:\Temp), puisexécuter Setup.exe.

    InstallationLe premier choix est donné pour le type d’installation : typique, complète et personnalisée –choisir typique dans un premier temps.

    Le deuxième écran vous invite à vous enregistrer – ce n’est pas obligatoire, mais conseillétoutefois pour saluer l’énorme travail fait par ces jeunes informaticiens de génie (voilà, lapommade est passée).

    La suite concerne la configuration du serveur de données (choisir la configuration détailléepour suivre les différentes étapes et mieux comprendre le paramétrage de votre serveur).

    ● L’assistant propose en premier lieu de déterminer le type de votre serveur (machine dedéveloppement, serveur ou machine dédiée). J’ai opté pour le premier choix.

    ● Choissisez ensuite le type de base de données que vous comptez exploiter (multifonction,mode transactionnel seulement ou jamais transactionnel). J’ai opté pour le premier choix.

    ● Déterminez ensuite le répertoire qui contiendra les données des bases InnoDB (c’est letype de tables que nous utiliserons dans cet ouvrage, car étant le seul, dans cette version, àprendre en charge les clés étrangères). J’ai opté pour le choix par défaut.

    ● Choissisez ensuite l’option qui convient à votre utilisation (en fonction du nombre deconnexions). J’ai opté pour le premier choix (vingt connexions maximum).

    ● Il est ensuite possible de modifier le port UDP d’écoute (par défaut 3306) et le modecomportemental du serveur par rapport à la syntaxe des instructions SQL. J’ai opté pour lepremier choix (mode strict).

    ● Attention à ne pas sélectionner un jeu de caractères japonais dans l’écran qui arrive. J’aiopté pour les choix par défaut (West European et latin1).

    ● L’écran suivant permet de déclarer MySQL comme un service Windows (qu’on pourraarrêter via le panneau de configuration plutôt qu’avec une belle commande en ligne, ou parun Ctrl-Alt-Suppr bien connu des bidouilleurs…). Penser aussi à inclure dans le path lechemin de l’exécutable mysql de manière à pouvoir lancer une connexion en ligne decommande. Il vous suffit de cocher la case appropriée.

    ● Saisissez un mot de passe pour root ; vous pouvez aussi créer un compte anonyme(connexion fantôme sans utilisateur ni mot de passe).

    4055_00d_Intro Page 9 Jeudi, 2. mars 2006 1:59 13 > Apogee FrameMaker Noir

    http://dev.mysql.com/downloads/

  • Apprendre SQL avec MySQL

    10 © Éditions Eyrolles

    Après avoir validé la demande d’exécution (bouton Execute), quelques secondes vonts’écouler avant qu’on vous invite à terminer l’installation.

    Voilà, MySQL est installé. Si ce n’est pas le cas, la section suivante vous aidera sûrement.Dernière chose, si vous n’utilisez pas souvent MySQL, pensez à arrêter et à positionner surManuel le service (ce n’est pas pour l’espace qu’il occupe : 10 Mo en RAM).

    Pour modifier une configuration existante, vous trouverez un assistant dans Démarrer/MySQL/…/MySQL Server Instance Wizard.

    DésinstallationPour supprimer une configuration, vous trouverez un assistant dans Démarrer/Tous lesprogrammes/MySQL/…/MySQL Server Instance Wizard, choix Remove Instance.Cependant le répertoire installé par défaut dans Program Files reste sur le disque (compterune centaine de méga-octets). De même qu’en ce qui concerne les entrées dans le menu Démar-rer, je ne parle pas de la base de registres qui est inchangée…

    Dans Panneau de configuration, Ajout/Suppression de programmes, supprimerMySQL Server. Il reste encore des choses dans la base de registres. Le répertoire MySQL sousProgram Files a diminué de taille, mais il est toujours présent. Une fois que tout est fait,redémarrez votre machine et reprenez l’installation initiale. Prudence si vous modifiez leschemins des répertoires des données entre plusieurs installations.

    ReconfigurationEn relançant une installation, il vous est donné d’ajouter des composants (option Modify) sivous n’avez pas fait une installation complète au début. Vous avez aussi la possibilité de« réparer » (option Repair) une configuration existante.

    Premiers pas

    La procédure suivante va guider vos premiers pas pour travailler sous cette interface d’unemanière « professionnelle ». Il s’agit de stocker vos fichiers de commande qui pourront servirà différentes actions (créations de tables, de vues ou d’utilisateurs, insertions, modificationsou suppressions d’enregistrements, élaboration de requêtes, de procédures cataloguées, etc.).

    L’interface de commandeL’interface de commande en ligne porte le nom du SGBD (mysql). Cette interface ressembleà une fenêtre DOS ou telnet et permet de dialoguer de la plus simple façon avec la base dedonnées. L’utilisation peut être interactive ou « batch ». Qua