php et mysql maitrisez le developpement d un site web dynamique et interactif
TRANSCRIPT
-
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