Vous êtes sur la page 1sur 105

MySQL

pour booster votre site web PHP

Hugo Etivant

Dernire mise jour : 20 juillet 2003

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

Introduction
MySQL drive directement de SQL (Structured Query Language) qui est un langage de requte vers les bases de donnes exploitant le modle relationnel. Il en reprend la syntaxe mais nen conserve pas toute la puissance puisque de nombreuses fonctionnalits de SQL napparaissent pas dans MySQL (slections imbriques, cls trangres) Le serveur de base de donnes MySQL est trs souvent utilis avec le langage de cration de pages web dynamiques : PHP. Il sera discut ici des commandes MySQL utilisables via PHP dans les conditions typiques dutilisation dans le cadre de la gestion dun site personnel hberg gratuitement (par exemple sur Free.fr).

Base de MySQL donnes Serveur


Le CyberZode Qui Frtille

Script PHP

HTTP

Page HTML Client

http://cyberzoide.developpez.com

Sommaire
Thorie des bases de donnes relationnelles Syntaxe de MySQL Fonctions de MySQL Interface avec PHP Administration avec loutil phpMyAdmin

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

Thorie des bases de donnes


Le CyberZode Qui Frtille http://cyberzoide.developpez.com 4

Concepts du modle relationnel


Avant dattaquer le vif du sujet, un petit glossaire du jargon des bases de donnes : Domaine : ensemble des valeurs dun attribut. Relation : sous ensemble du produit cartsien dune liste de domaines. Cest en fait un tableau deux dimensions dont les colonnes correspondent aux domaines et dont les lignes contiennent des tuples. On associe un nom chaque colonne. Attribut : une colonne dune relation, caractris par un nom. Tuple : liste des valeurs dune ligne dune relation. Une relation est un peu une classe (programmation oriente objet) qui ne possderait que des attributs et donc chaque instance reprsenterait un tuple.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

Les relations
Une relation est une table comportant des colonnes (appeles aussi attributs) dont le nom et le type caractrisent le contenu qui sera insr dans la table. Imaginons que lon veuille stocker dans notre base de donnes notre carnet dadresses. On va donc crer la relation Personne qui aura pour attributs : nom, prnom, adresse, tlphone. Autrement dit, cest une table nomme Personne possdant les colonnes : nom, prnom, adresse, tlphone. Les lignes que contiendra cette table seront appeles enregistrements ou tuples.
Personnes nom prnom adresse tlphone

Dupond

Marc

8 rue de loctet

0123456789

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

Algbre relationnelle
Lalgbre relationnelle regroupe toutes les oprations possibles sur les relations. Voici la liste des oprations possibles : Projection : on ne slectionne quun ou plusieurs attributs dune relation (on ignore les autres). Par exemple nafficher que les colonnes nom et prnom de la table Personnes. Jointure : on fabrique une nouvelle relation partir de 2 ou plusieurs autres en prenant comme pivot 1 ou plusieurs attributs. Par exemple, on concatne la table du carnet dadresse et celle des inscrits la bibliothque en fonction du nom de famille (ces typiquement du recoupement de fichiers). Slection : on slectionne tous les tuples ou bien seulement une partie en fonction de critres de slection qui portent sur les valeurs des attributs. Par exemple nafficher que les lignes de la table Personnes qui vrifient la condition suivante : le nom ne commence pas par la lettre C. Cette algbre est facilement possible avec les commandes de MySQL (SELECT FROM WHERE).

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

Projection
Personnes nom Martin prnom Pierre adresse tlphone 7 alle des vers 0258941236

Dupond
Dupond

Jean
Marc

32 all Poivrot
8 rue de loctet

0526389152
0123456789

SELECT nom, prnom FROM Personnes


nom Martin Dupond

On projette la table Personnes sur les colonnes nom et prnom.

prnom Pierre Jean

Dupond
Le CyberZode Qui Frtille http://cyberzoide.developpez.com

Marc
8

Jointure
Personnes
nom Martin Dupond prnom Pierre Jean adresse 32 all Poivrot tlphone 0526389152 nom Dupond Jospin 7 alle des vers 0258941236 Bibliothque Dernierlivre Robinson Faust

Martin

Misre

On joint les deux tables, grce la colonne nom.

SELECT Personnes.prnom, dernierlivre FROM Personnes, Bibliothque WHERE Personnes.nom = Bibliothque.nom

Et on combine cette jointure une projection sur les attributs nom et dernierlivre. Attention lever toute ambigut sur les noms dattribut dans le cas o deux tables possdent des colonnes de mme nom.
9

prnom Jean Pierre


Le CyberZode Qui Frtille

Dernierlivre Robinson Misre

http://cyberzoide.developpez.com

Slection
Personnes nom Martin Dupond Dupond prnom Pierre Jean Marc adresse 32 all Poivrot 8 rue de loctet tlphone 0526389152 0123456789 7 alle des vers 0258941236

SELECT * FROM Personnes WHERE nom = Dupond

On ne slectionne que les tuples dont lattribut nom est gale Dupond.

nom Dupond Dupond


Le CyberZode Qui Frtille

prnom Jean Marc

adresse 32 all Poivrot 8 rue de loctet

tlphone 0526389152 0123456789


10

http://cyberzoide.developpez.com

Syntaxe de MySQL
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 11

Types des attributs (I)


Les proprits de vos objets peuvent tre de types trs diffrents : Nombre entier sign ou non (temprature, quantit commande, ge) Nombre virgule (prix, taille) Chane de caractres (nom, adresse, article de presse) Date et heure (date de naissance, heure de parution) numration (une couleur parmi une liste prdfinie) Ensemble (une ou des monnaies parmi une liste prdfinie) Il sagit de choisir le plus adapt vos besoins. Ces types requirent une plus ou moins grande quantit de donnes stocker. Par exemple, ne pas choisir un LONGTEXT pour stocker un prnom mais plutt un VACHAR(40) !

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

12

Types des attributs (II) entiers


nom TINYINT TINYINT UNSIGNED SMALLINT SMALLINT UNSIGNED MEDIUMINT MEDIUMINT UNSIGNED INT* borne infrieure -128 0 -32768 0 -8388608 0 -2147483648 borne suprieure 127 255 32767 65535 8388607 16777215 2147483647

INT* UNSIGNED
BIGINT BIGINT UNSIGNED (*) : INTEGER est un synonyme de INT. UNSIGNED permet davoir un type non sign.

0
-9223372036854775808 0

4294967295
9223372036854775807 18446744073709551615

ZEROFILL : remplissage des zros non significatifs.


Le CyberZode Qui Frtille http://cyberzoide.developpez.com 13

Types des attributs (III) flottants


Les flottants dits aussi nombres rels sont des nombres virgule. Contrairement aux entiers, leur domaine nest pas continu du fait de limpossibilit de les reprsenter avec une prcision absolue. Exemple du type FLOAT : -1.175494351E-38 -3.402823466E+38 nom 0 1.175494351E-38 Domaine positif : borne infrieure borne suprieure 1.175494351E-38 3.402823466E+38 2.2250738585072014E-308 1.7976931348623157E+308 3.402823466E+38

domaine ngatif : borne infrieure borne suprieure -3.402823466E+38 -1.175494351E-38 -1.7976931348623157E+308 -2.2250738585072014E-308

FLOAT DOUBLE*

(*) : REAL est un synonyme de DOUBLE.


Le CyberZode Qui Frtille http://cyberzoide.developpez.com 14

Types des attributs (IV) chanes


nom
CHAR(M) CHAR(M) BINARY

longueur
Chane de taille fixe M, o 1<M<255, complte avec des espaces si ncessaire. Idem, mais insensible la casse lors des tris et recherches.

VARCHAR(M)
VARCHAR(M) BINARY TINYTEXT TEXT MEDIUMTEXT LONGTEXT DECIMAL(M,D)*

Chane de taille variable, de taille maximum M, o 1<M<255, complt avec des espaces si ncessaire.
Idem, mais insensible la casse lors des tris et recherches. Longueur maximale de 255 caractres. Longueur maximale de 65535 caractres. Longueur maximale de 16777215 caractres. Longueur maximale de 4294967295 caractres. Simule un nombre flottant de D chiffres aprs la virgule et de M chiffres au maximum. Chaque chiffre ainsi que la virgule et le signe moins (pas le plus) occupe un caractre.

(*) : NUMERIC est un synonyme de DECIMAL.


Le CyberZode Qui Frtille http://cyberzoide.developpez.com 15

Types des attributs (V) chanes


