IFT1147
Programmation Serveur Web avec PHP Introduction à MySQL
IFT1147 - Introduction à MySQL 2
Base de donnée relationnelle
Une base de données relationnelle est composée de plusieurs tables possédant des relations logiques (théorie des ensembles) entre elles.
Chaque table possède plusieurs attributs.
Chaque ligne d’une table est un ensemble de valeurs pour les mêmes attributs.
IFT1147 - Introduction à MySQL 3
Exemple de table: Film
1952 Singing in the Rain
4
1960 Psycho
3
1990 Cyrano de Bergerac
2
1997 Les Boys
1
annee titre
filmID
Le filmID permet d’identifier chaque ligne de façon unique.
IFT1147 - Introduction à MySQL 4
Exemple de table: Acteur
1969-01-02 Patrick
Huard 6
1967-06-20 Nicole
Kidman 5
1932-04-04 Anthony
Perkins 4
1912-08-23 Gene
Kelly 3
1947-08-16 Marc
Messier 2
1948-12-27 Gerard
Depardieu 1
Naissance Prenom
Nom acteurID
IFT1147 - Introduction à MySQL 5
Exemple de table: Role
Cette table fait le lien entre les acteurs et les films.
IFT1147 - Introduction à MySQL 6
Contenu de la table Role
Ti-Guy 6
1
Don Lockwood 3
4
Norman Bates 4
3
Cyrano de Bergerac 1
2
Bob 2
1
Personnage acteurID
filmID
IFT1147 - Introduction à MySQL 7
MySQL et MySQL AB
MySQL est un serveur de base de données produit par MySQL AB qui peut, sous certaines conditions, être utilisé gratuitement (double licence).
Nous utiliserons la version 3.23
Le site Web de référence est http://www.mysql.com
IFT1147 - Introduction à MySQL 8
MySQL - limitations
La version 3.23 de MySQL dont nous nous servirons comporte plusieurs limitations
Aucun subselect n’est possible
Pas de support pour des foreign key
Pas de support pour des transactions
Pas de trigger, view, stored procedure
IFT1147 - Introduction à MySQL 9
Connexion
Le serveur MySQL est installé sur europa.iro.umontreal.ca et ne peut être accédé qu’à partir du domaine iro.umontreal.ca.
Votre nom d’usager MySQL est le même que votre login Unix, le mot de passe initial est celui de la recette Unix initiale.
IFT1147 - Introduction à MySQL 10
Connexion
Vous pouvez seulement créer des bases de données dont le nom débute par votre login suivi de _, par exemple dift1147_Cinema
Personne à part vous (et l’administrateur du serveur) ne possède de droits (même de consultation) sur vos bases de données.
Ligne de commande mysql
mysql est le logiciel de prédilection pour interagir avec le serveur MySQL.
Il est installé par défaut
Il est créé et supporté par MySQL AB
Il fonctionne sous tout système d’exploitation
D’autres logiciels incluent PHPMyAdmin, mysqlcc, MySQL Administrator, …
Connexion avec mysql
Afin que le client mysql puisse se connecter au serveur, vous devez lui donner le nom du serveur, votre nom d’usager et votre login
mysql -h europa.iro.umontreal.ca -u login -p
Le système vous demandera alors votre mot de passe.
IFT1147 - Introduction à MySQL 13
Lister les bases de données
show databases permet d’afficher la liste de toutes les bases de données du serveur.
Il y en a beaucoup … donc, afin de trouver les vôtres, il vaut mieux spécifier que le nom de celles que vous cherchez commence par votre login
show databases like ’dift1147_%’;
IFT1147 - Introduction à MySQL 14
Choisir une base de données
Afin de travailler avec une des bases de données, on utilise la commande use use dift1147_Cinema;
La prochaine étape est d’obtenir la liste des tables
show tables;
ou, comme précédemment
show tables like ’%toto% ’;
IFT1147 - Introduction à MySQL 15
La structure d’une table
Afin de connaître la liste des colonnes d’une table, on peut utiliser la commande
describe nomDeLaTable;
Et pour obtenir la commande SQL complète permettant de recréer la structure d’une table
show create table nomDeLaTable;
IFT1147 - Introduction à MySQL 16
Finalement, les données …
La commande SQL SELECT permet d’extraire les informations d’une ou plusieurs tables.
SELECT titre, annee FROM Film;
Si on veut obtenir toutes les colonnes SELECT * FROM Film;
IFT1147 - Introduction à MySQL 17
Avant d’aller plus loin
La casse n’a pas d’importance pour les mots clés SQL. Elle importe pour ce qui est des noms des tables !
Les retours à la ligne à l’intérieur d’une commande ne servent qu’à la lisibilité.
Afin que le client envoie une commande au serveur, elle doit être terminée par ; (ou par \G)
IFT1147 - Introduction à MySQL 18
Résultats distincts
Dans la table Film, plusieurs films peuvent porter le même titre.
SELECT titre FROM Film;
retournera alors des duplicats.
Si on ne souhaite pas obtenir de duplicats, il faut écrire
SELECT DISTINCT titre FROM Film;
IFT1147 - Introduction à MySQL 19
Limiter les résultats de SELECT
Les résultats retournés par SELECT peuvent être limités en utilisant WHERE SELECT titre, annee
FROM Film
WHERE annee = 1997;
SELECT * FROM Film WHERE titre LIKE ’P% ’;
IFT1147 - Introduction à MySQL 20
Ordonner les résultats de SELECT
ORDER BY ordonne les résultats. Les colonnes du tri n’ont pas besoin d’être affichées
SELECT titre FROM FILM ORDER BY annee ASC;
ORDER BY doit être utilisé après WHERE SELECT * FROM FILM
WHERE annee=1997 ORDER BY titre;
IFT1147 - Introduction à MySQL 21
Limiter - encore
De grandes bases de données contiennent des centaines de millions d’entrées. Il est inimaginable de toutes les afficher d’une seule fois.
Souvent, on n’a besoin que des 100 premières (selon l’ordre choisi). On peut alors utiliser LIMIT.
IFT1147 - Introduction à MySQL 22
Limiter - exemple
Voici comment afficher les 5 premiers films (en ordre alphabétique) qui ont été tournés en 1997
SELECT * FROM Film
WHERE annee = 1997 ORDER BY titre ASC LIMIT 5;
Nombre de lignes
Si on n’est pas vraiment intéressé au résultat d’une requête, mais seulement au nombre de lignes qu’elle retourne, il vaut mieux utiliser la fonction count (moins de transfert de données).
SELECT COUNT(*) AS nombre FROM Film
WHERE annee = 1997;
Quelques fonctions utiles
Afin de manipuler des chaînes de caractères, on peut utiliser (entre autres)
LEFT(colonne, nbChr)
RIGHT(colonne, nbChr)
CONCAT(chaine1, chaine2)
Dans la condition WHERE, on peut utiliser AND, OR, BETWEEN et ISNULL
IFT1147 - Introduction à MySQL 25
Plusieurs tables dans une requête
Le FROM d’une requête peut contenir plusieurs tables, séparées par des virgules.
SELECT *
FROM Acteur, Role
Le résultat de la requête est alors le produit cartésien des deux tables.
IFT1147 - Introduction à MySQL 26
Plusieurs tables - suite
La plupart du temps, on ne veut obtenir que les lignes « reliées » des deux tables, et non pas le produit cartésien au grand complet.
Il faut alors spécifier la relation dans le WHERE.
SELECT * FROM Acteur, Role
WHERE Acteur.acteurID=Role.acteurID;
IFT1147 - Introduction à MySQL 27
Plusieurs tables - ce n’est pas fini
Dans certains cas, seulement les lignes reliées entre deux tables ne sont pas non plus le résultat souhaité.
Que faire s’il faut obtenir tous les éléments d’une première table qui ne possèdent pas d’entrée dans une autre, par exemple tous les acteurs qui n’ont encore eu aucun role ?
IFT1147 - Introduction à MySQL 28
Plusieurs tables - LEFT JOIN
La clause LEFT JOIN permet de retourner toutes les entrées d’une première table avec, s’il y a correspondance, les entrées d’une deuxième, et NULL dans toutes les colonnes réservées à la deuxième table s’il n’y a pas de correspondance.
IFT1147 - Introduction à MySQL 29
LEFT JOIN - exemple
SELECT Acteur.*
FROM Acteur LEFT JOIN Role
ON Acteur.acteurID = Role.acteurID WHERE isnull(Role.acteurID);
Un LEFT JOIN est beaucoup plus lent à exécuter qu’un lien direct. À n’utiliser qu’en cas de besoin.
IFT1147 - Introduction à MySQL 30
Sauvegarde
Avant de modifier les données dans les tables, mieux vaut savoir créer une sauvegarde !
Le logiciel mysqldump est l’utilitaire nécessaire. Il prend les mêmes
arguments que le client mysql; de plus, on doit aussi spécifier le nom de la base de données à sauvegarder.
IFT1147 - Introduction à MySQL 31
Sauvegarde - côté pratique
La sauvegarde créée par mysqldump contient toutes les instructions SQL afin de recréer la base de données.
mysqldump -h europa -u dift1147 -p dift1147_Cinema > cinema.sql
Pour restaurer
mysql -h europa -u dift1147 -p dift1147_Cinema < cinema.sql
IFT1147 - Introduction à MySQL 32
Insérer de nouvelles données
La commande INSERT permet d’insérer de nouvelles données dans une table.
On peut spécifier les valeurs à insérer ou utiliser le résultat d’une requête.
INSERT INTO Film(titre, annee) VALUES (’LES Boys’, 1997);
INSERT INTO Film(titre, annee) SELECT titre, annee FROM Table;
IFT1147 - Introduction à MySQL 33
Effacer des données
La commande DELETE sert à effacer des données.
N’oubliez pas le WHERE, sinon, la table est vide instantanément !
Il n’y a pas de poubelle, ni de undo DELETE FROM Acteur
WHERE acteurID = 1;
IFT1147 - Introduction à MySQL 34
Modifier les données
On peut modifier les entrées d’une table avec la commande UPDATE.
De nouveau, mieux vaut ne pas oublier le WHERE
UPDATE Acteur
SET prenom = ’Gaston’,
naissance = ’1950-12-12’
WHERE acteurID = 1;
Créer la structure d’une table
On crée la structure d’une table avec la commande CREATE TABLE
Il faut spécifier
Le nom de la table
Pour chaque colonne, son nom et le type de données
Les clés (indices)
Type de colonnes
Les types de colonnes les plus usuels
VARCHAR(lon)
chaîne de caractères de longueur variable
INT
un entier entre -2147483648 et 2147483647
SMALLINT
un entier entre -32768 and 32767
DATE
une date en format AAAA-MM-JJ
IFT1147 - Introduction à MySQL 37
Clés et indices
Clé et indice sont des synonymes pour MySQL
On se sert des clés pour
Empêcher des duplicats
Accélérer les recherches
Il existe trois clés: clé primaire (primary key), clé unique (unique key) et la clé (key).
IFT1147 - Introduction à MySQL 38
Clés - suite
Une table ne peut posséder qu’une seule clé primaire.
Une clé primaire est une clé unique particulière: la différence se situe au niveau du traitement des valeurs nulles.
Une clé unique empêche les duplicats.
Une clé sert à accélérer les recherches.
IFT1147 - Introduction à MySQL 39
Clés - quand les utiliser
Chaque table devrait avoir une clé primaire.
Une colonne qui est souvent utilisée dans un WHERE devrait avoir une clé.
Les clés utilisent de l’espace disque et ralentissent les insertions (et parfois les modifications) … il ne faut donc pas exagérer.
IFT1147 - Introduction à MySQL 40
Création d’une table - exemple
CREATE TABLE Acteur (
acteurID INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
nom varchar(40) NOT NULL, prenom varchar(40) NOT NULL, naissance DATE NOT NULL, PRIMARY KEY(acteurID), KEY nom(nom)
);
IFT1147 - Introduction à MySQL 41
Modifications de la structure
On peut aussi modifier la structure d’une table une fois qu’elle a été créée
Les commandes sont de la forme ALTER TABLE nomTable
Effacer une colonne ALTER TABLE nomTable DROP COLUMN nomColonne;
IFT1147 - Introduction à MySQL 42
Modifications de la structure
Ajouter une clé
ALTER TABLE nomTable ADD key(nomCol, nomCol2);
Ajouter une colonne ALTER TABLE nomTable
ADD COLUMN nomCol VARCHAR(40) AFTER autreCol;