Vous êtes sur la page 1sur 14

mémento

MySQL 5
Rod ol p he Rime lé
4e édition
Connexion à une base de données
Étape préliminaire avant toute opération : la connexion à la base se fait via
un client mysql, en ligne de commande ou en mode graphique, ou encore à
travers un langage de programmation (PHP, C, Ruby, Python...).
Connexion en ligne de commande avec le client MySQL
Sous Linux/Unix, Mac OS X, et sous Windows :
mysql -ulogin -pmot_de_passe Connexion sans spécifier de base de données
mysql -ulogin -pmot_de_passe Connexion spécifiant une base de données
nom_base

Une fois connecté, saisir directement les requêtes closes d’un point-virgule.
Productivité : instructions utiles en ligne de commande MySQL
source nom_de_fichier Exécute les commandes SQL stockées dans un fichier.
quit OU exit Quitte le client MySQL.
use Choisit la base de données à utiliser.
status Affiche l’état du serveur.
? Affiche l’aide.
tee nom_de_fichier Enregistre les commandes entrées et leurs résultats dans un
fichier journal.

Autres commandes shell utiles


mysqldump Exporte vers un fichier texte pour sauvegarde ou transfert
entre serveurs, une (– –opt nom_base) ou toutes (– –all-
databases) les bases.
EXEMPLE mysqldump – –opt nom_base > base.sql
mysqldump – –all-databases > bases.sql
myisamchk Vérifie, optimise et répare les tables au format MyISAM.
ATTENTION Le serveur doit être stoppé durant les opérations.
mysqlimport Importe un fichier texte dans une table (similaire à LOAD DATA
INFILE).
mysqladmin Permet de créer/supprimer une base, exporter des tables,
recharger les droits d’accès, etc.
EXEMPLE Pour changer le mot de passe root
mysqladmin -u root password nouveau_mot_de_passe
mysqlcheck Utilitaire client de maintenance des tables, pour les vérifier,
réparer, analyser et optimiser.
ATTENTION Le serveur doit être démarré durant les opérations.
mysqlshow Affiche des informations sur une table ou un index.
mysqldumpslow Affiche le journal des requêtes les plus lentes, si l’option
log-slow-queries est activée sur le serveur.

Connexion via PHP


Après avoir établi la connexion, la fonction query transmet la requête au serveur.
Diverses fonctions permettent de lire les résultats retournés.
Avec PDO (PHP version 5.3 et supérieures)
$sqlpdo = new PDO("mysql:host=$mysql_server;dbname=$mysql_base",
$mysql_login, $mysql_password);
$result = $sqlpdo->query('SELECT * FROM table');
foreach ($result as $ligne) {
echo $ligne['champ']; }
Avec l’API MySQLi (PHP version 5 et supérieures)
mysqli_connect($mysql_server,$mysql_login,$mysql_password);
mysqli_select_db($mysql_base);
$result = mysqli_query('SELECT * FROM table');
while($ligne = mysqli_fetch_assoc($result))
echo $ligne['champ'];
mysqli_close();
Avec MySQLi en mode objet
$sql = new mysqli($mysql_server,$mysql_login,$mysql_password,$mysql_base);
$result = $sql->query('SELECT * FROM table');
while($ligne = $result->fetch_assoc()) echo $ligne['champ'];
$sql->close();

Utiliser une base


En ligne de commande, renseignent sur le contenu disponible (bases et tables).
SHOW DATABASES; Liste les bases disponibles
USE nom_de_la_base; Définit la base active à utiliser
SHOW TABLES; Liste les tables présentes dans une base
DESCRIBE nom_de_la_table; Décrit la structure d’une table (champs)
Connexion à une base de données Gestion des utilisateurs Modifier la structure d’une table Requêtes

Fonctions courantes CREATE USER login IDENTIFIED BY Crée un nouvel utilisateur ADD UNIQUE nom_index type_index Ajoute un index unique sur champ de type ■ FIELDS peut être spécifié par une (au moins) ou plusieurs instructions :
TERMINATED BY '\t' : colonnes séparées par... (\t = tabulation)
mysqli_query($requete) Exécute une requête et renvoie le résultat. 'mot_de_passe'; (champ, champ2...) type_index sur champ, champ2...
ENCLOSED BY '' : colonnes entourées d’un caractère précis (ex. guillemets)
mysqli_fetch_row($result)Renvoie la ligne dans une liste. RENAME USER ancien_login TO nouveau_login; Renomme un utilisateur ADD FULLTEXT nom_index Ajoute un index de type FULLTEXT sur ESCAPED BY '\\' : caractère d’échappement (ici un antislash simple)
EXEMPLE while(list($champ1,$champ2) = mysqli_fetch_row($result)) { ... } SET PASSWORD FOR login = Change un mot de passe (champ, champ2 ...) champ, champ2... ■ LINES est défini par STARTING BY '' (les lignes commencent par...) et
mysqli_fetch_assoc($result) Renvoie la ligne dans un tableau associatif. PASSWORD('nouveau_mot_de_passe'); DROP nom_champ Supprime le champ de la structure de la table. TERMINATED BY '\n' (les lignes terminent par...) où \n est une nouvelle ligne ou
mysqli_fetch_array($result) Renvoie la ligne dans un tableau. DROP USER login; Supprime un utilisateur DROP PRIMARY KEY Supprime la primaire de la structure de la table. line feed (LF).
GRANT droits ON cible TO login WITH Modifie ou attribue des droits DROP INDEX nom_index Supprime un index de la structure de la table. Pour ignorer les lignes superflues en début de fichier, IGNORE nb_de_lignes LINES.
mysqli_affected_rows() Renvoie le nombre de lignes affectées par
options; à un utilisateur SELECT * INTO OUTFILE 'sangria.txt' Exporte les enregistrements retournés
la dernière commande.
REMARQUE Voir ci-après le détail des options pour la gestion des droits. FIELDS TERMINATED BY ',' FROM boissons; par une instruction SELECT vers un
mysqli_insert_id() Renvoie l’identifiant unique (EXEMPLE PRIMARY KEY en
REVOKE droits ON cible FROM login; Révoque les droits d’un utilisateur fichier texte. (Voir ci-dessus pour la
mysqli_error()
AUTO_INCREMENT) de la dernière commande INSERT.
Renvoie le message d’erreur né de la dernière requête. FLUSH PRIVILEGES; Recharge les droits MySQL
ATTENTION N’oubliez pas de recharger les droits après toute modification des droits utilisateur !
Requêtes SELECT @@version;
syntaxe des clauses FIELDS et LINES.)
Retourne la version du moteur MySQL utilisé.
mysqli_num_rows($result) Renvoie le nombre de lignes d’un résultat. SELECT champ1,champ2 FROM Sélectionne tous (*) ou certains
mysqli_close() Ferme la connexion MySQL. nom_table; clause_where clause_group enregistrements d’une table, répondant
REMARQUE Options pour la gestion des droits clause_order clause_limit; éventuellement à des conditions.
ATTENTION Le préfixe mysqli est à remplacer par mysql dans ces noms de fonctions si si la colonne cible : nom d’une table nom_table (nom complet : nom_base.nom_table). Pour
le serveur n’est pas équipé de MySQLi. En outre, en mode objet, on omet le préfixe
si la fonction est appelée en tant que méthode de l’instance utilisée (EXEMPLE $mysqli-
attribuer les droits à l’ensemble des tables d’une base : nom_base.*
login : un login ou plusieurs séparés par des virgules, avec éventuellement le mot de
CLAUSES CONDITIONNELLES Voir plus loin les clauses WHERE, GROUP BY, ORDER BY,
LIMIT pour les requêtes conditionnelles et triées.
SELECT nom,ROUND Le mot clé AS crée un alias sur un
Requêtes conditionnelles
>fetch_assoc(), $mysqli->query($requete)) ou en tant qu’attribut dans le cas
de valeurs simples (EX. $result->num_rows, $sql->error).
passe : TO 'login'@'localhost' IDENTIFIED BY 'mot_de_passe'. (2014-annee_naissance) AS age FROM
adresses ORDER BY age DESC;
nom de colonne ou de table. Il est
ainsi possible de raccourcir les noms
avec WHERE
ALL Tous les droits SELECT a.jour,p.nom FROM anniversaires utilisés pour des commodités L’essentiel étant d’effectuer des requêtes SELECT, REPLACE, DELETE ou
ALTER Autorise ALTER TABLE AS a,carnet_adresses AS p WHERE d’écriture. (Ci-contre alias sur champ UPDATE sur les enregistrements d’une table répondant à une condition, WHERE
Création d’une base et de tables CREATE
CREATE VIEW
Autorise CREATE TABLE
Autorise CREATE VIEW
a.id = p.id;
INSERT INTO nom_table
puis sur table)
Insère de nouveaux enregistrements
se révèle indispensable pour mettre en jeu un ou plusieurs tests, portant sur un ou
plusieurs champs. Toutes sortes de fonctions peuvent être utilisées pour comparer
Un serveur MySQL contient une ou plusieurs bases de données, interrogeables par des (champ1,champ2,...) dans une table. les champs entre eux, ou à des constantes, sauf les fonctions d’agrégation (AVG,
DELETE Autorise DELETE
requêtes. Chaque base contient au moins une table, structurée en champs (colonnes) VALUES ('valeur1','valeur2',...); MIN, MAX, SUM...).
DROP Autorise DROP TABLE
définis à sa création, et contenant zéro à plusieurs enregistrements (lignes).
EXECUTE Autorise l’emploi de procédures stockées REMARQUES Si une colonne n’est pas spécifiée dans la liste, elle prend la valeur
FILE Autorise SELECT ... INTO OUTFILE et LOAD DATA INFILE par défaut qui lui a été assignée lors de la création de la table. Si une colonne EXEMPLE SELECT * FROM nom_table WHERE colonne='valeur';
REMARQUE Ce mémento offre une sélection des commandes les plus utiles, n’hésitez pas
INDEX Autorise CREATE INDEX et DROP INDEX possède l’attribut AUTO_INCREMENT il suffit de ne pas préciser la colonne à Ces conditions peuvent être multiples grâce aux opérateurs de comparaison.
à consulter la documentation officielle sur http://dev.mysql.com/doc/. l’insertion, ou de lui donner la valeur NULL. INSERT permet les insertions multiples :
INSERT Autorise INSERT OPÉRATEURS DE COMPARAISON
INSERT INTO mementos (titre,editeur) VALUES
Créer une nouvelle base de données ou une nouvelle table LOCK TABLES Autorise LOCK TABLES ('MySQL','Eyrolles'),('HTML5','Eyrolles'); Booléens : AND (&&) : ET logique OR (||) : OU logique
PROCESS Autorise SHOW FULL PROCESSLIST En précisant la clause DELAYED après INSERT, le serveur rend la Comparateurs : < inférieur à = égal <= inférieur ou égal
CREATE DATABASE nom_de_la_base; DELAYED
RELOAD Autorise FLUSH main au client et n’insère les lignes que lorsque la table est > supérieur à != différent de >= supérieur ou égal
CREATE TABLE nom_de_la_table (
SELECT Autorise SELECT inutilisée. Parenthèses de priorité :
nom_champ1 type_champ1(longueur) attributs,
nom_champ2 type_champ2(longueur) attributs, ...
SHOW DATABASES Autorise SHOW DATABASES LOW_PRIORITY La clause LOW_PRIORITY retarde l’insertion jusqu’à ce qu’il n’y ait SELECT * FROM contacts WHERE age>20 AND (code_postal=’67’ OR age<=35);
SHUTDOWN Autorise mysqladmin shutdown plus de client lisant la table, mais ne rend pas la main. LIKE Teste la validité d’une chaîne de caractères ou d’un nombre par
type_clé1 nom_clé1, type_clé2 nom_clé2, ...
SUPER Autorise entre autres KILL et SET GLOBAL INSERT INTO mementos INSERT... SELECT permet d’insérer des rapport à une expression pouvant contenir deux caractères joker :
) TYPE = type_de_table;
UPDATE Autorise UPDATE (titre_memento,description_memento, valeurs à partir d’une ou plusieurs % (aucun ou plusieurs caractères) ; _ (un caractère exactement).
Chaque champ (colonne) est défini par un nom, un type dont la longueur est spécifiée (voir plus
USAGE Synonyme de “pas de privilèges” prix_memento) SELECT titre,description, autres tables grâce à une sous-requête EXEMPLES
loin « Types de champs »), et des attributs, séparés par des virgules, pouvant prendre ces valeurs :
lorsqu’aucune GRANT OPTION Synonyme de WITH GRANT OPTION (voir ci-dessous) '5' FROM livres WHERE type='memento'; SELECT. SELECT prenom FROM carnet WHERE prenom LIKE 'C%'; ‹ Charles, Céline, Claire
NULL / NOT NULL Le champ peut être vide, prendre ou pas la valeur NULL. SELECT mot,definition FROM dico WHERE mot LIKE 'Fu_ _ _'; ‹ Fusée, Fusil, Futur
UPDATE nom_table SET champ1= Met à jour des enregistrements dans
DEFAULT 'valeur_par_defaut' Le champ a une valeur par défaut WITH GRANT OPTION Donne le droit de modifier les droits NOT LIKE Seuls les champs ne correspondant pas à l’expression sont valides.
'nouvelle_valeur',champ2='autre_valeur' une table, concernés ou non par une
automatique si elle n’est pas précisée lors des autres utilisateurs REGEXP Teste la conformité du texte à une expression régulière.
WHERE champ3=champ2+7; condition. L’UPDATE peut porter sur EXEMPLE
d’une insertion. WITH MAX_QUERIES_PER_HOUR n N’autorise que n requêtes par heure plusieurs tables. SELECT titre FROM livres WHERE titre REGEXP 'Il était une .+';
AUTO_INCREMENT Sa valeur est auto-incrémentée à chaque nouvelle WITH MAX_UPDATES_PER_HOUR n N’autorise que n requêtes UPDATE EXEMPLE UPDATE produit,catalogue SET produit.prix=catalogue.prix WHERE
insertion (clé primaire et type numérique requis). Avec . pour un caractère, [a-z] pour une classe de caractères, * pour 0 ou plusieurs
par heure produit.id=catalogue.id; caractères, ^ pour le début de chaîne, $ pour la fin, {n} pour une répétition n-fois.
WITH MAX_CONNECTIONS_PER_HOUR n N’autorise que n connexions par heure REMARQUE Il est possible d’utiliser la clause LIMIT ou ORDER BY pour limiter la Utiliser REGEXP BINARY pour être sensible à la casse.
, REMARQUE La longueur est facultative pour les types numériques, CHAR et VARCHAR. Elle '); WITH MAX_USER_CONNECTIONS n N’autorise que n connexions portée des modifications. La clause WHERE est facultative, dans ce cas tous les STRCMP Compare deux chaînes et renvoie 0 si elles sont identiques, -1 si la
n’est pas permise pour les autres types (dates, TEXT, BLOB, ENUM, SET...). simultanées enregistrements de la table seront affectés. Si LOW_PRIORITY est spécifié après première chaîne est plus petite que la seconde, 1 sinon. STRCMP est
UPDATE, les modifications auront lieu lorsqu’aucun client ne lira plus la table. Le
Les clés (index) de la table sont déclarées par leur type (voir plus loin « Types d’index ») EXEMPLE nombre d’enregistrements affectés est retourné. insensible à la casse.
et le(s) champ(s) à indexer. GRANT SELECT,UPDATE,DELETE,INSERT ON mabase.* TO 'monlogin'@'localhost' EXEMPLE
INSERT INTO participants ON DUPLICATE KEY UPDATE procède SELECT titre FROM livres WHERE STRCMP(titre,’mysql’) >= 0;
Le type de table est spécifié à la création par TYPE=type_de_table en fin d’instruction IDENTIFIED BY 'motdepassedifficileàtrouver'; (nom_joueur,score) VALUES ('Manw',1337) à une requête UPDATE si l’insertion IN / NOT IN Teste l’appartenance d’une valeur à une liste. Depuis MySQL 4.1,
CREATE TABLE. Les types par défaut sont : REMARQUE localhost ne tolère que les connexions locales sur le serveur, % tolère toutes ON DUPLICATE KEY UPDATE engendre un doublon pour une clé IN() peut contenir une sous-requête.
MyISAM Format par défaut les sources externes (à utiliser avec précaution). score=score+1337; PRIMARY ou UNIQUE. EXEMPLE
MEMORY (HEAP) En mémoire vive, rapide mais perte des données au REPLACE INTO animaux (id,espece,nom) Insère ou remplace des SELECT prix FROM desserts WHERE fruit IN(SELECT nom FROM fruits WHERE nom
redémarrage du serveur VALUES (2,’Elephant’,’Babar’); enregistrements dans une table. LIKE 'K%');
InnoDB Permet les transactions, les clés étrangères et les locks avancés REMARQUE REPLACE fonctionne similairement à INSERT sauf dans le cas où l’insertion BETWEEN Teste la présence d’une valeur dans un intervalle, bornes incluses
EXEMPLE
CREATE Modifier la structure d’une table crée un doublon dans une table munie d’un index UNIQUE ou PRIMARY KEY.
Il n’a d’ailleurs de sens qu’avec ces deux types d’index. Dans ce cas, l’ancien EXEMPLE
(min <= valeur AND valeur <= max).
CREATE TABLE adresses (id INT NOT NULL UNSIGNED AUTO_INCREMENT, Pour changer la structure d’une table existante : ALTER TABLE nom_table ... SELECT nom,age FROM carnet_adresses WHERE age BETWEEN 20 and 35;
enregistrement est effacé avant que le nouveau ne soit inséré.
nom CHAR(50) NOT NULL, prenom CHAR(40), anniversaire DATE, Suivi, au choix, des instructions suivantes :
DELETE FROM nom_table WHERE Efface les enregistrements d’une table NOT Seules les valeurs hors de l’intervalle sont prises en compte.
); PRIMARY KEY(id) descrip- RENAME nouveau_nom_table Renomme la table condition ORDER BY champ_de_tri répondant à une condition, et BETWEEN
) TYPE = MyISAM; MODIFY nom_champ nouveau_type Modifie le type d’un champ LIMIT limite; renvoie le nombre de lignes effacées, FULLTEXT Recherche en texte intégral. N’est possible que sur les colonnes
CHANGE nom_champ Change le champ nom_champ vers éventuellement avec une clause MATCH... dotées d’un index FULLTEXT. Elle est insensible à la casse et la
Créer une table ayant la même structure qu’une autre nouveau_nom_champ nouveau_type nouveau_nom_champ avec le type limitative et un ordre de suppression. AGAINST longueur minimale des mots recherchés est de 4 lettres.
CREATE TABLE nouvelle_table LIKE ancienne_table; nouveau_type TRUNCATE TABLE nom_table; Équivaut en plus rapide à DELETE EXEMPLE
ADD nom_champ type_champ Ajoute un champ FROM nom_table; car assimilé à une SELECT * FROM livres WHERE MATCH(titre,resume) AGAINST ('mysql');
Créer un index EXEMPLE ALTER TABLE table ADD code_postal CHAR(5) AFTER ville; destruction/création de table. PERTINENCE Quand MATCH() est utilisé comme condition de WHERE les lignes retournées
CREATE [type_index] INDEX nom_index ON nom_table (col_indexee,...); REMARQUE On précisera la position du champ dans la structure avec les clauses sont automatiquement organisée par la pertinence. Exprimée sous forme de décimal
LOAD DATA INFILE 'contacts.txt' INTO Insère dans la base de données un
Met en place une clé nom_index de type type_index (UNIQUE, FULLTEXT ou AFTER (après un autre champ à préciser) et FIRST (en premier). positif, elle peut être sélectionnée pour opérer un tri personnalisé.
TABLE adresses FIELDS TERMINATED fichier texte qui peut avoir été créé
SPATIAL) sur un ou plusieurs champs, dont les noms sont séparés par des virgules. ADD INDEX nom_index type_index Ajoute un index de type type_index sur SELECT id,MATCH(titre,resume) AGAINST ('mysql') AS pertinence FROM livres;
BY '\t' LINES TERMINATED BY '\n'; grâce à la commande SELECT ... INTO
et MATCH (champ, champ2...) champ, champ2... Dans le résultat obtenu figurent tous les enregistrements de la table, assortis d’une
PERFORMANCES Il est possible de spécifier la longueur du champ à indexer entre paren- OUTFILE.
MyISAM ou ADD PRIMARY KEY nom_index Ajoute une clé primaire de type type_index colonne pertinence dont la valeur est comprise entre 0 (pas de similarité) et 1 (très
thèses, notamment lorsqu’il s’agit de champs texte et il est souvent inutile d’indexer REMARQUE L’interprétation du fichier dépend des clauses FIELDS et LINES,
type_index (champ, champ2...) sur champ, champ2... pertinent).
toute la chaîne de caractères pour des raisons de performances. définissant la façon dont sont séparés les champs (colonnes) et les lignes du fichier texte.
EXEMPLE : CREATE INDEX debut_prenom ON carnet_adresses(prenom(5));
Renommer/supprimer bases,
tables et clés Modifier la structure d’une table Requêtes