Les types TINYTEXT, TEXT, MEDIUMTEXT et LONGTEXT peuvent tre judicieusement remplacs respectivement par TINYBLOB, BLOB, MEDIUMBLOB et LONGBLOB. Ils ne diffrent que par la sensibilit la casse qui caractrise la famille des BLOB. Alors que la famille des TEXT sont insensibles la casse lors des tris et recherches. Les BLOB peuvent tre utiliss pour stocker des donnes binaires. Les VARCHAR, TEXT et BLOB sont de taille variable. Alors que les CHAR et DECIMAL sont de taille fixe.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

16

Types des attributs (VI) dates et heures


nom description

DATE
DATETIME TIMESTAMP TIMESTAMP(M) TIME YEAR
nom TIMESTAMP(2) TIMESTAMP(4) TIMESTAMP(6) TIMESTAMP(8) TIMESTAMP(10) TIMESTAMP(12) TIMESTAMP(14) AA

Date au format anglophone AAAA-MM-JJ.


Date et heure au format anglophone AAAA-MM-JJ HH:MM:SS. Affiche la date et lheure sans sparateur : AAAAMMJJHHMMSS. Idem mais M vaut un entier pair entre 2 et 14. Affiche les M premiers caractres de TIMESTAMP. Heure au format HH:MM:SS. Anne au format AAAA.
description

AAMM AAMMJJ AAAAMMJJ AAMMJJHHMM AAMMJJHHMMSS AAAAMMJJHHMMSS

En cas dinsertion dun enregistrement en laissant vide un attribut de type TIMESTAMP, celui-ci prendra automatiquement la date et heure de linsertion. Contrairement Unix (o le timestamp est le nombre de secondes coules depuis le 1er janvier 1970), en MySQL, il est une chane de format comme indiqu ci-contre.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

17

Types des attributs (VII) dates et heures


nom
DATE DATETIME TIMESTAMP TIMESTAMP(M) TIME YEAR

description
Date au format anglophone AAAA-MM-JJ. Date et heure au format anglophone AAAA-MM-JJ HH:MM:SS. Affiche la date et lheure sans sparateur : AAAAMMJJHHMMSS. Idem mais M vaut un entier pair entre 2 et 14. Affiche les M premiers caractres de TIMESTAMP. Heure au format HH:MM:SS. Anne au format AAAA.

Le format de date AAAA-MM-JJ signifie : anne sur 4 chiffre, mois sur 2 chiffres et jour sur 2 chiffres avec pour sparateur le tiret. Le format dheure HH:MM:SS signifie : heure, minute et seconde chacune sur 2 chiffres, avec pour sparateur les deux points.
Dans le format tendu qui comprend la date et lheure, des deux dernires sont spares par un espace. Les formats de date sont assez permissifs car des variantes sont tolres. Il est possible de mettre nimporte quel caractre qui ne soit pas un chiffre en guise de sparateur, il est aussi possible de na pas en mettre, comme cela est affich par TIMESTAMP.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 18

Types des attributs (VIII) numrations


Un attribut de type ENUM peut prendre une valeur parmi celles dfinies lors de la cration de la table plus la chane vide ainsi que NULL si la dfinition le permet. Ces valeurs sont exclusivement des chanes de caractres. Une numration peut contenir 65535 lments au maximum.

Dfinition dun tel attribut : nom_attribut ENUM(valeur 1,valeur 2) nom_attribut ENUM(valeur 1,valeur 2) NULL A chaque valeur est associe un index allant de 0 N si N valeurs ont t dfinies. Lindex 0 est associ la chane nulle, lindex 1 la premire valeur Lindex NULL est associ la valeur NULL.
Si une slection (SELECT ou WHERE) est faite dans un contexte numrique, lindex est renvoy. Sinon, cest la valeur qui est retourne. Il peut tre dfini jusqu 65535 valeurs distinctes insensibles la casse.
19

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

Types des attributs (IX) ensembles


Un attribut de type SET peut prendre pour valeur la chane vide, NULL ou une chane contenant une liste de valeurs qui doivent tre dclares lors de la dfinition de lattribut lors de la cration de la relation. Par exemple, un attribut dclar comme ci : SET(voiture, moto, vlo) NOT NULL peut prendre les valeurs suivantes : (chane vide) voiture,moto vlo,voiture,moto et autres combinaisons de listes des trois valeurs dfinie plus haut. Un attribut dclar comme suit : SET(voiture, moto, vlo) NULL peut prendre, en plus ce celles prcdentes, la valeur NULL. Il ne peut tre dfini que 64 lments maximum.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 20

Identificateurs
Les noms des bases, relations, attributs, index et alias sont constitus de caractres alphanumriques et des caractres _ et $. Un nom comporte au maximum 64 caractres. Comme les bases de donnes et les relations sont codes directement dans le systme de fichiers, la sensibilit la casse de MySQL dpend de celle du systme dexploitation sur lequel il repose. Sous Windows, la casse na pas dimportance ; alors que sous Unix, elle en a ! Le point . est un caractre rserv utilis comme sparateur entre le nom dune base et celui dune relation, entre le nom dune relation et celui dun attribut. Exemple : SELECT base1.table25.attribut5 FROM base1.table25

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

21

Exemple (I)
Imaginons que lon veuille construire la version web dun journal papier. Nous devrons crer une table pour stocker les articles de presse. Les informations relatives un article sont les suivantes : titre, texte, date de parution, auteur, rubrique. Un titre ayant une longueur raisonnable, il sera de type VARCHAR(80), le texte pourra tre trs grand : TEXT (65535 caractres !), la date sera au format DATE (YYYY:MM:JJ). Lauteur pourra tre cod sur un VARCHAR(80). Et la rubrique pourrait tre un ENUM. CREATE TABLE article ( id MEDIUM INT UNSIGNED PRIMARY KEY, titre VARCHAR(80), texte TEXT, parution DATE, auteur VARCHAR(80), rubrique ENUM(conomie,sports,international,politique,culture) )
22

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

Exemple (II)
Cette dfinition apporte certaines limitations : le nombre et le nom des rubriques sont fixs la cration de la relation (CREATE TABLE). Bien sr, il sera toujours possible de modifier la dfinition de la table (ALTER TABLE) pour modifier ou ajouter une rubrique ; mais ce ne sera pas pratique du tout. On peut imaginer une interface web qui permette un administrateur dajouter, de renommer ou de supprimer des rubriques. Pour cela on va crer une nouvelle relation : la table rubrique. La relation article contiendra non plus le nom de la rubrique mais une rfrence vers le nom de cette rubrique. Ainsi, lors dune slection, il faudra faire une jointure entre les deux tables article et rubrique pour connatre le nom de la rubrique associe un article.

CREATE TABLE article ( rubrique_idx TINYINT )

CREATE TABLE rubrique ( id TINYINT UNSIGNED PRIMARY KEY, label VARCHAR(40) )

SELECT * FROM article,rubrique WHERE article.rubrique_idx=rubrique.id


Le CyberZode Qui Frtille http://cyberzoide.developpez.com 23

Crer une relation (I)


La cration dune relation utilise la commande CREATE TABLE selon la syntaxe suivante : CREATE [TEMPORARY] TABLE nom_relation [IF NOT EXISTS] ( nom_attribut TYPE_ATTRIBUT [OPTIONS] ) TEMPORARY donne pour dure de vie la table : le temps de la connexion de lutilisateur au serveur, aprs, elle sera dtruite. En labsence de cette option, la table sera permanente moins dtre dtruite par la commande DROP TABLE. Loption IF NOT EXIST permet de ne crer cette table que si une table de mme nom nexiste pas encore. A lintrieur des parenthses, il sera list tous les attributs, cls et indexs de la table.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

24

Crer une relation (II)


Le type de lattribut doit tre dun type vu prcdemment. Les options seront vues au fur et mesure du cours. Exemple du carnet dadresse : CREATE TABLE Personne ( nom VARCHAR(40), prnom VARCHAR(40), adresse TINYTEXT, tlphone DECIMAL(10,0) ) Notre carnet dadresse est stock dans un tableau (appel Relation) de nom Personne qui comporte les colonnes (dites aussi attributs) suivantes : nom (chane de 40 caractres maximum), prnom (idem), adresse (texte de longueur variable mais infrieure 255 caractres) et tlphone (chane de 10 caractres). Chacune des personnes ajouter au carnet dadresse occupera une ligne de cette table. Une ligne est dite enregistrement dans le jargon des bases de donnes.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 25

Crer une relation (III)


