PHP Et MySQL Maitrisez Le Developpement d Un Site Web Dynamique Et Interactif

471

Transcript of PHP Et MySQL Maitrisez Le Developpement d Un Site Web Dynamique Et Interactif

  • Ce livre sur PHP et MySQL sadresse aux concepteurs et dveloppeurs qui souhaitent utiliser PHP et MySQL pour dvelopper un site Web dynamique et interactif. Dans la premire partie du livre, lauteur prsente la mise en oeuvre dune base de donnes MySQL : langage SQL (Structured Query Language), utilisation des fonctions MySQL, construction dune base de donnes (tables, index, vues), sans oublier les techniques avances comme la recherche en texte intgral ou le dveloppement de programmes stocks. Dans la deuxime partie du livre, aprs une prsentation des fonctionnalits de base du langage PHP, lauteur se focalise sur les besoins spcifiques du dveloppement de sites dynamiques et interactifs en sattachant apporter des rponses prcises et compltes aux problmatiques habituelles : gestion des formulaires, gestion des sessions, envoi de courriers lectroniques et bien sr accs une base de donnes MySQL. Abondamment illustr dexemples comments, ce livre (crit sur les versions 5 de PHP et de MySQL) est la fois complet et synthtique et vous permet daller droit au but. Les exemples cits dans le livre sont en tlchargement sur cette page.

    Ce livre numrique a t conu et est diffus dans le respect des droits dauteur. Toutes les marques cites ont t dposes par leur diteur respectif. La loi du 11 Mars 1957 nautorisant aux termes des alinas 2 et 3 de larticle 41, dune part, que les copies ou reproductions strictement rserves lusage priv du copiste et non destines une utilisation collective, et, dautre part, que les analyses et les courtes citations dans un but dexemple et dillustration, toute reprsentation ou reproduction intgrale, ou partielle, faite sans le consentement de lauteur ou de ses ayants droit ou ayant cause, est illicite (alina 1er de larticle 40). Cette reprsentation ou reproduction, par quelque procd que ce soit, constituerait donc une contrefaon sanctionne par les articles 425 et suivants du Code Pnal. Copyright Editions ENI

    PHPetMySQLMatrisez le dveloppement d'un site Web dynamique et interactif

    OlivierHEURTEL

    Rsum

    L'auteur Aprs plus de huit ans passs en socit de service, o il a successivement occup les postes de dveloppeur, chef de projet puis directeur de projet, Olivier Heurtel a dmarr une activit de consultant/formateur indpendant spcialis sur les bases de donnes (Oracle), le dveloppement Web (PHP) et les systmes dcisionnels. Il est certifi Oracle Certified Professional.

    - 1 - ENI Editions - All rigths reserved

  • Objectifsdelouvrage

    LobjectifdecetouvrageestdapprendredvelopperunsiteWebdynamiqueetinteractiflaidedePHPetMySQL.

    Pourrpondrecetobjectif,celivretudieendtail lesfonctionnalitsncessairesaudveloppementdunsiteWebdynamiqueetinteractif :

    l utilisation du langage SQL (Structered Query Language langage standard daccs aux bases de donnesrelationnelles)pourinterrogeretmodifierlesdonnesdunebasededonnesMySQL

    l crationdunebasededonnesMySQL

    l utilisationdesfonctionnalitsdebasedulangagePHP

    l accsunebasededonnesMySQLpartirdePHP

    l gestiondesformulaires

    l gestiondessessions(authentification,gestionduncontexte,utilisationdescookies)

    l envoiduncourrierlectronique(dontlescourriersauformatHTMLetceuxavecpicejointe)

    l gestiondesfichiers,dontletransfertdefichiersdupostedelutilisateurversleserveur("fileupload").

    Cet ouvrage sadresse des chefs de projet, concepteurs ou dveloppeurs ayant une connaissance de base de laprogrammationWebenHTML.

    Celivreabordelesversions5dePHPetdeMySQL.

    - 1 - ENI Editions - All rigths reserved

  • BrefhistoriquedePHPetMySQL

    1.PHP

    LelangagePHP(historiquementPersonalHomePage,officiellementacronymercursifdePHP :HypertextPreprocessor)atconuen1994parRasmusLerdorfpourcesbesoinspersonnels,avantdtrerendupublicaudbutde lanne1995.

    Courant1995,unenouvelleversion,compltementrcrite,estpubliesouslenomPHP/FIversion2.Cetteversion,capabledegrerlesformulairesetdaccderlabasemSQL,permetaulangagedesedvelopperrapidement.

    En1997,ledveloppementdulangageestprisenchargeparunequipeformeautourdeRasmusLerdorfetaboutitlasortiedelaversion3.

    En 2000, lanalyseur PHP est migr sur le moteur danalyse Zend afin doffrir de meilleures performances et desupporterunplusgrandnombredextension :cestlaversion4dePHP.

    En2004,laversion5voit lejour.Cettenouvelleversion,basesurlaversion2dumoteurZend,apporteplusieursnouveauts,laplupartconcernantledveloppementorientobjet.

    cejour,lesanalystesestimentquePHPestutilisparplusde20millionsdesitesWebdanslemonde(ennombrededomaines).

    2.MySQL

    MySQL est leSystme de Gestion de Base de Donnes Relationnelle (SGBDR) Open Source le plus rpandu dans lemonde.IlestdveloppparMySQLAB,uneentreprisesudoise.

    LapremireversiondeMySQLestapparueen1995.Cettepremireversionest crepourunusagepersonnelpartirdemSQL.

    En2000,laversion3.23estpasseenlicenceGPL(GeneralPublicLicense).

    En 2003, la version 4, apparue en 2001, est dclare stable. Cette version apporte de nombreuses nouvellesfonctionnalitsetamliorations :oprateurUNION, DELETEmultitables,nouvellesoptionspour lagestiondesdroits,amliorationdesperformances,sousrequtes(4.1),etc.

    En 2005, la version 5, apparue en 2003, est dclare stable. Cette version majeure introduit de nombreusesfonctionnalitsmanquantesdansMySQL :programmesstocks,triggers,vues.

    Fin2007,laversion5.1estdistribueenReleaseCandidateetdevraitsortirenversionfinaledbut2008.

    MySQLestdisponibleselondeuxlicencesdiffrentes :

    l LalicenceGPL

    l Unelicencecommerciale.

    SivousutilisezMySQLdansunproduitlibre,vouspouvezutiliserMySQLlibrement(versionMySQLCommunityServer).SivousutilisezMySQLdansunproduitcommercial,ousivoussouhaitezavoirunsupportpourlelogiciel,vousdevezacqurirunelicencecommerciale(versionMySQLEnterprise).

    - 1 - ENI Editions - All rigths reserved

  • OseprocurerPHPetMySQL

    Denombreux sitesWeb sont consacrs au langage PHP et MySQL. Ils permettent de tlcharger les produits, deconsulterdesexemplesdescriptsoudedialoguersurdesforums :

    Cette listeestvidemmentnonexhaustivemais tous lessitesprsentsproposentdenombreux liensversdautressites.Nhsitezpassurfer !

    TouslesexemplesdecetouvrageontttestsavecXAMPPLinux1.6.4(soitMySQL5.0.45etPHP5.2.4).

    Adresse Contenu

    www.php.net

    SiteofficieldePHPquiproposeletlchargementdePHPetunmanuelderfrenceenlignetrspratique.Vouspouveznotammentsaisirwww.php.net/nom_fonctionpouraccderdirectementlaideenlignedunefonctionPHP.

    wwwfr.mysql.com SiteofficieldeMySQLquiproposeletlchargementdeMySQL,uneaideenligne,desarticles,unforum,etc.

    www.phpindex.comSiteenfranaisconsacrPHPquiproposedesnews,desexemplesainsiquunforumdediscussion.Bref,unsitetrscompletmettredanssesfavoris.

    www.phpfrance.com AutresitefrancophoneconsacrPHPproposantdesrubriquessimilaires.

    www.zend.com/frSiteofficieldumoteurdescriptZendquiproposeluiaussilesrubriquesclassiquesdetlchargement,dexemples,deforum,

    www.easyphp.org

    Sitefrancophonequiproposegratuitementunproduitinstallable(EasyPHP)surplateformeWindows.Ceproduitcomprend :unserveurApache,PHPetMySQL.Voustlchargezleproduitetdoublecliquezsurlexcutablequiinstallelesdiffrentslments.Cinqminutesaprs,votreenvironnementPHPMySQLestoprationnel.CesiteestindispensablepourceuxquisouhaitentmonterrapidementuneconfigurationoprationnellecompltesurWindows.LesversionsutilisesparEasyPHPprsententtoujoursunlgerretardparrapportauxderniresversionsofficielles.

    www.apachefriends.org/fr/xampp.html

    Autresitequiproposeunproduitinstallable(XAMPP)surdiffrentesplatesformes(Linux,Windows,Solaris,MacOSX).Ceproduitcomprendluiaussi,entreautres,unserveurApache,PHPetMySQL.Lencorelinstallationesttrssimpleettrsrapide.LesversionsutilisesparXAMPPsonttoujourstrsrcentesparrapportauxderniresversionsofficielles.

    www.editionseni.com/exemples/ PagedusitedesditionsENIsurlaquellelesexemplestraitsdanscetouvragepeuventtretlchargs.

    - 1 - ENI Editions - All rigths reserved

  • Conventionsdcriture

    1.PHP

    LasyntaxedesfonctionsPHPestdcritedelamaniresuivantedanscetouvrage :

    type_retour nom_fonction(type_paramtre nom_paramtre)

    type_retour

    Typederetourdelafonction.

    nom_fonctionNomdelafonction.

    type_paramtre

    Typeduparamtreacceptparlafonction.

    nom_paramtreNomdonnauparamtre.

    Les types de donnes possibles seront prsents dans le chapitre Introduction PHP. Dans le cas o la fonctionaccepteunparamtredenimportequel typeet/ou retourneunevaleurdenimportequel type, le termemixte estutilis.

    Silafonctionneretournepasdevaleur,linformationtype_retourestomise.

    Exemple

    nom_fonction(type_paramtre nom_paramtre)

    Silafonctionneprendaucunparamtre,lesinformationstype_paramtreetnom_paramtresontomises.

    Exemple

    type_retour nom_fonction()

    Lesparamtresoptionnelssontindiqusentrecrochets([]).

    Exemple

    type_retour nom_fonction([type_paramtre nom_paramtre])

    Si la fonction accepte plusieurs paramtres, ces derniers sont indiqus, spars par une virgule, selon la mmeconvention.

    Exemple

    type_retour nom_fonction(type_paramtre_1 nom_paramtre_1, type_paramtre_2 nom_paramtre_2)

    Siunparamtrepeuttrerptunnombrequelconquedefois,ilestsimplementsuividelasquence[,].

    Exemple

    type_retour nom_fonction(type_paramtre nom_paramtre[,...])

    2.MySQL

    LasyntaxedesordresSQLestdcritedelamaniresuivantedanscetouvrage :

    MOT EN MAJUSCULES

    - 1 - ENI Editions - All rigths reserved

  • Motsclsdelacommande(CREATE TABLEparexemple).

    Danslapratique,ilspeuventtresaisisindiffremmentenmajusculesouenminuscules.

    mot en minucules

    Valeurssaisirrelativeslabasededonnesoulapplication(nomdetable,nomdecolonne,etc).

    Selonlecas,cesvaleurssontsensibleslacasseoupas(cf.IntroductionMySQLphpMyAdmin).

    []

    Clauseoptionnelle.

    [,]

    Laclauseprcdentepeuttrerpteplusieursfois.

    |Indiqueunchoixentreplusieursoptions.

    {}

    Dlimiteunelistedoptions.

    mot soulign

    Valeurpardfaut.

    mot en italique

    Clausedelacommandedontlasyntaxeestdtaillepart.

    - 2 - ENI Editions - All rigths reserved

  • Introductionauxbasesdedonnesrelationnelles

    1.Concepts

    Unebasededonnesestunensemblededonnesstructurescorrespondantgnralementundomainefonctionnel(facturation, ressources humaines, etc.). Physiquement, une base de donnes se matrialise par un ensemble defichiersstockssurunpriphriquedestockage.

    LesdonnesdunebasededonnessontgresparunlogicielappelSystmedeGestiondeBasedeDonnes(SGBD).Ce logicieloffreplusieurs fonctionnalits :accsauxdonnes,gestiondesmises jour, renforcementde lintgrit,contrledelascuritdaccs,etc.

    Une base de donnes relationnelle supporte une organisation des donnes bases sur le modle relationnel,dveloppen1970parEdgarFrankCodd.Cestlastructurelaplusrpandueaujourdhui.

    Dansunebasededonnesrelationnelle, lesdonnessontorganisesentables logiquement liesentreelles.Unetablecomporteuncertainnombredecolonnes(ouchamps)quidcriventuneligne(ouenregistrement).Lamiseenrelationdestablesseffectueparlintermdiairedunecolonne.

    Exemple

    livre +----+--------------------------------+---------------+

    | id | titre | id_collection | +----+--------------------------------+---------------+

    | 1 | PHP 5.2 - Dveloppement Web | 1 | | 2 | Oracle 10g - Administration | 1 | | 3 | Oracle 10g - Recovery Manager | 2 | | 4 | BusinessObjects 6 | 1 | | 5 | MySQL 5 - Mise en oeuvre | 1 | | 6 | PHP et MySQL (versions 4 et 5) | 3 | | 7 | MySQL 5 et PHP 5 | 4 | +----+--------------------------------+---------------+

    collection +----+--------------------------+

    | id | nom | +----+--------------------------+

    | 1 | Ressources Informatiques | | 2 | TechNote | | 3 | Les TP Informatiques | | 4 | Coffret Technique | +----+--------------------------+

    Surcetexemple,lestableslivreetcollectionsontliesparlescolonnesid_collectiondelatablelivreetiddelatablecollection.

    LinteractionavecunebasededonnesrelationnelleseffectuegrceaulangageSQL(StructuredQueryLangage).Celangagepermet la lectureet lamise jourdesdonnes,maisaussi ladfinitionde lorganisationdesdonnes, lagestiondelascurit,lerenforcementdelintgrit,etc.LelangageSQLestunlangagenormalis,maislesdiffrentsditeursdebasededonnesnerespectentpaslintgralitdustandard.

    2.Principesdeconceptiondunebasededonnes

    Laconceptiondunebasededonnesestunsujetcomplexedontnousnabordonsiciquelesprincipesdebase,dansuneapprochepluspratiquequethorique.

    Dans une base de donnes relationnelle, lobjectif est de stocker dans des tables diffrentes les informationscorrespondantdesentits(objets)diffrentsdudomainefonctionnel.Lebutestdviterlesredondancesetfaireensorte quune information donne ne soit stocke quune fois. Sur notre exemple prcdent, les informations surlauteurdunlivrenesontpasstockesdanslatablelivre lauteurdunlivreestuneentitfonctionnellepartentirequieststockedansunetablespare.

    Ceprocessusdesparationdesdonnesdansplusieurstablesestappel normalisation .

    Unenormalisationpousselextrmepeutnuireauxperformancesdesrequtesdinterrogationquidoiventlireun grand nombre de tables. Pour amliorer les performances des lectures, il est alors envisageable de

    - 1 - ENI Editions - All rigths reserved

  • dnormaliser lemodle,enregroupantdestables,quitteavoirdesdonnesredondantesdanslesdiffrenteslignes. Les bases de donnes des systmes dcisionnels, qui effectuent principalement des interrogationsgnralement complexes, sont trs souvent dnormalises. linverse, les bases de donnes des systmestransactionnels, qui effectuent principalement des petites interrogations simples et beaucoup de mises jour,respectentbienleprincipedenormalisation.

    Dansunebasededonnesrelationnelle,chaquetablestockelesinformationsrelativesunobjetmtierconcretouabstraitquidoittreidentifi.

    Danslatable,chaquecolonnestockeuneinformationunitaire(attribut,proprit)quicaractriseunelignedelatable.Chaquecolonnepossdeuntypededonnes(entier,chanedecaractres,date,etc)etpeuttreobligatoireounon.

    Une colonne ou combinaison de colonnes qui identifie de manire unique une ligne dune table est appele clcandidate.Lavaleurduneclcandidateestdiffrentepourtoutes les lignesde latable(pasdedoublonautoris).Uneclcandidatepeuttreconstitueparunecolonnearbitraireutilisespcifiquementpourcela.

    Laclprimairedunetableestunedesclscandidatesdelatable,choisieplusoumoinsarbitrairement,sicenestquelescolonnesdelaclprimairedoiventaussitreobligatoires ilyauneseuleclprimairepartable.Lesautresclscandidatesdelatablesontalorsappelesclsuniques.

    Unecolonneoucombinaisondecolonnesdunetablequirfrenceuneclcandidateduneautretable(engnrallaclprimaire)estappelecltrangre.Unetablepeutavoirplusieursclstrangres.

    Exemple

    Leschmacidessusprsentelemodledelabasededonnesutilisedanscetouvrage.Cemodleestunmodlesimplifidegestiondeslivresdunditeur.

    Cemodlecomportelestablessuivantes :

    auteur

    - 2 - ENI Editions - All rigths reserved

  • Auteursdeslivres.

    rubriqueRubriquespermettantleclassementdeslivresdansdiffrentescatgories(basededonnes,langagededveloppement,etc.).Lesrubriquessontorganisessurdeuxniveaux:rubriqueprincipaleetsousrubrique.Unesousrubriqueestrattacheunerubriqueparentparlintermdiairedelacolonneid_parent.Pourunerubriqueparent,lacolonneid_parentestvide.

    collection

    Collectionsdelditeurdanslesquellesleslivressontpublis.

    promotion

    Promotionssurleslivres.

    livre

    Livrespublisparlditeur.

    auteur_livre

    Relationentrelesauteursetleslivres:unauteurpeutcrireplusieurslivresetunlivrepeutavoirplusieursauteurs.

    rubrique_livre

    Relationentrelesrubriquesetleslivres:unerubriquepeutcontenirplusieurslivresetunlivrepeutappartenirplusieursrubriques.

    Dans toutes les tables, lexceptiondeauteur_livre etrubrique_livre, laclprimaireest lacolonneid. Pour lestables auteur_livre et rubrique_livre, la cl primaire est la combinaison des deux colonnes, respectivement(id_auteur,id_livre)et(id_rubrique,id_livre).

    Dansltatactueldumodle,ilyaunecluniquesurlacolonnenomdelatablecollection.DanslechapitreConstruireunebasededonnesdansMySQL,nousajouteronsdesclsuniquessurdautrestables.

    Latablelivrecomportedeuxclstrangres:id_collection(verslatablecollection)etid_promotion(verslatablepromotion).

    La tableauteur_livre comporte deux cls trangres :id_auteur (vers la tableauteur)etid_livre (vers la tablelivre).

    La tablerubrique_livre comportedeux clstrangres :id_rubrique (vers la tablerubrique)etid_livre (vers latablelivre).

    Latablerubriquecomporteunecltrangre:id_parent(verslatablerubrique).

    - 3 - ENI Editions - All rigths reserved

  • TravailleravecMySQL

    1.AdministrationduserveurMySQL

    AprsavoirinstallMySQL,nouspouvonsadministrerleserveurMySQLaveclecomptesuperutilisateurroot(rienvoiraveclecompterootsousUnixouLinux).

    Initialement,lecompterootnapasdemotdepasseetildisposedetouslesdroitssurtouteslesbasesdedonnesduserveurMySQL.Parcontre,ilnepeutseconnecterquelocalement(partirduserveurluimme).

    Dans lechapitreConstruireunebasededonnesdansMySQL,nousverronscommentcrerdautresutilisateursetleuraffecterdesdroits.

    2.Interfacelignedecommande

    LapplicationclientemysqlestunprogrammeinteractifquipermetdeseconnecterunserveurMySQLetdexcuterdesrequtessurceserveur.CetteapplicationsetrouvedanslerpertoirebindevotreinstallationMySQL.

    Syntaxe

    mysql [-h hte] [-u utilisateur] [-p[mot_de_passe]] [nom_base]

    -h hte

    Hteauquelilfautseconnecter(machinelocalepardfaut).

    -u utilisateur

    Nomdutilisateurpourlaconnexion(nomdelutilisateurcourantdusystmedexploitationpardfaut).

    -p[mot_de_passe]

    Motdepassepourlaconnexion(aucunmotdepassepardfaut).Silnestpasdonnsurlalignedecommande,ilserademanddemanireinteractive,ensaisiemasque.Silemotdepasseestspcifidanslalignedecommande(cequinestpasconseillpourlascurit),ilnedoitpasyavoirdespaceaprsloption-p.

    nom_base

    Baseslectionneaudpart(aucunepardfaut).

    Exemple

    [root@xampp ~]# mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 32 Server version: 5.0.45 Source distribution

    Type help; or \h for help. Type \c to clear the buffer.

    mysql>

    Surcetexemple,laconnexionseffectuelocalement,sansmotdepasse,entantquutilisateurroot.Commelutilisateurcourantestroot au niveau du systmedexploitation, lemme rsultat peut tre obtenuen tapant simplement lacommandemysql :

    [root@xampp ~]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. ...

    Siunmotdepasseestrequisetquevousnesouhaitezpaslesaisirsurlalignedecommande,vouspouvezutiliserlacommandesuivantepourvousconnecter :

    [root@xampp ~]# mysql -u root -p

    - 1 - ENI Editions - All rigths reserved

  • Enter password: **** Welcome to the MySQL monitor. Commands end with ; or \g. ...

    Siunmotdepasseestrequisetquevoustentezdevousconnectersansmotdepasse,vousobtenezuneerreur :

    ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)

    Demme,sivoustentezdevousconnecterpartirdunemachinequinestpasautorise,vousobtenezuneerreursimilaire.

    Danslinterfacelignedecommande,vouspouvezsaisirsoitdescommandesduclientmysqlsoitdesrequtesSQL.

    Lescommandesduclientmysqlsontinterprtesdirectementparleclientmysql.Unetellecommandedoittrecritesuruneseuleligneetlutilisationdupointvirguleenfindecommandeestsuperflue.Lescommandesduclientmysqlnesontpassensibleslacasseetpeuventtresaisiesindiffremmentenminusculesouenmajuscules.

    Les requtes SQL sont envoyes au serveur pour tre excutes. Une requte SQL peut tre crite sur plusieurslignes et doit se terminer par unpoint virgule. Lesmots cls du langageSQLne sont pas sensibles la casse etpeuventtresaisisindiffremmentenminusculesouenmajuscules.

    Lescommandesduclientmysqllesplussouventutilisessontlessuivantes :

    exitouquit

    Quittelapplication.

    usenom_base

    Utiliseuneautrebasededonnes.

    sourcefichier_script

    ExcuteunscriptSQL.

    delimitercaractres

    ModifieledlimiteurutilispourterminerunerequteSQL.

    Exemple

    [root@xampp ~]# mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 37 Server version: 5.0.45 Source distribution

    Type help; or \h for help. Type \c to clear the buffer.

    mysql> use information_schema Database changed

    mysql> SELECT schema_name FROM schemata; +--------------------+

    | schema_name | +--------------------+

    | information_schema | | cdcol | | mysql | | phpmyadmin | | test | +--------------------+

    5 rows in set (0.01 sec)

    mysql> exit Bye [root@xampp ~]#

    Dans la suite de cet ouvrage, nous prsenterons la syntaxe de lordreSQLSELECT, ainsi que la base de donnes

    - 2 - ENI Editions - All rigths reserved

  • information_schema.

    IlexisteaussiunordreSQLUSEquivalentlacommandeuse.

    3.MySQLQueryBrowser

    MySQL Query Browser est une application graphique dveloppe par la socit MySQL AB qui permet dditer etdexcuterdesrequtesSQLdansunebasededonnesMySQL.

    VouspouvezvousprocurerMySQLQueryBrowserladressesuivante :http://dev.mysql.com/downloads/.LeproduitestdisponiblesurlesplatesformesWindows,LinuxetMacOS.

    Lorsque vous lancez lapplication, une fentre de dialogue saffiche afin de saisir les paramtres de connexion auserveurMySQL :

    Danscettefentrededialogue,vousdevezindiquerlesinformationssuivantes :

    ServerHost

    Hteauquelilfautseconnecter(obligatoire).

    Username

    Nomdutilisateurpourlaconnexion(nomdelutilisateurcourantdusystmedexploitationpardfaut).

    Password

    Motdepassepourlaconnexion(aucunmotdepassepardfaut).

    DefaultSchema

    Base(ouschma)slectionneaudpart(aucunepardfaut).

    Unefoisconnect,lafentresuivantesaffiche :

    - 3 - ENI Editions - All rigths reserved

  • Dans lecadrededroite, loutil liste lesbasesdedonnesauxquelles lutilisateuraaccs.Encliquantsur lespetitstriangles,vouspouveztrsfacilementafficherlalistedestablesstockesdansunebasededonnes,puislastructuredunetable :

    Sivousdoublecliquezsurlenomdunebasededonnes,cellecidevientlabasededonnescourante :sonnomestalorsaffichengras.

    Dans le cadre suprieur, vous pouvez saisir le texte dune requte SQL puis cliquer sur le bouton Execute pourlexcuter lersultatdelarequtesaffichedanslongletResultset :

    - 4 - ENI Editions - All rigths reserved

  • Si vous double cliquez sur le nom dune table dans le cadre de droite, une requte permettant dafficher tout lecontenudelatableestautomatiquementrenseignedanslecadresuprieur.

    Si vous effectuez un clic droit sur un objet dans le cadre de droite, unmenu contextuel saffiche. Ce dernier vouspropose diffrents articles qui vous permettent de crer,modifier ou supprimer les objets (table, vue, programmestock) :

    Danslensemble,cetoutilesttrsconvivialetsonapprentissageestais.

    4.phpMyAdmin

    phpMyAdminestuneapplicationWebdveloppeenPHPquipermetdadministrerunserveurMySQL(sousrservededisposerduncompteutilisateurMySQLayantlesdroitssuffisants).

    phpMyAdminpermetde :

    l grerlesbasesdedonnesduserveurMySQL

    l grerlesutilisateursetlesdroits

    l grerlesdiffrentsobjetsdunebasededonnes(tables,colonnes,index,vues,programmesstocks,etc.)

    l diteretexcuterdesrequtesSQL

    - 5 - ENI Editions - All rigths reserved

  • l chargerdesfichierstextesdansdestables

    l exporterouimporterdestables

    l exporterlesdonnesdestablesdansdiffrentsformats(CSV,XML,PDF,etc)

    l Etc.

    VouspouvezvousprocurerphpMyAdminladressesuivante :http://www.phpmyadmin.net/

    phpMyAdminpeuttreconfigurlaidedufichierconfig.inc.php.

    Cefichierdeconfigurationpermetnotammentdespcifierlamthodedauthentification.

    SivousnesouhaitezpassaisirunnometunmotdepasselorsdelutilisationdephpMyAdmin,vouspouvezutiliserlamthodedauthentificationconfig aveccettemthode,lenomdelutilisateuretlemotdepassesontstocksdanslefichierdeconfiguration.Cedernierdoitcontenirlestroislignessuivantes :

    $cfg[Servers][$i][auth_type] = config; $cfg[Servers][$i][user] = root; // nom de lutilisateur $cfg[Servers][$i][password] = xhz12A8q0; // mot de passe

    Si vous souhaitez scuriser lutilisation de phpMyAdmin, vous pouvez utiliser lamthode dauthentificationcookie aveccettemthode,lenomdutilisateuretlemotdepassesontdemandsparphpMyAdmin.Lefichierdeconfigurationdoitcontenirlesdeuxlignessuivantes :

    $cfg[blowfish_secret] = abZ123aXiu65; ...

    $cfg[Servers][$i][auth_type] = cookie;

    Ladirectiveblowfish_secretpermetdedfinirunephrasequiserautilisepourchiffrerlemotdepassedelutilisateur.

    Quelquesoitlemodedauthentificationchoisi,lenomdutilisateuretlemotdepasseutilisspourlaconnexionphpMyAdmindoiventtreceuxduncompteMySQLvalide.ConsultezladocumentationdephpMyAdminpour

    obtenirplusdinformationssurlefichierdeconfigurationetlesdiffrentsmodesdauthentification.

    LapagedaccueildephpMyAdminaffichequelquesinformationsgnralessurleserveur :

    Pagedaccueil

    - 6 - ENI Editions - All rigths reserved

  • Entreautresactions,cettepagedaccueilpermetdecrerunenouvellebasededonnes(formulaireCrerunebasededonnes).

    Danslapartiegauchedelafentre,phpMyAdminaffichelalistedesbasesdedonnesgresparleserveurMySQL.

    Surlapagedaccueil,vouspouvezcliquersurleliencorrespondantunebasededonnesafindaccderlapagedadministrationdecettebasededonnes.

    Pagedadministrationdunebasededonnes

    - 7 - ENI Editions - All rigths reserved

  • Lapagedadministrationdunebasededonnesproposeplusieursonglets :

    Structure

    Cetongletaffichelalistedestablesetlalistedesprogrammesstocksetproposeplusieurslienseticnespourgrercesdiffrentsobjets.Pourditerunobjet,ilsuffitdecliquersurlicneStructure( )associe.

    SQL

    CetongletpermetdcriredesrequtesSQLsurlabasededonnesactuellementslectionne.

    Rechercher

    Cetongletpermetderechercherdesdonnesdansuneouplusieurstables.

    Requte

    CetongletproposeunditeurquipermetdeconstruiredesrequtesSQLsansconnatrelelangageSQL.

    Exporter

    Cetongletpermetdexportertoutoupartiedunebasededonnessousdiffrentesformes.

    Importer

    Cetongletpermetdexcuterlesrequtescontenuesdansunfichier.

    Oprations

    Cetongletpermetdeffectuerdiversesoprationssurlabasededonnes.

    Privilges

    Cetongletaffichelesdroitsdesutilisateursquiontaccslabasededonnescourante.

    Supprimer

    Cetongletpermetdesupprimerlabasededonnescourante.

    - 8 - ENI Editions - All rigths reserved

  • Danslapartiegauchedelafentre,phpMyAdminaffichelalistedestablesdelabasededonnes.Vouspouvezcliquersurleliencorrespondantunetableafindelditer.

    Lapagedditiondunetableproposeplusieursonglets :

    Afficher

    Cetongletaffichelesdonnesdelatableetpermetdelesmodifier.

    Structure

    Cetongletaffichelastructuredelatableetproposeplusieurslienseticnespourmodifiercettestructure(ajouterousupprimerdescolonnes,desindex,etc.).Pourditerunobjet,ilsuffitdecliquersurlicneModifier( )associe.

    SQL

    CetongletpermetdcriredesrequtesSQLsurlatable.

    Rechercher

    Cetongletpermetderechercherdesdonnesdanslatable.

    Insrer

    Cetongletproposeunformulairequipermetdinsrerdesnouvelleslignesdanslatable.

    Exporter

    Cetongletpermetdexporterlatablesousdiffrentesformes.

    Importer

    Cetongletpermetdimporterdesdonnesdanslatable.

    Pagedditiondunetable

    - 9 - ENI Editions - All rigths reserved

  • Oprations

    Cetongletpermetdeffectuerdiversesoprationssurlatable.

    Vider

    Cetongletpermetdeviderlatabledesoncontenusanslasupprimer(ordreSQLTRUNCATE).

    Supprimer

    Cetongletpermetdesupprimerlatable.

    5.Fichierdeconfiguration

    LesdiffrentsprogrammesMySQL,dontleserveurmysqld,peuventtreconfigursparplusieursoptionspassesenlignedecommandeouspcifiesdansunfichierdeconfiguration.

    Sur une plateforme Linux, le fichier de configuration sappelle my.cnf et se trouve gnralement dans lerpertoire/etc.SuruneplateformeWindows,lefichierdeconfigurationsappellemy.inietsetrouvegnralementdanslerpertoireWindows(c:\windowsparexemple).

    Lefichierdeconfigurationcomporteplusieurssectionsdlimitespardesmotsentrecrochets.

    Lasection[client]permetdedfinirdesoptionspourlesprogrammesclientscommemysql :port,motdepasse,etc.

    Lasection[mysqld]permetdespcifierdesoptionspourleserveur.

    - 10 - ENI Editions - All rigths reserved

  • Installernotrebasededonnesdedmonstration

    Danslasuitedecechapitre,nousallonstravailleravecunebasededonnesnommeeni.

    CettebasededonnesENIpeuttrecrelaideduscriptcreer-base-eni.sqlsuivant :

    -- Cration de la base de donnes. DROP DATABASE IF EXISTS eni ; CREATE DATABASE eni; USE eni;

    -- Cration de la table RUBRIQUE. CREATE TABLE rubrique ( id INT PRIMARY KEY AUTO_INCREMENT, titre VARCHAR(20) NOT NULL, id_parent INT ); INSERT INTO rubrique (id,titre,id_parent) VALUES (1,Base de donnes,NULL), (2,Dveloppement,NULL), (3,Internet,NULL), (4,Open Source,NULL) ;

    INSERT INTO rubrique (titre,id_parent) VALUES (MySQL,1), (Oracle,1), (Langages,2), (Mthode,2), (HTML - XML,3), (Conception Web,3), (Scurit,3), (Systme,4), (Langages,4), (Base de donnes,4) ;

    -- Cration de la table COLLECTION. CREATE TABLE collection ( id INT PRIMARY KEY AUTO_INCREMENT, nom VARCHAR(25) NOT NULL UNIQUE, prix_ht DECIMAL(5,2) DEFAULT 20, frais_ht DECIMAL(5,2) ); INSERT INTO collection (nom,prix_ht,frais_ht) VALUES (Ressources Informatiques,24.44,1.5), (TechNote,9.48,NULL), (Les TP Informatiques,25.59,1.5), (Coffret Technique,46.45,2) ;

    -- Cration de la table AUTEUR. CREATE TABLE auteur ( id INT PRIMARY KEY AUTO_INCREMENT, nom VARCHAR(40) NOT NULL, prenom VARCHAR(40) NOT NULL, mail VARCHAR(200), tel_bureau VARCHAR(10), tel_portable VARCHAR(10),

    - 1 - ENI Editions - All rigths reserved

  • tel_domicile VARCHAR(10), mot_de_passe BLOB, profil BLOB, UNIQUE (nom,prenom) ); INSERT INTO auteur (nom,prenom,mail,tel_bureau,tel_portable,tel_domicile) VALUES (HEURTEL,Olivier,NULL,NULL,0687731346,0102030405), (THIBAUD,Cyril,NULL,0203040506,NULL,NULL), (GUERIN,Brice-Arnaud,NULL,NULL,NULL,0304050607) ;

    -- Cration de la table PROMOTION. CREATE TABLE promotion ( id INT PRIMARY KEY AUTO_INCREMENT, intitule VARCHAR(40) NOT NULL, date_debut DATE, date_fin DATE, est_active BOOLEAN ); INSERT INTO promotion (intitule,date_debut,date_fin,est_active) VALUES (-5% sur cet ouvrage,CURDATE(),ADDDATE(CURDATE(),10),TRUE), (Frais de port offerts sur cet ouvrage,NULL,NULL,FALSE), (Un superbe marque page en cadeau,NULL,NULL,FALSE) ;

    -- Cration de la table LIVRE. CREATE TABLE livre ( id INT PRIMARY KEY AUTO_INCREMENT, isbn VARCHAR(20), titre VARCHAR(100) NOT NULL, sous_titre VARCHAR(100), nombre_pages INT, annee_parution YEAR(4), niveau ENUM(Dbutant,Initi,Confirm,Expert), id_collection INT, id_promotion INT, description TEXT, couverture BLOB, date_maj TIMESTAMP ); INSERT INTO livre (isbn,titre,sous_titre,nombre_pages,annee_parution,niveau,id_collection, id_promotion,description,couverture) VALUES (2-7460-1451-3,PHP 4, Dvelopper un site Web dynamique et interactif, 447,2001,Initi,1,1,NULL,NULL), (978-2-7460-3992-6,PHP 5.2, Dvelopper un site Web dynamique et interactif, 518,2007,Initi,1,1,NULL,NULL), (2-7460-3104-3,PHP 5, L\accs aux donnes (MySQL, Oracle, SQL Server, SQLite...), 211,2006,Expert,2,1,NULL,NULL), (2-7460-2778-X,Oracle 10g, Administration, 489,2005,Initi,1,NULL,NULL,NULL), (2-7460-2834-4,Oracle 10g, Installation du serveur sous Windows/Linux - Oracle Net, 161,2005,Expert,2,NULL,NULL,NULL), (2-7460-2833-6,Oracle 10g, Sauvegarde et restauration de la base de donnes avec RMAN, 174,2005,Expert,2,NULL,NULL,NULL), (2-7460-2281-8,BusinessObjects 6,

    - 2 - ENI Editions - All rigths reserved

  • NULL, 470,2004,Initi,1,NULL,NULL,NULL), (2-7460-3004-7,MySQL 5, Installation, mise en uvre, administration et programmation, 468,2006,Initi,1,NULL,NULL,NULL), (2-7460-2340-7,PHP et MySQL (versions 4 et 5), Entranez-vous crer des applications professionnelles, 272,2004,Initi,3,NULL,NULL,NULL), (2-7460-3377-1,MySQL 5 et PHP 5, Matrisez les sites web dynamiques, 972,2006,Initi,4,2,NULL,NULL) ;

    -- Cration de la table AUTEUR_LIVRE. CREATE TABLE auteur_livre ( id_auteur INT, id_livre INT, PRIMARY KEY (id_auteur,id_livre) ); INSERT INTO auteur_livre (id_auteur,id_livre) VALUES (1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (2,8), (3,9), (1,10), (2,10) ;

    -- Cration de la table RUBRIQUE_LIVRE. CREATE TABLE rubrique_livre ( id_rubrique INT, id_livre INT, PRIMARY KEY (id_rubrique,id_livre) ); INSERT INTO rubrique_livre SELECT rub.id,liv.id FROM livre liv,rubrique rub WHERE liv.titre like %PHP% AND rub.titre IN (Langages,Conception Web) AND rub.id_parent IS NOT NULL; INSERT INTO rubrique_livre SELECT rub.id,liv.id FROM livre liv,rubrique rub WHERE liv.titre like %MySQL% AND rub.titre IN (MySQL,Base de donnes) AND rub.id_parent IS NOT NULL; INSERT INTO rubrique_livre SELECT rub.id,liv.id FROM livre liv,rubrique rub WHERE liv.titre like %Oracle% AND rub.titre IN (Oracle) AND rub.id_parent IS NOT NULL;

    -- Cration de la table CATALOGUE. CREATE TABLE catalogue ( code VARCHAR(10) NOT NULL UNIQUE,

    - 3 - ENI Editions - All rigths reserved

  • titre VARCHAR(100) NOT NULL UNIQUE, prix_ttc DECIMAL(5,2) NOT NULL );

    -- Cration de trois programmes stocks delimiter // CREATE PROCEDURE ps_creer_collection ( -- Nom de la nouvelle collection. IN p_nom VARCHAR(25), -- Prix HT de la nouvelle collection. IN p_prix_ht DECIMAL(5,2), -- Identifiant de la nouvelle collection. OUT p_id INT ) BEGIN /* ** Insrer la nouvelle collection et ** rcuprer lidentifiant affect. */ INSERT INTO collection (nom,prix_ht) VALUES (p_nom,p_prix_ht); SET p_id = LAST_INSERT_ID(); END; // CREATE PROCEDURE ps_lire_sous_rubriques ( -- Identifiant dune rubrique (parent). IN p_id_parent INT ) BEGIN /* ** Slectionner les sous-rubriques dune ** rubrique dont lidentifiant est pass ** en paramtre. */ SELECT titre FROM rubrique WHERE id_parent = p_id_parent; END; // CREATE FUNCTION fs_nombre_sous_rubriques ( -- Identifiant dune rubrique (parent). p_id_parent INT ) RETURNS INT BEGIN /* ** Compter le nombre de sous-rubriques dune ** rubrique dont lidentifiant est pass ** en paramtre. */ DECLARE v_resultat INT; SELECT COUNT(*) INTO v_resultat FROM rubrique WHERE id_parent = p_id_parent; RETURN v_resultat; END; // delimiter ;

    - 4 - ENI Editions - All rigths reserved

  • -- Cration dun utilisateur eniweb. DROP USER eniweb@localhost; CREATE USER eniweb@localhost IDENTIFIED BY web; GRANT SELECT,INSERT,UPDATE,DELETE,EXECUTE ON eni.* TO eniweb@localhost;

    -- Affichage des tables. SHOW TABLES;

    Cescriptpeuttrercuprsurlesitedelditeur(www.enilivres.com).

    Pourcrerlabasededonnesenilaideduscriptprcdent,vouspouvezprocderdelamaniresuivante :

    l Lancezlapplicationclientemysqletconnectezvousauserveurentantquutilisateurroot :

    [root@xampp ~]# mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. ...

    l Excutezlescriptlaidedelacommandesource :

    mysql> source creer-base-eni.sql Query OK, 0 rows affected, 1 warning (0.00 sec)

    Query OK, 1 row affected (0.00 sec)

    Database changed ...

    ...

    +----------------+

    | Tables_in_eni | +----------------+

    | auteur | | auteur_livre | | catalogue | | collection | | livre | | promotion | | rubrique | | rubrique_livre | +----------------+

    8 rows in set (0.00 sec)

    Silescriptnestpasstockdanslerpertoirecourant,indiquezunchemincompletdanslacommandesource.

    - 5 - ENI Editions - All rigths reserved

  • ApprendrelesbasesdulangageSQL

    1.Typesdedonnes

    MySQLproposeplusieurstypesdedonnespourladfinitiondescolonnesdestables.DanslechapitreConstruireunebasededonnesdansMySQL,nousverronscommentutilisercestypesdedonnesdanslesordresdecrationdetable.

    a.Typeschanedecaractres

    MySQLproposelesprincipauxtypessuivantspourleschanesdecaractres :

    CHAR[(n)] [BINARY]Chanedelongueurfixe,dencaractres(ncomprisentre0et255,1pardfaut).Lorsdustockage,lachaneestcompltedroitepardesespacesjusqulalongueurdemande cesespacessontautomatiquementsupprimslorsquelachaneestlue.

    VARCHAR(n) [BINARY]

    Chanedelongueurvariable,dencaractresmaximum(ncomprisentre0et65535,1pardfaut).Lorsdustockage,aucunespacenestajout.Ilfautnoterquesilachanecontientdesespacesdroite,ceuxcinesontpassupprimslorsquelachaneestlue.

    TINYTEXT [BINARY]

    Chanedelongueurvariablejusqu255caractres.quivalentVARCHAR(255).

    TEXT [BINARY]

    Chanedelongueurvariablejusqu216-1caractres.

    MEDIUMTEXT [BINARY]

    Chanedelongueurvariablejusqu224-1caractres.

    LONGTEXT [BINARY]

    Chanedelongueurvariablejusqu232-1caractres.

    ENUM(valeur[,...])

    numration.Chanedontlavaleurdoitappartenirunelistedevaleurs(outreNULL).Unenumrationpeutcontenir65535valeursdistinctesaumaximum.

    SET(valeur[,...])

    Ensemble.Chanequipeutcontenirzro,uneouplusieursvaleursparmiunelistedevaleurs.Unensemblepeutcontenir64valeursdistinctesaumaximum.

    Pardfaut,leschanesdecaractresnesontparsensibleslacasse(Aestgala).LemotclBINARY,dansladfinitiondutype,permetdavoirunechane binaire sensiblelacasse.

    LestypesdedonnesENUMetSETnesontpassensibleslacasse.

    Comptetenudelasuppressiondesespaceslorsdelalecture,ab (espaceenfindechane)stockdansunecolonnedetypeVARCHARnestpasgalab stockdansunecolonnedetypeCHAR.

    b.Typesnumriques

    MySQLproposelesprincipauxtypesnumriquessuivants :

    - 1 - ENI Editions - All rigths reserved

  • TINYINT[(m)]

    Entiersignsur8bits(-128+127).

    SMALLINT[(m)]

    Entiersignsur16bits(-32768+32767).

    SMALLINT[(m)] UNSIGNED

    Entiernonsignsur16bits(065535).

    MEDIUMINT[(m)]

    Entiersignsur24bits(-223+223-1).

    MEDIUMINT[(m)] UNSIGNED

    Entiernonsignsur24bits(0+224-1).

    INT[(m)]

    Entiersignsur32bits(-231+231-1).

    INT[(m)] UNSIGNED

    Entiernonsignsur32bits(0+232-1).

    BIGINT[(m)]

    Entiersignsur64bits(-263+263-1).

    BIGINT[(m)] UNSIGNED

    Entiernonsignsur64bits(0+264-1).

    FLOAT[(n,d)] [UNSIGNED]

    Nombrevirguleflottanteensimpleprcision.nspcifielenombredechiffressignificatifsetdlenombredechiffresaprslavirgule sinetdsontomis,MySQLutiliselesvaleursmaximalespermisesparlamachine.SilemotclUNSIGNEDestspcifi,lesnombresngatifssontinterdits.

    DOUBLE[(n,d)] [UNSIGNED]

    Nombrevirguleflottanteendoubleprcision.nspcifielenombredechiffressignificatifsetdlenombredechiffresaprs la virgule sin et d sont omis,MySQL utilise les valeursmaximales permises par lamachine. Si lemot clUNSIGNEDestspcifi,lesnombresngatifssontinterdits.

    FLOAT(p) [UNSIGNED]

    Nombrevirguleflottante.Pspcifielaprcisionenbits.CetteprcisionestutiliseparMySQLpourdterminerletypeutilis :FLOATentre0et24etDOUBLEentre25et53.

    DECIMAL[(n[,d])] [UNSIGNED]

    Nombrevirgulefixe.nspcifielenombredechiffressignificatifs(10pardfaut,65aumaximum)etdlenombredechiffresaprslavirgule(0pardfaut,30aumaximum).SilemotclUNSIGNEDestspcifi,lesnombresngatifssontinterdits.

    Pour les diffrents types entiers, le nombre optionnel m permet de dfinir une longueur daffichage (pas unecontraintesurlaplagedevaleursautorises) lesvaleursentiresdontlalongueurestinfrieurecettelimitesontaffichescompltesgauchepardesespaces.Pourcompltergauchepardeszros,ilestpossibledajouterlemotclZEROFILLlafindeladfinitiondutype.

    INTEGERestunsynonymedeINT.

    - 2 - ENI Editions - All rigths reserved

  • DEC,NUMERICetFIXEDsontdessynonymesdeDECIMAL.

    c.Typeboolen

    BOOL,BOOLEAN

    SynonymesdeTINYINT(1)utilisspourreprsenterunevaleurboolenne(0estconsidrcommefaux touteautrevaleurestconsidrecommevraie).

    d.Typesdateetheure

    MySQLproposelesprincipauxtypessuivantspourlesdatesetheures :

    DATE

    Datecompriseentrele01/01/1000et 31/12/9999.Formatpardfaut :YYYY-MM-DD.

    DATETIME

    Dateetheurecompriseentrele01/01/1000 00:00:00et31/12/9999 23:59:59.Formatpardfaut :YYYY-MM-DD HH:MM:SS.

    TIMESTAMP

    Dateetheurecompriseentrele01/01/1970 00:00:01et19/01/2038 04:14:08.Formatpardfaut :YYYY-MM-DD HH:MM:SS.

    TIME

    Heurecompriseentre-838:59:59et838:59:59.Formatpardfaut :HH:MM:SS.

    YEAR[(2|4)]Annesur2ou4chiffres(4pardfaut),compriseentre70(pour1970)et69(pour2069)pourlannesur2chiffresetentre1901et2155pourlannesur4chiffres.Formatpardfaut :YYYY.

    LetypededonnesTIMESTAMPachangentrelaversion4etlaversion5.

    e.Typespourlesdonnesbinaires

    MySQLproposelesprincipauxtypessuivantspourlesdonnesbinaires(image,son,etc.) :

    TINYBLOB

    Donnebinairejusqu255octets.

    BLOB

    Donnebinairejusqu216-1octets.

    MEDIUMBLOB

    Donnebinairejusqu224-1octets.

    LONGBLOB

    Donnebinairejusqu232-1octets.

    Sicestypessontutilisspourstockerdeschanesdecaractres,cesderniressontsensibleslacasse.

    - 3 - ENI Editions - All rigths reserved

  • 2.Nomdesobjets

    Unnomdebasededonnes,detable,decolonneoudindexestlimit64octets.

    Pourvoussimplifierlatche,nousvousconseillonsdenutiliserquedescaractresnonaccentus,deschiffresetlescaractres$et_(soulign)pourvosnomsdobjets.Lutilisationdetoutautrecaractreimposeeneffetdedlimiterlenomsoitpardesapostrophesobliques(`)soitpardesguillemets(")silaconfigurationduserveurlepermet.

    AvecMySQL, lesbasesdedonneset lestablescorrespondentdesdossiersetdes fichiers.Enconsquence, lesnomsdebasesdedonnesetdetablessontsensibleslacassesilesnomsdefichierslesontauniveaudusystmedexploitation.CelasignifiequelesnomsdebasesdedonnesetdetablessontsensibleslacassesurlesplatesformesUnixetLinuxetnonsensibleslacassesurlesplatesformesWindows.

    Lesnomsdecolonnesnesontpassensibleslacasse.

    Lessyntaxespermettantderfrencerunnomdetableetunnomdecolonnesontlessuivantes :

    [nom_base.]nom_table [[nom_base.]nom_table.]nom_colonne

    Unnomdetablepeuttrerfrencdirectementsilatableeststockedanslabasededonnescourante.Silatableappartientuneautrebasededonnes, ilestncessairedeprfixer lenomde latablepar lenomde labasededonnespouryfairerfrence.

    De mme, un nom de colonne peut tre prfix par un nom de table (luimme prfix par un nom de base dedonnes).

    Dans la suite de cet ouvrage, dans les descriptions de syntaxe, les termes nom_table et nom_colonne dsignentrespectivementunnomdunetableetunnomdecolonne,aveclesdiffrentespossibilitsdesyntaxeprsentescidessus.

    3.Valeurslittrales

    a.Chane

    Unechanelittraleestdlimitepardesapostrophes :ceci est une chane.

    Si la configuration du serveur MySQL le permet, il est aussi possible de dlimiter une chane littrale par desguillemets.CettepossibilitestdconseillecarellenerespectepaslanormeANSI.

    lintrieurdunechane,certainessquencesdecaractresprcdesparlecaractredchappementantislash(\)ontunesignificationspciale :

    \

    Apostrophe

    \"

    Guillemet

    \n

    Nouvelleligne

    \r

    Retourchariot

    \t

    Tabulation

    \\

    Antislash

    Pour intgrer une apostrophe lintrieur dune chane littrale dlimite par des apostrophes, il existe deux

    - 4 - ENI Editions - All rigths reserved

  • possibilits :

    l doublerlapostrophe :larticle

    l faireprcderlapostropheparlecaractredchappementantislash :l\article.

    Pardfaut,leschanesdecaractresnesontpassensibleslacasse,saufsiellessontdfiniessouslaformedunechanebinaire,cequipeuttrefaitenfaisantprcderlavaleurdeloprateurBINARY.Ainsi,pardfautaestgalA,maisBINARYa estdiffrentdeA,

    b.Nombre

    Un nombre peut tre crit directement, sans dlimiteur. Le sparateur dcimal est le point (.). La notationexponentielleestautorise.

    Exemples

    123 -10 1.23 1.2e3

    c.Date,heure,date/heure

    UnedatepeuttrecritesoitsouslaformedunechaneauformatYYYY-MM-DD,soitsouslaformedunnombreauformatYYYYMMDD.

    UneheurepeuttrecritesoitsouslaformedunechaneauformatHH:MM:SS,soitsouslaformedunnombreauformatHHMMSS.

    Unedate/heurepeuttrecritesoitsouslaformedunechaneauformatYYYY-MM-DD HH:MM:SS,soitsouslaformedunnombreauformatYYYYMMDDHHMMSS.Lheureestcompriseentre0et23.

    Exemples

    2001-12-19 20031213 2001-12-19 23:15:00 20031213031500

    d.Boolen

    Lesdeuxvaleursboolennes vrai et faux peuventtre reprsentespar lesconstantesTRUE (valeur1)etFALSE(valeur0).Lenomdecesconstantesnestpassensiblelacasse.

    4.Expression

    Uneexpressionpeututiliserdesvaleurslittrales,desnomsdecolonnes,desvariables,lesoprateursarithmtiqueshabituels(+,-,*,/),desparenthsesetdesfonctions(cf.chapitreUtiliserlesfonctionsMySQL).

    Exemples

    prix_ht * ( 1 + taux_tva/100 ) UPPER(titre)

    5.ValeurNULL

    LavaleurNULLsignifielabsencedevaleur.NULLestdiffrentde0,etdiffrentdunechanevide.

    UneexpressionquicontientunevaleurNULLdonnetoujoursunrsultatNULL(parexemple,10 + NULLestgalNULL).

    LesvaleursNULLsontsouventsourcedeproblme danslasuitedecetouvrage,nousverronscommentviterces

    - 5 - ENI Editions - All rigths reserved

  • problmes.

    6.Variables

    a.Variablesutilisateurs

    MySQLpermetdutiliserdesvariablesutilisateursspcifiqueslaconnexionaveclasyntaxe@nom_variable.Unnomdevariablepeutcontenirdescaractresalphanumriques,ainsiquelescaractres_,$et..

    Lesvariablesnontpasbesoindtreinitialisesavantdtreutilises pardfaut,ellescontiennentlavaleurNULL.Unevariableutilisateurpeutcontenirunnombre(entierourel)ouunechanedecaractres.

    Lesvariablespeuventtreutilisesdansdesexpressions.

    Pouraffecterunevaleurunevariable,vouspouvezutiliserlacommandeSET.

    Syntaxe

    SET @nom_variable = expression [,...]

    Pourafficherlavaleurdunevariable,vouspouvezutiliserunesyntaxesimplifiedelordreSELECT.

    Syntaxe

    SELECT @nom_variable [,...]

    Exemple

    mysql> SET @taux_tva=19.6; Query OK, 0 rows affected (0.00 sec)

    mysql> SELECT ROUND(100 * ( 1 + @taux_tva/100 ),2); +--------------------------------------+

    | ROUND(100 * ( 1 + @taux_tva/100 ),2) | +--------------------------------------+

    | 119.60 | +--------------------------------------+

    1 row in set (0.00 sec)

    b.Variablessystmes

    MySQL fournit un grand nombre de variables qui permettent dobtenir des informations sur le fonctionnement duserveur.Dans laplupartdescas, lavaleurdecesvariablespeuttremodifiepourchanger lefonctionnementduserveur.

    Ilexistedeuxtypesdevariables :

    l Les variables globales qui affectent lensemble du serveur. Ces variables globales sont initialises audmarrageduserveur,partirdufichierdeconfigurationetdesargumentspasssenlignedecommandeauserveurMySQL.

    l Lesvariablesdesessionquiaffectentlesconnexions.Cesvariablesdesessionsontinitialisesaumomentdelaconnexionpartirdesvaleursdesvariablesglobalescorrespondantes.

    LacommandeSETpermetdemodifierlavaleurdunevariableglobaleoudesession.

    Syntaxes

    SET GLOBAL nom_variable = valeur SET @@global.nom_variable = valeur SET [SESSION] nom_variable = valeur SET [@@[session.]]nom_variable = valeur

    Les deux premires syntaxes permettent demodifier une variable globale et les deux dernires une variable desession(SESSIONetsessionsontoptionnels).LOCALestsynonymedeSESSION.

    - 6 - ENI Editions - All rigths reserved

  • Lamodificationdunevariableglobalenaffectepaslessessionsdjconnectes(pasmmelasessionquieffectuelamodification).

    Pourafficher lavaleurdunevariableglobaleoudesession,vouspouvezutiliserunesyntaxesimplifiede lordreSELECT.

    Syntaxes

    SELECT @@global.nom_variable SELECT @@[session.]nom_variable

    Exemple

    mysql> SELECT @@lc_time_names; +-----------------+

    | @@lc_time_names | +-----------------+

    | en_US | +-----------------+

    1 row in set (0.00 sec)

    mysql> SET @@lc_time_names=fr_FR; Query OK, 0 rows affected (0.00 sec)

    7.Commentaires

    MySQLsupportetroistypesdecommentaires :

    l depuislecaractre#(dise)jusqulafindelaligne

    l depuislasquence-- (deuxtiretssuivisdunespace)jusqulafindelaligne

    l entrelessquences/*et*/,cesdeuxsquencespouvanttresurdeslignesdiffrentes.

    Exemple

    /* Exemple de commentaire crit sur plusieurs lignes */ SELECT * FROM collection ORDER BY rand(); -- tri alatoire ! (commentaire mono-ligne)

    - 7 - ENI Editions - All rigths reserved

  • ExcuterdesrequtesSQLsimples

    1.LemodeSQLduserveur

    Le serveurMySQLpeut fonctionner selondiffrentsmodesSQL. LemodeSQLdfinit quelle syntaxeSQLpeut treutiliseetquellesvrificationsleserveurdoitfaire,notammentlorsdesmisesjour.

    LemodeSQLutilisaudmarrageestdfiniparlavaleurdeloptionsql-mode(surlalignedecommandedudmonMySQLoudanslefichierdeconfiguration).

    Depuislaversion4.1,vouspouvezmodifierlemodeSQLaprsledmarragegrcelavariablesystmesql_mode.LemodeSQLpeuttremodifiauniveauglobalouauniveausession(chaqueconnexionpeututiliserunmodediffrentadaptcesbesoins).

    LemodeSQLestdfiniparunelistedemotsclssparspardesvirgules.Lavaleurpardfautestvide(pasdemodeconfigur).

    Avec lemode par dfaut (pas demode), le serveurMySQL vite de gnrer des erreurs lors desmises jour etnhsitepasmodifierdesvaleurspourpermettreleuraffectationunecolonne unesimplealerteestmise.

    Pourmodifiercecomportement,lesmodesSTRICT_TRANS_TABLES ouSTRICT_ALL_TABLESpeuventtreutiliss :cestlemode SQL "strict". Dans ce mode, les valeurs invalides sont rejetes et une erreur est gnre. Le modeSTRICT_ALL_TABLES sappliquetouslesmoteursdestockage lemodeSTRICT_TRANS_TABLES sappliqueuniquementauxmoteursdestockagetransactionnel.

    Nousreviendronsplusendtailsurcesujetdanslasuitedecechapitre.

    LanotiondemoteurdestockageestprsentedanslechapitreConstruireunebasededonnesdansMySQLGrerlestables.

    ExempledaffichageetdemodificationdumodeSQL

    mysql> SELECT @@sql_mode; +------------+

    | @@sql_mode | +------------+

    | | +------------+

    1 row in set (0.00 sec)

    mysql> SET @@sql_mode=STRICT_ALL_TABLES; Query OK, 0 rows affected (0.00 sec)

    mysql> SELECT @@sql_mode; +-------------------+

    | @@sql_mode | +-------------------+

    | STRICT_ALL_TABLES | +-------------------+

    1 row in set (0.00 sec)

    IlexistedautresmodesSQL(ANSI,TRADITIONAL,etc.).Pourensavoirplus,consultezladocumentation.

    2.Obtenirdesinformations

    LinstructionSQL SHOW offre diffrentes formes qui permettent dobtenir des informations sur le serveurMySQL, lesbasesdedonnesquilgreetlecontenudecesbasesdedonnes(lestables,lescolonnes,etc.).

    Dans cette section, nous prsentons les formes les plus utilises de la commande SHOW permettant dafficher desinformationssur lesbasesdedonnesgrespar leserveur, les tablesstockesdansunebasededonneset lastructuredunetable :

    SHOW DATABASES

    - 1 - ENI Editions - All rigths reserved

  • SHOW SCHEMAS

    ListedesbasesdedonnesgresparleserveurmySQL.

    SHOW TABLES

    Listedestablesstockesdanslabasededonnescourante.

    SHOW COLUMNS FROM nom_table

    { DESCRIBE | DESC } nom_tableListedescolonnesdunetable.

    Exemple

    mysql> SHOW DATABASES; +--------------------+

    | Database | +--------------------+

    | information_schema | | cdcol | | eni | | mysql | | phpmyadmin | | test | +--------------------+

    6 rows in set (0.00 sec)

    mysql> USE eni; Database changed mysql> SHOW TABLES; +----------------+

    | Tables_in_eni | +----------------+

    | auteur | | auteur_livre | | catalogue | | collection | | livre | | promotion | | rubrique | | rubrique_livre | +----------------+

    6 rows in set (0.00 sec)

    mysql> DESC collection; +----------+--------------+------+-----+---------+----------------+

    | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+

    | id | int(11) | NO | PRI | NULL | auto_increment | | nom | varchar(25) | NO | UNI | | | | prix_ht | decimal(5,2) | YES | | 20.00 | | | frais_ht | decimal(5,2) | YES | | NULL | | +----------+--------------+------+-----+---------+----------------+

    4 rows in set (0.00 sec)

    mysql>

    DanslechapitreConstruireunebasededonnesdansMySQL,nousverronsdautresvariantesdelacommandeSHOWquipermettentdercuprerdesinformationssurlesvues,lesprocduresetlestriggers.

    3.Afficherleserreursetlesalertes

    La commande SHOW WARNINGS permet dafficher les alertes ou les erreurs gnres par la dernire commande. La

    - 2 - ENI Editions - All rigths reserved

  • commandeSHOW ERRORSpermetdafficheruniquementleserreursgnresparladernirecommande.

    Danslapplicationclientemysql,leserreursgnresparladernirecommandesontautomatiquementaffiches.Parcontre, pour les alertes, lapplication indique uniquement le nombre dalertes gnresmais ne les affiche pas lacommandeSHOW WARNINGSestalorstrsutile.

    Exemple

    mysql> INSERT INTO rubrique(titre) -> VALUES(Messagerie et travail de groupe); Query OK, 1 row affected, 1 warning (0.00 sec)

    mysql> SHOW WARNINGS; +---------+------+--------------------------------------------+

    | Level | Code | Message | +---------+------+--------------------------------------------+

    | Warning | 1265 | Data truncated for column titre at row 1 | +---------+------+--------------------------------------------+

    1 row in set (0.00 sec)

    4.Lirelesdonnes

    a.SyntaxedebasedelordreSELECT

    LordreSQLSELECTpermetdelirelesdonnes.

    LasyntaxelaplussimplepourlordreSELECTestlasuivante :

    SELECT [DISTINCT] expression[,...] | * FROM nom_table

    La clauseFROM indique dans quelle table lire les donnes.Nous verrons plus loin comment lire les donnes dansplusieurstables.

    La clauseSELECTcontientunelistedexpressionssparesparunevirgule.Uneexpressionpeuttreunecolonnedunetable,unevaleurlittraleouuneexpressioncalculeutilisantventuellementuneouplusieurscolonnesdunetable.laplacedunelistedexpressions,ilestpossibledutiliserunastrisquepourindiquerquetouteslescolonnessontslectionnes.

    Aveclasyntaxesuivante,toutesleslignesdelatablesontretournes.Nousverronsplusloincommentrestreindrelersultatdunerequte.

    Exemples

    mysql> SELECT * FROM collection; +----+--------------------------+---------+----------+

    | id | nom | prix_ht | frais_ht | +----+--------------------------+---------+----------+

    | 1 | Ressources Informatiques | 24.44 | 1.50 | | 2 | TechNote | 9.48 | NULL | | 3 | Les TP Informatiques | 25.59 | 1.50 | | 4 | Coffret Technique | 46.45 | 2.00 | +----+--------------------------+---------+----------+

    4 rows in set (0.00 sec)

    mysql> SELECT id,nom FROM collection; +----+--------------------------+

    | id | nom | +----+--------------------------+

    | 1 | Ressources Informatiques | | 2 | TechNote | | 3 | Les TP Informatiques | | 4 | Coffret Technique | +----+--------------------------+

    4 rows in set (0.00 sec)

    mysql> SELECT nom,prix_ht+ROUND(prix_ht*5.5/100,2) FROM collection; +--------------------------+----------------------------------+

    - 3 - ENI Editions - All rigths reserved

  • | nom | prix_ht+ROUND(prix_ht*5.5/100,2) | +--------------------------+----------------------------------+

    | Ressources Informatiques | 25.78 | | TechNote | 10.00 | | Les TP Informatiques | 27.00 | | Coffret Technique | 49.00 | +--------------------------+----------------------------------+

    4 rows in set (0.00 sec)

    Surledernierexemple,ROUND(prix_ht*(1+5.5/100),2)estuneexpressioncalculesurlacolonneprix_ht.

    LemotclDISTINCTpermetdobteniruneseuleoccurrencedechaqueensembledelignesdupliques.

    Exemple

    mysql> SELECT annee_parution FROM livre; +----------------+

    | annee_parution | +----------------+

    | 2001 | | 2007 | | 2006 | | 2005 | | 2005 | | 2005 | | 2004 | | 2006 | | 2004 | | 2006 | +----------------+

    10 rows in set (0.00 sec)

    mysql> SELECT DISTINCT annee_parution FROM livre; +----------------+

    | annee_parution | +----------------+

    | 2001 | | 2007 | | 2006 | | 2005 | | 2004 | +----------------+

    5 rows in set (0.00 sec)

    mysql> SELECT annee_parution,niveau FROM livre; +----------------+--------+

    | annee_parution | niveau | +----------------+--------+

    | 2001 | Initi | | 2007 | Initi | | 2006 | Expert | | 2005 | Initi | | 2005 | Expert | | 2005 | Expert | | 2004 | Initi | | 2006 | Initi | | 2004 | Initi | | 2006 | Initi | +----------------+--------+

    10 rows in set (0.00 sec)

    mysql> SELECT DISTINCT annee_parution,niveau FROM livre; +----------------+--------+

    | annee_parution | niveau | +----------------+--------+

    | 2001 | Initi | | 2007 | Initi | | 2006 | Expert | | 2005 | Initi | | 2005 | Expert |

    - 4 - ENI Editions - All rigths reserved

  • | 2004 | Initi | | 2006 | Initi | +----------------+--------+

    7 rows in set (0.00 sec)

    LordreSELECT peut aussi treutilis pour lire des expressions calcules, oudes variables, sans rfrence unetable.Danscecas,laclauseFROMestabsente.

    Exemple

    mysql> SELECT 1+2+3; +-------+

    | 1+2+3 | +-------+

    | 6 | +-------+

    1 row in set (0.00 sec)

    Depuislaversion4.1,vouspouvezspcifierdualcommenomdetabledanslaclauseFROM,danslecasoaucunetable nest rfrence. Cette possibilit permet dtre compatible avec les serveurs de base de donnes qui nesupportentpasleSELECTsansclauseFROM.

    Exemple

    mysql> SELECT 1+2+3 FROM dual; +-------+

    | 1+2+3 | +-------+

    | 6 | +-------+

    1 row in set (0.00 sec)

    DanslaclauseSELECTuneexpressionpeuttresuiviedunaliasquipermetdenommerlexpression.

    Syntaxe

    expression [AS] alias

    LemotclASestoptionnel.

    Exemple

    mysql> SELECT nom,prix_ht+ROUND(prix_ht*5.5/100,2) prix_ttc -> FROM collection; +--------------------------+----------+

    | nom | prix_ttc | +--------------------------+----------+

    | Ressources Informatiques | 25.78 | | TechNote | 10.00 | | Les TP Informatiques | 27.00 | | Coffret Technique | 49.00 | +--------------------------+----------+

    4 rows in set (0.00 sec)

    Unaliaspeuttreappliquunesimplecolonne,cequiapoureffetderenommer lacolonnedans linterrogationuniquement(pasdanslatable).

    Silaliascomportedesespacesoutoutautrecaractrespcial,ildoittresaisientreguillemets.

    Demme,dans la clauseFROM,unnomde tablepeuttresuividunaliasquipermetde renommer la tabledanslinterrogationuniquement(pasdanslabasededonnes).

    Syntaxe

    nom_table [AS] alias

    LemotclASestoptionnel.

    - 5 - ENI Editions - All rigths reserved

  • Unaliasdetablepeuttreutilislaplacedunomdelatablepourprfixerunecolonne.

    Exemple

    mysql> SELECT col.nom FROM collection col; +--------------------------+

    | nom | +--------------------------+

    | Ressources Informatiques | | TechNote | | Les TP Informatiques | | Coffret Technique | +--------------------------+

    4 rows in set (0.00 sec)

    Cettepossibilitestparticulirementintressantedanslesinterrogationsportantsurplusieurstables.

    Eneffet,danscegenredinterrogation,ilestconseilldeprfixerlenomdescolonnesparlenomdelatable(ouparunaliasdetable)pourfaciliterlalecturedelarequte(onvoittoutedesuitequelletableappartientlacolonne).Leprfixe est par ailleurs obligatoire lorsquedeux tables ont une colonneportant lemmenomet que ce nomestprsentdanslarequte sansprfixelarequteestambiguetprovoqueuneerreur.

    Exemple

    mysql> SELECT id FROM livre,collection; ERROR 1052 (23000): Column id in field list is ambiguous

    Utiliserunaliasdetablelaplacedunomdelatablepourprfixerlescolonnesestintressantlorsquelestablesportent des noms "longs" des alias de 3 ou 4 caractres bien choisis (suffisamment significatifs) peuventavantageusementlesremplacer.

    Pourvoussimplifierlatche,nousvousconseillonsdenutiliserquedescaractresnonaccentus,deschiffreset lescaractres$et_(soulign)pourvosaliasde table.Lutilisationdetoutautrecaractre imposeraen

    effet de dlimiter lalias soit par des apostrophes obliques (`) soit par des guillemets (") si la configuration duserveurlepermet.

    b.Restreindrelersultat :clauseWHERE

    UneclauseWHEREpeuttreajoutelarequteSELECTpourrestreindrelersultat.

    Syntaxe

    SELECT [DISTINCT] expression[,...] | * FROM nom_tableWHERE conditions

    SeulesleslignesvrifiantlesconditionsdelaclauseWHEREsontretournes.

    Lasyntaxegnraleduneconditionestlasuivante :

    expression1 oprateur expression2

    expression1 et expression2 sont des expressions du type de celles qui peuvent figurer dans la clause SELECT :colonne,valeurlittraleouexpressioncalcule.

    UneconditionretourneTRUE,FALSEouNULL.

    Lesoprateurslesplussouventutilisssontlessuivants :

    =

    galit

    >

    Strictementsuprieur

    >=

    - 6 - ENI Editions - All rigths reserved

  • Suprieurougal

    SELECT id,nom FROM collection WHERE id 1; +----+----------------------+

    | id | nom | +----+----------------------+

    | 2 | TechNote | | 3 | Les TP Informatiques | | 4 | Coffret Technique | +----+----------------------+

    3 rows in set (0.00 sec)1 row in set (0.00 sec)

    mysql> SELECT id,nom FROM collection WHERE id IN (1,2); +----+--------------------------+

    | id | nom | +----+--------------------------+

    | 1 | Ressources Informatiques | | 2 | TechNote | +----+--------------------------+

    2 rows in set (0.01 sec)

    mysql> SELECT nom,prix_ht FROM collection WHERE prix_ht < 25; +--------------------------+---------+

    | nom | prix_ht | +--------------------------+---------+

    | Ressources Informatiques | 24.44 | | TechNote | 9.48 | +--------------------------+---------+

    - 7 - ENI Editions - All rigths reserved

  • 2 rows in set (0.00 sec)

    mysql> SELECT nom,prix_ht FROM collection -> WHERE prix_ht BETWEEN 10 AND 25; +--------------------------+---------+

    | nom | prix_ht | +--------------------------+---------+

    | Ressources Informatiques | 24.44 | +--------------------------+---------+

    1 row in set (0.00 sec)

    mysql> SELECT prix_ht FROM collection WHERE nom = TECHNOTE; +---------+

    | prix_ht | +---------+

    | 9.48 | +---------+

    1 row in set (0.00 sec)

    mysql> -- Recherche sensible la casse mysql> SELECT prix_ht FROM collection WHERE nom = BINARY TECHNOTE; Empty set (0.00 sec)

    mysql> -- Recherche sur un couple de colonnes mysql> SELECT sous_titre FROM livre -> WHERE (titre,annee_parution) = (Oracle 10g,2005); +------------------------------------------------------------+

    | sous_titre | +------------------------------------------------------------+

    | Administration | | Installation du serveur sous Windows/Linux - Oracle Net | | Sauvegarde et restauration de la base de donnes avec RMAN | +------------------------------------------------------------+

    3 rows in set (0.00 sec)

    Les colonnes de type DATETIME ou TIMESTAMP sont susceptibles de stocker une composante horaire. Cettecomposante horaire peut poser des problmes pour la recherche uniquement sur la partie date. Une premiresolutionconsisteeffectuerunerechercheborne unedeuximesolutionconsisteappliquerlafonctionDATElacolonnepourliminerlacomposantehoraire(cf.chapitreUtiliserlesfonctionsMySQLFonctionsdates).

    Exemple

    mysql> SELECT titre FROM livre WHERE date_maj = 2008-01-19; Empty set (0.01 sec)

    mysql> SELECT titre FROM livre WHERE DATE(date_maj) = 2008-01-19; +--------------------------------+

    | titre | +--------------------------------+

    | PHP 5.2 | +--------------------------------+

    1 row in set (0.01 sec)

    mysql> SELECT titre FROM livre -> WHERE date_maj BETWEEN -> 2008-01-19 00:00:00 AND 2008-01-19 23:59:59; +--------------------------------+

    | titre | +--------------------------------+

    | PHP 5.2 | +--------------------------------+

    1 row in set (0.01 sec)

    PourtestersiuneexpressionestNULL(ounonNULL),ilnefautpasutiliserloprateur=(ou !=)maisloprateurIS NULL(ouIS NOT NULL).Utiliserlesoprateurs=ou!=negnrepasderreur,maislinterrogationneretourneaucunrsultat.

    Exemple

    - 8 - ENI Editions - All rigths reserved

  • mysql> SELECT titre FROM livre WHERE sous_titre = NULL; Empty set (0.00 sec)

    mysql> SELECT titre FROM livre WHERE sous_titre IS NULL; +-------------------+

    | titre | +-------------------+

    | BusinessObjects 6 | +-------------------+

    1 row in set (0.00 sec)

    mysql> SELECT DISTINCT titre FROM livre -> WHERE sous_titre IS NOT NULL; +--------------------------------+

    | titre | +--------------------------------+

    | PHP 4 | | PHP 5.2 | | PHP 5 | | Oracle 10g | | MySQL 5 | | PHP et MySQL (versions 4 et 5) | | MySQL 5 et PHP 5 | +--------------------------------+

    7 rows in set (0.00 sec)

    AvecloprateurLIKE,ilestpossibledutiliserdeuxcaractres"joker" :

    %

    Remplaceunnombrequelconquedecaractres(ycomprisaucun).

    _(soulign)

    Remplaceexactementuncaractre.

    Pourrechercherundecesdeuxcaractres,vousdevezlefaireprcderducaractredchappementantislashdanslemodle.Sivoussouhaitezutiliserunautrecaractredchappement,vouspouvezajouterlaclauseESCAPE c,ctantgalaucaractredchappementutilis.

    Exemple

    mysql> SELECT DISTINCT titre FROM livre WHERE titre LIKE PHP%; +--------------------------------+

    | titre | +--------------------------------+

    | PHP 4 | | PHP 5.2 | | PHP 5 | | PHP et MySQL (versions 4 et 5) | +--------------------------------+

    4 rows in set (0.00 sec)

    mysql> SELECT DISTINCT titre FROM livre -> WHERE titre LIKE %MySQL%PHP%; +------------------+

    | titre | +------------------+

    | MySQL 5 et PHP 5 | +------------------+

    1 row in set (0.00 sec)

    Plusieurs conditions simplespeuventtre combines laidedesoprateurs logiqueshabituelsOR, AND etNOT. LaprcdentepardfautdecesoprateursestNOT,ANDetOR(duplusprioritaireaumoinsprioritaire).Pourvaluerlesconditionsdansunordrediffrent,ilfaututiliserdesparenthses.

    Exemple

    mysql> SELECT titre FROM livre

    - 9 - ENI Editions - All rigths reserved

  • -> WHERE annee_parution = 2005 AND id_collection = 1; +------------+

    | titre | +------------+

    | Oracle 10g | +------------+

    1 row in set (0.00 sec)

    mysql> SELECT titre,annee_parution FROM livre -> WHERE (annee_parution = 2005 OR annee_parution = 2006) -> AND id_collection = 1; +------------+----------------+

    | titre | annee_parution | +------------+----------------+

    | Oracle 10g | 2005 | | MySQL 5 | 2006 | +------------+----------------+

    2 rows in set (0.01 sec)

    c.Trierlersultat :clauseORDERBY

    Pardfaut,lersultatduneinterrogationestretourndansunordreindtermin.

    UneclauseORDER BYpeuttreajoutelarequteSELECTpourtrierlersultat.

    Syntaxe

    SELECT [DISTINCT] expression[,...] | * FROM nom_table [WHERE conditions] ORDER BY expression [ASC | DESC][,...]

    SilarequtecomporteuneclauseWHERE,laclauseORDER BYdoitfigureraprs.

    Letripeuttrecroissant(ASC)oudcroissant(DESC)ilestcroissantpardfaut.LaclauseORDER BYpeutcontenirplusieurs expressions de tri spares par des virgules lordre des expressions dtermine lordre de priorit desniveauxdetri.

    expressionpeuttre :

    l unecolonne

    l uneexpressionbasesurdescolonnes

    l unaliasdecolonne

    l un numro correspondant la position dune expression de la clause SELECT (syntaxe dconseille etobsolte).

    Exemples

    mysql> SELECT nom,prix_ht+ROUND(prix_ht*5.5/100,2) -> FROM collection -> ORDER BY nom; +--------------------------+----------------------------------+

    | nom | prix_ht+ROUND(prix_ht*5.5/100,2) | +--------------------------+----------------------------------+

    | Coffret Technique | 49.00 | | Les TP Informatiques | 27.00 | | Ressources Informatiques | 25.78 | | TechNote | 10.00 | +--------------------------+----------------------------------+

    4 rows in set (0.00 sec)

    mysql> SELECT nom,prix_ht+ROUND(prix_ht*5.5/100,2) -> FROM collection -> ORDER BY prix_ht+ROUND(prix_ht*5.5/100,2);

    - 10 - ENI Editions - All rigths reserved

  • +--------------------------+----------------------------------+

    | nom | prix_ht+ROUND(prix_ht*5.5/100,2) | +--------------------------+----------------------------------+

    | TechNote | 10.00 | | Ressources Informatiques | 25.78 | | Les TP Informatiques | 27.00 | | Coffret Technique | 49.00 | +--------------------------+----------------------------------+

    4 rows in set (0.00 sec)

    mysql> SELECT nom,prix_ht+ROUND(prix_ht*5.5/100,2) prix_ttc -> FROM collection -> ORDER BY prix_ttc DESC; +--------------------------+----------+

    | nom | prix_ttc | +--------------------------+----------+

    | Coffret Technique | 49.00 | | Les TP Informatiques | 27.00 | | Ressources Informatiques | 25.78 | | TechNote | 10.00 | +--------------------------+----------+

    4 rows in set (0.00 sec)

    mysql> SELECT id_parent,titre -> FROM rubrique -> ORDER BY id_parent,titre; +-----------+----------------------+

    | id_parent | titre | +-----------+----------------------+

    | NULL | Base de donnes | | NULL | Dveloppement | | NULL | Internet | | NULL | Messagerie et travai | | NULL | Open Source | | 1 | MySQL | | 1 | Oracle | | 2 | Langages | | 2 | Mthode | | 3 | Conception Web | | 3 | HTML - XML | | 3 | Scurit | | 4 | Base de donnes | | 4 | Langages | | 4 | Systme | +-----------+----------------------+

    15 rows in set (0.00 sec)

    LesvaleursNULLapparaissentenpremierdansuntricroissant.

    d.Limiterlenombredelignes :clauseLIMIT

    UneclauseLIMITpeuttreajoutelarequteSELECTpourlimiterlenombredelignesretournes.

    Syntaxe

    SELECT [DISTINCT] expression[,...] | * FROM nom_table [WHERE conditions] [ORDER BY expression [ASC | DESC][,...]]LIMIT [offset,] nombre_lignes

    nombre_lignesestuneconstanteentirequispcifielenombredelignesretourner.

    offset, silestprsent,estaussiuneconstanteentirequispcifie lenumrode lapremire ligneretourner(0pourlapremireligne).LIMIT nestquivalentLIMIT 0,n.

    SilarequtecomporteuneclauseWHEREet/ouuneclauseORDER BY,laclauseLIMITdoitfigureraprs.

    - 11 - ENI Editions - All rigths reserved

  • LaclauseLIMITestvalueaprslesclausesWHEREetORDER BY.CombineuneclauseORDER BY,laclauseLIMITesttrspratiquepourlesinterrogationsdetype"palmars"("TopN").

    Exemple

    mysql> -- afficher les trois plus "gros" livres (en nombre de pages) mysql> SELECT titre,nombre_pages -> FROM livre -> ORDER BY nombre_pages DESC -> LIMIT 3; +------------------+--------------+

    | titre | nombre_pages | +------------------+--------------+

    | MySQL 5 et PHP 5 | 972 | | PHP 5.2 | 518 | | Oracle 10g | 489 | +------------------+--------------+

    3 rows in set (0.00 sec)

    -- afficher les deux suivants mysql> SELECT titre,nombre_pages -> FROM livre -> ORDER BY nombre_pages DESC -> LIMIT 3,2; +-------------------+--------------+

    | titre | nombre_pages | +-------------------+--------------+

    | BusinessObjects 6 | 470 | | MySQL 5 | 468 | +-------------------+--------------+

    2 rows in set (0.00 sec)

    e.Liredansplusieurstables :jointure

    Dansuneinterrogation,ilestsouventncessairedextrairedesinformationsdansplusieurstables.

    Pour cela, il faut lister les tables souhaites dans la clause FROM et effectuer une jointure entre les tables. UnejointureconsisteindiquerauserveurMySQLcommentrelierlestablesentreelles.

    Lister les tables dans la clause FROM et oublier dcrire la jointure nest pas une erreur de syntaxe. Le serveurretourne un rsultat en effectuant un produit cartsien entre les tables : chaque ligne de la premire table estcombineavecchaquelignedeladeuximetable.Untelrsultatestrarementsouhait !

    MySQLsupporteplusieurssyntaxespourcrireunejointure.Nousprsenteronsicilesplusutilises.

    Pourcrireunejointureinterne("simple")entredeuxtables,vouspouvezutiliserunedestroissyntaxessuivantes :

    FROM nom_table1,nom_table2 WHERE nom_table1.nom_colonne1 = nom_table2.nom_colonne2

    FROM nom_table1 [INNER] JOIN nom_table2 ON nom_table1.nom_colonne1 = nom_table2.nom_colonne2

    FROM nom_table1 [INNER] JOIN nom_table2 USING (nom_colonne[,...])

    Unejointuresematrialiseleplussouventparuneconditiondgalitentreunecolonnedelapremiretableetunecolonnedeladeuximetable :cestune"quijointure",jointurelaplussouventutilise(maisilexistedautretypesdejointures,nonbasessurunegalit).

    Danslapremiresyntaxe,laconditiondejointureestcritedanslaclauseWHEREetlestablessontsparesparunevirguledanslaclauseFROM.Cettesyntaxe,bienquellesoitsupportepardenombreuxSGBDR,nestpaslasyntaxedelanormeANSI.

    Les deux dernires syntaxes sont conformes la norme ANSI. Les tables sont jointes dans la clause FROM parlintermdiairedumotclJOIN (INNERestoptionnel,cest lavaleurpardfaut)et laconditionde jointureest,elleaussi,spcifiedanslaclauseFROMsoitavecuneclauseONsoitavecuneclauseUSING.AveclaclauseON,laconditiondejointureestcriteexplicitement(commedanslaclauseWHEREdelapremiresyntaxe).AveclaclauseUSING,unequijointureestimplicitementralisesurlescolonnesmentionnesquidoiventdoncporterlemmenomdansles

    Jointureinterne

    - 12 - ENI Editions - All rigths reserved

  • deuxtables USING (nom_colonne)estquivalentON nom_table1.nom_colonne = nom_table2.nom_colonne.

    Lorsquevouscrivezdes interrogationsportantsurplusieurstables, ilestvivementconseilldedfinirdesaliasdetablesetdelesutiliserpourprfixerlenomdescolonnes.

    Exempleavecdeuxtables

    mysql> SELECT col.nom,liv.titre -> FROM collection col,livre liv -> WHERE col.id = liv.id_collection -> AND liv.annee_parution=2006; +--------------------------+------------------+

    | nom | titre | +--------------------------+------------------+

    | Ressources Informatiques | MySQL 5 | | TechNote | PHP 5 | | Coffret Technique | MySQL 5 et PHP 5 | +--------------------------+------------------+

    3 rows in set (0.00 sec)

    mysql> SELECT col.nom,liv.titre -> FROM collection col JOIN livre liv -> ON (col.id = liv.id_collection) -> WHERE liv.annee_parution=2006; +--------------------------+------------------+

    | nom | titre | +--------------------------+------------------+

    | Ressources Informatiques | MySQL 5 | | TechNote | PHP 5 | | Coffret Technique | MySQL 5 et PHP 5 | +--------------------------+------------------+

    3 rows in set (0.00 sec)

    Exempleavectroistables

    mysql> SELECT -> liv.id, -> liv.titre, -> aut.nom -> FROM -> livre liv, -> auteur_livre aul, -> auteur aut -> WHERE -> liv.id = aul.id_livre -> AND aul.id_auteur = aut.id -> AND liv.annee_parution=2006 -> ORDER BY -> liv.titre; +----+------------------+---------+

    | id | titre | nom | +----+------------------+---------+

    | 7 | MySQL 5 | THIBAUD | | 9 | MySQL 5 et PHP 5 | HEURTEL | | 9 | MySQL 5 et PHP 5 | THIBAUD | | 2 | PHP 5 | HEURTEL | +----+------------------+---------+

    4 rows in set (0.00 sec)

    mysql> SELECT -> liv.id, -> liv.titre, -> aut.nom -> FROM -> livre liv -> JOIN -> auteur_livre aul

    - 13 - ENI Editions - All rigths reserved

  • -> ON (liv.id = aul.id_livre) -> JOIN -> auteur aut -> ON (aul.id_auteur = aut.id) -> WHERE -> liv.annee_parution=2006 -> ORDER BY -> liv.titre; +----+------------------+---------+

    | id | titre | nom | +----+------------------+---------+

    | 7 | MySQL 5 | THIBAUD | | 9 | MySQL 5 et PHP 5 | HEURTEL | | 9 | MySQL 5 et PHP 5 | THIBAUD | | 2 | PHP 5 | HEURTEL | +----+------------------+---------+

    4 rows in set (0.00 sec)

    Dansunejointureinterne,seulesleslignesencorrespondancedanslesdeuxtablessontretournes :siunelignede la premire table na pas de correspondance dans la deuxime table, elle nest pas retourne (etrciproquement).

    Exemple

    mysql> SELECT titre,id_promotion FROM livre -> WHERE annee_parution = 2006; +------------------+--------------+

    | titre | id_promotion | +------------------+--------------+

    | PHP 5 | 1 | | MySQL 5 | NULL | | MySQL 5 et PHP 5 | 2 | +------------------+--------------+

    3 rows in set (0.00 sec)

    mysql> SELECT liv.titre,pro.intitule -> FROM livre liv JOIN promotion pro -> ON (liv.id_promotion = pro.id) -> WHERE liv.annee_parution = 2006; +------------------+---------------------------------------+

    | titre | intitule | +------------------+---------------------------------------+

    | PHP 5 | -5% sur cet ouvrage | | MySQL 5 et PHP 5 | Frais de port offerts sur cet ouvrage | +------------------+---------------------------------------+

    2 rows in set (0.00 sec)

    Surcetexemple,lelivre"MySQL5"nestpasretournparladeuximerequtecarilnapasdepromotion.

    Pourretournertoutesleslignesdunedesdeuxtablesmmesiellesnontpasdecorrespondance,ilfautcrireunejointureexterne.Avecunejointureexterne,leserveurMySQLcreuneligneavecdesvaleursNULLpourlatablequinapasdeligneencorrespondanceaveclautretable cetteligne"vide"estutilisepourtablirla"correspondance"aveclautretable.

    Lorsque vous crivez une jointure, posezvous toujours la question de savoir sil peut ne pas y avoir decorrespondanceentre lesdeuxtables,etsicest lecas,cequevoussouhaitez faire :conserverounon les

    lignesenquestion.

    Pourcrireunejointureexterneentredeuxtables,vouspouvezutiliserunedesquatresyntaxessuivantes :

    FROM nom_table1 LEFT [OUTER] JOIN nom_table2 ON nom_table1.nom_colonne1 = nom_table2.nom_colonne2

    FROM nom_table1 LEFT [OUTER] JOIN nom_table2 USING (nom_colonne[,...])

    Jointureexterne

    - 14 - ENI Editions - All rigths reserved

  • FROM nom_table1 RIGHT [OUTER] JOIN nom_table2 ON nom_table1.nom_colonne1 = nom_table2.nom_colonne2

    FROM nom_table1 RIGHT [OUTER] JOIN nom_table2 USING (nom_colonne[,...])

    LemotclOUTERestoptionnelcarlesensdelajointureexternedoittreprcisaveclemotclLEFTouRIGHT.Dansune jointure "gauche" nom_table1 LEFT JOIN nom_table2, les lignes de la table de "gauche" nom_table1 sontretournesmme si elles nontpasde correspondancedans lautre table.Dans une jointure "droite" nom_table1 RIGHT JOIN nom_table2, les lignesde la tablede "droite"nom_table2 sont retournesmmesi ellesnontpasdecorrespondancedanslautretable.

    Commepourlajointureinterne,laconditiondejointurepeuttrespcifielaideduneclauseONouUSING.

    Exemple

    mysql> SELECT liv.titre,pro.intitule -> FROM livre liv LEFT JOIN promotion pro -> ON (liv.id_promotion = pro.id) -> WHERE liv.annee_parution = 2006; +------------------+---------------------------------------+

    | titre | intitule | +------------------+---------------------------------------+

    | PHP 5 | -5% sur cet ouvrage | | MySQL 5 | NULL | | MySQL 5 et PHP 5 | Frais de port offerts sur cet ouvrage | +------------------+---------------------------------------+

    3 rows in set (0.00 sec)

    Maintenant,lelivre"MySQL5"estbienretourndanslersultat,bienquilnaitpasdepromotion.

    Si la requte comporte une condition supplmentaire sur la table externe (celle sur laquelle une ligne vide estgnrepour lamiseencorrespondance), il faut lamettredans laclauseONde la jointureetnondans laclauseWHERE,souspeinedobtenirunejointuresimplelaplacedelajointureexterne.

    Exemple

    mysql> SELECT liv.titre,pro.intitule -> FROM livre liv LEFT JOIN promotion pro -> ON (liv.id_promotion = pro.id) -> WHERE liv.annee_parution = 2006 -> AND pro.est_active = TRUE; +-------+---------------------+

    | titre | intitule | +-------+---------------------+

    | PHP 5 | -5% sur cet ouvrage | +-------+---------------------+

    1 row in set (0.00 sec)

    mysql> SELECT liv.titre,pro.intitule -> FROM livre liv LEFT JOIN promotion pro -> ON (liv.id_promotion = pro.id -> AND pro.est_active = TRUE) -> WHERE liv.annee_parution = 2006; +------------------+---------------------+

    | titre | intitule | +------------------+---------------------+

    | PHP 5 | -5% sur cet ouvrage | | MySQL 5 | NULL | | MySQL 5 et PHP 5 | NULL | +------------------+---------------------+

    3 rows in set (0.00 sec)

    Ilestpossiblede joindreunetableavecellemme(notiondauto jointure).Pourcela, il faut faire figurer latabledeuxfoisdanslaclauseFROM,avecdesaliasdetablediffrents,etcrirelajointureentrelesdeuxtablescommesilsagissaitdetablesdiffrentes.Cettetechniqueestparticulirementutilepourinterrogerunetablequiimplmenteunestructurehirarchique.

    Autojointure

    - 15 - ENI Editions - All rigths reserved

  • Exemple

    mysql> SELECT par.titre rubrique,enf.titre sous_rubrique -> FROM rubrique par,rubrique enf -> WHERE enf.id_parent = par.id; +-----------------+-----------------+

    | rubrique | sous_rubrique | +-----------------+-----------------+

    | Base de donnes | MySQL | | Base de donnes | Oracle | | Dveloppement | Langages | | Dveloppement | Mthode | | Internet | HTML - XML | | Internet | Conception Web | | Internet | Scurit | | Open Source | Systme | | Open Source | Langages | | Open Source | Base de donnes | +-----------------+-----------------+

    10 rows in set (0.00 sec)

    5.Ajouterdeslignesdansunetable

    LordreSQLINSERTpermetdajouterdeslignesdansunetable.

    Syntaxe1

    INSERT [IGNORE] [INTO] nom_table [(nom_colonne,...)] VALUES ({expression | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE nom_colonne=expression, ... ]

    Syntaxe2

    INSERT [IGNORE] [INTO] nom_table SET nom_colonne ={ expression | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE nom_colonne= expression, ... ]

    nom_tableestlenomdelatabledanslaquellelesdonnessontajoutes.

    Lescolonnesconcernesparlinsertionsontspcifiessoitparunelistedenomsdecolonnesdernirelenomdelatable(premiresyntaxe),soitparlaclauseSET(deuximesyntaxe).Danslapremiresyntaxe,silalistedescolonnesestabsente, toutes lescolonnesde la tablesontconcernespardfaut. Il fautnoterquil nyapasdobligationinsrerunevaleurdanstouteslescolonnesdelatable.

    LesvaleursdescolonnessontspcifiessoitparlaclauseVALUES(premiresyntaxe),soitparlaclauseSET(deuximesyntaxe).Danslapremiresyntaxe,laclauseVALUESdoitcomporteruneexpressionpourchaquecolonnementionnedanslalistedescolonnes(danslordre) silalistedescolonnesestabsente,laclauseVALUESdoitfournirunevaleurpourchaquecolonnedelatable,danslordredescolonnesdelatable.Dansladeuximesyntaxe,lavaleurdechaquecolonneestdonneparlexpressionsituedroitedusigne=.Danslapremiresyntaxe,plusieurslistesdevaleurspeuventtrespcifies(sparespardesvirgules)afindinsrerplusieurslignesenuneseuleopration.

    Danslapremiresyntaxe,pourducodeenproduction,ilestconseilldetoujoursspcifierlalistedescolonnes,afinquelarequtepuissecontinuerfonctionnermmesidescolonnessontajoutesdanslatable.

    Exemples

    mysql> DESC collection; +----------+--------------+------+-----+---------+----------------+

    | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+

    | id | int(11) | NO | PRI | NULL | auto_increment | | nom | varchar(25) | NO | UNI | | | | prix_ht | decimal(5,2) | YES | | 20.00 | | | frais_ht | decimal(5,2) | YES | | NULL | |

    - 16 - ENI Editions - All rigths reserved

  • +----------+--------------+------+-----+---------+----------------+

    3 rows in set (0.00 sec)

    mysql> INSERT INTO collection -> VALUES(5,Solutions Informatiques,36.97,1.25); Query OK, 1 row affected (0.01 sec)

    mysql> INSERT INTO collection(nom) -> VALUES(ExpertIT); Query OK, 1 row affected (0.00 sec)

    mysql> SELECT * FROM collection WHERE id >= 5; +----+-------------------------+---------+----------+

    | id | nom | prix_ht | frais_ht | +----+-------------------------+---------+----------+

    | 5 | Solutions Informatiques | 36.97 | 1.25 | | 6 | ExpertIT | 20.00 | NULL | +----+-------------------------+---------+----------+

    2 rows in set (0.00 sec)

    Commelemontrecetexemple,siunecolonnenestpasmentionnedanslinsertion,maisquelleatdfinieaveclattribut AUTO_INCREMENT (cf. chapitre Construire une base de donnes dans MySQL Grer les tables), un entierunique luiestaffect.Sicenestpas lecas lavaleurpardfautde lacolonne luiestaffecte lemotclDEFAULTpermetdaffecterexplicitementlavaleurpardfautdelacolonne.

    Commenous le verronsdans le chapitreConstruireunebasededonnesdansMySQL, la valeurpardfautdunecolonnepeuttredfinielorsdelacrationdelatable.Lorsdelinsertion,siaucunev