RENAME TABLE ancien_nom TO nouveau_nom; Renomme une table ADD UNIQUE nom_index type_index Ajoute un index unique sur champ de type ■ FIELDS peut être spécifié par une (au moins) ou plusieurs instructions :
un client mysql REMARQUE Nécessite les privilèges ALTER et DROP sur l’ancienne table, CREATE et INSERT (champ, champ2...) type_index sur champ, champ2... TERMINATED BY '\t' : colonnes séparées par... (\t = tabulation)
ENCLOSED BY '' : colonnes entourées d’un caractère précis (ex. guillemets)
sur la nouvelle. ADD FULLTEXT nom_index Ajoute un index de type FULLTEXT sur ESCAPED BY '\\' : caractère d’échappement (ici un antislash simple)
DROP TABLE nom_de_la_table, nom_de_la_table2,...; Supprime une ou plusieurs (champ, champ2 ...) champ, champ2... ■ LINES est défini par STARTING BY '' (les lignes commencent par...) et
tables DROP nom_champ Supprime le champ de la structure de la table. TERMINATED BY '\n' (les lignes terminent par...) où \n est une nouvelle ligne ou
DROP DATABASE nom_de_la_base; Supprime une base de DROP PRIMARY KEY Supprime la primaire de la structure de la table. line feed (LF).
mysql -u données DROP INDEX nom_index Supprime un index de la structure de la table. Pour ignorer les lignes superflues en début de fichier, IGNORE nb_de_lignes LINES.
mysql -u DROP INDEX nom_index ON nom_table; Supprime un index SELECT * INTO OUTFILE 'sangria.txt' Exporte les enregistrements retournés
nom_base FIELDS TERMINATED BY ',' FROM boissons; par une instruction SELECT vers un
fichier texte. (Voir ci-dessus pour la
Requêtes SELECT @@version;
syntaxe des clauses FIELDS et LINES.)
Retourne la version du moteur MySQL utilisé.
SELECT champ1,champ2 FROM
source Types de champs Sélectionne tous (*) ou certains
nom_table; clause_where clause_group enregistrements d’une table, répondant
quit OU PERFORMANCES Le choix du type de champ influe sur les performances et l’espace de clause_order clause_limit; éventuellement à des conditions.
. Pour
use
status
stockage, ainsi que sur la simplicité des requêtes qui en découleront. Il définit un nombre
fixe ou variable d’octets pour le stockage de chaque valeur.
CLAUSES CONDITIONNELLES Voir plus loin les clauses WHERE, GROUP BY, ORDER BY,
LIMIT pour les requêtes conditionnelles et triées.
SELECT nom,ROUND Le mot clé AS crée un alias sur un
Requêtes conditionnelles
?
tee
*INT pour le stockage de nombres entiers
(2014-annee_naissance) AS age FROM
adresses ORDER BY age DESC;
nom de colonne ou de table. Il est
ainsi possible de raccourcir les noms
avec WHERE
Type Nb d’octets De... à... SELECT a.jour,p.nom FROM anniversaires utilisés pour des commodités L’essentiel étant d’effectuer des requêtes SELECT, REPLACE, DELETE ou
TINYINT 1 -128 127 AS a,carnet_adresses AS p WHERE d’écriture. (Ci-contre alias sur champ UPDATE sur les enregistrements d’une table répondant à une condition, WHERE
mysqldump
SMALLINT 2 -32 768 32 767 a.id = p.id; puis sur table) se révèle indispensable pour mettre en jeu un ou plusieurs tests, portant sur un ou
MEDIUMINT 3 -8 388 608 8 388 607 INSERT INTO nom_table Insère de nouveaux enregistrements plusieurs champs. Toutes sortes de fonctions peuvent être utilisées pour comparer
INT 4 -2 147 483 648 2 147 483 647 (champ1,champ2,...) dans une table. les champs entre eux, ou à des constantes, sauf les fonctions d’agrégation (AVG,
BIGINT 8 -9 223 372 036 854 775 808 9 223 372 036 854 775 807 VALUES ('valeur1','valeur2',...); MIN, MAX, SUM...).
REMARQUES Si une colonne n’est pas spécifiée dans la liste, elle prend la valeur
myisamchk
REMARQUES Si le mot-clé UNSIGNED est spécifié, la limite inférieure est 0 (seuls des par défaut qui lui a été assignée lors de la création de la table. Si une colonne EXEMPLE SELECT * FROM nom_table WHERE colonne='valeur';
nombres positifs sont stockés), et la limite supérieure est doublée car on s’affranchit du possède l’attribut AUTO_INCREMENT il suffit de ne pas préciser la colonne à Ces conditions peuvent être multiples grâce aux opérateurs de comparaison.
mysqlimport signe (ex. TINYINT UNSIGNED : 0 à 255). INTEGER est un alias pour INT. On peut l’insertion, ou de lui donner la valeur NULL. INSERT permet les insertions multiples :
spécifier la longueur maximale du champ, entre parenthèses, après le type. INSERT INTO mementos (titre,editeur) VALUES OPÉRATEURS DE COMPARAISON
('MySQL','Eyrolles'),('HTML5','Eyrolles'); Booléens : AND (&&) : ET logique OR (||) : OU logique
mysqladmin Comparateurs : < inférieur à = égal <= inférieur ou égal
EXEMPLES DELAYED En précisant la clause DELAYED après INSERT, le serveur rend la
age TINYINT(3) UNSIGNED NOT NULL, main au client et n’insère les lignes que lorsque la table est > supérieur à != différent de >= supérieur ou égal
EXEMPLE
code_postal MEDIUMINT(5) UNSIGNED NOT NULL inutilisée. Parenthèses de priorité :
mysqlcheck LOW_PRIORITY La clause LOW_PRIORITY retarde l’insertion jusqu’à ce qu’il n’y ait SELECT * FROM contacts WHERE age>20 AND (code_postal=’67’ OR age<=35);
L’attribut ZEROFILL définit le caractère « 0 » comme remplissage par défaut. EXEMPLE plus de client lisant la table, mais ne rend pas la main. LIKE Teste la validité d’une chaîne de caractères ou d’un nombre par
en stockant la valeur 3 dans un champ INT(4) ZEROFILL, la valeur lue sera 0003. INSERT INTO mementos INSERT... SELECT permet d’insérer des rapport à une expression pouvant contenir deux caractères joker :
mysqlshow (titre_memento,description_memento, valeurs à partir d’une ou plusieurs % (aucun ou plusieurs caractères) ; _ (un caractère exactement).
BIT, BOOL, BOOLEAN : types booléens pour valeurs binaires prix_memento) SELECT titre,description, autres tables grâce à une sous-requête EXEMPLES
Expriment une variable ne prenant que deux valeurs (vrai ou faux). Équivalent à un '5' FROM livres WHERE type='memento'; SELECT. SELECT prenom FROM carnet WHERE prenom LIKE 'C%'; ‹ Charles, Céline, Claire
TINYINT(1) stockant 1 ou 0 dans un champ numérique. SELECT mot,definition FROM dico WHERE mot LIKE 'Fu_ _ _'; ‹ Fusée, Fusil, Futur
UPDATE nom_table SET champ1= Met à jour des enregistrements dans
NOT LIKE Seuls les champs ne correspondant pas à l’expression sont valides.
'nouvelle_valeur',champ2='autre_valeur' une table, concernés ou non par une
FLOAT, DOUBLE, DECIMAL pour les nombres à virgule flottante REGEXP Teste la conformité du texte à une expression régulière.
WHERE champ3=champ2+7; condition. L’UPDATE peut porter sur EXEMPLE
FLOAT et DOUBLE (équiv. REAL) stockent des nombres à virgule flottante. DECIMAL (équiv. plusieurs tables. SELECT titre FROM livres WHERE titre REGEXP 'Il était une .+';
NUMERIC) stocke sous forme littérale : chaque caractère représente un chiffre stocké. EXEMPLE UPDATE produit,catalogue SET produit.prix=catalogue.prix WHERE Avec . pour un caractère, [a-z] pour une classe de caractères, * pour 0 ou plusieurs
REMARQUE Les attributs UNSIGNED et ZEROFILL sont là aussi applicables. produit.id=catalogue.id; caractères, ^ pour le début de chaîne, $ pour la fin, {n} pour une répétition n-fois.
REMARQUE Il est possible d’utiliser la clause LIMIT ou ORDER BY pour limiter la Utiliser REGEXP BINARY pour être sensible à la casse.
$sqlpdo = portée des modifications. La clause WHERE est facultative, dans ce cas tous les STRCMP Compare deux chaînes et renvoie 0 si elles sont identiques, -1 si la
$mysql CHAR et VARCHAR pour les chaînes de caractères enregistrements de la table seront affectés. Si LOW_PRIORITY est spécifié après première chaîne est plus petite que la seconde, 1 sinon. STRCMP est
$result = $ Stockent des chaînes sur un nombre maximal d’octets indiqué entre parenthèses – les UPDATE, les modifications auront lieu lorsqu’aucun client ne lira plus la table. Le
nombre d’enregistrements affectés est retourné. insensible à la casse.
chaînes excédant ce maximum sont tronquées. Si la chaîne stockée occupe moins EXEMPLE
d’espace, CHAR le réserve quand même en complétant de blancs, à la différence de localhost' INSERT INTO participants ON DUPLICATE KEY UPDATE procède
echo $ SELECT titre FROM livres WHERE STRCMP(titre,’mysql’) >= 0;
VARCHAR qui ne stocke que la chaîne utile (mais est un peu moins performant). (nom_joueur,score) VALUES ('Manw',1337) à une requête UPDATE si l’insertion IN / NOT IN Teste l’appartenance d’une valeur à une liste. Depuis MySQL 4.1,
tolère toutes ON DUPLICATE KEY UPDATE engendre un doublon pour une clé IN() peut contenir une sous-requête.
REMARQUE Si une table comporte au moins un champ de taille variable (VARCHAR, TEXT,
score=score+1337; PRIMARY ou UNIQUE. EXEMPLE
BLOB...), tous les champs CHAR sont automatiquement convertis en VARCHAR à la
REPLACE INTO animaux (id,espece,nom) Insère ou remplace des SELECT prix FROM desserts WHERE fruit IN(SELECT nom FROM fruits WHERE nom
création de la table, car il n’y a aucun intérêt à les laisser en taille fixe.
$result = VALUES (2,’Elephant’,’Babar’); enregistrements dans une table. LIKE 'K%');
while($ REMARQUE REPLACE fonctionne similairement à INSERT sauf dans le cas où l’insertion BETWEEN Teste la présence d’une valeur dans un intervalle, bornes incluses
echo $ BINARY et VARBINARY pour les chaînes binaires crée un doublon dans une table munie d’un index UNIQUE ou PRIMARY KEY. (min <= valeur AND valeur <= max).
mysqli_close Diffèrent de la même façon que CHAR et VARCHAR (voir ci-avant). Ils n’ont pas de jeu Il n’a d’ailleurs de sens qu’avec ces deux types d’index. Dans ce cas, l’ancien EXEMPLE
enregistrement est effacé avant que le nouveau ne soit inséré. SELECT nom,age FROM carnet_adresses WHERE age BETWEEN 20 and 35;
de caractères associé, les tris et comparaisons sont basés sur la valeur numérique de
DELETE FROM nom_table WHERE Efface les enregistrements d’une table NOT Seules les valeurs hors de l’intervalle sont prises en compte.
$sql = l’octet, et on spécifie leur taille maximale de la même façon que CHAR et VARCHAR, à
condition ORDER BY champ_de_tri répondant à une condition, et BETWEEN
$result = la différence près qu’elle est définie en octets.
LIMIT limite; renvoie le nombre de lignes effacées, FULLTEXT Recherche en texte intégral. N’est possible que sur les colonnes
while($ éventuellement avec une clause MATCH... dotées d’un index FULLTEXT. Elle est insensible à la casse et la
$sql->close TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT, BLOB, TINYBLOB, limitative et un ordre de suppression. AGAINST longueur minimale des mots recherchés est de 4 lettres.
MEDIUMBLOB, LONGBLOB pour les chaînes longues TRUNCATE TABLE nom_table; Équivaut en plus rapide à DELETE EXEMPLE
Une colonne de type TEXT est assimilable à un VARCHAR de grande capacité. Ce type FROM nom_table; car assimilé à une SELECT * FROM livres WHERE MATCH(titre,resume) AGAINST ('mysql');
peut contenir une quantité variable de données, en fonction de l’un des 4 types. Les ; destruction/création de table. PERTINENCE Quand MATCH() est utilisé comme condition de WHERE les lignes retournées
types BLOB (Binary Long Object) diffèrent des types TEXT : ils sont sensibles à la casse LOAD DATA INFILE 'contacts.txt' INTO Insère dans la base de données un sont automatiquement organisée par la pertinence. Exprimée sous forme de décimal
(majuscules/minuscules) et triés sur leur valeur binaire. TABLE adresses FIELDS TERMINATED fichier texte qui peut avoir été créé positif, elle peut être sélectionnée pour opérer un tri personnalisé.
sur SELECT id,MATCH(titre,resume) AGAINST ('mysql') AS pertinence FROM livres;
USE REMARQUE On ne peut spécifier de valeur par défaut pour les types BLOB et TEXT. BY '\t' LINES TERMINATED BY '\n'; grâce à la commande SELECT ... INTO
OUTFILE. Dans le résultat obtenu figurent tous les enregistrements de la table, assortis d’une
colonne pertinence dont la valeur est comprise entre 0 (pas de similarité) et 1 (très
DESCRIBE REMARQUE L’interprétation du fichier dépend des clauses FIELDS et LINES, pertinent).
définissant la façon dont sont séparés les champs (colonnes) et les lignes du fichier texte.
Connexion à une base de données tables et clés Types de champs Requêtes

Étape préliminaire avant toute opération : la connexion à la base se fait via Type Capacité de stockage en caractères ■ FIELDS peut être spécifié par une (au moins) ou plusieurs instructions :
un client mysql, en ligne de commande ou en mode graphique, ou encore à TINYTEXT / TINYBLOB 255 TERMINATED BY '\t' : colonnes séparées par... (\t = tabulation)
travers un langage de programmation (PHP, C, Ruby, Python...). 65 535 ENCLOSED BY '' : colonnes entourées d’un caractère précis (ex. guillemets)
TEXT / BLOB sur ESCAPED BY '\\' : caractère d’échappement (ici un antislash simple)
MEDIUMTEXT / MEDIUMBLOB 16 777 215
Connexion en ligne de commande avec le client MySQL EXEMPLE
LONGTEXT / LONGBLOB 4 294 967 295 (4 Go)
■ LINES est défini par STARTING BY '' (les lignes commencent par...) et
TERMINATED BY '\n' (les lignes terminent par...) où \n est une nouvelle ligne ou
Sous Linux/Unix, Mac OS X, et sous Windows : line feed (LF).
mysql -ulogin -pmot_de_passe Connexion sans spécifier de base de données EXEMPLES Pour ignorer les lignes superflues en début de fichier, IGNORE nb_de_lignes LINES.
mysql -ulogin -pmot_de_passe Connexion spécifiant une base de données prix DECIMAL(6,2), poids FLOAT UNSIGNED, nom CHAR(30), prenom SELECT * INTO OUTFILE 'sangria.txt' Exporte les enregistrements retournés
nom_base
CHAR(50), FIELDS TERMINATED BY ',' FROM boissons; par une instruction SELECT vers un
article TEXT NOT NULL, fichier texte. (Voir ci-dessus pour la
Une fois connecté, saisir directement les requêtes closes d’un point-virgule.
syntaxe des clauses FIELDS et LINES.)
Productivité : instructions utiles en ligne de commande MySQL ENUM et SET pour proposer une liste de choix SELECT @@version; Retourne la version du moteur MySQL utilisé.
ENUM permet le choix d’une valeur parmi une liste définie à la création de la table.
source nom_de_fichier Exécute les commandes SQL stockées dans un fichier.
quit OU exit Quitte le client MySQL. Il est possible d’utiliser une chaîne vide (' '). La valeur par défaut sera le premier
ATTENTION élément de l’énumération si la colonne est déclarée NOT NULL, ou NULL si la colonne
use
status
Choisit la base de données à utiliser.
Affiche l’état du serveur. dispose de cet attribut. Une énumération peut avoir un maximum de 65 535 éléments.
SET diffère d’ENUM car il peut avoir 0 ou plusieurs valeurs choisies dans la liste définie
,
Requêtes conditionnelles
? Affiche l’aide.
tee nom_de_fichier Enregistre les commandes entrées et leurs résultats dans un
fichier journal.
à la création de la table. Les valeurs sont séparées par des virgules.
REMARQUE Pour sélectionner des champs selon des valeurs de SET, le plus simple est
avec WHERE
d’utiliser la fonction FIND_IN_SET. L’essentiel étant d’effectuer des requêtes SELECT, REPLACE, DELETE ou
Autres commandes shell utiles UPDATE sur les enregistrements d’une table répondant à une condition, WHERE
EXEMPLE
se révèle indispensable pour mettre en jeu un ou plusieurs tests, portant sur un ou
mysqldump Exporte vers un fichier texte pour sauvegarde ou transfert couleur ENUM('bleu','vert','indigo'),
plusieurs champs. Toutes sortes de fonctions peuvent être utilisées pour comparer
entre serveurs, une (– –opt nom_base) ou toutes (– –all- colis SET('lourd','fragile','rond'),
les champs entre eux, ou à des constantes, sauf les fonctions d’agrégation (AVG,
databases) les bases. SELECT * FROM nom_table WHERE
EXEMPLE mysqldump – –opt nom_base > base.sql MIN, MAX, SUM...).
FIND_IN_SET('fragile',colis)>0;
mysqldump – –all-databases > bases.sql
myisamchk Vérifie, optimise et répare les tables au format MyISAM. EXEMPLE SELECT * FROM nom_table WHERE colonne='valeur';
REMARQUE
ATTENTION Le serveur doit être stoppé durant les opérations. Gestion des dates avec TIME, DATETIME, DATE, TIMESTAMP, YEAR Ces conditions peuvent être multiples grâce aux opérateurs de comparaison.
mysqlimport Importe un fichier texte dans une table (similaire à LOAD DATA Type Format De A
OPÉRATEURS DE COMPARAISON
INFILE). YEAR AAAA 1901 2155
Booléens : AND (&&) : ET logique OR (||) : OU logique
mysqladmin Permet de créer/supprimer une base, exporter des tables, DATE AAAA-MM-JJ 1000-01-01 9999-12-31
Comparateurs : < inférieur à = égal <= inférieur ou égal
recharger les droits d’accès, etc. DATETIME AAAA-MM-JJ 1000-01-01 9999-12-31
> supérieur à != différent de >= supérieur ou égal
EXEMPLE Pour changer le mot de passe root HH:MM:SS 00:00:00 23:59:59
mysqladmin -u root password nouveau_mot_de_passe Parenthèses de priorité :
TIME HH:MM:SS -838:59:59 838:59:59
mysqlcheck Utilitaire client de maintenance des tables, pour les vérifier, SELECT * FROM contacts WHERE age>20 AND (code_postal=’67’ OR age<=35);
TIMESTAMP AAAA-MM-JJ 1000-01-01 9999-12-31
réparer, analyser et optimiser. HH:MM:SS 00:00:00 23:59:59 LIKE Teste la validité d’une chaîne de caractères ou d’un nombre par
ATTENTION Le serveur doit être démarré durant les opérations. ) TYPE = rapport à une expression pouvant contenir deux caractères joker :
mysqlshow Affiche des informations sur une table ou un index. Le type TIMESTAMP diffère des autres types date, car il stocke automatiquement l’heure % (aucun ou plusieurs caractères) ; _ (un caractère exactement).
mysqldumpslow Affiche le journal des requêtes les plus lentes, si l’option courante lors d’une commande INSERT ou UPDATE sur les enregistrements affectés. En EXEMPLES
log-slow-queries est activée sur le serveur. d’autres termes, MySQL applique automatiquement la fonction NOW() lorsqu’aucune SELECT prenom FROM carnet WHERE prenom LIKE 'C%'; ‹ Charles, Céline, Claire
valeur par défaut n’est spécifiée lors de l’insertion ou de la modification. SELECT mot,definition FROM dico WHERE mot LIKE 'Fu_ _ _'; ‹ Fusée, Fusil, Futur
DEFAULT ' NOT LIKE Seuls les champs ne correspondant pas à l’expression sont valides.
REMARQUE Pour empêcher la mise à jour ultérieure du champ lors de la modification du
REGEXP Teste la conformité du texte à une expression régulière.
Connexion via PHP champ, lui affecter sa propre valeur : EXEMPLE
Après avoir établi la connexion, la fonction query transmet la requête au serveur. UPDATE nom_table SET colonne_timestamp=colonne_timestamp, ...; SELECT titre FROM livres WHERE titre REGEXP 'Il était une .+';
Diverses fonctions permettent de lire les résultats retournés. WHERE Avec . pour un caractère, [a-z] pour une classe de caractères, * pour 0 ou plusieurs
EXEMPLES caractères, ^ pour le début de chaîne, $ pour la fin, {n} pour une répétition n-fois.
Avec PDO (PHP version 5.3 et supérieures) UPDATE rendezvous SET heure=’14:30:20’ WHERE contact_id=3; Utiliser REGEXP BINARY pour être sensible à la casse.
$sqlpdo = new PDO("mysql:host=$mysql_server;dbname=$mysql_base", REMARQUE INSERT INTO agenda (description,jour) VALUES ('KiwiParty','2014-06-13'); STRCMP Compare deux chaînes et renvoie 0 si elles sont identiques, -1 si la
$mysql_login, $mysql_password); annee YEAR NOT NULL, première chaîne est plus petite que la seconde, 1 sinon. STRCMP est
$result = $sqlpdo->query('SELECT * FROM table'); SELECT * FROM nom_table WHERE annee=2014; insensible à la casse.
foreach ($result as $ligne) { EXEMPLE
echo $ligne['champ']; } procède SELECT titre FROM livres WHERE STRCMP(titre,’mysql’) >= 0;
IN / NOT IN Teste l’appartenance d’une valeur à une liste. Depuis MySQL 4.1,
Avec l’API MySQLi (PHP version 5 et supérieures)
mysqli_connect($mysql_server,$mysql_login,$mysql_password); MyISAM Types d’index (clés) EXEMPLE
IN() peut contenir une sous-requête.
mysqli_select_db($mysql_base); MEMORY Pour la bonne performance d’une base de données à travers le temps et à mesure de son SELECT prix FROM desserts WHERE fruit IN(SELECT nom FROM fruits WHERE nom
$result = mysqli_query('SELECT * FROM table'); remplissage, il est souvent nécessaire d’y adjoindre un ou plusieurs index accélérant la LIKE 'K%');
while($ligne = mysqli_fetch_assoc($result)) InnoDB recherche. Rappelons qu’un index est employé dans une clause WHERE, que tout type de BETWEEN Teste la présence d’une valeur dans un intervalle, bornes incluses
echo $ligne['champ']; colonne peut être indexé, qu’il se crée avant ou après la création de la table (voir CREATE . (min <= valeur AND valeur <= max).
EXEMPLE EXEMPLE
mysqli_close(); INDEX) et que KEY est synonyme de INDEX.
SELECT nom,age FROM carnet_adresses WHERE age BETWEEN 20 and 35;
Avec MySQLi en mode objet nom EXEMPLE NOT Seules les valeurs hors de l’intervalle sont prises en compte.
$sql = new mysqli($mysql_server,$mysql_login,$mysql_password,$mysql_base); CREATE TABLE livres (id INT UNSIGNED, titre CHAR(50), editeur CHAR(100), descrip- BETWEEN
$result = $sql->query('SELECT * FROM table'); ) TYPE = tion TEXT, INDEX idx_titre (titre) INDEX idx_titre_editeur (titre,editeur) ); FULLTEXT Recherche en texte intégral. N’est possible que sur les colonnes
while($ligne = $result->fetch_assoc()) echo $ligne['champ']; MATCH... dotées d’un index FULLTEXT. Elle est insensible à la casse et la
■ PRIMARY KEY définit la clé primaire d’une table SQL et porte aussi sur un ou
$sql->close(); AGAINST longueur minimale des mots recherchés est de 4 lettres.
plusieurs champs, pour identifier de façon unique et rapide un enregistrement précis
(ex. : numéro de sécurité sociale). EXEMPLE PRIMARY KEY (id) DELETE EXEMPLE
SELECT * FROM livres WHERE MATCH(titre,resume) AGAINST ('mysql');
Utiliser une base CREATE [
■ UNIQUE n’autorise que l’insertion de valeurs ne figurant pas déjà dans la colonne.
Il interdit les doublons car rend impossible d’obtenir deux enregistrements pour lesquels PERTINENCE Quand MATCH() est utilisé comme condition de WHERE les lignes retournées
sont automatiquement organisée par la pertinence. Exprimée sous forme de décimal
En ligne de commande, renseignent sur le contenu disponible (bases et tables). le champ est strictement identique. EXEMPLE UNIQUE KEY (titre) positif, elle peut être sélectionnée pour opérer un tri personnalisé.
SHOW DATABASES; Liste les bases disponibles ■ FULLTEXT est voué à l’indexation de texte et permet la recherche d’un ou plusieurs
SPATIAL) SELECT id,MATCH(titre,resume) AGAINST ('mysql') AS pertinence FROM livres;
USE nom_de_la_base; Définit la base active à utiliser mots avec évaluation de la pertinence (voir “Requêtes avancées”, FULLTEXT et MATCH
PERFORMANCES Dans le résultat obtenu figurent tous les enregistrements de la table, assortis d’une
SHOW TABLES; Liste les tables présentes dans une base ... AGAINST). N’indexe que des CHAR, VARCHAR ou TEXT de tables MyISAM ou colonne pertinence dont la valeur est comprise entre 0 (pas de similarité) et 1 (très
DESCRIBE nom_de_la_table; Décrit la structure d’une table (champs) InnoDB. EXEMPLE FULLTEXT KEY (description) , pertinent).
EXEMPLE :
Gestion des utilisateurs
CREATE USER login IDENTIFIED BY Crée un nouvel utilisateur
'mot_de_passe';
RENAME USER ancien_login TO nouveau_login; Renomme un utilisateur
SET PASSWORD FOR login = Change un mot de passe
PASSWORD('nouveau_mot_de_passe');
DROP USER login; Supprime un utilisateur
GRANT droits ON cible TO login WITH Modifie ou attribue des droits
options; à un utilisateur
REMARQUE Voir ci-après le détail des options pour la gestion des droits.
REVOKE droits ON cible FROM login; Révoque les droits d’un utilisateur
FLUSH PRIVILEGES; Recharge les droits MySQL
ATTENTION N’oubliez pas de recharger les droits après toute modification des droits utilisateur !