A sa cration, la table peut tre remplie par une requte SELECT (qui sera vue en dtail plus tard). Par dfaut, une table est vide sa cration. Exemple : CREATE TABLE Personne ( nom VARCHAR(40), prnom VARCHAR(40), adresse TINYTEXT, tlphone DECIMAL(10,0) ) SELECT firstname, name, town, tel FROM Users Les options IGNORE et REPLACE placer entre la parenthse fermante et le SELECT permettent respectivement dignorer les doublons et de remplacer les doublons par la dernire valeur trouve. Ces options ne sont prises en compte que pour grer le problme des contraintes dunicit (UNIQUE, PRIMARY KEY).

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

26

Cl primaire (I)
Pour des raisons pratiques, nous souhaitons pouvoir associer chacun des enregistrements de la relation un identifiant numrique unique qui puise tre pass en paramtre nos scripts PHP. Pour cela on rajoute un nouvelle attribut de type entier. Pour nous facilit la tche, cet entier ne devra pas tre sign mais tre suffisamment grand pour identifier tous nos enregistrements car destin un dcompte (donc dbute forcment 1 et pas -127 par exemple). Dans notre exemple, le carnet dadresse ne devrait pas excder plusieurs centaines de personnes. Ainsi un attribut de type SMALLINT UNSIGNED devrait faire laffaire. Nous le nommerons par la suite : id. Cet attribut devra ne jamais tre vide, il faut donc prciser loption NOT NULL pour le forcer prendre une valeur de son domaine (entre 0 et 65535). Il devra aussi tre unique, cest--dire que deux enregistrements ne pourront pas avoir une valeur identique de id. Il faut alors faire la dclaration suivante : UNIQUE (id) la suite de la liste des attributs. Pour simplifier, on utilisera loption PRIMARY KEY qui regroupe NOT NULL et UNIQUE en remplacement des deux dernires dclarations. Et pour finir, il faut signifier que cette valeur doit sincrmenter automatiquement chaque insertion dun enregistrement grce loption AUTO_INCREMENT.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 27

Cl primaire (II)
Notre exemple devient : CREATE TABLE Personne ( id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, nom VARCHAR(40), prnom VARCHAR(40), adresse TINYTEXT, tlphone DECIMAL(10,0) ) Cet identifiant numrique unique auto-incrmental, sappelle une cl primaire . La numrotation des cls primaires, dbute 1 et pas 0.
Personnes Id 1 nom Dupond prnom Marc adresse 8 rue de loctet
http://cyberzoide.developpez.com

tlphone 0123456789
28

Le CyberZode Qui Frtille

Cl primaire (III)
Notre cl primaire peut tre associe simultanment plusieurs attributs mais selon une syntaxe diffrente. Si au lieu de crer un identifiant numrique unique, on souhaite simplement interdire davoir des doublon sur le couple (nom,prnom) et den interdire la nullit, on va crer une cl primaire sur ce couple.

La connaissance des seuls nom et prnom suffit identifier sans ambigut un et un seul enregistrement.
Mauvaise syntaxe : CREATE TABLE Personne ( nom VARCHAR(40) PRIMARY KEY, prnom VARCHAR(40) PRIMARY KEY, adresse TINYTEXT, tlphone DECIMAL(10,0) Bonne syntaxe : ) CREATE TABLE Personne ( nom VARCHAR(40), prnom VARCHAR(40), adresse TINYTEXT, tlphone DECIMAL(10,0), PRIMARY KEY (nom,prnom) )
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 29

Attribut non nul


Considrons que lon souhaite que certains attributs aient obligatoirement une valeur. On utilisera loption NOT NULL. Dans ce cas, si malgr tout, aucune valeur nest fournie, la valeur par dfaut si elle est dclare la cration de la relation sera automatiquement affecte cet attribut dans lenregistrement. Si aucune valeur par dfaut nest dclare : - la chane vide sera affecte lattribut sil est de type chane de caractres - la valeur zro 0 sil est de type nombre - la date nulle 0000-00-00 et/ou lheure nulle 00:00:00 sil est de type date, heure ou date et heure. Exemple : adresse TINYTEXT NOT NULL

Au contraire, on utilisera loption NULL si on autorise labsence de valeur.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

30

Valeur par dfaut


Pour donner une valeur par dfaut un attribut, on utilise loption DEFAULT. Lors de lajout dun enregistrement cette valeur sera affecte lattribut si aucune valeur nest donne. Exemple : tlphone DECIMAL(10,0) DEFAULT 0123456789 Les attributs de type chane de caractres de la famille TEXT et BLOB ne peuvent pas avoir de valeur par dfaut.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

31

Attribut sans doublon (I)


Pour interdire lapparition de doublon pour un attribut, on utilise loption UNIQUE. Syntaxe : UNIQUE [nomdelacontrainte](liste des attributs) Exemple, pour interdire tout doublon de lattribut nom : UNIQUE(nom)

Pour interdire les doublons sur lattribut nom mais les interdire aussi sur prnom, tout en les laissant indpendants : UNIQUE(nom) UNIQUE(prnom)
nom Dupond prnom Marc

Dupont
Martin
Le CyberZode Qui Frtille

Pierre
Marc
http://cyberzoide.developpez.com

enregistrement interdit car Marc est un doublon dans la colonne prnom

32

Attribut sans doublon (II)


Pour interdire tout doublon un ensemble dattributs (tuple), on passe en paramtre UNIQUE la liste des attributs concerns. Pour interdit tout doublon du couple (nom, prnom) : UNIQUE(nom,prnom)

nom Dupond Dupont Martin Martin Martin

prnom Marc Pierre Marc Pierre Marc

enregistrement interdit car le couple (Martin, Marc) est un doublon du couple (nom,prnom)

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

33

Index (I)
Lors de la recherche dinformations dans une relation, MySQL parcours la table correspondante dans nimporte quel ordre. Dans le cas dun grand nombre de lignes, cette recherche est trs trs longue du fait du parcours de TOUTE la table. Pour y remdier, une optimisation possible et FORTEMENT recommande, est dutiliser des indexs. La cration dun index associ un attribut ou un ensemble ordonn dattributs va crer une liste ordonne des valeurs de ces attributs et de ladresse de la ligne associe. Cest sur les valeurs de cette liste que se fera les recherches et les tris. Les algorithmes de recherche et de tri sur des ensembles ordonnes sont normment plus rapides ! Ainsi, dune recherche cot prohibitif, on passe une recherche sur un ensemble dj tri. On gagne donc normment en temps daccs aux informations. Bien que cela ralentisse les mises jour (insertion, suppression, modification de cl). On choisira de crer des indexs sur les attributs qui seront les plus sollicits par les recherches ou utiliss comme critre de jointure. Par contre, on pargnera les attributs qui contiennent peu de valeurs diffrentes les unes des autres et ceux dont les valeurs sont trs frquemment modifies.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 34

Index (II)
Syntaxe : INDEX index (liste des attributs) Exemple, pour crer un index sur les 3 premiers caractres seulement de lattribut nom : INDEX idx_nom (nom(3)) Exemple, pour crer un index sur le couple (nom,prnom) : INDEX idx_nom_prenom (nom,prnom) Un index peut porter sur 15 colonnes maximum. Une table peut possder au maximum 16 indexs. Un index peut avoir une taille dau maximum 256 octets et ne doit porter que sur des attributs NOT NULL. Il suffit de suffixer lattribut (CHAR, VARCHAR) pour dire de ne prendre que les M premiers caractres pour lindexation.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 35

Supprimer une relation


La commande DROP TABLE prend en paramtre le nom de la table supprimer. Toutes les donnes quelle contient sont supprimes et sa dfinition aussi. Syntaxe : DROP TABLE relation Exemple : DROP TABLE Personnes Si un beau jour on saperoit quune relation a t mal dfinie au dpart, plutt que de la supprimer et de la reconstruire bien comme il faut, on peut la modifier trs simplement. Cela vite de perdre les donnes quelle contient.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

36

Modifier une relation


La cration dune relation par CREATE TABLE nen rend pas dfinitives les spcifications. Il est possible den modifier la dfinition par la suite, tout moment par la commande ALTER TABLE. Voici ce quil est possible de raliser : - ajouter/supprimer un attribut - crer/supprimer une cl primaire - ajouter une contrainte dunicit (interdire les doublons) - changer la valeur par dfaut dun attribut - changer totalement la dfinition dun attribut - changer le nom de la relation - ajouter/supprimer un index

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

37

Ajouter un attribut
Syntaxe : ALTER TABLE relation ADD definition [ FIRST | AFTER attribut] Ajoutons lattribut fax qui est une chane reprsentant un nombre de 10 chiffres: ALTER TABLE Personnes ADD fax DECIMAL(10,0) Nous aurions pu forcer la place o doit apparatre cet attribut. Pour le mettre en tte de la liste des attributs de la relation, il faut ajouter loption FIRST en fin de commande. Pour le mettre aprs lattribut tlphone, il aurait fallu ajouter AFTER tlphone. Note : il ne doit pas dj avoir dans la relation un attribut du mme nom !

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

38

Supprimer un attribut (I)


Attention, supprimer un attribut implique la suppression des valeurs qui se trouvent dans la colonne qui correspond cet attribut, sauf utiliser loption IGNORE. Syntaxe : ALTER TABLE relation DROP attribut Exemple : ALTER TABLE Personnes DROP prnom

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

39

Supprimer un attribut (II)


La suppression dun attribut peut incidemment provoquer des erreurs sur les contraintes cl primaire (PRIMARY KEY) et unique (UNIQUE).
CREATE TABLE Personne ( id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, nom VARCHAR(40), prnom VARCHAR(40), adresse TINYTEXT, tlphone DECIMAL(10,0), UNIQUE(nom,prnom) )

ALTER TABLE Personnes DROP prnom

nom Dupond Martin Martin


Le CyberZode Qui Frtille

prnom Marc Marc Pierre

nom

Dupond
Martin Martin
http://cyberzoide.developpez.com

Refus doprer la suppression, car cela contredirait la contrainte dunicit qui resterait sur lattribut nom.

40

Crer une cl primaire


La cration dune cl primaire nest possible quen labsence de cl primaire dans la relation. Syntaxe : ALTER TABLE relation ADD PRIMARY KEY (attribut) Exemple : ALTER TABLE Personnes ADD PRIMARY KEY (nom,prnom)

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

41

Supprimer une cl primaire


Comme une cl primaire est unique, il ny a aucune ambigut lors de la suppression. Syntaxe : ALTER TABLE relation DROP PRIMARY KEY Exemple : ALTER TABLE Personnes ADD PRIMARY KEY

Sil ny a aucune cl primaire lorsque cette commande est excute, aucun message derreur ne sera gnr, le commande sera simplement ignore.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

42

Ajout dune contrainte dunicit


Il est possible (facultatif) de donner un nom la contrainte. Cette contrainte peut sappliquer plusieurs attributs. Si les valeurs dj prsentes dans la relation sont en contradiction avec cette nouvelle contrainte, alors cette dernire ne sera pas applique et une erreur sera gnre. Syntaxe : ALTER TABLE relation ADD UNIQUE [contrainte] (attributs)

Exemple pour interdire tout doublon sur lattribut fax de la relation Personnes : ALTER TABLE Personnes ADD UNIQUE u_fax (fax)
Autre exemple fictif : ALTER TABLE Moto ADD UNIQUE u_coul_vitre (couleur,vitre)

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

43

Changer la valeur par dfaut dun attribut


Pour changer ou supprimer la valeur par dfaut dun attribut. Attention aux types qui nacceptent pas de valeur par dfaut (les familles BLOB et TEXT). Syntaxe : ALTER TABLE relation ALTER attribut { SET DEFAULT valeur | DROP DEFAULT } Changer sa valeur par dfaut : ALTER TABLE Personnes ALTER tlphone SET DEFAULT 9999999999 Supprimer sa valeur par dfaut : ALTER TABLE Personnes ALTER tlphone DROP DEFAULT Le changement ou la suppression naffecte en rien les enregistrements qui ont eu recours cette valeur lors de leur insertion.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 44

Changer la dfinition dun attribut


Pour changer la dfinition de lattribut sans le renommer : ALTER TABLE relation MODIFY attribut definition_relative Exemple 1 : ALTER TABLE Personnes MODIFY fax VARCHAR(14) Pour changer sa dfinition en le renommant : ALTER TABLE relation CHANGE attribut definition_absolue Exemple 2 : ALTER TABLE Personnes CHANGE fax num_fax VARCHAR(14) Attention, si le nouveau type appliqu lattribut est incompatible avec les valeurs des enregistrements dj prsents dans la relation, alors elles risques dtres modifies ou remises zro !

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

45

Changer le nom de la relation


Syntaxe : ALTER TABLE relation RENAME nouveau_nom Exemple : ALTER TABLE Personnes RENAME Carnet Cela consiste renommer la table, et donc le fichier qui la stocke.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

46

Ajouter un index
Une table ne peut comporter que 32 indexs. Et un index ne peut porter que sur 16 attributs maximum la fois. Syntaxe : ALTER TABLE relation ADD INDEX index (attributs) Exemple : ALTER TABLE Personnes ADD INDEX nom_complet (nom,prnom) Dans cet exemple, on a ajout la relation Personnes un index que lon nomme nom_complet et qui sapplique aux deux attributs nom et prnom. Ainsi, les recherches et les tris sur les attributs nom et prnom seront grandement amliors. Car un index apporte les changements sous-jacents permettant doptimiser les performances du serveur de base de donnes.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

47

Supprimer un index
Syntaxe : ALTER TABLE relation DROP INDEX index Exemple : ALTER TABLE Personnes DROP INDEX nom_complet Cette exemple permet de supprimer lindex nomm nom_complet de la relation Personnes.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

48

Ajouter un enregistrement (I) insertion tendue


Ajouter un enregistrement une relation revient ajouter une ligne la table. Pour cela, pour chacun des attributs, il faudra en prciser la valeur. Si certaines valeurs sont omises, alors les valeurs par dfauts dfinie les de la cration de la relation seront utilises. Si on ne dispose pas non plus de ces valeurs par dfaut, alors MySQL mettra 0 pour un nombre, pour une chane, 0000-00-00 pour une date, 00:00:00 pour une heure, 00000000000000 pour un timestamp (si le champs poste la contrainte NOT NULL). Dans le cas o lattribut porte la contrainte NULL (par dfaut) alors la valeur par dfaut de lattribut quel soit sont type sera la suivante : NULL.

Syntaxe dune insertion tendue : INSERT INTO relation(liste des attributs) VALUES(liste des valeurs)
Exemple : INSERT INTO Personnes(nom,prnom) VALUES(Martin,Jean) REPLACE est un synonyme de INSERT, mais sans doublon. Pratique pour respecter les contraintes dunicit (UNIQUE, PRIMARY KEY).
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 49

Ajouter un enregistrement (II) insertion standard


Une syntaxe plus courte mais plus ambigu permet dinsrer un enregistrement dans une table. Elle consiste omettre la liste des noms dattribut la suite du nom de la relation. Cela impose que la liste des valeurs suivant le mot cl VALUES soit exactement celle dfinie dans la table et quelles soient dans lordre dfini dans la dfinition de la table ; sinon des erreurs se produiront. Syntaxe dune insertion standard : INSERT INTO relation VALUES(liste exhaustive et ordonne des valeurs) Exemple : CREATE TABLE Ballon ( taille INT NOT NULL, couleur VARCHAR(40) ) INSERT INTO Ballon VALUES(20, rouge) ok INSERT INTO Ballon VALUES(rouge, 20) faux INSERT INTO Ballon VALUES(rouge) faux
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 50

Ajouter un enregistrement (III) insertion complte


Dans le cas o lon souhaite procder linsertion de plusieurs enregistrements les uns la suite des autres, il y a deux mthodes : - faire une boucle qui envoie autant dINSERT que ncessaire au serveur - faire une insertion dite complte

Syntaxe dune insertion complte : INSERT INTO relation VALUES (liste des valeurs), (liste dautres valeurs), (liste dencore dautres valeurs),
Exemple : INSERT INTO Ballon VALUES (20, rouge), (35, vert fluo), (17, orange), (28, crulen) Cet exemple est quivalent aux requtes suivantes : INSERT INTO Ballon VALUES(20, rouge) INSERT INTO Ballon VALUES(35, vert fluo) INSERT INTO Ballon VALUES(17, orange) INSERT INTO Ballon VALUES(28, crulen)

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

51

Ajouter un enregistrement (IV) insertion complte


Linsertion complte permet dinsrer plusieurs enregistrements dans une mme table. Une insertion complte ne permet pas dinsrer des donnes dans plusieurs tables diffrentes. Linsertion complte et linsertion tendue peuvent tre associes dans une mme requte : INSERT INTO Ballon(taille, couleur) VALUES (20, rouge), (35, vert fluo), (17, orange), (28, crulen)

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