REMARQUE Options pour la gestion des droits


cible : nom d’une table nom_table (nom complet : nom_base.nom_table). Pour
attribuer les droits à l’ensemble des tables d’une base : nom_base.*
login : un login ou plusieurs séparés par des virgules, avec éventuellement le mot de
passe : TO 'login'@'localhost' IDENTIFIED BY 'mot_de_passe'.

ALL Tous les droits


ALTER Autorise ALTER TABLE
CREATE Autorise CREATE TABLE
CREATE VIEW Autorise CREATE VIEW
DELETE Autorise DELETE
DROP Autorise DROP TABLE
EXECUTE Autorise l’emploi de procédures stockées
FILE Autorise SELECT ... INTO OUTFILE et LOAD DATA INFILE
INDEX Autorise CREATE INDEX et DROP INDEX
INSERT Autorise INSERT
LOCK TABLES Autorise LOCK TABLES
PROCESS Autorise SHOW FULL PROCESSLIST
RELOAD Autorise FLUSH
SELECT Autorise SELECT
SHOW DATABASES Autorise SHOW DATABASES
SHUTDOWN Autorise mysqladmin shutdown
SUPER Autorise entre autres KILL et SET GLOBAL
UPDATE Autorise UPDATE
USAGE Synonyme de “pas de privilèges”
GRANT OPTION Synonyme de WITH GRANT OPTION (voir ci-dessous)

WITH GRANT OPTION Donne le droit de modifier les droits


des autres utilisateurs
WITH MAX_QUERIES_PER_HOUR n N’autorise que n requêtes par heure
WITH MAX_UPDATES_PER_HOUR n N’autorise que n requêtes UPDATE
par heure
WITH MAX_CONNECTIONS_PER_HOUR n N’autorise que n connexions par heure
WITH MAX_USER_CONNECTIONS n N’autorise que n connexions
simultanées
EXEMPLE
GRANT SELECT,UPDATE,DELETE,INSERT ON mabase.* TO 'monlogin'@'localhost'
IDENTIFIED BY 'motdepassedifficileàtrouver';
REMARQUE localhost ne tolère que les connexions locales sur le serveur, % tolère toutes
les sources externes (à utiliser avec précaution).

Modifier la structure d’une table


Pour changer la structure d’une table existante : ALTER TABLE nom_table ...
Suivi, au choix, des instructions suivantes :
RENAME nouveau_nom_table Renomme la table
MODIFY nom_champ nouveau_type Modifie le type d’un champ
CHANGE nom_champ Change le champ nom_champ vers
nouveau_nom_champ nouveau_type nouveau_nom_champ avec le type
nouveau_type
ADD nom_champ type_champ Ajoute un champ
EXEMPLE ALTER TABLE table ADD code_postal CHAR(5) AFTER ville;
REMARQUE On précisera la position du champ dans la structure avec les clauses
AFTER (après un autre champ à préciser) et FIRST (en premier).
ADD INDEX nom_index type_index Ajoute un index de type type_index sur
(champ, champ2...) champ, champ2...
ADD PRIMARY KEY nom_index Ajoute une clé primaire de type type_index
type_index (champ, champ2...) sur champ, champ2...
Renommer/supprimer bases,
Connexion à une base de données Connexion à une base de données tables et clés Modifier la structure d’une table