52

Modifier un enregistrement (I)


Pour modifier un ou des enregistrement(s) dune relation, il faut prciser un critre de slection des enregistrement modifier (clause WHERE), il faut aussi dire quels sont les attributs dont on va modifier la valeur et quelles sont ces nouvelles valeurs (clause SET).

Syntaxe : UPDATE [ LOW_PRORITY ] relation SET attribut=valeur, [ WHERE condition ] [ LIMIT a ]


Exemple : UPDATE Personnes SET tlphone=0156281469 WHERE nom=Martin AND prnom = Pierre Cet exemple modifie le numro de tlphone de Martin Pierre. LOW_PRORITY est une option un peu spciale qui permet de nappliquer la ou les modification(s) quune fois que plus personne nest en train de lire dans la relation.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 53

Modifier un enregistrement (II)


Il est possible de modifier les valeurs dautant dattributs que la relation en contient. Exemple pour modifier plusieurs attributs : UPDATE Personnes SET tlphone=0156281469, fax=0156281812 WHERE id = 102 Pour appliquer la modification tous les enregistrements de la relation, il suffit de ne pas mettre de clause WHERE.

LIMIT a permet de nappliquer la commande quaux a premiers enregistrements satisfaisant la condition dfinie par WHERE.
Autre exemple : UPDATE Enfants SET age=age+1 Il est donc possible de modifier la valeur dun attribut relativement sa valeur dj existante.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

54

Supprimer un enregistrement
Attention, la suppression est dfinitive ! Syntaxe : DELETE [ LOW_PRIORITY ] FROM relation [ WHERE condition ] [ LIMIT a ] Exemple : DELETE FROM Personnes WHERE nom=Martin AND prnom=Marc Pour vider une table de tous ces lments, ne pas mettre de clause WHERE. Cela efface et recre la table, au lieu de supprimer un un chacun des tuples de la table (ce qui serait trs long).

Exemple : DELETE FROM Personnes

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

55

Slectionner des enregistrements (I)


Pour extraire de votre base de donnes des informations, comme la liste des personnes de votre carnet dadresse qui vivent Paris. Syntaxe gnrale : SELECT [ DISTINCT ] attributs [ INTO OUTFILE fichier ] [ FROM relation ] [ WHERE condition ] [ GROUP BY attributs [ ASC | DESC ] ] [ HAVING condition ] [ ORDER BY attributs ] [ LIMIT [a,] b ]

Exemple : SELECT nom,prnom FROM Personnes WHERE adresse LIKE %paris%

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

56

Slectionner des enregistrements (II)


Nom SELECT DISTINCT INTO OUTFILE FROM WHERE GROUP BY HAVING ORDER BY LIMIT Description Spcifie les attributs dont on souhaite connatre les valeurs. Permet dignorer les doublons de ligne de rsultat. Spcifie le fichier sur lequel effectuer la slection. Spcifie le ou les relations sur lesquelles effectuer la slection. Dfinie le ou les critres de slection sur des attributs. Permet de grouper les lignes de rsultats selon un ou des attributs. Dfinie un ou des critres de slection sur des ensembles de valeurs dattributs aprs groupement. Permet de dfinir lordre (ASCendant par dfaut ou DESCendant) dans lenvoi des rsultats. Permet de limiter le nombre de lignes du rsultats

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

57

Slectionner des enregistrements (III)


Procdons par tapes : Pour slectionner tous les enregistrements dune relation : SELECT * FROM relation Pour slectionner toutes les valeurs dun seul attribut : SELECT attribut FROM relation Pour liminer les doublons : SELECT DISTINCT attribut FROM relation Pour trier les valeurs en ordre croissant : SELECT DISTINCT attribut FROM relation ORDER BY attribut ASC Pour se limiter aux num premiers rsultats : SELECT DISTINCT attribut FROM relation ORDER BY attribut ASC LIMIT num Pour ne slectionner que ceux qui satisfont une condition : SELECT DISTINCT attribut FROM relation WHERE condition ORDER BY attribut ASC LIMIT num

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

58

Slectionner des enregistrements (IV)


Relation de dpart :
SELECT * FROM Gens
Gens Nom Dupond Martin Dupont Martin Dupond Chirac Prenom Pierre Marc Jean Paul Lionel Jacques Age 24 48 51 36 68 70

1
SELECT Nom FROM Gens
Gens Nom Dupond Martin Dupont Martin Dupond Gens Nom Dupond Martin Dupont Chirac

2 3

Chirac

SELECT DISTINCT Nom FROM Gens

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

59

Slectionner des enregistrements (V)


Gens Nom Chirac Dupond Dupont Martin

SELECT DISTINCT Nom FROM Gens ORDER BY Nom ASC

4 5
Gens Nom Chirac Dupond

SELECT DISTINCT Nom FROM Gens ORDER BY Nom ASC LIMIT 2

Gens Nom Dupond

SELECT DISTINCT Nom FROM Gens WHERE Nom <> Chirac ORDER BY Nom ASC LIMIT 2

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

60

Optimisation
Aprs la suppression de grandes parties dune table contenant des index, les index des tuples supprims sont conservs, rallongeant dautant les slections. Pour supprimer ces index obsoltes et vider les trous , il faut loptimiser. Syntaxe : OPTIMIZE TABLE Relation Exemple : OPTIMIZE TABLE Personnes

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

61

Jointure volue (I)


En dbut de ce document, on a vu la jointure suivante :
SELECT Personnes.nom, nblivres FROM Personnes, Bibliothque WHERE Personnes.nom = Bibliothque.nom

qui permet de concatner deux relation en prenant un attribut comme pivot. Il est possible de concatner deux relation sur plusieurs attributs la fois, ou mme de concatner X relation sur Y attributs. Les requtes utilisant trs souvent les jointures, il a t cr une syntaxe spciale plus rapide : JOIN que la mthode vue plus haut : avec la clause WHERE. Ainsi la jointure prcdente peut scrire aussi :
SELECT Personnes.nom, nblivres FROM Personnes INNER JOIN Bibliothque USING (nom)

ce qui signifie que les deux relations Personnes et Bibliothque sont concatne (INNER JOIN) en utilisant (USING) lattribut nom.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

62

Jointure volue (II)


La syntaxe USING permet de lister les attributs servant de pivot. Ces attributs doivent porter le mme nom dans chacune des tables devant tre concatnes. Si les attributs pivots ne portent pas le mme nom, il faut utiliser la syntaxe ON. Ainsi la jointure prcdente peut scrire aussi :
SELECT Personnes.nom, nblivres FROM Personnes INNER JOIN Bibliothque ON Personnes.nom = Bibliothque.nom

La mthode INNER JOIN ninclus les enregistrements de la premire table que sils ont une correspondance dans la seconde table.
Personnes
Nom Martin Tartan Prnom Jean Pion

Bibliothque
Nom Martine Tartan Dupond Nblivres 5 10 3

Rsultat de la jointure
Nom Nblivres

Tartan
Dupond

10
3

Dupond

Jacques

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

63

Jointure volue (III)


Pour remdier aux limites de INNER JOIN, il existe la syntaxe LEFT JOIN qui inclus tous les enregistrements de la premire table mme sils nont pas de correspondance dans la seconde table. Dans ce cas prcis, lattribut non renseign prendra la valeur NULL.

L encore, le ON peut avantageusement tre remplac par le USING.


La jointure devient : SELECT Personnes.nom, nblivres
FROM Personnes LEFT JOIN Bibliothque ON Personnes.nom = Bibliothque.nom
Personnes
Nom Martin Tartan Dupond Prnom Jean Pion Jacques

Bibliothque
Nom Martine Tartan Dupond Nblivres 5 10 3

Rsultat de la jointure
Nom Martin Tartan Dupond Nblivres NULL 10 3

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

64

Fonctions de MySQL
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 65

Les fonctions
Bien que ces fonctions appartiennent typiquement MySQL, la cration dun chapitre part se justifie par le fait que je vais me contenter ici dnumrer les fonctions les plus courantes. Reportez-vous au manuel MySQL pour la liste dtaille de toutes les fonctions disponibles dans votre version du serveur MySQL. Ces fonctions sont ajouter vos requtes dans un SELECT, WHERE, GROUP BY ou encore HAVING. Dabord sachez que vous avez votre disposition : les parenthses ( ), les oprateurs arithmtiques (+, -, *, /, %), les oprateurs binaires (<, << , >, >>, |, &), les oprateurs logiques qui retournent 0 (faux) ou 1 (vrai) (AND, OR, NOT, BETWEEN, IN), les oprateurs relationnels (<, <=, =, >, >=, <>). Les oprateurs et les fonctions peuvent tres composs entre eux pour donner des expressions trs complexes.
66

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

Quelques exemples
SELECT nom Liste du nom des produits dont le prix est infrieur ou gale 100.5 EUR. FROM produits WHERE prix <= 100.5

SELECT nom,prnom Liste des nom et prnom des lves dont lge est compris entre 12 et 16 ans. FROM lves WHERE age BETWEEN 12 AND 16
SELECT modle FROM voitures WHERE couleur IN (rouge, blanc, noir) SELECT modle FROM voitures WHERE couleur NOT IN (rose, violet) Liste des modles de voiture dont la couleur est dans la liste : rouge, blanc, noir.

Liste des modles de voiture dont la couleur nest pas dans la liste : rose, violet.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

67

Fonctions de comparaison de chanes


Le mot cl LIKE permet de comparer deux chanes. Le caractre % est spcial et signifie : 0 ou plusieurs caractres. Le caractre _ est spcial et signifie : 1 seul caractre, nimporte lequel.

Lexemple suivant permet de rechercher tous les clients sont le prnom commence par Jean, cela peut tre Jean-Pierre, etc : SELECT nom FROM clients WHERE prnom LIKE Jean%
Pour utiliser les caractres spciaux ci-dessus en leur enlevant leur fonction spciale, il faut les faire prcder de lantislash : \. Exemple, pour lister les produit dont le code commence par la chane _XE : SELECT * FROM produit WHERE code LIKE \_XE%

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

68

Fonctions mathmatiques
Fonction ABS(x) SIGN(x) Description Valeur absolue de X. Signe de X, retourne -1, 0 ou 1.

FLOOR(x)
CEILING(x) ROUND(x) EXP(x), LOG(x), SIN(x), COS(x), TAN(x), PI() POW(x,y) RAND(), RAND(x)

Arrondi lentier infrieur.


Arrondi lentier suprieur. Arrondi lentier le plus proche. Bon, l cest les fonctions de maths de base Retourne X la puissance Y. Retourne un nombre alatoire entre 0 et 1.0 Si x est spcifi, entre 0 et X

TRUNCATE(x,y)
SELECT nom FROM filiales WHERE SIGN(ca) = -1 ORDER BY RAND()
Le CyberZode Qui Frtille

Tronque le nombre X la Yme dcimale.


Cet exemple affiche dans un ordre alatoire le nom des filiales dont le chiffre daffaire est ngatif. A noter que : SIGN(ca) = -1 ca < 0
http://cyberzoide.developpez.com 69

Fonctions de chanes
Fonction TRIM(x) LOWER(x) UPPER(x) LONGUEUR(x) LOCATE(x,y) CONCAT(x,y,) SUBSTRING(s,i,n) SOUNDEX(x) Description Supprime les espaces de dbut et de fin de chane. Converti en minuscules. Converti en majuscules. Retourne la taille de la chane. Retourne la position de la dernire occurrence de x dans y. Retourne 0 si x nest pas trouv dans y. Concatne ses arguments. Retourne les n derniers caractres de s en commenant partir de la position i. Retourne une reprsentation phontique de x.

SELECT UPPER(nom) FROM clients WHERE SOUNDEX(nom) = SOUNDEX(Dupond) On affiche en majuscules le nom de tous les clients dont le nom ressemble Dupond.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 70

Fonctions de dates et heures


Fonction NOW() TO_DAYS(x) DAYOFWEEK(x) Description Retourne la date et heure du jour. Conversion de la date X en nombre de jours depuis le 1er janvier 1970. Retourne le jour de la semaine de la date x sous la forme dun index qui commence 1 (1=dimanche, 2=lundi) Retourne le jour du mois (entre 1 et 31). Retourne le jour de lanne (entre 1 et 366). Retournent respectivement les secondes, minutes, heures, mois, anne et semaine de la date.

DAYOFMONTH(x) DAYOFYEAR(x) SECOND(x), MINUTE(x), HOUR(x), MONTH(x), YEAR(x), WEEK(x)

SELECT titre FROM article WHERE (TO_DAYS(NOW()) TO_DAYS(parution)) < 30 Cet exemple affiche le titre des articles parus il y a moins de 30 jours.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 71

Fonctions utiliser dans les GROUP BY


Fonction Description COUNT([DISTINCT]x,y,) Dcompte des tuples du rsultat par projection sur le ou les attributs spcifis (ou tous avec *). Loption DISTINCT limine les doublons. MIN(x), MAX(x), AVG(x), SUM(x) Calculent respectivement le minimum, le maximum, la moyenne et la somme des valeurs de lattribut X. Ici on affiche le palmars des models de voitures qui proposent un choix de plus de 10 couleurs. Affichage de tous les clients.

SELECT DISTINCT model FROM voiture GROUP BY model HAVING COUNT(couleur) > 10

SELECT COUNT(*) FROM client

SELECT DISTINCT produit.nom, SUM(vente.qt * produit.prix) AS total FROM produit, vente WHERE produit.id = vente.produit_idx Classement des produits GROUP BY produit.nom par la valeur totale vendue. ORDER BY total
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 72

Interface avec PHP


Le CyberZode Qui Frtille http://cyberzoide.developpez.com 73

Connexion (I)
Pour se connecter une base depuis un script php, il faut spcifier un nom de serveur, un nom dutilisateur, un mot de passe et un nom de base. Aucune connexion nest possible sans authentification auprs du serveur de base de donnes. Les actions possibles de lutilisateur sur la base laquelle il se connecte dpendent des droits qui lui auront t fournis par ladministrateur de la base de donnes. mysql_connect($server,$user,$password) : permet de se connecter au serveur $server en tant quutilisateur $user avec le mot de passe $password, retourne lidentifiant de connexion si succs, FALSE sinon. Si ces arguments manquent, les valeurs par dfaut du fichier de configuration php.ini seront utilises. mysql_select_db($base[,$id]) : permet de choisir la base $base, peut prendre un identifiant $id de connexion ; retourne TRUE en cas de succs, sinon FALSE. Les identifiants de connexion ne sont pas ncessaires si on ne se connecte qu un seul serveur la fois, ils permettent seulement de lever toute ambigut en cas de connexions multiples (vers plusieurs serveurs dans le mme script).
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 74

Connexion (II)
mysql_close([$id]) : permet de fermer la connexion un serveur de bases de donnes, largument optionnel $id est lidentifiant de session retourn louverture de la connexion. A not que toutes les connexions aux serveurs de bases de donnes sont automatiquement fermes la fin de lexcution du script qui les aura ouvertes. Dans le cas o le visiteur du site doit naviguer travers diffrents script PHP qui se connectent tous au mme serveur, il est prfrable davoir recours aux connexions persistantes . Une connexion persistante est ouverte avec la fonction mysql_pconnect() qui est en tout point comparable mysql_connect() la seule diffrence que la connexion nest pas ferme la fin du script qui a ouvert la connexion. Ainsi, les scripts suivants peuvent continuer lancer des requtes la base de donnes sans avoir rouvrir de connexion en direction du serveur. Une connexion persistante ne peut pas tre ferme avec la fonction mysql_close(). Au del dun certain temps dinactivit, la ou les connexions persistantes ouvertes sont automatiquement fermes.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

75

Connexion (III)
Exemple 1 : if( $id = mysql_connect(localhost,foobar,0478) ) { if(mysql_select_db(gigabase) ) { echo Succs de connexion.; /* code du script */ } else { die(Echec de connexion la base.); } mysql_close($id); } else { die(Echec de connexion au serveur de base de donnes.); }

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

76

Connexion (IV)
Exemple 2 : @mysql_connect(localhost,foobar,0478) or die(Echec de connexion au serveur.); @mysql_select_db(gigabase) or die(Echec de slection de la base.); Cet exemple est quivalent au prcdent mais plus court crire. Le symbole @ (arobase) permet dviter le renvoi de valeur par la fonction quil prcde. On pourra avantageusement intgrer ce code dans un fichier que lon pourra joindre par include(). Cest aussi un moyen de scuriser le mot de passe de connexion. Une connexion persistante vite davoir rouvrir une connexion dans chaque script. Les connexions sont automatiquement fermes au bout dun certain temps en cas dabsence de toute activit

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

77