Étape préliminaire avant toute opération : la connexion à la base se fait via Fonctions courantes RENAME TABLE ancien_nom TO nouveau_nom; Renomme une table ADD UNIQUE nom_index type_index Ajoute un index unique sur champ de type
un client mysql, en ligne de commande ou en mode graphique, ou encore à REMARQUE Nécessite les privilèges ALTER et DROP sur l’ancienne table, CREATE et INSERT (champ, champ2...) type_index sur champ, champ2...
mysqli_query($requete) Exécute une requête et renvoie le résultat.
travers un langage de programmation (PHP, C, Ruby, Python...). sur la nouvelle. ADD FULLTEXT nom_index Ajoute un index de type FULLTEXT sur
mysqli_fetch_row($result)Renvoie la ligne dans une liste.
DROP TABLE nom_de_la_table, nom_de_la_table2,...; Supprime une ou plusieurs (champ, champ2 ...) champ, champ2...
Connexion en ligne de commande avec le client MySQL EXEMPLE while(list($champ1,$champ2) = mysqli_fetch_row($result)) { ... }
tables DROP nom_champ Supprime le champ de la structure de la table.
Sous Linux/Unix, Mac OS X, et sous Windows : mysqli_fetch_assoc($result) Renvoie la ligne dans un tableau associatif.
mysqli_fetch_array($result) Renvoie la ligne dans un tableau. DROP DATABASE nom_de_la_base; Supprime une base de DROP PRIMARY KEY Supprime la primaire de la structure de la table.
mysql -ulogin -pmot_de_passe Connexion sans spécifier de base de données EXEMPLES
mysqli_affected_rows() Renvoie le nombre de lignes affectées par données DROP INDEX nom_index Supprime un index de la structure de la table.
prix
mysql -ulogin -pmot_de_passe Connexion spécifiant une base de données la dernière commande. DROP INDEX nom_index ON nom_table; Supprime un index
nom_base
CHAR(50),
mysqli_insert_id() Renvoie l’identifiant unique (EXEMPLE PRIMARY KEY en article
Une fois connecté, saisir directement les requêtes closes d’un point-virgule.
Productivité : instructions utiles en ligne de commande MySQL
mysqli_error()
AUTO_INCREMENT) de la dernière commande INSERT.
Renvoie le message d’erreur né de la dernière requête. Requêtes
SELECT champ1,champ2 FROM
source nom_de_fichier Exécute les commandes SQL stockées dans un fichier.
mysqli_num_rows($result) Renvoie le nombre de lignes d’un résultat.
mysqli_close() Ferme la connexion MySQL. Types de champs ENUM
Sélectionne tous (*) ou certains
nom_table; clause_where clause_group enregistrements d’une table, répondant
quit OU exit Quitte le client MySQL. PERFORMANCES Le choix du type de champ influe sur les performances et l’espace de clause_order clause_limit; éventuellement à des conditions.
ATTENTION Le préfixe mysqli est à remplacer par mysql dans ces noms de fonctions si CLAUSES CONDITIONNELLES Voir plus loin les clauses WHERE, GROUP BY, ORDER BY,
use Choisit la base de données à utiliser. stockage, ainsi que sur la simplicité des requêtes qui en découleront. Il définit un nombre
le serveur n’est pas équipé de MySQLi. En outre, en mode objet, on omet le préfixe LIMIT pour les requêtes conditionnelles et triées.
status Affiche l’état du serveur. fixe ou variable d’octets pour le stockage de chaque valeur.
si la fonction est appelée en tant que méthode de l’instance utilisée (EXEMPLE $mysqli- SET SELECT nom,ROUND Le mot clé AS crée un alias sur un
? Affiche l’aide.
>fetch_assoc(), $mysqli->query($requete)) ou en tant qu’attribut dans le cas (2014-annee_naissance) AS age FROM nom de colonne ou de table. Il est
tee nom_de_fichier Enregistre les commandes entrées et leurs résultats dans un
fichier journal.
de valeurs simples (EX. $result->num_rows, $sql->error). *INT pour le stockage de nombres entiers REMARQUE adresses ORDER BY age DESC; ainsi possible de raccourcir les noms
Type Nb d’octets De... à... SELECT a.jour,p.nom FROM anniversaires utilisés pour des commodités
TINYINT 1 -128 127
Autres commandes shell utiles EXEMPLE AS a,carnet_adresses AS p WHERE d’écriture. (Ci-contre alias sur champ
mysqldump Exporte vers un fichier texte pour sauvegarde ou transfert
entre serveurs, une (– –opt nom_base) ou toutes (– –all-
Création d’une base et de tables SMALLINT
MEDIUMINT
2
3
-32 768
-8 388 608
32 767
8 388 607
couleur
colis SET
a.id = p.id;
INSERT INTO nom_table
puis sur table)
Insère de nouveaux enregistrements
Un serveur MySQL contient une ou plusieurs bases de données, interrogeables par des INT 4 -2 147 483 648 2 147 483 647 (champ1,champ2,...) dans une table.
databases) les bases. requêtes. Chaque base contient au moins une table, structurée en champs (colonnes)
EXEMPLE mysqldump – –opt nom_base > base.sql BIGINT 8 -9 223 372 036 854 775 808 9 223 372 036 854 775 807 VALUES ('valeur1','valeur2',...);
mysqldump – –all-databases > bases.sql définis à sa création, et contenant zéro à plusieurs enregistrements (lignes).
REMARQUES Si une colonne n’est pas spécifiée dans la liste, elle prend la valeur
myisamchk Vérifie, optimise et répare les tables au format MyISAM. REMARQUES Si le mot-clé UNSIGNED est spécifié, la limite inférieure est 0 (seuls des par défaut qui lui a été assignée lors de la création de la table. Si une colonne
REMARQUE Ce mémento offre une sélection des commandes les plus utiles, n’hésitez pas nombres positifs sont stockés), et la limite supérieure est doublée car on s’affranchit du
ATTENTION Le serveur doit être stoppé durant les opérations. possède l’attribut AUTO_INCREMENT il suffit de ne pas préciser la colonne à
à consulter la documentation officielle sur http://dev.mysql.com/doc/. signe (ex. TINYINT UNSIGNED : 0 à 255). INTEGER est un alias pour INT. On peut l’insertion, ou de lui donner la valeur NULL. INSERT permet les insertions multiples :
mysqlimport Importe un fichier texte dans une table (similaire à LOAD DATA
INFILE). spécifier la longueur maximale du champ, entre parenthèses, après le type. YEAR INSERT INTO mementos (titre,editeur) VALUES
mysqladmin Permet de créer/supprimer une base, exporter des tables, Créer une nouvelle base de données ou une nouvelle table DATE ('MySQL','Eyrolles'),('HTML5','Eyrolles');
CREATE DATABASE nom_de_la_base; EXEMPLES DATETIME DELAYED En précisant la clause DELAYED après INSERT, le serveur rend la
recharger les droits d’accès, etc. age TINYINT(3) UNSIGNED NOT NULL,
EXEMPLE Pour changer le mot de passe root CREATE TABLE nom_de_la_table ( main au client et n’insère les lignes que lorsque la table est
mysqladmin -u root password nouveau_mot_de_passe nom_champ1 type_champ1(longueur) attributs, code_postal MEDIUMINT(5) UNSIGNED NOT NULL inutilisée.
TIME
mysqlcheck Utilitaire client de maintenance des tables, pour les vérifier, nom_champ2 type_champ2(longueur) attributs, ... TIMESTAMP LOW_PRIORITY La clause LOW_PRIORITY retarde l’insertion jusqu’à ce qu’il n’y ait
L’attribut ZEROFILL définit le caractère « 0 » comme remplissage par défaut. EXEMPLE plus de client lisant la table, mais ne rend pas la main.
réparer, analyser et optimiser. type_clé1 nom_clé1, type_clé2 nom_clé2, ...
ATTENTION Le serveur doit être démarré durant les opérations. en stockant la valeur 3 dans un champ INT(4) ZEROFILL, la valeur lue sera 0003. INSERT INTO mementos INSERT... SELECT permet d’insérer des
) TYPE = type_de_table;
mysqlshow Affiche des informations sur une table ou un index. Chaque champ (colonne) est défini par un nom, un type dont la longueur est spécifiée (voir plus Le type (titre_memento,description_memento, valeurs à partir d’une ou plusieurs
mysqldumpslow Affiche le journal des requêtes les plus lentes, si l’option loin « Types de champs »), et des attributs, séparés par des virgules, pouvant prendre ces valeurs :
BIT, BOOL, BOOLEAN : types booléens pour valeurs binaires prix_memento) SELECT titre,description, autres tables grâce à une sous-requête
log-slow-queries est activée sur le serveur. Expriment une variable ne prenant que deux valeurs (vrai ou faux). Équivalent à un '5' FROM livres WHERE type='memento'; SELECT.
NULL / NOT NULL Le champ peut être vide, prendre ou pas la valeur NULL. TINYINT(1) stockant 1 ou 0 dans un champ numérique. UPDATE nom_table SET champ1= Met à jour des enregistrements dans
DEFAULT 'valeur_par_defaut' Le champ a une valeur par défaut
REMARQUE 'nouvelle_valeur',champ2='autre_valeur' une table, concernés ou non par une
automatique si elle n’est pas précisée lors FLOAT, DOUBLE, DECIMAL pour les nombres à virgule flottante
Connexion via PHP d’une insertion.
WHERE champ3=champ2+7; condition. L’UPDATE peut porter sur
Après avoir établi la connexion, la fonction query transmet la requête au serveur. FLOAT et DOUBLE (équiv. REAL) stockent des nombres à virgule flottante. DECIMAL (équiv. UPDATE plusieurs tables.
AUTO_INCREMENT Sa valeur est auto-incrémentée à chaque nouvelle NUMERIC) stocke sous forme littérale : chaque caractère représente un chiffre stocké. EXEMPLE UPDATE produit,catalogue SET produit.prix=catalogue.prix WHERE
Diverses fonctions permettent de lire les résultats retournés.
insertion (clé primaire et type numérique requis). EXEMPLES produit.id=catalogue.id;
REMARQUE Les attributs UNSIGNED et ZEROFILL sont là aussi applicables.
Avec PDO (PHP version 5.3 et supérieures) UPDATE REMARQUE Il est possible d’utiliser la clause LIMIT ou ORDER BY pour limiter la
$sqlpdo = new PDO("mysql:host=$mysql_server;dbname=$mysql_base", REMARQUE La longueur est facultative pour les types numériques, CHAR et VARCHAR. Elle INSERT portée des modifications. La clause WHERE est facultative, dans ce cas tous les
$mysql_login, $mysql_password); n’est pas permise pour les autres types (dates, TEXT, BLOB, ENUM, SET...). CHAR et VARCHAR pour les chaînes de caractères annee enregistrements de la table seront affectés. Si LOW_PRIORITY est spécifié après
$result = $sqlpdo->query('SELECT * FROM table'); Stockent des chaînes sur un nombre maximal d’octets indiqué entre parenthèses – les UPDATE, les modifications auront lieu lorsqu’aucun client ne lira plus la table. Le
Les clés (index) de la table sont déclarées par leur type (voir plus loin « Types d’index ») chaînes excédant ce maximum sont tronquées. Si la chaîne stockée occupe moins nombre d’enregistrements affectés est retourné.
foreach ($result as $ligne) {
et le(s) champ(s) à indexer. d’espace, CHAR le réserve quand même en complétant de blancs, à la différence de INSERT INTO participants ON DUPLICATE KEY UPDATE procède
echo $ligne['champ']; }
Le type de table est spécifié à la création par TYPE=type_de_table en fin d’instruction VARCHAR qui ne stocke que la chaîne utile (mais est un peu moins performant). (nom_joueur,score) VALUES ('Manw',1337) à une requête UPDATE si l’insertion
Avec l’API MySQLi (PHP version 5 et supérieures) CREATE TABLE. Les types par défaut sont : ON DUPLICATE KEY UPDATE engendre un doublon pour une clé
MyISAM Format par défaut REMARQUE Si une table comporte au moins un champ de taille variable (VARCHAR, TEXT,
mysqli_connect($mysql_server,$mysql_login,$mysql_password); score=score+1337; PRIMARY ou UNIQUE.
MEMORY (HEAP) En mémoire vive, rapide mais perte des données au BLOB...), tous les champs CHAR sont automatiquement convertis en VARCHAR à la
mysqli_select_db($mysql_base); REPLACE INTO animaux (id,espece,nom) Insère ou remplace des
$result = mysqli_query('SELECT * FROM table'); redémarrage du serveur création de la table, car il n’y a aucun intérêt à les laisser en taille fixe.
VALUES (2,’Elephant’,’Babar’); enregistrements dans une table.
while($ligne = mysqli_fetch_assoc($result)) InnoDB Permet les transactions, les clés étrangères et les locks avancés REMARQUE REPLACE fonctionne similairement à INSERT sauf dans le cas où l’insertion
echo $ligne['champ']; BINARY et VARBINARY pour les chaînes binaires crée un doublon dans une table munie d’un index UNIQUE ou PRIMARY KEY.
EXEMPLE Il n’a d’ailleurs de sens qu’avec ces deux types d’index. Dans ce cas, l’ancien
mysqli_close(); Diffèrent de la même façon que CHAR et VARCHAR (voir ci-avant). Ils n’ont pas de jeu INDEX
CREATE TABLE adresses (id INT NOT NULL UNSIGNED AUTO_INCREMENT, enregistrement est effacé avant que le nouveau ne soit inséré.
Avec MySQLi en mode objet nom CHAR(50) NOT NULL, prenom CHAR(40), anniversaire DATE, de caractères associé, les tris et comparaisons sont basés sur la valeur numérique de EXEMPLE DELETE FROM nom_table WHERE Efface les enregistrements d’une table
$sql = new mysqli($mysql_server,$mysql_login,$mysql_password,$mysql_base); PRIMARY KEY(id) l’octet, et on spécifie leur taille maximale de la même façon que CHAR et VARCHAR, à
condition ORDER BY champ_de_tri répondant à une condition, et
$result = $sql->query('SELECT * FROM table'); ) TYPE = MyISAM; la différence près qu’elle est définie en octets. tion TEXT, LIMIT limite; renvoie le nombre de lignes effacées,
while($ligne = $result->fetch_assoc()) echo $ligne['champ']; éventuellement avec une clause
$sql->close(); Créer une table ayant la même structure qu’une autre TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT, BLOB, TINYBLOB, ■
limitative et un ordre de suppression.
CREATE TABLE nouvelle_table LIKE ancienne_table; MEDIUMBLOB, LONGBLOB pour les chaînes longues TRUNCATE TABLE nom_table; Équivaut en plus rapide à DELETE
Une colonne de type TEXT est assimilable à un VARCHAR de grande capacité. Ce type FROM nom_table; car assimilé à une
Créer un index
Utiliser une base CREATE [type_index] INDEX nom_index ON nom_table (col_indexee,...);
peut contenir une quantité variable de données, en fonction de l’un des 4 types. Les
types BLOB (Binary Long Object) diffèrent des types TEXT : ils sont sensibles à la casse
■ UNIQUE
destruction/création de table.
LOAD DATA INFILE 'contacts.txt' INTO Insère dans la base de données un
En ligne de commande, renseignent sur le contenu disponible (bases et tables). Met en place une clé nom_index de type type_index (UNIQUE, FULLTEXT ou
SHOW DATABASES; Liste les bases disponibles (majuscules/minuscules) et triés sur leur valeur binaire. TABLE adresses FIELDS TERMINATED fichier texte qui peut avoir été créé
SPATIAL) sur un ou plusieurs champs, dont les noms sont séparés par des virgules. ■
USE nom_de_la_base; Définit la base active à utiliser REMARQUE On ne peut spécifier de valeur par défaut pour les types BLOB et TEXT. BY '\t' LINES TERMINATED BY '\n'; grâce à la commande SELECT ... INTO
SHOW TABLES; Liste les tables présentes dans une base PERFORMANCES Il est possible de spécifier la longueur du champ à indexer entre paren- OUTFILE.
Décrit la structure d’une table (champs) thèses, notamment lorsqu’il s’agit de champs texte et il est souvent inutile d’indexer REMARQUE L’interprétation du fichier dépend des clauses FIELDS et LINES,
DESCRIBE nom_de_la_table; InnoDB. E
toute la chaîne de caractères pour des raisons de performances. définissant la façon dont sont séparés les champs (colonnes) et les lignes du fichier texte.
EXEMPLE : CREATE INDEX debut_prenom ON carnet_adresses(prenom(5));
Renommer/supprimer bases,
Connexion à une base de données Connexion à une base de données tables et clés Types de champs Requêtes