Interrogation
Pour envoyer une requte une base de donne, il existe la fonction : mysql_query($str) qui prend pour paramtre une chane de caractres qui contient la requte crite en SQL et retourne un identificateur de rsultat ou FALSE si chec.

Exemple : $result = mysql_query(SELECT tlphone FROM Personnes WHERE nom=\$name\); Cet exemple recherche le tlphone dune personne portant pour nom la valeur de la chane $name. Lidentificateur de rsultat $result permettra dautres fonctions dextraire ligne par ligne les donnes retournes par le serveur. Chaque appel cette fonction retournera un tuple du rsultat. Cest pourquoi cette instruction pourra tre utilise au sein dune boucle while qui sarrtera lorsque mysql_query() renverra FALSE.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

78

Extraction des donnes (I) tableau


mysql_fetch_row($result) : retourne une ligne de rsultat (un tuple) sous la forme dun tableau. Les lments du tableau tant les valeurs des attributs de la ligne. Retourne FALSE sil ny a plus aucune ligne. Exemple 1 : $requet = SELECT * FROM users; if($result = mysql_query($requet)) { while($ligne = mysql_fetch_row($result)) { $id = $ligne[0]; $name = $ligne[1]; $address = $ligne[2]; echo $id - $name, $address <br />; } } else { echo Erreur de requte de base de donnes.; } Ici, on accde aux valeurs de la ligne par leur indice dans le tableau.
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 79

Extraction des donnes (II) associatif


mysql_fetch_array($result) et mysql_fetch_assoc($result) : retournent un tableau associatif. Les cls tant les noms des attributs et leurs valeurs associes leurs valeurs respectives. Retourne FALSE sil ny a plus aucune ligne.

Exemple 2 : $requet = SELECT * FROM users; if($result = mysql_query($requet)) { while($ligne = mysql_fetch_array($result)) { $id = $ligne[id]; $name = $ligne[name]; $address = $ligne[address]; echo $id - $name, $address <br />; } } else { echo Erreur de requte de base de donnes.; } Ici, on accde aux valeurs de la ligne par lattribut dans le tableau associatif.
80

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

Extraction des donnes (III) objet


mysql_fetch_object($result) : retourne un objet. Les attributs de lobjet correspondent ceux de la ligne de rsultat. Et les valeurs des attributs de lobjet correspondent ceux de la ligne de rsultat. Retourne FALSE sil ny a plus aucune ligne.

Exemple 3 : $requet = SELECT * FROM users; if($result = mysql_query($requet)) { while($ligne = mysql_fetch_object($result)) { $id = $ligne->id; $name = $ligne->name; $address = $ligne->address; echo $id - $name, $address <br />; } } else { echo Erreur de requte de base de donnes.; } Ici, on accde aux valeurs par leur attribut dans lobjet.
81

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

Statistiques sur une requte


mysql_affected_rows([$id]) : retourne le nombre de lignes modifies par la dernire requte INSERT, UPDATE ou DELETE effectue sur le serveur identifie par $id (les DELETE sans clause WHERE retourneront 0 lignes, car la table sera recre au lieu de supprimer les lignes une une).
$requet = DELETE FROM users WHERE name LIKE \Martin%\; $result = mysql_query($requet) or die(Erreur de base de donnes.); $num = mysql_affected_rows();

mysql_num_rows($result) : retourne le nombre de lignes retournes par la dernire requte SELECT dont on connat lidentifiant de rsultat $result.
$requet = SELECT name FROM users WHERE birth > \1980-05-10\; $result = mysql_query($requet) or die(Erreur de base de donnes.); $num = mysql_num_rows();

mysql_num_fields($result) : retourne le nombre dattributs des tuples du rsultat dune requte.


$requet = SELECT * FROM users; $result = mysql_query($requet) or die(Erreur de base de donnes.); $num = mysql_num_fields();

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

82

Informations sur les attributs (I)


Les fonctions suivantes sappliquent au $field me attribut retourn par la dernire requte identifie par $result :
mysql_field_name($result, $field) : retourne le nom mysql_field_len($result, $field) : retourne la taille mysql_field_type($result, $field) : retourne le type mysql_field_flags($result, $field) : retourne les drapeaux mysql_field_table($result, $field) : retourne le nom de la table mysql_fetch_field($result [,$field]) : retourne un objet contenant des informations sur lattribut $field. Ses attributs sont name (nom), table (nom de la table), max_length (taille), type (type) et les boolens suivants : not_null, primary_key, unique_key, multiple_key, numeric, blob, unsigned, zerofill. mysql_field_seek($result, $field) : prpositionne lindex $field afin de ne pas le passer en paramtre mysql_fetch_field().

Lindex commence zro. Elles ne peuvent tre utilise quaprs un appel la fonction mysql_query() retournant le pointeur de rsultat $result.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

83

Informations sur les attributs (II)


mysql_list_dbs([$id]) : retourne un pointeur de rsultat simulant la requte suivante : SHOW DATABASES. Liste des bases de donnes. mysql_list_tables($base [, $id]) : retourne un pointeur de rsultat simulant la requte suivante : SHOW TABLES FROM $base. Liste des relations de la base de donnes $base. mysql_list_fields ($base, $table [, $id]) : retourne un pointeur de rsultat simulant la requte suivante : SHOW COLUMNS FROM $table FROM $base. Ce pointeur peut tre utilis par les fonctions mysql_field_* afin davoir des informations sur une table $table de la base $base. Lidentifiant de connexion $id est optionnel. mysql_fetch_lengths($result) : retourne un tableau contenant la taille de chaque attribut de la ligne du dernier tuple rsultat de la requte $result, ou FALSE sinon. Ne peut tre utilise quaprs lune des fonctions dextraction.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

84

Informations sur les attributs (III)


if($result = mysql_query(SELECT * FROM forum) ) { for($i=1; $i<= mysql_num_fields($result); $i++ ) { echo mysql_field_name($result, $i-1), , , mysql_field_len($result, $i-1), , , Dfinition de la table : CREATE TABLE forum ( mysql_field_type($result, $i-1), , , id bigint(20) unsigned auto_increment, mysql_field_flags($result, $i-1), ,, title tinytext NOT NULL, mysql_field_table($result, $i-1), <br />; mesg text NOT NULL, hits mediumint(8) unsigned NOT NULL, } author_idx bigint(20) unsigned NOT NULL, } else die(Erreur de base de donnes.); date datetime NOT NULL,
PRIMARY KEY(id)

Rsultats :
nom
id title mesg hits author_idx date

) taille
20 255 65535 8 20 19 int blob blob int int datetime

type
not_null blob not_null blob not_null unsigned not_null unsigned not_null

drapeaux
not_null primary_key unsigned auto_increment

table
forum forum forum forum forum forum
85

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

Informations sur les attributs (IV)


if($result = mysql_query(SELECT * FROM forum) ) { $infos = mysql_fetch_field($result, 0); Rsultat : stdClass Object print_r($infos); ( } [name] => id [table] => forum Cet exemple affiche les informations sur le premier attribut [def] => des rsultats de la requte. On voit quil sappelle id, quil [max_length] => 2 appartient la table forum, que sa taille maximum est de [not_null] => 1 2 digits, quil porte les contraintes suivantes : NOT NULL et PRIMARY KEY, quil est de type numrique non sign : [primary_key] => 1 INT, UNSIGNED. [multiple_key] => 0 [unique_key] => 0 [numeric] => 1 [blob] => 0 [type] => int [unsigned] => 1 [zerofill] => 0 )
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 86

Fonctions sur le serveur


mysql_create_db($base [, $id]) : cration de la base $base. mysql_db_name($result, $row [, $field]) : Lit les noms des bases de donnes. $result est lidentifiant de rsultat issu de mysql_list_dbs(). $row est l'index dans le rsultat. Retourne FALSE si chec. mysql_db_query($base, $query [, $id]) : excution de la requte $query sur la base $base. Retourne un identifiant de rsultat si succs ou FALSE si chec. mysql_query($query [, $id]) : excution de la requte sur la base ouverte. Retourne un identifiant de rsultat si succs ou FALSE si chec. mysql_drop_db($base [, $id]) : supprime la base de donnes $base. Retourne TRUE si succs ou FASE si chec. mysql_select_db($base [, $id]) : slectionne la base de donnes $base sur le serveur sur lequel on est connect et dont $id est lidentifiant de connexion. Retourne TRUE si succs ou FASE si chec.
$result = mysql_list_dbs(); $num = mysql_num_rows($result); for ($i=0; $i<$num; $i++) echo mysql_db_name($result, $i).<br />;

Cet exemple affiche la liste des bases de donnes du serveur.


87

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

Gestion des erreurs


Il est recommand de tester systmatiquement les valeurs retournes par les fonction de traitement sur une base de donnes afin dviter la pollution de la page web par des Warning. mysql_errno([$id]) : retourne le numro derreur de la dernire opration MySQL effectue sur la connexion courante ou celle didentifiant $id. mysql_error([$id]) : retourne le message derreur de la dernire opration MySQL effectue sur la connexion courante ou celle didentifiant $id. Exemple :
$requet = DELETE FROM users WHERE name LIKE \Martin%\; if($result = mysql_query($requet)) { } else { echo Erreur de base de donnes n.mysql_errno().: .mysql_error(); }

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

88

Fonctions additionnelles
Quelques fonctions supplmentaires trs utiles :
mysql_free_result($result) : efface de la mmoire du serveur les lignes de rsultat de la requte identifies par $requet. Trs utile pour amliorer les performances du serveur. A nutiliser que si votre script utilise vraiment beaucoup de mmoire. mysql_insert_id([$id]) : retourne lidentifiant dun attribut cl primaire AUTO_INCREMENT de la dernire insertion. mysql_data_seek($result, $row) : Permet de prpositionner le pointeur interne de rsultat $result la ligne $row. Le prochain appel une fonction dextraction de tuple du rsultat ira directement cette ligne. Retourne TRUE si succs et FALSE sinon.

Penser bien tester la valeur de retour des fonctions (mysql_query et les autres) afin de dtecter toute erreur et dviter de polluer votre page avec des Warnings.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

89

Directives de configuration du php.ini


Ces informations sont utilises si elles sont omises lors dune connexion :
mysql.default_host chane de caractres Adresse par dfaut du serveur de bases de donnes. mysql.default_user chane de caractres Utilisateur par dfaut. mysql.default_password chane de caractres Mot de passe par dfaut.

Connexions persistantes :
mysql.allow_persistent boolen Active ou dsactive les connexions persistantes. mysql.max_persistent entier Nombre maximum de connexions persistantes par processus.

Connexions :
mysql.max_links entier Nombre de connexion simultanes maximum, par processus, incluant les connexions persistantes
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 90

Administration avec loutil web phpMyAdmin


Le CyberZode Qui Frtille http://cyberzoide.developpez.com 91

Prsentation
Loutil phpMyAdmin est dvelopp en PHP et offre une interface intuitive pour ladministration des base de donnes du serveur. Il est tlchargeable ici : http://phpmyadmin.sourceforge.net Cet outil permet de : - crer de nouvelles bases - crer/modifier/supprimer des tables - afficher/ajouter/modifier/supprimer des tupes dans des tables - effectuer des sauvegarde de la structure et/ou des donnes - effectuer nimporte quelle requte - grer les privilges des utilisateurs Les exemples qui vont suivrent sappliquent la version 2.2.6

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

92

Cration/slection dune base de donnes


Avant de manipuler des donnes, il faut crer une ou des bases de donnes.

ETAPE 2 : slectionnez le nom de la base manipuler (le nombre de tables de la base apparat entre parenthses)

ETAPE 1 : crivez le nom de la base de donne crer. Puis cliquez sur Crer

Et aussi.. choix de la langue de linterface de phpMyAdmin

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

93

Gestion de la base de donnes (I)

Choix dune table grer en particulier crire une requte MySQL excuter Actions sur les tables : afficher leur contenu intgral, faire une slection sur critres, ajouter des donnes, grer ses proprit intrinsques, supprimer, vider.

Excuter une requte MySQL contenue dans un fichier


http://cyberzoide.developpez.com 94

Le CyberZode Qui Frtille

Gestion de la base de donnes (II)


Accs un formulaire dtaill pour effectuer une requte

Option permettant de transmettre le schma sous la forme dun fichier Affichage du schma (structure et/ou donnes) des tables slectionnes de la base Accs un formulaire dtaill dajout dune table dans la base Supprimer la base
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 95

Affichage dune table


Rappel de la requte Rappel de la base, de la table et du serveur

Colonnes = noms des attributs de la table

Supprimer un enregistrement Accs au formulaire de modification dun enregistrement Insertion dun nouvel enregistrement
Le CyberZode Qui Frtille

Liste des enregistrements de la table par pages de X lignes


Permet de naviguer dans les pages de rsultats

Afficher par page de X lignes


http://cyberzoide.developpez.com 96

Insertion/modification dun enregistrement


Nom du champ Type Choix dune fonction appliquer la valeur saisie Valeur saisir

Les champs et leurs types sont dfinis lors de la cration de la table : tous les champs sont pas forcment obligatoires Les formulaires dinsertion et de modification sont similaires.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

97

Gestion dune table (I)


Proprits des attributs de la table

Quelques actions rapides : affichage, slection, insertion dun enregistrement, vidage, suppression

Quelques actions sur les attributs : modifier, supprimer ; plus les contraintes : cl primaire et unique ; et y mettre un index

Crer une nouvelle cl sur X attributs


Le CyberZode Qui Frtille

Modifier ou supprimer plusieurs attributs en mme temps


http://cyberzoide.developpez.com

Quelques statistiques et infos


98

Gestion dune table (II)


Affichage de la version imprimable de la page

crire une requte excuter ou spcifier un fichier en contenant une ou plusieurs

Ajouter X champs dans la table une position particulire

Rordonner les donnes de table en fonction dun attribut Accs au formulaire dinsertion de donnes dans la table partir dun fichier
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 99

Gestion dune table (III)


Permet dafficher le schma (structure et/ou donnes) de la table.

Le schma dune table est lensemble de la structure et des donnes dune table.
La structure est compose de la dfinition des proprits des attributs et des cls. Le rsultat de sortie structure et/ou donnes est constitu des requtes MySQL de cration de la table et dinsertion des enregistrements.

Le format CSV est un fichier texte dont chaque ligne reprsente un enregistrement.
Le rsultat peut tre transmis sous la forme dun fichier (qui lui-mme peut tre compress).
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 100

Gestion dune table (IV)


Dplacer la table vers une autre base avec changement de nom possible dans la foule Changer le nom de la table La copier (avec ou sans les donnes) vers une autre base avec changement de nom possible

Quelques oprations de maintenance : vrification, analyse, rparation, optimisation Lui associer un commentaire Changer le format de la table La supprimer
Le CyberZode Qui Frtille

Recharger la table en mmoire du serveur


http://cyberzoide.developpez.com 101

Insertion des donnes dans une table


On accde cet cran var le lien Insrer des donnes provenant d'un fichier texte dans la table de la page de gestion de la table. Permet dinsrer des enregistrements dans une table partir dun fichier de donnes au format CSV. On peut changer les valeurs par dfaut des sparateurs standards du CSV.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

102

Cration dune cl
On accde cet cran var le lien Crer une clef sur X colonne(s de la page de gestion de la table.

Permet de crer une cl sur une ou plusieurs colonnes.


Il faut nommer la cl, en spcifier le type, et les attributs sur lesquels elle sapplique. On peut rajouter une autre colonne cette cl avant de valider lajout de la cl.

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

103

Liens
La rfrence PHP (anglais & franais) : http://www.php.net La rfrence MySQL (anglais) : http://www.mysql.com Le manuel MySQL traduit en franais ici : http://dev.nexen.net/docs/ Des cours et articles intressants : http://www.developpez.com dont la FAQ PHP & MySQL : http://php.developpez.com/faq/

Loutil phpMyAdmin : http://phpmyadmin.sourceforge.net

Le CyberZode Qui Frtille

http://cyberzoide.developpez.com

104

Historique
20 juillet 2003 : insertions compltes et tendues ; jointures (105 diapos) 9 mars 2003 : corrections, aide phpMyAdmin (101 diapos) 17 dcembre 2002 : plus dexemples, api php, jointures (90 diapos) 9 dcembre 2002 : premire publication (73 diapos) 5 dcembre 2002 : cration du document par Hugo Etivant (54 diapos) Remerciement tous ceux qui part leurs suggestions et critiques font progresser la qualit de ce document.

Ce cours sinspire des ressources suivantes : cours de SQL de M. PICHAT (UCBL) transparents de Mohand-Sad HACID (LISI, UCBL) manuel MySQL (Nexen)
Hugo Etivant cyberzoide@yahoo.fr http://cyberzoide.developpez.com/
Le CyberZode Qui Frtille http://cyberzoide.developpez.com 105