Étape préliminaire avant toute opération : la connexion à la base se fait via Fonctions courantes RENAME TABLE ancien_nom TO nouveau_nom; Renomme une table Type Capacité de stockage en caractères ■ FIELDS peut être spécifié par une (au moins) ou plusieurs instructions :
TERMINATED BY '\t' : colonnes séparées par... (\t = tabulation)
un client mysql, en ligne de commande ou en mode graphique, ou encore à REMARQUE Nécessite les privilèges ALTER et DROP sur l’ancienne table, CREATE et INSERT TINYTEXT / TINYBLOB 255 '
mysqli_query($requete) Exécute une requête et renvoie le résultat. ENCLOSED BY '' : colonnes entourées d’un caractère précis (ex. guillemets)
travers un langage de programmation (PHP, C, Ruby, Python...). sur la nouvelle. TEXT / BLOB 65 535
mysqli_fetch_row($result)Renvoie la ligne dans une liste. ESCAPED BY '\\' : caractère d’échappement (ici un antislash simple)
DROP TABLE nom_de_la_table, nom_de_la_table2,...; Supprime une ou plusieurs MEDIUMTEXT / MEDIUMBLOB 16 777 215
Connexion en ligne de commande avec le client MySQL EXEMPLE while(list($champ1,$champ2) = mysqli_fetch_row($result)) { ... }
tables LONGTEXT / LONGBLOB 4 294 967 295 (4 Go)
■ LINES est défini par STARTING BY '' (les lignes commencent par...) et
mysqli_fetch_assoc($result) Renvoie la ligne dans un tableau associatif. TERMINATED BY '\n' (les lignes terminent par...) où \n est une nouvelle ligne ou
Sous Linux/Unix, Mac OS X, et sous Windows : DROP DATABASE nom_de_la_base; Supprime une base de line feed (LF).
mysqli_fetch_array($result) Renvoie la ligne dans un tableau. DROP USER
mysql -ulogin -pmot_de_passe Connexion sans spécifier de base de données données EXEMPLES Pour ignorer les lignes superflues en début de fichier, IGNORE nb_de_lignes LINES.
mysqli_affected_rows() Renvoie le nombre de lignes affectées par GRANT
prix DECIMAL(6,2), poids FLOAT UNSIGNED, nom CHAR(30), prenom
mysql -ulogin -pmot_de_passe Connexion spécifiant une base de données la dernière commande. DROP INDEX nom_index ON nom_table; Supprime un index options; SELECT * INTO OUTFILE 'sangria.txt' Exporte les enregistrements retournés
nom_base
CHAR(50), REMARQUE FIELDS TERMINATED BY ',' FROM boissons; par une instruction SELECT vers un
mysqli_insert_id() Renvoie l’identifiant unique (EXEMPLE PRIMARY KEY en article TEXT NOT NULL,
Une fois connecté, saisir directement les requêtes closes d’un point-virgule. REVOKE fichier texte. (Voir ci-dessus pour la
AUTO_INCREMENT) de la dernière commande INSERT.
syntaxe des clauses FIELDS et LINES.)
mysqli_error() Renvoie le message d’erreur né de la dernière requête.
Productivité : instructions utiles en ligne de commande MySQL ENUM et SET pour proposer une liste de choix ATTENTION SELECT @@version; Retourne la version du moteur MySQL utilisé.
source nom_de_fichier Exécute les commandes SQL stockées dans un fichier.
mysqli_num_rows($result) Renvoie le nombre de lignes d’un résultat.
mysqli_close() Ferme la connexion MySQL. Types de champs ENUM permet le choix d’une valeur parmi une liste définie à la création de la table.
Il est possible d’utiliser une chaîne vide (' '). La valeur par défaut sera le premier
quit OU exit Quitte le client MySQL. PERFORMANCES Le choix du type de champ influe sur les performances et l’espace de REMARQUE
ATTENTION Le préfixe mysqli est à remplacer par mysql dans ces noms de fonctions si élément de l’énumération si la colonne est déclarée NOT NULL, ou NULL si la colonne
Requêtes conditionnelles
use Choisit la base de données à utiliser. stockage, ainsi que sur la simplicité des requêtes qui en découleront. Il définit un nombre cible
le serveur n’est pas équipé de MySQLi. En outre, en mode objet, on omet le préfixe dispose de cet attribut. Une énumération peut avoir un maximum de 65 535 éléments.
status Affiche l’état du serveur. fixe ou variable d’octets pour le stockage de chaque valeur.
si la fonction est appelée en tant que méthode de l’instance utilisée (EXEMPLE $mysqli- SET diffère d’ENUM car il peut avoir 0 ou plusieurs valeurs choisies dans la liste définie login
? Affiche l’aide.
tee nom_de_fichier Enregistre les commandes entrées et leurs résultats dans un
fichier journal.
>fetch_assoc(), $mysqli->query($requete)) ou en tant qu’attribut dans le cas
de valeurs simples (EX. $result->num_rows, $sql->error). *INT pour le stockage de nombres entiers
à la création de la table. Les valeurs sont séparées par des virgules.
REMARQUE Pour sélectionner des champs selon des valeurs de SET, le plus simple est
passe : TO avec WHERE
Type Nb d’octets De... à... d’utiliser la fonction FIND_IN_SET. ALL L’essentiel étant d’effectuer des requêtes SELECT, REPLACE, DELETE ou
Autres commandes shell utiles TINYINT 1 -128 127 ALTER UPDATE sur les enregistrements d’une table répondant à une condition, WHERE
EXEMPLE
mysqldump Exporte vers un fichier texte pour sauvegarde ou transfert
entre serveurs, une (– –opt nom_base) ou toutes (– –all-
Création d’une base et de tables SMALLINT
MEDIUMINT
2
3
-32 768
-8 388 608
32 767
8 388 607
couleur ENUM('bleu','vert','indigo'),
colis SET('lourd','fragile','rond'),
CREATE se révèle indispensable pour mettre en jeu un ou plusieurs tests, portant sur un ou
plusieurs champs. Toutes sortes de fonctions peuvent être utilisées pour comparer
Un serveur MySQL contient une ou plusieurs bases de données, interrogeables par des INT 4 -2 147 483 648 2 147 483 647 les champs entre eux, ou à des constantes, sauf les fonctions d’agrégation (AVG,
databases) les bases. SELECT * FROM nom_table WHERE DELETE
requêtes. Chaque base contient au moins une table, structurée en champs (colonnes) BIGINT 8 -9 223 372 036 854 775 808 9 223 372 036 854 775 807 MIN, MAX, SUM...).
EXEMPLE mysqldump – –opt nom_base > base.sql FIND_IN_SET('fragile',colis)>0; DROP
mysqldump – –all-databases > bases.sql définis à sa création, et contenant zéro à plusieurs enregistrements (lignes).
EXECUTE
myisamchk Vérifie, optimise et répare les tables au format MyISAM. REMARQUES Si le mot-clé UNSIGNED est spécifié, la limite inférieure est 0 (seuls des EXEMPLE SELECT * FROM nom_table WHERE colonne='valeur';
REMARQUE Ce mémento offre une sélection des commandes les plus utiles, n’hésitez pas FILE
ATTENTION Le serveur doit être stoppé durant les opérations. nombres positifs sont stockés), et la limite supérieure est doublée car on s’affranchit du Gestion des dates avec TIME, DATETIME, DATE, TIMESTAMP, YEAR
à consulter la documentation officielle sur http://dev.mysql.com/doc/. INDEX Ces conditions peuvent être multiples grâce aux opérateurs de comparaison.
mysqlimport Importe un fichier texte dans une table (similaire à LOAD DATA signe (ex. TINYINT UNSIGNED : 0 à 255). INTEGER est un alias pour INT. On peut Type Format De A
spécifier la longueur maximale du champ, entre parenthèses, après le type.
INSERT OPÉRATEURS DE COMPARAISON
INFILE). YEAR AAAA 1901 2155
mysqladmin Permet de créer/supprimer une base, exporter des tables, Créer une nouvelle base de données ou une nouvelle table DATE AAAA-MM-JJ 1000-01-01 9999-12-31
Booléens : AND (&&) : ET logique OR (||) : OU logique
CREATE DATABASE nom_de_la_base; EXEMPLES PROCESS Comparateurs : < inférieur à = égal <= inférieur ou égal
recharger les droits d’accès, etc. DATETIME AAAA-MM-JJ 1000-01-01 9999-12-31
CREATE TABLE nom_de_la_table ( age TINYINT(3) UNSIGNED NOT NULL, RELOAD > supérieur à != différent de >= supérieur ou égal
EXEMPLE Pour changer le mot de passe root HH:MM:SS 00:00:00 23:59:59
mysqladmin -u root password nouveau_mot_de_passe nom_champ1 type_champ1(longueur) attributs, code_postal MEDIUMINT(5) UNSIGNED NOT NULL SELECT Parenthèses de priorité :
TIME HH:MM:SS -838:59:59 838:59:59
mysqlcheck Utilitaire client de maintenance des tables, pour les vérifier, nom_champ2 type_champ2(longueur) attributs, ... SELECT * FROM contacts WHERE age>20 AND (code_postal=’67’ OR age<=35);
L’attribut ZEROFILL définit le caractère « 0 » comme remplissage par défaut. EXEMPLE TIMESTAMP AAAA-MM-JJ 1000-01-01 9999-12-31 SHUTDOWN
réparer, analyser et optimiser. type_clé1 nom_clé1, type_clé2 nom_clé2, ... HH:MM:SS 00:00:00 23:59:59 LIKE Teste la validité d’une chaîne de caractères ou d’un nombre par
ATTENTION Le serveur doit être démarré durant les opérations. en stockant la valeur 3 dans un champ INT(4) ZEROFILL, la valeur lue sera 0003. SUPER rapport à une expression pouvant contenir deux caractères joker :
) TYPE = type_de_table;
mysqlshow Affiche des informations sur une table ou un index. Le type TIMESTAMP diffère des autres types date, car il stocke automatiquement l’heure UPDATE % (aucun ou plusieurs caractères) ; _ (un caractère exactement).
Chaque champ (colonne) est défini par un nom, un type dont la longueur est spécifiée (voir plus
mysqldumpslow Affiche le journal des requêtes les plus lentes, si l’option loin « Types de champs »), et des attributs, séparés par des virgules, pouvant prendre ces valeurs :
BIT, BOOL, BOOLEAN : types booléens pour valeurs binaires courante lors d’une commande INSERT ou UPDATE sur les enregistrements affectés. En USAGE EXEMPLES
log-slow-queries est activée sur le serveur. Expriment une variable ne prenant que deux valeurs (vrai ou faux). Équivalent à un d’autres termes, MySQL applique automatiquement la fonction NOW() lorsqu’aucune SELECT prenom FROM carnet WHERE prenom LIKE 'C%'; ‹ Charles, Céline, Claire
NULL / NOT NULL Le champ peut être vide, prendre ou pas la valeur NULL. TINYINT(1) stockant 1 ou 0 dans un champ numérique. valeur par défaut n’est spécifiée lors de l’insertion ou de la modification. SELECT mot,definition FROM dico WHERE mot LIKE 'Fu_ _ _'; ‹ Fusée, Fusil, Futur
DEFAULT 'valeur_par_defaut' Le champ a une valeur par défaut WITH NOT LIKE Seuls les champs ne correspondant pas à l’expression sont valides.
REMARQUE Pour empêcher la mise à jour ultérieure du champ lors de la modification du
automatique si elle n’est pas précisée lors FLOAT, DOUBLE, DECIMAL pour les nombres à virgule flottante REGEXP Teste la conformité du texte à une expression régulière.
Connexion via PHP d’une insertion.
champ, lui affecter sa propre valeur : EXEMPLE
Après avoir établi la connexion, la fonction query transmet la requête au serveur. FLOAT et DOUBLE (équiv. REAL) stockent des nombres à virgule flottante. DECIMAL (équiv. UPDATE nom_table SET colonne_timestamp=colonne_timestamp, ...; WITH
AUTO_INCREMENT Sa valeur est auto-incrémentée à chaque nouvelle SELECT titre FROM livres WHERE titre REGEXP 'Il était une .+';
Diverses fonctions permettent de lire les résultats retournés. NUMERIC) stocke sous forme littérale : chaque caractère représente un chiffre stocké. WITH Avec . pour un caractère, [a-z] pour une classe de caractères, * pour 0 ou plusieurs
insertion (clé primaire et type numérique requis). EXEMPLES
REMARQUE Les attributs UNSIGNED et ZEROFILL sont là aussi applicables. caractères, ^ pour le début de chaîne, $ pour la fin, {n} pour une répétition n-fois.
Avec PDO (PHP version 5.3 et supérieures) UPDATE rendezvous SET heure=’14:30:20’ WHERE contact_id=3; WITH Utiliser REGEXP BINARY pour être sensible à la casse.
$sqlpdo = new PDO("mysql:host=$mysql_server;dbname=$mysql_base", REMARQUE La longueur est facultative pour les types numériques, CHAR et VARCHAR. Elle INSERT INTO agenda (description,jour) VALUES ('KiwiParty','2014-06-13'); WITH STRCMP Compare deux chaînes et renvoie 0 si elles sont identiques, -1 si la
$mysql_login, $mysql_password); n’est pas permise pour les autres types (dates, TEXT, BLOB, ENUM, SET...). CHAR et VARCHAR pour les chaînes de caractères annee YEAR NOT NULL, première chaîne est plus petite que la seconde, 1 sinon. STRCMP est
$result = $sqlpdo->query('SELECT * FROM table'); Stockent des chaînes sur un nombre maximal d’octets indiqué entre parenthèses – les SELECT * FROM nom_table WHERE annee=2014;
Les clés (index) de la table sont déclarées par leur type (voir plus loin « Types d’index ») EXEMPLE insensible à la casse.
foreach ($result as $ligne) { chaînes excédant ce maximum sont tronquées. Si la chaîne stockée occupe moins EXEMPLE
et le(s) champ(s) à indexer. d’espace, CHAR le réserve quand même en complétant de blancs, à la différence de GRANT
echo $ligne['champ']; } SELECT titre FROM livres WHERE STRCMP(titre,’mysql’) >= 0;
Le type de table est spécifié à la création par TYPE=type_de_table en fin d’instruction VARCHAR qui ne stocke que la chaîne utile (mais est un peu moins performant). IN / NOT IN Teste l’appartenance d’une valeur à une liste. Depuis MySQL 4.1,
Avec l’API MySQLi (PHP version 5 et supérieures)
mysqli_connect($mysql_server,$mysql_login,$mysql_password);
CREATE TABLE. Les types par défaut sont :
MyISAM Format par défaut REMARQUE Si une table comporte au moins un champ de taille variable (VARCHAR, TEXT, Types d’index (clés) REMARQUE
EXEMPLE
IN() peut contenir une sous-requête.
MEMORY (HEAP) En mémoire vive, rapide mais perte des données au BLOB...), tous les champs CHAR sont automatiquement convertis en VARCHAR à la Pour la bonne performance d’une base de données à travers le temps et à mesure de son
mysqli_select_db($mysql_base); SELECT prix FROM desserts WHERE fruit IN(SELECT nom FROM fruits WHERE nom
$result = mysqli_query('SELECT * FROM table'); redémarrage du serveur création de la table, car il n’y a aucun intérêt à les laisser en taille fixe. remplissage, il est souvent nécessaire d’y adjoindre un ou plusieurs index accélérant la LIKE 'K%');
while($ligne = mysqli_fetch_assoc($result)) InnoDB Permet les transactions, les clés étrangères et les locks avancés recherche. Rappelons qu’un index est employé dans une clause WHERE, que tout type de BETWEEN Teste la présence d’une valeur dans un intervalle, bornes incluses
echo $ligne['champ']; BINARY et VARBINARY pour les chaînes binaires colonne peut être indexé, qu’il se crée avant ou après la création de la table (voir CREATE (min <= valeur AND valeur <= max).
EXEMPLE EXEMPLE
mysqli_close(); Diffèrent de la même façon que CHAR et VARCHAR (voir ci-avant). Ils n’ont pas de jeu INDEX) et que KEY est synonyme de INDEX.
CREATE TABLE adresses (id INT NOT NULL UNSIGNED AUTO_INCREMENT, SELECT nom,age FROM carnet_adresses WHERE age BETWEEN 20 and 35;
Avec MySQLi en mode objet nom CHAR(50) NOT NULL, prenom CHAR(40), anniversaire DATE, de caractères associé, les tris et comparaisons sont basés sur la valeur numérique de EXEMPLE NOT Seules les valeurs hors de l’intervalle sont prises en compte.
$sql = new mysqli($mysql_server,$mysql_login,$mysql_password,$mysql_base); PRIMARY KEY(id) l’octet, et on spécifie leur taille maximale de la même façon que CHAR et VARCHAR, à CREATE TABLE livres (id INT UNSIGNED, titre CHAR(50), editeur CHAR(100), descrip- RENAME BETWEEN
$result = $sql->query('SELECT * FROM table'); ) TYPE = MyISAM; la différence près qu’elle est définie en octets. tion TEXT, INDEX idx_titre (titre) INDEX idx_titre_editeur (titre,editeur) ); MODIFY FULLTEXT Recherche en texte intégral. N’est possible que sur les colonnes
while($ligne = $result->fetch_assoc()) echo $ligne['champ']; CHANGE MATCH... dotées d’un index FULLTEXT. Elle est insensible à la casse et la
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT, BLOB, TINYBLOB, ■ PRIMARY KEY définit la clé primaire d’une table SQL et porte aussi sur un ou
$sql->close(); Créer une table ayant la même structure qu’une autre plusieurs champs, pour identifier de façon unique et rapide un enregistrement précis AGAINST longueur minimale des mots recherchés est de 4 lettres.
CREATE TABLE nouvelle_table LIKE ancienne_table; MEDIUMBLOB, LONGBLOB pour les chaînes longues EXEMPLE
(ex. : numéro de sécurité sociale). EXEMPLE PRIMARY KEY (id) ADD
Une colonne de type TEXT est assimilable à un VARCHAR de grande capacité. Ce type SELECT * FROM livres WHERE MATCH(titre,resume) AGAINST ('mysql');
Créer un index
Utiliser une base CREATE [type_index] INDEX nom_index ON nom_table (col_indexee,...);
peut contenir une quantité variable de données, en fonction de l’un des 4 types. Les
types BLOB (Binary Long Object) diffèrent des types TEXT : ils sont sensibles à la casse
■ UNIQUE n’autorise que l’insertion de valeurs ne figurant pas déjà dans la colonne.
Il interdit les doublons car rend impossible d’obtenir deux enregistrements pour lesquels
EXEMPLE
REMARQUE
PERTINENCE Quand MATCH() est utilisé comme condition de WHERE les lignes retournées
sont automatiquement organisée par la pertinence. Exprimée sous forme de décimal
En ligne de commande, renseignent sur le contenu disponible (bases et tables). Met en place une clé nom_index de type type_index (UNIQUE, FULLTEXT ou le champ est strictement identique. EXEMPLE UNIQUE KEY (titre) AFTER
(majuscules/minuscules) et triés sur leur valeur binaire. positif, elle peut être sélectionnée pour opérer un tri personnalisé.
SHOW DATABASES; Liste les bases disponibles SPATIAL) sur un ou plusieurs champs, dont les noms sont séparés par des virgules. ■ FULLTEXT est voué à l’indexation de texte et permet la recherche d’un ou plusieurs ADD INDEX SELECT id,MATCH(titre,resume) AGAINST ('mysql') AS pertinence FROM livres;
USE nom_de_la_base; Définit la base active à utiliser REMARQUE On ne peut spécifier de valeur par défaut pour les types BLOB et TEXT. mots avec évaluation de la pertinence (voir “Requêtes avancées”, FULLTEXT et MATCH (champ,
PERFORMANCES Il est possible de spécifier la longueur du champ à indexer entre paren- Dans le résultat obtenu figurent tous les enregistrements de la table, assortis d’une
SHOW TABLES; Liste les tables présentes dans une base ... AGAINST). N’indexe que des CHAR, VARCHAR ou TEXT de tables MyISAM ou colonne pertinence dont la valeur est comprise entre 0 (pas de similarité) et 1 (très
Décrit la structure d’une table (champs) thèses, notamment lorsqu’il s’agit de champs texte et il est souvent inutile d’indexer
DESCRIBE nom_de_la_table; InnoDB. EXEMPLE FULLTEXT KEY (description) pertinent).
toute la chaîne de caractères pour des raisons de performances.
EXEMPLE : CREATE INDEX debut_prenom ON carnet_adresses(prenom(5));
Déclencheurs (TRIGGER) Administration et performances Vues

mémento
MySQL 5
Un déclencheur (trigger) active une instruction lorsque survient un événement Une procédure stockée est créée avec CREATE PROCEDURE et appelée avec SHOW GRANTS FOR login; Affiche les droits attribués à l’utilisateur CREATE VIEW nom_de_la_vue Crée une nouvelle vue d’après une requête
INSERT, UPDATE ou DELETE. la commande CALL ; elle ne renvoie de valeur que via les paramètres de retour SHOW GRANTS FOR CURRENT_USER; login sous forme de requête SQL. AS requete_select; SELECT qui fournit la définition de la vue.
CREATE TRIGGER nom_déclencheur BEFORE|AFTER événement ON nom_table FOR (OUT). Une fonction peut renvoyer une valeur scalaire, et être appelée depuis une CREATE VIEW memento AS SELECT titre,prix FROM livres WHERE type=’memento’;
SHOW INDEX FROM nom_table; Affiche les index de la table.
EACH ROW requête_à_exécuter; commande SQL, comme toute autre fonction standard. SHOW CREATE VIEW memento Affiche la commande qui a créé la vue.
Une fonction est déclarée avec CREATE FUNCTION. Les champs suivants sont retournés : ‹ SELECT titre,description,prix FROM livres WHERE type=’memento’
Dans la requête à exécuter, la référence à un champ doit s’accompagner des pré- Une variable est déclarée avec la commande SET@nomvariable=valeur Table Nom de la table. ALTER VIEW nom_de_la_vue AS Modifie une vue existante en
KIWIS
fixes OLD et NEW : OLD.nom_champ et NEW.nom_champ désignent respectivement Non_unique 1 si les doublons sont autorisés, 0 sinon. nouvelle_requete_select; lui assignant une nouvelle définition.
chaîne. REMARQUE La commande delimiter permet d’utiliser ";" dans la déclaration de la pro-
la ligne avant et après sa modification (ou avant effacement et après insertion). Key_name Nom de l’index ALTER VIEW memento AS SELECT titre,description FROM livres WHERE prix=’5’;
'); cédure ou de la fonction.
ATTENTION Il ne peut exister deux déclencheurs de même type au même moment. CREATE Seq_in_index Position de la colonne dans l’index DROP VIEW nom_de_la_vue1, Supprime une ou plusieurs vues
TRIGGER nécessite le privilège SUPER. CREATE PROCEDURE Column_name Nom de la colonne indexée nom_de_la_vue2,...; (séparées par des virgules).
Collation Mode de tri de l’index ('A’ tri ascendant, NULL pas de tri)
EXEMPLE CREATE PROCEDURE nom_procedure (paramètres) instructions Cardinality Nombre de valeurs uniques de l’index
CREATE TRIGGER insertion BEFORE INSERT ON comptes FOR EACH ROW SET @ à
paramètres
somme = @somme + NEW.montant;
Supprimer un déclencheur :
les kiwis
Liste des paramètres acceptés par la fonction, suivis de leur type
(ex. nom CHAR(20), age TINYINT). Chaque paramètre est de type
Sub_part Nombre de caractères si la colonne est partiellement indexée,
NULL sinon. Sécurité et injections SQL
IN par défaut. Il est possible de spécifier OUT ou INOUT pour les Packed Mode de compactage de la clé En PHP il faut « échapper » les variables provenant des utilisateurs avec mysqli_real_
DROP TRIGGER nom_table.nom_déclencheur; paramètres de sortie. Null YES si la colonne peut contenir NULL escape_string qui remplace les caractères pouvant être pris pour des caractères
instructions Suite d’instructions SQL, entourées par BEGIN et END. Index_type Type d’index (BTREE,FULLTEXT,HASH,RTREE) spéciaux SQL. La connexion doit d’abord être établie pour pouvoir l’utiliser :
Comment Informations complémentaires if(isset ($_POST['prenom'])){;
EXEMPLE delimiter //
Groupage et tri
Permet de ne sélectionner qu’une fois chaque valeur différente
CREATE PROCEDURE proc (OUT poids INT)
BEGIN SELECT SUM(poids_kg) INTO poids FROM commande; END
SHOW
SHOW
STATUS;
STATUS LIKE 'Table%';
Informe sur l’état du serveur :
variables d’exécution, liste des processus
$prenom = mysqli_real_escape_string($_POST['prenom']);
mysqli_query("INSERT INTO inscrits (prenom) VALUES ('$prenom')");
DISTINCT Les prepared statements permettent dans différents langages de s’affranchir de cette
dans une table (sans doublon). //delimiter ; SHOW VARIABLES; en cours d’exécution, avec la requête précaution, avec les commandes PREPARE et EXECUTE.
EXEMPLE SHOW VARIABLES LIKE 'max%'; exécutée correspondante, l’utilisateur
SELECT DISTINCT ville FROM annuaire WHERE code_postal LIKE '67%'; USAGE CALL proc(@nom_variable); SHOW PROCESSLIST; et le numéro de processus, etc. PRÉCAUTIONS À PRENDRE ! 1. Vérifier, valider, échapper les données entrées par l’utili-
ORDER BY Ordonne le résultat de la requête en triant sur au moins une Autres éléments de langage : sateur. 2. Bloquer toute donnée pouvant contenir un mot-clé SQL interdit. 3. Ne
KILL numero_processus; Termine un processus grâce à la commande KILL définir que des autorisations d’accès minimales par utilisateur MySQL (à l’aide
colonne. . DECLARE nom_variable type_variable; Déclaration de variable locale suivie du numéro de processus concerné. de GRANT). 4. Utiliser des procédures stockées et des requêtes paramétrées.
Par défaut, le tri est croissant (ASC). Pour inverser l’ordre, ajouter la SET nom_variable = expression; Affectation de variable
clause DESC (tri décroissant). REPEAT ... UNTIL condition END REPEAT; Boucles. Pour sortir d’une REMARQUE Seuls les droits d’administrateur (SUPER) permettent de voir la liste de tous
EXEMPLE WHILE condition DO ... END WHILE; boucle LOOP : LEAVE. les processus et de les terminer; à défaut seuls les processus de l’utilisateur courant
SELECT nom,prenom FROM ORDER BY age DESC;
GROUP BY Groupe les résultats d’une requête selon une ou plusieurs
LOOP ... END LOOP;
IF condition THEN ... ELSE ... END IF; Conditions
sont accessibles.
Variables serveur
colonnes, en général pour effectuer dessus des calculs (sommes...).
CASE variable WHEN valeur THEN ... END CASE; EXPLAIN En PHP, les variables serveur sont définies en priorité par les commandes
EXEMPLE passées en argument au démarrage du serveur mysqld et dans les fichiers de
SELECT joueur,SUM(parties) FROM golf GROUP BY joueur; DECLARE nom_curseur CURSOR FOR requete_select; Déclaration de curseur PERFORMANCES Cette commande est essentielle à l’optimisation de tables.
SELECT auteur,COUNT(*) FROM commentaires GROUP BY auteur; OPEN nom_curseur; Ouverture de curseur configuration : /etc/mysql/my.cnf ou /etc/my.cnf sous Linux et C:\Windows\
En faisant précéder une requête SELECT avec le mot-clé EXPLAIN, MySQL renvoie un
TOTAL En ajoutant la clause WITH ROLLUP après GROUP BY, une dernière ligne FETCH nom_curseur INTO variables; Lecture de curseur my.ini OU C:\my.cnf sous Windows. Pour en voir la liste : SHOW VARIABLES;
enregistrement décrivant comment le moteur traitera la requête :
comprenant le total des valeurs groupées est ajoutée au jeu de résultats. CLOSE nom_curseur; Fermeture de curseur
HAVING Ne peut être utilisé qu’après GROUP BY, et, s’il y en a, avant une id Identifiant de requête Variables courantes
clause ORDER BY. Opère une sous-sélection des résultats à l’aide CREATE FUNCTION select_type Type de requête SELECT port = 3306 Port utilisé par le serveur. Par défaut : 3306
d’une condition supplémentaire (calcul...). Permet d’utiliser des table Table utilisée pour la requête socket = /var/run/mysqld/mysqld.sock Socket à utiliser
CREATE FUNCTION nom_fonction (paramètres) RETURNS type_retour instructions
fonctions non autorisées dans une clause WHERE, telles que SUM, type Type de jointure basedir = /usr Dossier d’installation de MySQL
paramètres Liste des paramètres acceptés par la fonction, suivis de leur type possible_keys Index utilisables pour effectuer la requête
AVG, MIN, MAX... datadir = /var/lib/mysql Dossier de données de MySQL
EXEMPLE (ex. nom CHAR(20), age TINYINT) key Index réellement utilisé tmpdir = /tmp Chemin utilisé pour le stockage des fichiers
SELECT client,achats,pays FROM clients WHERE pays=’France’ GROUP BY type_retour Type MySQL retourné par la fonction (ex. CHAR(10), INT) key_len Taille de la clé d’index utilisée (plus la valeur est petite plus temporaires
client,achats HAVING MAX(achats)>1000; instructions Suite d’instructions SQL, terminées par RETURN variable l’index est rapide) language = /usr/share/mysql/french Langue utilisée par le serveur pour afficher
LIMIT Limite à n lignes le résultat retourné, si nécessaire en débutant à ref Références utilisées avec la clé key pour effectuer la requête
EXEMPLE delimiter | les messages
partir de la ligne m. rows Estimation du nombre de lignes à parcourir dans la table pour
CREATE FUNCTION presentation (nom CHAR(20), age TINYINT) RETURNS key_buffer_size = 16M Taille du buffer utilisé pour le cache
EXEMPLE SELECT * FROM nom_table LIMIT m,n effectuer la requête
CHAR(50) des blocs d’index
SELECT nom,prenom FROM contacts LIMIT 5,10; extra Informations complémentaires sur la méthode appliquée.
RETURN CONCAT(nom,' a ',age,’ ans'); log = /var/log/mysql/mysql.log Log de toutes les requêtes
|delimiter ; log-bin = /var/log/mysql/mysql-bin.log Log binaire
Réparer et restaurer log-slow-queries = /var/log/ Log des requêtes les plus lentes, dont
USAGE SELECT presentation('Jocelyn',28); ‹ Jocelyn a 28 ans mysql/mysql-slow.log
Fonctions mathématiques SHOW CREATE PROCEDURE | FUNCTION
ANALYZE TABLE nom_table; Analyse et stocke la clé de distribution de la table
qui permet de décider dans quel ordre les tables
la durée est spécifiée par la variable
long_query_time, en secondes
La plupart des fonctions sont exploitables dans un SELECT et/ou dans une doivent être rassemblées lors des jointures qui max_connections = 128 Nombre maximal de clients MySQL simultanés
SHOW CREATE PROCEDURE nom_procedure; Renvoie l’instruction permettant de
clause WHERE. ne s’effectuent pas sur une constante. query_cache_limit = 1M Ne met pas en cache les résultats plus
SHOW CREATE FUNCTION nom_fonction; recréer la procédure ou la fonction.
OPTIMIZE TABLE nom_table; Défragmente une table. Optimise les performances grands que la valeur spécifiée
DROP PROCEDURE nom_procedure; Supprime une procédure ou
SELECT CONCAT(nom,prenom) FROM adresses WHERE LENGTH(ville)>10; suite à un grand nombre d’insertions et query_cache_size = 16777216 Mémoire allouée pour la mise en cache
DROP FUNCTION nom_fonction; une fonction.
effacements, des requêtes précédentes
SELECT COUNT(*) FROM nom_table; Compte les lignes d’un résultat.
SELECT ABS(-1337); ‹ 1337 Renvoie la valeur absolue. à une CHECK TABLE nom_table; Vérifie l’intégrité d’une table. REMARQUE Certaines de ces variables sont modifiables dynamiquement durant l’exécu-
SELECT CEILING(3.21); ‹ 4 REPAIR TABLE nom_table; Tente la réparation d’une table corrompue. tion grâce à l’instruction SET GLOBAL pour l’ensemble du serveur, ou SET SESSION
SELECT
SELECT
FLOOR(3.21); ‹ 3
MAX(champ) FROM nom_table;
Valeur entière supérieure/inférieure de x.
Renvoie la valeur maximum/minimum
Transactions LOCK TABLES table1,table2 READ;
LOCK TABLES table1,table2 WRITE;
Verrouille une ou plusieurs tables en lecture.
Verrouille une ou plusieurs tables en écriture.
pour la session courante uniquement : SET GLOBAL query_cache_limit=1048576;
Une transaction n’est effective que sur une table de type InnoDB ou BDB (mode REMARQUE Seule la connexion courante peut lire et écrire sur cette table. Les autres
SELECT
SELECT
MIN(champ) FROM nom_table;
RAND(); ‹ 0.25508142100189
d’un champ.
Renvoie un nombre à virgule flottante
autocommit désactivé : SET AUTOCOMMIT=0;). Elle permet de revenir si nécessaire connexions sont bloquées en écriture.
Chez le même éditeur… Rod ol p he Rime lé

ISBN : 978-2-212-14039-2
(en cas d’erreur) à l’état précédent, avant le début de la transaction. Elle débute UNLOCK TABLES; Déverrouille les tables précédemment spécifiées.

Code éditeur : G14039


entre 0 et 1 inclus. BACKUP TABLE nom_table Sauvegarde les fichiers de définition et HTML 5, R. RIMELÉ, 2013
REMARQUE Peut servir à ordonner un résultat aléatoirement : par START TRANSACTION et se termine par COMMIT.
SELECT * FROM table ORDER BY RAND(); ROLLBACK restaure l’état initial de la table avant la fin de la transaction sans TO '/chemin/sur/le/disque'; de données de la table vers le chemin spécifié, MySQL 5 – Audit et optimisation, BORGHINO, 2010 4e édition

Conception : Nord Compo


SELECT ROUND(4.7); ‹ 5 Renvoie l’arrondi entier le plus proche. appliquer les modifications. afin de la restaurer ultérieurement. Mémento PHP 5 et SQL, C. PIERRE DE GEYER ET AL., 2009
NOMBRE DE DÉCIMALES Un deuxième argument n peut être précisé pour arrondir la Seules les tables MyISAM sont supportées.
START TRANSACTION; START TRANSACTION;
RESTORE TABLE nom_table Restaure une table à partir d’une
Mémento Unix/Linux, 4e éd., I. Hurbain,
valeur à n décimales. UPDATE nom_table SET modifications; UPDATE nom_table SET ;
SELECT TRUNCATE(4.7); ‹ 4 Renvoie la valeur tronquée. FROM '/chemin/sur/le/disque'; sauvegarde effectuée avec BACKUP TABLE, E. DREYFUS, 2011
UPDATE nom_table SET autres_modifications; ROLLBACK;
NOMBRE DE DÉCIMALES Un deuxième argument n peut être précisé pour tronquer la stockée sur le disque dans le dossier chemin. Mémento CSS 3, R. GOETTER, 2013
valeur à n décimales. COMMIT;
Sites web, les bonnes pratiques, E. SLOÏM, 2010
Mémento HTML 5, R. RIMELÉ, 2014

5€
Déclencheurs (TRIGGER) Unions et jointures Administration et performances Vues

mémento
MySQL 5
UNION Combine les résultats de plusieurs requêtes SELECT en un seul SHOW GRANTS FOR login; Affiche les droits attribués à l’utilisateur CREATE VIEW nom_de_la_vue Crée une nouvelle vue d’après une requête
résultat. Les colonnes de chaque requête doivent être du même type. SHOW GRANTS FOR CURRENT_USER; login sous forme de requête SQL. AS requete_select; SELECT qui fournit la définition de la vue.
nom_table FOR CREATE VIEW memento AS SELECT titre,prix FROM livres WHERE type=’memento’;
SHOW INDEX FROM nom_table; Affiche les index de la table.
EXEMPLE SHOW CREATE VIEW memento Affiche la commande qui a créé la vue.
(SELECT champ1,champ2,... FROM nom_table1) UNION (SELECT champ1,champ2,... Les champs suivants sont retournés : ‹ SELECT titre,description,prix FROM livres WHERE type=’memento’
FROM nom_table2); Table Nom de la table. ALTER VIEW nom_de_la_vue AS Modifie une vue existante en
Le mot-clé ALL renvoie toutes les lignes concernées par chaque SELECT. Par défaut, Non_unique 1 si les doublons sont autorisés, 0 sinon. nouvelle_requete_select; lui assignant une nouvelle définition.
les lignes retournées sont uniques (comme avec DISTINCT) pour l’ensemble du résultat. Key_name Nom de l’index ALTER VIEW memento AS SELECT titre,description FROM livres WHERE prix=’5’;
CREATE Seq_in_index Position de la colonne dans l’index DROP VIEW nom_de_la_vue1, Supprime une ou plusieurs vues
SELECT a,b FROM table1 UNION ALL SELECT c,d FROM table2;
Column_name Nom de la colonne indexée nom_de_la_vue2,...; (séparées par des virgules).
Les jointures mettent en relation plusieurs tables grâce à une seule requête (produit Collation Mode de tri de l’index ('A’ tri ascendant, NULL pas de tri)
cartésien sur lequel on applique des conditions) avec les types de jointure : Cardinality Nombre de valeurs uniques de l’index
ROW SET @ INNER JOIN Sélectionne uniquement les lignes correspondantes qui se

LEFT JOIN
trouvent dans les deux tables.
Sélectionne toutes les lignes de la table de gauche et si tel est le
Sub_part Nombre de caractères si la colonne est partiellement indexée,
NULL sinon. Sécurité et injections SQL
pour les Packed Mode de compactage de la clé En PHP il faut « échapper » les variables provenant des utilisateurs avec mysqli_real_
cas les entrées correspondantes dans la table de droite. S’il n’y Null YES si la colonne peut contenir NULL escape_string qui remplace les caractères pouvant être pris pour des caractères
a pas d’entrée correspondante dans la table de droite, elle est Index_type Type d’index (BTREE,FULLTEXT,HASH,RTREE) spéciaux SQL. La connexion doit d’abord être établie pour pouvoir l’utiliser :
remplacée par des valeurs NULL. Comment Informations complémentaires if(isset ($_POST['prenom'])){;
RIGHT JOIN Sélectionne toutes les lignes dans la table de droite et les $prenom = mysqli_real_escape_string($_POST['prenom']);
entrées correspondantes dans la table de gauche. S’il n’y en a SHOW STATUS; Informe sur l’état du serveur : mysqli_query("INSERT INTO inscrits (prenom) VALUES ('$prenom')");
pas, elle est remplacée par des valeurs NULL. ; END SHOW STATUS LIKE 'Table%'; variables d’exécution, liste des processus Les prepared statements permettent dans différents langages de s’affranchir de cette
STRAIGHT_JOIN Identique à JOIN, mais la table de gauche est lue avant celle de SHOW VARIABLES; en cours d’exécution, avec la requête précaution, avec les commandes PREPARE et EXECUTE.
droite. SHOW VARIABLES LIKE 'max%'; exécutée correspondante, l’utilisateur
67%'; NATURAL JOIN Jointure sur les colonnes qui possèdent le même nom et le SHOW PROCESSLIST; et le numéro de processus, etc. PRÉCAUTIONS À PRENDRE ! 1. Vérifier, valider, échapper les données entrées par l’utili-
même type dans les deux tables. sateur. 2. Bloquer toute donnée pouvant contenir un mot-clé SQL interdit. 3. Ne
KILL numero_processus; Termine un processus grâce à la commande KILL définir que des autorisations d’accès minimales par utilisateur MySQL (à l’aide
Ces clauses JOIN sont utilisées conjointement avec ON ou USING : la clause ON suivie du numéro de processus concerné. de GRANT). 4. Utiliser des procédures stockées et des requêtes paramétrées.
s’écrit comme une condition utilisée dans une clause WHERE ; USING nomme REMARQUE Seuls les droits d’administrateur (SUPER) permettent de voir la liste de tous
les colonnes communes à exploiter pour la jointure. les processus et de les terminer; à défaut seuls les processus de l’utilisateur courant
EQUIVALENCE Ces deux instructions sont équivalentes :
table1 LEFT JOIN table2 USING (champ1,champ2,champ3)
sont accessibles.
Variables serveur
table1.champ1=table2.champ1 AND table1.champ2=table2.champ2 AND table1. EXPLAIN En PHP, les variables serveur sont définies en priorité par les commandes
champ3=table2.champ3 PERFORMANCES Cette commande est essentielle à l’optimisation de tables. passées en argument au démarrage du serveur mysqld et dans les fichiers de
; EXEMPLES configuration : /etc/mysql/my.cnf ou /etc/my.cnf sous Linux et C:\Windows\
En faisant précéder une requête SELECT avec le mot-clé EXPLAIN, MySQL renvoie un
SELECT * FROM table1,table2 WHERE table1.id=table2.id; my.ini OU C:\my.cnf sous Windows. Pour en voir la liste : SHOW VARIABLES;
enregistrement décrivant comment le moteur traitera la requête :
SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id; Variables courantes
SELECT * FROM table1 LEFT JOIN table2 USING (id);
id Identifiant de requête
SELECT * FROM table1 LEFT JOIN table2 USING (champ1,champ2,champ3);
select_type Type de requête SELECT port = 3306 Port utilisé par le serveur. Par défaut : 3306
SELECT table1.champ1,table2.champ2 FROM table1 JOIN table2 ON table1.
table Table utilisée pour la requête socket = /var/run/mysqld/mysqld.sock Socket à utiliser
tions
SUM, champ3=table2.champ4;
type Type de jointure basedir = /usr Dossier d’installation de MySQL
possible_keys Index utilisables pour effectuer la requête datadir = /var/lib/mysql Dossier de données de MySQL
key Index réellement utilisé tmpdir = /tmp Chemin utilisé pour le stockage des fichiers
’ GROUP BY key_len Taille de la clé d’index utilisée (plus la valeur est petite plus temporaires
FonctionsRenvoie
SELECT
diverses
la clé de hachage MD5 (Message-Digest Algorithm)
ref
l’index est rapide)
Références utilisées avec la clé key pour effectuer la requête
language = /usr/share/mysql/french Langue utilisée par le serveur pour afficher
les messages
RETURNS rows Estimation du nombre de lignes à parcourir dans la table pour key_buffer_size = 16M Taille du buffer utilisé pour le cache
de la chaîne en argument (hexadécimal de 32 caractères).
effectuer la requête des blocs d’index
MD5('Sheldon’'); ‹ 9a70014ca0bb18f7c4e88bf8d9e6de97
extra Informations complémentaires sur la méthode appliquée. log = /var/log/mysql/mysql.log Log de toutes les requêtes
SHA1() ou SHA() Renvoie la somme SHA1 (Secure Hash Algorithm) de la
log-bin = /var/log/mysql/mysql-bin.log Log binaire
chaîne passée en argument (hexadécimal de 40 caractères). Réparer et restaurer log-slow-queries = /var/log/ Log des requêtes les plus lentes, dont
SELECT SHA1('’Sheldon Cooper’');
‹ e6299f9b0450b9de34b8625a6b0c46e014f92afd ANALYZE TABLE nom_table; Analyse et stocke la clé de distribution de la table mysql/mysql-slow.log la durée est spécifiée par la variable
PASSWORD() Calcule un mot de passe MySQL à partir de la chaîne. qui permet de décider dans quel ordre les tables long_query_time, en secondes
Cette fonction est utilisée pour l’encodage des mots de doivent être rassemblées lors des jointures qui max_connections = 128 Nombre maximal de clients MySQL simultanés
passe stockés dans la table mysql.user. ne s’effectuent pas sur une constante. query_cache_limit = 1M Ne met pas en cache les résultats plus
SELECT PASSWORD('banane'); ‹ 33b8ada77d684dab OPTIMIZE TABLE nom_table; Défragmente une table. Optimise les performances grands que la valeur spécifiée
)>10; ENCODE() DECODE() Ces fonctions encodent et décodent respectivement un texte suite à un grand nombre d’insertions et query_cache_size = 16777216 Mémoire allouée pour la mise en cache
passé en paramètre à l’aide d’une clé elle aussi spécifiée. effacements, des requêtes précédentes
SELECT ENCODE('C\’est un secret','banane'); ‹ Gc2iF38B4e CHECK TABLE nom_table; Vérifie l’intégrité d’une table. REMARQUE Certaines de ces variables sont modifiables dynamiquement durant l’exécu-
SELECT DECODE('Gc2iF38B4e','banane'); ‹ C’est un secret REPAIR TABLE nom_table; Tente la réparation d’une table corrompue. tion grâce à l’instruction SET GLOBAL pour l’ensemble du serveur, ou SET SESSION
x. FOUND_ROWS() Renvoie le nombre d’enregistrements trouvés lors de la LOCK TABLES table1,table2 READ; Verrouille une ou plusieurs tables en lecture. pour la session courante uniquement : SET GLOBAL query_cache_limit=1048576;
dernière requête. LOCK TABLES table1,table2 WRITE; Verrouille une ou plusieurs tables en écriture.
REMARQUE Seule la connexion courante peut lire et écrire sur cette table. Les autres
LAST_INSERT_ID() Renvoie le dernier identifiant unique (ex : clé en AUTO_
INCREMENT) créé par une requête INSERT.
connexions sont bloquées en écriture.
Chez le même éditeur… Rod ol p he Rime lé

ISBN : 978-2-212-14039-2
UNLOCK TABLES; Déverrouille les tables précédemment spécifiées.

Code éditeur : G14039


VERSION() Renvoie la version du serveur MySQL utilisé. HTML 5, R. RIMELÉ, 2013
BACKUP TABLE nom_table Sauvegarde les fichiers de définition et
SELECT VERSION(); ‹ 5.1.49-3
USER() Renvoie l’identité de l’utilisateur courant.
TO '/chemin/sur/le/disque'; de données de la table vers le chemin spécifié, MySQL 5 – Audit et optimisation, BORGHINO, 2010 4e édition

Conception : Nord Compo


afin de la restaurer ultérieurement. Mémento PHP 5 et SQL, C. PIERRE DE GEYER ET AL., 2009
SELECT USER(); ‹ monlogin@localhost
Seules les tables MyISAM sont supportées.
CONCAT(chaîne1, Concatène des champs ou des chaînes de texte. ;
RESTORE TABLE nom_table Restaure une table à partir d’une
Mémento Unix/Linux, 4e éd., I. Hurbain,
chaîne2,...) SELECT CONCAT('ki', 'wi'); ‹ kiwi SET ; E. DREYFUS, 2011
FROM '/chemin/sur/le/disque'; sauvegarde effectuée avec BACKUP TABLE,
LENGTH(chaîne) Renvoie la longueur de la chaîne de texte.
stockée sur le disque dans le dossier chemin. Mémento CSS 3, R. GOETTER, 2013
SELECT LENGTH('kiwi'); ‹ 4
Sites web, les bonnes pratiques, E. SLOÏM, 2010
Mémento HTML 5, R. RIMELÉ, 2014

5€
Fonctions texte Procédures stockées et fonctions Vues

mémento
MySQL 5
INSTR(chaîne, Renvoie la position de la 1re occurrence de la sous-chaîne. CREATE VIEW nom_de_la_vue Crée une nouvelle vue d’après une requête
INSERT, sous-chaîne) SELECT INSTR('J\’aime les kiwis','kiwi'); ‹ 12 AS requete_select; SELECT qui fournit la définition de la vue.
LEFT(chaîne,n) Renvoie les n premiers/derniers caractères de chaîne. CREATE VIEW memento AS SELECT titre,prix FROM livres WHERE type=’memento’;
EACH ROW RIGHT(chaîne,n) SELECTLEFT('J\’aime les kiwis', 6); ‹ J’aime SHOW CREATE VIEW memento Affiche la commande qui a créé la vue.
LOWER(chaîne) Met les caractères de chaîne en minuscules/majuscules. ‹ SELECT titre,description,prix FROM livres WHERE type=’memento’
UPPER(chaîne) SELECT UPPER('J\’aime les kiwis'); ‹ J’AIME LES KIWIS ALTER VIEW nom_de_la_vue AS Modifie une vue existante en
fixes OLD et nouvelle_requete_select; lui assignant une nouvelle définition.
REPLACE(chaîne, Remplace les sous-chaînes chaîne_a par chaîne_b dans chaîne.
la ligne avant ALTER VIEW memento AS SELECT titre,description FROM livres WHERE prix=’5’;
chaîne_a,chaîne_b) SELECT REPLACE('J\’aime les kiwis','kiwi','orange');
ATTENTION ‹ J’aime les oranges DROP VIEW nom_de_la_vue1, Supprime une ou plusieurs vues
TRIGGER REVERSE(chaîne) Renvoie une chaîne inversée. nom_de_la_vue2,...; (séparées par des virgules).
EXEMPLE SELECT REVERSE('kiwi'); ‹ iwik
SUBSTRING(chaîne, Renvoie une sous-chaîne de chaîne, de longueur n à
somme = @ position,n) partir de la position position.
SELECT SUBSTRING('J\’aime les kiwis',8,9); ‹ les kiwis Sécurité et injections SQL
TRIM(chaîne) Retire les espaces en début et fin de texte. En PHP il faut « échapper » les variables provenant des utilisateurs avec mysqli_real_
DROP TRIGGER escape_string qui remplace les caractères pouvant être pris pour des caractères
spéciaux SQL. La connexion doit d’abord être établie pour pouvoir l’utiliser :
if(isset ($_POST['prenom'])){;

Fonctions de dates $prenom = mysqli_real_escape_string($_POST['prenom']);


mysqli_query("INSERT INTO inscrits (prenom) VALUES ('$prenom')");
DISTINCT SELECT NOW(); ‹ 2014-01-27 13:37:00 Renvoie la date actuelle au format Les prepared statements permettent dans différents langages de s’affranchir de cette
'YYYY-MM-DD HH:MM:SS'. précaution, avec les commandes PREPARE et EXECUTE.
EXEMPLE SYNONYMES SYSDATE(), LOCALTIME(), CURRENT_TIMESTAMP(),LOCALTIMESTAMP()
SELECT SELECT CURDATE(); ‹ 2014-01-27 Renvoie la date au format 'YYYY- PRÉCAUTIONS À PRENDRE ! 1. Vérifier, valider, échapper les données entrées par l’utili-
ORDER BY MM-DD’. sateur. 2. Bloquer toute donnée pouvant contenir un mot-clé SQL interdit. 3. Ne
KILL définir que des autorisations d’accès minimales par utilisateur MySQL (à l’aide
SELECT CURTIME(); ‹ 13:37:00 Renvoie l’heure au format 'HH:MM:SS'.
SELECT UNIX_TIMESTAMP(); Renvoie le timestamp UNIX actuel de GRANT). 4. Utiliser des procédures stockées et des requêtes paramétrées.
‹ 1147550227 (nombre de secondes écoulées depuis
EXEMPLE le 1er janvier 1970 à 00:00:00).
SELECT nom,
GROUP BY
REMARQUE Si UNIX_TIMESTAMP() est appelée avec un argument date, elle renvoie
le timestamp correspondant à cette date. Variables serveur
SELECT FROM_UNIXTIME(1320669158); Renvoie une date sous la forme En PHP, les variables serveur sont définies en priorité par les commandes
EXEMPLE passées en argument au démarrage du serveur mysqld et dans les fichiers de
SELECT ‹ 2011-11-07 13:32:28 'YYYY-MM-DD HH:MM:SS' à partir
SELECT d’un timestamp UNIX. configuration : /etc/mysql/my.cnf ou /etc/my.cnf sous Linux et C:\Windows\
TOTAL SELECT YEAR('2014-04-27'); ‹ 2014 Renvoient respectivement l’année, my.ini OU C:\my.cnf sous Windows. Pour en voir la liste : SHOW VARIABLES;
SELECT DAY('2014-04-27'); ‹ 27 le jour et le mois d’une date.
HAVING SELECT MONTH('2014-04-27'); ‹ 04
Variables courantes
SELECT HOUR('2014-04-27 13:37:00'); ‹13 Renvoient respectivement l’heure, port = 3306 Port utilisé par le serveur. Par défaut : 3306
SELECT MINUTE('13:37:00'); ‹ 37 les minutes et les secondes d’une date. socket = /var/run/mysqld/mysqld.sock Socket à utiliser
SELECT SECOND('13:37:00'); ‹ 00 basedir = /usr Dossier d’installation de MySQL
SELECT DAYNAME(NOW()); ‹ Sunday Renvoient respectivement le nom du datadir = /var/lib/mysql Dossier de données de MySQL
EXEMPLE SELECT MONTHNAME('2014-04-27’); jour et le nom du mois de la date tmpdir = /tmp Chemin utilisé pour le stockage des fichiers
SELECT temporaires
client,
‹ April passée en argument.
SELECT DAYOFWEEK('2014-04-27'); ‹ 1 Renvoie l’index du jour de la semaine language = /usr/share/mysql/french Langue utilisée par le serveur pour afficher
LIMIT
(1 = Dimanche..., 7 = Samedi). les messages
SELECT DAYOFYEAR('2014-04-27'); ‹ 117 Renvoie le jour de l’année (1 à 366). key_buffer_size = 16M Taille du buffer utilisé pour le cache
EXEMPLE
SELECT WEEK('2014-04-27'); ‹ 17 Renvoie le numéro de la semaine. des blocs d’index
SELECT DATE('2014-01-27 13:37:00'); Extrait la partie date d’une expression. log = /var/log/mysql/mysql.log Log de toutes les requêtes
‹ 2014-01-27 log-bin = /var/log/mysql/mysql-bin.log Log binaire
SELECT TIME('2014-01-27 13:37:00'); Extrait la partie horaire log-slow-queries = /var/log/ Log des requêtes les plus lentes, dont
‹ 13:37:00 d’une expression. mysql/mysql-slow.log la durée est spécifiée par la variable
SELECT QUARTER('2014-01-27'); ‹ 2 Renvoie le trimestre de la date (1 à 4). long_query_time, en secondes
SELECT SEC_TO_TIME(49050); ‹ 13:37:30 Renvoie l’argument donné en secondes max_connections = 128 Nombre maximal de clients MySQL simultanés
clause WHERE. au format 'HH:MM:SS'. query_cache_limit = 1M Ne met pas en cache les résultats plus
SELECT TIME_TO_SEC('13:37:30'); Convertit en secondes l’argument grands que la valeur spécifiée
‹ 49050 donné en heures, minutes et query_cache_size = 16777216 Mémoire allouée pour la mise en cache
secondes. des requêtes précédentes
SELECT
SELECT ABS(- SELECT ADDTIME('2014-01-27 00:00:00', Ajoute une valeur de type TIME à une REMARQUE Certaines de ces variables sont modifiables dynamiquement durant l’exécu-
SELECT '13:37:30'); ‹ 2014-01-27 13:37:30 valeur DATE ou DATETIME. tion grâce à l’instruction SET GLOBAL pour l’ensemble du serveur, ou SET SESSION
SELECT SELECT DATEDIFF('2014-01-27 00:00:00', Renvoie le nombre de jours entre une pour la session courante uniquement : SET GLOBAL query_cache_limit=1048576;
SELECT MAX '2014-01-17'); ‹ 10 date de début et une date de fin (types
DATE ou DATETIME).
SELECT MIN
SELECT SELECT STR_TO_DATE('2014/01/27 Applique un format date à une chaîne Chez le même éditeur… Rod ol p he Rime lé

ISBN : 978-2-212-14039-2
13.37.30', '%Y/%m/%d %H.%i.%s'); de caractères pour renvoyer une valeur

Code éditeur : G14039


‹ 2014-01-27 13:37:30 DATETIME.
HTML 5, R. RIMELÉ, 2013
REMARQUE
SELECT DATE_FORMAT('2014-01-27 Formate une date. MySQL 5 – Audit et optimisation, BORGHINO, 2010 4e édition

Conception : Nord Compo


SELECT 13:37:30', '%W %M %Y, %H:%i%:%s'); ‹ Monday January 2014, 13:37:30 Mémento PHP 5 et SQL, C. PIERRE DE GEYER ET AL., 2009
NOMBRE DE SELECT DATE_ADD('2014-01-27 23:59:59', Opérations arithmétiques d’addition Mémento Unix/Linux, 4e éd., I. Hurbain,
INTERVAL 1 SECOND); et de soustraction sur des dates. E. DREYFUS, 2011
SELECT ‹ 2014-01-28 00:00:00 ,
NOMBRE DE
SELECT DATE_SUB('2014-01-27', REMARQUE Se référer à la documentation . Mémento CSS 3, R. GOETTER, 2013
INTERVAL 31 DAY); ‹ 2013-12-27 MySQL pour la syntaxe des intervalles. Sites web, les bonnes pratiques, E. SLOÏM, 2010
Mémento HTML 5, R. RIMELÉ, 2014

5€
Déclencheurs (TRIGGER) Fonctions texte Procédures stockées et fonctions

mémento
MySQL 5
Un déclencheur (trigger) active une instruction lorsque survient un événement UNION Une procédure stockée est créée avec CREATE PROCEDURE et appelée avec
INSERT, UPDATE ou DELETE. la commande CALL ; elle ne renvoie de valeur que via les paramètres de retour
CREATE TRIGGER nom_déclencheur BEFORE|AFTER événement ON nom_table FOR (OUT). Une fonction peut renvoyer une valeur scalaire, et être appelée depuis une memento’;
EACH ROW requête_à_exécuter; EXEMPLE commande SQL, comme toute autre fonction standard.
(SELECT Une fonction est déclarée avec CREATE FUNCTION. ’
Dans la requête à exécuter, la référence à un champ doit s’accompagner des pré- FROM Une variable est déclarée avec la commande SET@nomvariable=valeur
fixes OLD et NEW : OLD.nom_champ et NEW.nom_champ désignent respectivement
Le mot-clé REMARQUE La commande delimiter permet d’utiliser ";" dans la déclaration de la pro-
la ligne avant et après sa modification (ou avant effacement et après insertion). prix=’5’;
cédure ou de la fonction.
ATTENTION Il ne peut exister deux déclencheurs de même type au même moment. CREATE SELECT
TRIGGER nécessite le privilège SUPER. CREATE PROCEDURE
EXEMPLE CREATE PROCEDURE nom_procedure (paramètres) instructions
CREATE TRIGGER insertion BEFORE INSERT ON comptes FOR EACH ROW SET @ paramètres Liste des paramètres acceptés par la fonction, suivis de leur type
somme = @somme + NEW.montant; (ex. nom CHAR(20), age TINYINT). Chaque paramètre est de type
Supprimer un déclencheur : LEFT JOIN IN par défaut. Il est possible de spécifier OUT ou INOUT pour les
DROP TRIGGER nom_table.nom_déclencheur; paramètres de sortie.
instructions Suite d’instructions SQL, entourées par BEGIN et END.

EXEMPLE delimiter //
Groupage et tri
Permet de ne sélectionner qu’une fois chaque valeur différente
DISTINCT
CREATE PROCEDURE proc (OUT poids INT)
BEGIN SELECT SUM(poids_kg) INTO poids FROM commande; END
')");

dans une table (sans doublon). //delimiter ;


EXEMPLE
SELECT DISTINCT ville FROM annuaire WHERE code_postal LIKE '67%'; USAGE CALL proc(@nom_variable);
ORDER BY Ordonne le résultat de la requête en triant sur au moins une Autres éléments de langage : 3. Ne
colonne. DECLARE nom_variable type_variable; Déclaration de variable locale
Par défaut, le tri est croissant (ASC). Pour inverser l’ordre, ajouter la Ces clauses
SET nom_variable = expression; Affectation de variable
clause DESC (tri décroissant). REPEAT ... UNTIL condition END REPEAT; Boucles. Pour sortir d’une
EXEMPLE WHILE condition DO ... END WHILE; boucle LOOP : LEAVE.
SELECT nom,prenom FROM ORDER BY age DESC; EQUIVALENCE LOOP ... END LOOP;
GROUP BY Groupe les résultats d’une requête selon une ou plusieurs table1 IF condition THEN ... ELSE ... END IF; Conditions
colonnes, en général pour effectuer dessus des calculs (sommes...). table1. CASE variable WHEN valeur THEN ... END CASE;
EXEMPLE champ3=
SELECT joueur,SUM(parties) FROM golf GROUP BY joueur; DECLARE nom_curseur CURSOR FOR requete_select; Déclaration de curseur
SELECT auteur,COUNT(*) FROM commentaires GROUP BY auteur; EXEMPLES OPEN nom_curseur; Ouverture de curseur C:\Windows\
TOTAL En ajoutant la clause WITH ROLLUP après GROUP BY, une dernière ligne FETCH nom_curseur INTO variables; Lecture de curseur
comprenant le total des valeurs groupées est ajoutée au jeu de résultats. CLOSE nom_curseur; Fermeture de curseur
HAVING Ne peut être utilisé qu’après GROUP BY, et, s’il y en a, avant une
clause ORDER BY. Opère une sous-sélection des résultats à l’aide CREATE FUNCTION
d’une condition supplémentaire (calcul...). Permet d’utiliser des SELECT CREATE FUNCTION nom_fonction (paramètres) RETURNS type_retour instructions
fonctions non autorisées dans une clause WHERE, telles que SUM, champ3=
AVG, MIN, MAX... paramètres Liste des paramètres acceptés par la fonction, suivis de leur type
EXEMPLE (ex. nom CHAR(20), age TINYINT)
SELECT client,achats,pays FROM clients WHERE pays=’France’ GROUP BY type_retour Type MySQL retourné par la fonction (ex. CHAR(10), INT)
client,achats HAVING MAX(achats)>1000; instructions Suite d’instructions SQL, terminées par RETURN variable
LIMIT Limite à n lignes le résultat retourné, si nécessaire en débutant à
partir de la ligne m. SELECT EXEMPLE delimiter |
CREATE FUNCTION presentation (nom CHAR(20), age TINYINT) RETURNS
EXEMPLE SELECT * FROM nom_table LIMIT m,n
CHAR(50)
SELECT nom,prenom FROM contacts LIMIT 5,10; MD5('
RETURN CONCAT(nom,' a ',age,’ ans');
|delimiter ;
SELECT USAGE SELECT presentation('Jocelyn',28); ‹ Jocelyn a 28 ans
Fonctions mathématiques ‹
SHOW CREATE PROCEDURE | FUNCTION
La plupart des fonctions sont exploitables dans un SELECT et/ou dans une SHOW CREATE PROCEDURE nom_procedure; Renvoie l’instruction permettant de
clause WHERE. SHOW CREATE FUNCTION nom_fonction; recréer la procédure ou la fonction.
DROP PROCEDURE nom_procedure; Supprime une procédure ou
SELECT CONCAT(nom,prenom) FROM adresses WHERE LENGTH(ville)>10;
DROP FUNCTION nom_fonction; une fonction.
SELECT COUNT(*) FROM nom_table; Compte les lignes d’un résultat.
SELECT ABS(-1337); ‹ 1337 Renvoie la valeur absolue. SELECT
SELECT CEILING(3.21); ‹ 4 SELECT
SELECT
SELECT
FLOOR(3.21); ‹ 3
MAX(champ) FROM nom_table;
Valeur entière supérieure/inférieure de x.
Renvoie la valeur maximum/minimum
Transactions 1048576;
Une transaction n’est effective que sur une table de type InnoDB ou BDB (mode
SELECT
SELECT
MIN(champ) FROM nom_table;
RAND(); ‹ 0.25508142100189
d’un champ.
Renvoie un nombre à virgule flottante
entre 0 et 1 inclus. VERSION()
autocommit désactivé : SET AUTOCOMMIT=0;). Elle permet de revenir si nécessaire
(en cas d’erreur) à l’état précédent, avant le début de la transaction. Elle débute
Rod ol p he Rime lé
REMARQUE Peut servir à ordonner un résultat aléatoirement : par START TRANSACTION et se termine par COMMIT.
SELECT * FROM table ORDER BY RAND(); USER()
ROLLBACK restaure l’état initial de la table avant la fin de la transaction sans 4e édition

Conception : Nord Compo


SELECT ROUND(4.7); ‹ 5 Renvoie l’arrondi entier le plus proche. appliquer les modifications.
NOMBRE DE DÉCIMALES Un deuxième argument n peut être précisé pour arrondir la CONCAT( START TRANSACTION; START TRANSACTION;
valeur à n décimales. UPDATE nom_table SET modifications; UPDATE nom_table SET ;
chaîne2
SELECT TRUNCATE(4.7); ‹ 4 Renvoie la valeur tronquée.
LENGTH( UPDATE nom_table SET autres_modifications; ROLLBACK;
NOMBRE DE DÉCIMALES Un deuxième argument n peut être précisé pour tronquer la
valeur à n décimales. COMMIT;


Déclencheurs (TRIGGER) Unions et jointures Administration et performances
Un déclencheur (trigger) active une instruction lorsque survient un événement UNION Combine les résultats de plusieurs requêtes SELECT en un seul INSTR( SHOW GRANTS FOR login; Affiche les droits attribués à l’utilisateur
INSERT, UPDATE ou DELETE. résultat. Les colonnes de chaque requête doivent être du même type. sous- SHOW GRANTS FOR CURRENT_USER; login sous forme de requête SQL.
CREATE TRIGGER nom_déclencheur BEFORE|AFTER événement ON nom_table FOR LEFT(
SHOW INDEX FROM nom_table; Affiche les index de la table.
EACH ROW requête_à_exécuter; EXEMPLE RIGHT(
(SELECT champ1,champ2,... FROM nom_table1) UNION (SELECT champ1,champ2,... LOWER( Les champs suivants sont retournés :
Dans la requête à exécuter, la référence à un champ doit s’accompagner des pré- FROM nom_table2); Table Nom de la table.
UPPER(
fixes OLD et NEW : OLD.nom_champ et NEW.nom_champ désignent respectivement Non_unique 1 si les doublons sont autorisés, 0 sinon.
Le mot-clé ALL renvoie toutes les lignes concernées par chaque SELECT. Par défaut, REPLACE(
la ligne avant et après sa modification (ou avant effacement et après insertion). Key_name Nom de l’index
les lignes retournées sont uniques (comme avec DISTINCT) pour l’ensemble du résultat. chaîne_a,
ATTENTION Il ne peut exister deux déclencheurs de même type au même moment. CREATE Seq_in_index Position de la colonne dans l’index
SELECT a,b FROM table1 UNION ALL SELECT c,d FROM table2;
TRIGGER nécessite le privilège SUPER. REVERSE( Column_name Nom de la colonne indexée
Les jointures mettent en relation plusieurs tables grâce à une seule requête (produit Collation Mode de tri de l’index ('A’ tri ascendant, NULL pas de tri)
EXEMPLE cartésien sur lequel on applique des conditions) avec les types de jointure : Cardinality Nombre de valeurs uniques de l’index
CREATE TRIGGER insertion BEFORE INSERT ON comptes FOR EACH ROW SET @ SUBSTRING(
INNER JOIN Sélectionne uniquement les lignes correspondantes qui se Sub_part Nombre de caractères si la colonne est partiellement indexée,
somme = @somme + NEW.montant; position,
trouvent dans les deux tables. NULL sinon.
Supprimer un déclencheur : LEFT JOIN Sélectionne toutes les lignes de la table de gauche et si tel est le Packed Mode de compactage de la clé
TRIM(
DROP TRIGGER nom_table.nom_déclencheur;
cas les entrées correspondantes dans la table de droite. S’il n’y Null YES si la colonne peut contenir NULL
a pas d’entrée correspondante dans la table de droite, elle est Index_type Type d’index (BTREE,FULLTEXT,HASH,RTREE)
remplacée par des valeurs NULL. Comment Informations complémentaires
RIGHT JOIN Sélectionne toutes les lignes dans la table de droite et les
Groupage et tri
Permet de ne sélectionner qu’une fois chaque valeur différente
DISTINCT
entrées correspondantes dans la table de gauche. S’il n’y en a
pas, elle est remplacée par des valeurs NULL. SELECT
SHOW
SHOW
STATUS;
STATUS LIKE 'Table%';
Informe sur l’état du serveur :
variables d’exécution, liste des processus
dans une table (sans doublon). STRAIGHT_JOIN Identique à JOIN, mais la table de gauche est lue avant celle de SHOW VARIABLES; en cours d’exécution, avec la requête
EXEMPLE droite. SYNONYMES SHOW VARIABLES LIKE 'max%'; exécutée correspondante, l’utilisateur
SELECT DISTINCT ville FROM annuaire WHERE code_postal LIKE '67%'; NATURAL JOIN Jointure sur les colonnes qui possèdent le même nom et le SELECT SHOW PROCESSLIST; et le numéro de processus, etc.
ORDER BY Ordonne le résultat de la requête en triant sur au moins une même type dans les deux tables. KILL numero_processus; Termine un processus grâce à la commande KILL
colonne. SELECT
Ces clauses JOIN sont utilisées conjointement avec ON ou USING : la clause ON suivie du numéro de processus concerné.
Par défaut, le tri est croissant (ASC). Pour inverser l’ordre, ajouter la SELECT
clause DESC (tri décroissant). s’écrit comme une condition utilisée dans une clause WHERE ; USING nomme REMARQUE Seuls les droits d’administrateur (SUPER) permettent de voir la liste de tous

EXEMPLE les colonnes communes à exploiter pour la jointure. les processus et de les terminer; à défaut seuls les processus de l’utilisateur courant
SELECT nom,prenom FROM ORDER BY age DESC; EQUIVALENCE Ces deux instructions sont équivalentes : sont accessibles.
REMARQUE Si
GROUP BY Groupe les résultats d’une requête selon une ou plusieurs table1 LEFT JOIN table2 USING (champ1,champ2,champ3)
colonnes, en général pour effectuer dessus des calculs (sommes...). table1.champ1=table2.champ1 AND table1.champ2=table2.champ2 AND table1. SELECT EXPLAIN
EXEMPLE champ3=table2.champ3
SELECT joueur,SUM(parties) FROM golf GROUP BY joueur; ‹ PERFORMANCES Cette commande est essentielle à l’optimisation de tables.
SELECT auteur,COUNT(*) FROM commentaires GROUP BY auteur; EXEMPLES En faisant précéder une requête SELECT avec le mot-clé EXPLAIN, MySQL renvoie un
TOTAL En ajoutant la clause WITH ROLLUP après GROUP BY, une dernière ligne SELECT * FROM table1,table2 WHERE table1.id=table2.id; SELECT enregistrement décrivant comment le moteur traitera la requête :
comprenant le total des valeurs groupées est ajoutée au jeu de résultats. SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id; SELECT
HAVING Ne peut être utilisé qu’après GROUP BY, et, s’il y en a, avant une SELECT * FROM table1 LEFT JOIN table2 USING (id); SELECT id Identifiant de requête
clause ORDER BY. Opère une sous-sélection des résultats à l’aide SELECT * FROM table1 LEFT JOIN table2 USING (champ1,champ2,champ3); SELECT select_type Type de requête SELECT
d’une condition supplémentaire (calcul...). Permet d’utiliser des SELECT table1.champ1,table2.champ2 FROM table1 JOIN table2 ON table1. SELECT table Table utilisée pour la requête
fonctions non autorisées dans une clause WHERE, telles que SUM, champ3=table2.champ4; SELECT type Type de jointure
AVG, MIN, MAX... SELECT possible_keys Index utilisables pour effectuer la requête
EXEMPLE SELECT key Index réellement utilisé
SELECT client,achats,pays FROM clients WHERE pays=’France’ GROUP BY key_len Taille de la clé d’index utilisée (plus la valeur est petite plus
‹ April
client,achats HAVING MAX(achats)>1000;
LIMIT Limite à n lignes le résultat retourné, si nécessaire en débutant à FonctionsRenvoie
SELECT
diverses
la clé de hachage MD5 (Message-Digest Algorithm)
SELECT
ref
l’index est rapide)
Références utilisées avec la clé key pour effectuer la requête
partir de la ligne m. rows Estimation du nombre de lignes à parcourir dans la table pour
de la chaîne en argument (hexadécimal de 32 caractères). SELECT
EXEMPLE SELECT * FROM nom_table LIMIT m,n effectuer la requête
SELECT nom,prenom FROM contacts LIMIT 5,10; MD5('Sheldon’'); ‹ 9a70014ca0bb18f7c4e88bf8d9e6de97 SELECT
SELECT extra Informations complémentaires sur la méthode appliquée.
SHA1() ou SHA() Renvoie la somme SHA1 (Secure Hash Algorithm) de la
chaîne passée en argument (hexadécimal de 40 caractères). ‹ Réparer et restaurer
SELECT SHA1('’Sheldon Cooper’'); SELECT

Fonctions mathématiques ‹ e6299f9b0450b9de34b8625a6b0c46e014f92afd


PASSWORD() Calcule un mot de passe MySQL à partir de la chaîne.

SELECT
ANALYZE TABLE nom_table; Analyse et stocke la clé de distribution de la table
qui permet de décider dans quel ordre les tables
La plupart des fonctions sont exploitables dans un SELECT et/ou dans une Cette fonction est utilisée pour l’encodage des mots de SELECT doivent être rassemblées lors des jointures qui
clause WHERE. passe stockés dans la table mysql.user. ne s’effectuent pas sur une constante.
SELECT PASSWORD('banane'); ‹ 33b8ada77d684dab SELECT OPTIMIZE TABLE nom_table; Défragmente une table. Optimise les performances
SELECT CONCAT(nom,prenom) FROM adresses WHERE LENGTH(ville)>10; ENCODE() DECODE() Ces fonctions encodent et décodent respectivement un texte ‹ 49050 suite à un grand nombre d’insertions et
SELECT COUNT(*) FROM nom_table; Compte les lignes d’un résultat. passé en paramètre à l’aide d’une clé elle aussi spécifiée. secondes. effacements,
SELECT ABS(-1337); ‹ 1337 Renvoie la valeur absolue. SELECT ENCODE('C\’est un secret','banane'); ‹ Gc2iF38B4e SELECT CHECK TABLE nom_table; Vérifie l’intégrité d’une table.
SELECT CEILING(3.21); ‹ 4 SELECT DECODE('Gc2iF38B4e','banane'); ‹ C’est un secret '13:37:30' REPAIR TABLE nom_table; Tente la réparation d’une table corrompue.
SELECT FLOOR(3.21); ‹ 3 Valeur entière supérieure/inférieure de x. FOUND_ROWS() Renvoie le nombre d’enregistrements trouvés lors de la SELECT LOCK TABLES table1,table2 READ; Verrouille une ou plusieurs tables en lecture.
SELECT MAX(champ) FROM nom_table; Renvoie la valeur maximum/minimum dernière requête. '2014-01- LOCK TABLES table1,table2 WRITE; Verrouille une ou plusieurs tables en écriture.
REMARQUE Seule la connexion courante peut lire et écrire sur cette table. Les autres
SELECT MIN(champ) FROM nom_table; d’un champ. LAST_INSERT_ID() Renvoie le dernier identifiant unique (ex : clé en AUTO_
connexions sont bloquées en écriture.
SELECT RAND(); ‹ 0.25508142100189 Renvoie un nombre à virgule flottante INCREMENT) créé par une requête INSERT. SELECT
13.37.30 UNLOCK TABLES; Déverrouille les tables précédemment spécifiées.
entre 0 et 1 inclus. VERSION() Renvoie la version du serveur MySQL utilisé.
‹ 2014-01 BACKUP TABLE nom_table Sauvegarde les fichiers de définition et
REMARQUE Peut servir à ordonner un résultat aléatoirement : SELECT VERSION(); ‹ 5.1.49-3
SELECT * FROM table ORDER BY RAND(); SELECT TO '/chemin/sur/le/disque'; de données de la table vers le chemin spécifié,
USER() Renvoie l’identité de l’utilisateur courant.
SELECT ROUND(4.7); ‹ 5 Renvoie l’arrondi entier le plus proche. 13:37:30 afin de la restaurer ultérieurement.
SELECT USER(); ‹ monlogin@localhost
NOMBRE DE DÉCIMALES Un deuxième argument n peut être précisé pour arrondir la SELECT Seules les tables MyISAM sont supportées.
CONCAT(chaîne1, Concatène des champs ou des chaînes de texte.
valeur à n décimales. RESTORE TABLE nom_table Restaure une table à partir d’une
chaîne2,...) SELECT CONCAT('ki', 'wi'); ‹ kiwi ;
SELECT TRUNCATE(4.7); ‹ 4 Renvoie la valeur tronquée. ‹ 2014-01 FROM '/chemin/sur/le/disque'; sauvegarde effectuée avec BACKUP TABLE,
NOMBRE DE DÉCIMALES Un deuxième argument n peut être précisé pour tronquer la LENGTH(chaîne) Renvoie la longueur de la chaîne de texte.
stockée sur le disque dans le dossier chemin.
valeur à n décimales. SELECT LENGTH('kiwi'); ‹ 4 SELECT
INTERVAL
Vues
CREATE VIEW nom_de_la_vue Crée une nouvelle vue d’après une requête
AS requete_select; SELECT qui fournit la définition de la vue.
CREATE VIEW memento AS SELECT titre,prix FROM livres WHERE type=’memento’;
SHOW CREATE VIEW memento Affiche la commande qui a créé la vue.
‹ SELECT titre,description,prix FROM livres WHERE type=’memento’
ALTER VIEW nom_de_la_vue AS Modifie une vue existante en
nouvelle_requete_select; lui assignant une nouvelle définition.
ALTER VIEW memento AS SELECT titre,description FROM livres WHERE prix=’5’;
DROP VIEW nom_de_la_vue1, Supprime une ou plusieurs vues
nom_de_la_vue2,...; (séparées par des virgules).

Sécurité et injections SQL


En PHP il faut « échapper » les variables provenant des utilisateurs avec mysqli_real_
escape_string qui remplace les caractères pouvant être pris pour des caractères
spéciaux SQL. La connexion doit d’abord être établie pour pouvoir l’utiliser :
if(isset ($_POST['prenom'])){;
$prenom = mysqli_real_escape_string($_POST['prenom']);
mysqli_query("INSERT INTO inscrits (prenom) VALUES ('$prenom')");
Les prepared statements permettent dans différents langages de s’affranchir de cette
précaution, avec les commandes PREPARE et EXECUTE.
PRÉCAUTIONS À PRENDRE ! 1. Vérifier, valider, échapper les données entrées par l’utili-
sateur. 2. Bloquer toute donnée pouvant contenir un mot-clé SQL interdit. 3. Ne
définir que des autorisations d’accès minimales par utilisateur MySQL (à l’aide
de GRANT). 4. Utiliser des procédures stockées et des requêtes paramétrées.

Variables serveur
En PHP, les variables serveur sont définies en priorité par les commandes
passées en argument au démarrage du serveur mysqld et dans les fichiers de
configuration : /etc/mysql/my.cnf ou /etc/my.cnf sous Linux et C:\Windows\
my.ini OU C:\my.cnf sous Windows. Pour en voir la liste : SHOW VARIABLES;

Variables courantes
port = 3306 Port utilisé par le serveur. Par défaut : 3306
socket = /var/run/mysqld/mysqld.sock Socket à utiliser
basedir = /usr Dossier d’installation de MySQL
datadir = /var/lib/mysql Dossier de données de MySQL
tmpdir = /tmp Chemin utilisé pour le stockage des fichiers
temporaires
language = /usr/share/mysql/french Langue utilisée par le serveur pour afficher
les messages
key_buffer_size = 16M Taille du buffer utilisé pour le cache
des blocs d’index
log = /var/log/mysql/mysql.log Log de toutes les requêtes
log-bin = /var/log/mysql/mysql-bin.log Log binaire
log-slow-queries = /var/log/ Log des requêtes les plus lentes, dont
mysql/mysql-slow.log la durée est spécifiée par la variable
long_query_time, en secondes
max_connections = 128 Nombre maximal de clients MySQL simultanés
query_cache_limit = 1M Ne met pas en cache les résultats plus
grands que la valeur spécifiée
query_cache_size = 16777216 Mémoire allouée pour la mise en cache
des requêtes précédentes
REMARQUE Certaines de ces variables sont modifiables dynamiquement durant l’exécu-
tion grâce à l’instruction SET GLOBAL pour l’ensemble du serveur, ou SET SESSION
pour la session courante uniquement : SET GLOBAL query_cache_limit=1048576;

Chez le même éditeur…


HTML 5, R. RIMELÉ, 2013
ISBN : 978-2-212-14039-2

MySQL 5 – Audit et optimisation, BORGHINO, 2010


Code éditeur : G14039

Conception : Nord Compo

Mémento PHP 5 et SQL, C. PIERRE DE GEYER ET AL., 2009


Mémento Unix/Linux, 4e éd., I. Hurbain,
E. DREYFUS, 2011
Mémento CSS 3, R. GOETTER, 2013
Sites web, les bonnes pratiques, E. SLOÏM, 2010
Mémento HTML 5, R. RIMELÉ, 2014

Vous aimerez peut-être aussi