Base de donnée relationnelle Exemple de table

Transcription

Base de donnée relationnelle Exemple de table
Base de donnée relationnelle
IFT1147
Programmation Serveur Web avec PHP
 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.
Introduction à MySQL
IFT1147 - Introduction à MySQL
Exemple de table: Film
filmID
1
2
3
4
titre
Les Boys
annee
1997
Cyrano de Bergerac
Psycho
Singing in the Rain
1990
1960
1952
Exemple de table: Acteur
 Le filmID permet d’identifier chaque
ligne de façon unique.
IFT1147 - Introduction à MySQL
acteurID
1
2
3
Nom
Depardieu
Messier
Kelly
Prenom
Gerard
Marc
Gene
Naissance
1948-12-27
1947-08-16
1912-08-23
4
Perkins
Anthony
1932-04-04
5
Kidman
Nicole
1967-06-20
6
Huard
Patrick
1969-01-02
3
IFT1147 - Introduction à MySQL
Exemple de table: Role
4
Contenu de la table Role
 Cette table fait le lien entre les acteurs
et les films.
IFT1147 - Introduction à MySQL
2
5
filmID
1
2
acteurID Personnage
2
Bob
1
Cyrano de Bergerac
3
4
1
4
3
6
Norman Bates
Don Lockwood
Ti-Guy
IFT1147 - Introduction à MySQL
6
1
MySQL et MySQL AB
MySQL - limitations
 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
 La version 3.23 de MySQL dont nous
nous servirons comporte plusieurs
limitations




7
Connexion
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
8
Connexion
 Le serveur MySQL est installé sur
europa.iro.umontreal.ca et ne
peut être accédé qu’à partir du domaine
iro.umontreal.ca.
 Vous pouvez seulement créer des bases
de données dont le nom débute par
votre login suivi de _, par exemple
dift1147_Cinema
 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.
 Personne à part vous (et l’administrateur
du serveur) ne possède de droits (même
de consultation) sur vos bases de
données.
IFT1147 - Introduction à MySQL
9
Ligne de commande mysql


Il est installé par défaut
Il est créé et supporté par MySQL AB
Il fonctionne sous tout système
d’exploitation
 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.
 D’autres logiciels incluent PHPMyAdmin,
mysqlcc, MySQL Administrator, …
IFT1147 - Introduction à MySQL
10
Connexion avec mysql
 mysql est le logiciel de prédilection pour
interagir avec le serveur MySQL.

IFT1147 - Introduction à MySQL
11
IFT1147 - Introduction à MySQL
12
2
Lister les bases de données
Choisir une base 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
13
La structure d’une table
IFT1147 - Introduction à MySQL
14
 La commande SQL SELECT permet
d’extraire les informations d’une ou
plusieurs tables.
SELECT titre, annee
FROM Film;
describe nomDeLaTable;
 Et pour obtenir la commande SQL
complète permettant de recréer la
structure d’une table
 Si on veut obtenir toutes les colonnes
SELECT * FROM Film;
show create table nomDeLaTable;
15
Avant d’aller plus loin
IFT1147 - Introduction à MySQL
16
Résultats distincts
 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
 La prochaine étape est d’obtenir la liste
des tables
show tables;
ou, comme précédemment
show tables like ’%toto% ’;
Finalement, les données …
 Afin de connaître la liste des colonnes
d’une table, on peut utiliser la
commande
IFT1147 - Introduction à MySQL
 Afin de travailler avec une des bases de
données, on utilise la commande use
use dift1147_Cinema;
 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;
17
IFT1147 - Introduction à MySQL
18
3
Limiter les résultats de SELECT
Ordonner 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;
 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;
SELECT * FROM Film
WHERE titre LIKE ’P% ’;
IFT1147 - Introduction à MySQL
19
IFT1147 - Introduction à MySQL
Limiter - encore
Limiter - exemple
 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
 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;
21
IFT1147 - Introduction à MySQL
Nombre de lignes
22
Quelques fonctions utiles
 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;
IFT1147 - Introduction à MySQL
20
 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
23
IFT1147 - Introduction à MySQL
24
4
Plusieurs tables dans une requête
Plusieurs tables - suite
 Le FROM d’une requête peut contenir
plusieurs tables, séparées par des
virgules.
SELECT *
FROM Acteur, Role
 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.
 Le résultat de la requête est alors le
produit cartésien des deux tables.
IFT1147 - Introduction à MySQL
SELECT * FROM Acteur, Role
WHERE Acteur.acteurID=Role.acteurID;
25
 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 ?
27
LEFT JOIN - exemple
 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
28
Sauvegarde
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
26
Plusieurs tables - LEFT JOIN
Plusieurs tables - ce n’est pas fini
IFT1147 - Introduction à MySQL
IFT1147 - Introduction à MySQL
29
 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
30
5
Sauvegarde - côté pratique
Insérer de nouvelles données
 La sauvegarde créée par mysqldump
contient toutes les instructions SQL afin
de recréer la base de 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.
mysqldump -h europa -u dift1147
-p dift1147_Cinema > cinema.sql
INSERT
VALUES
INSERT
SELECT
 Pour restaurer
mysql -h europa -u dift1147
-p dift1147_Cinema < cinema.sql
IFT1147 - Introduction à MySQL
31
IFT1147 - Introduction à MySQL
Effacer des 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;
33
IFT1147 - Introduction à MySQL
Créer la structure d’une table


 Les types de colonnes les plus usuels

Le nom de la table
Pour chaque colonne, son nom et le type de
données
Les clés (indices)



IFT1147 - Introduction à MySQL
34
Type de colonnes
 On crée la structure d’une table avec la
commande CREATE TABLE
 Il faut spécifier

32
Modifier les 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
INTO Film(titre, annee)
(’LES Boys’, 1997);
INTO Film(titre, annee)
titre, annee FROM Table;
35
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
36
6
Clés et indices
Clés - suite
 Clé et indice sont des synonymes pour
MySQL
 On se sert des clés pour


 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.
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
37
Clés - quand les utiliser
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)
);
 Les clés utilisent de l’espace disque et
ralentissent les insertions (et parfois les
modifications) … il ne faut donc pas
exagérer.
39
Modifications de la structure
IFT1147 - Introduction à MySQL
40
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
38
Création d’une table - exemple
 Chaque table devrait avoir une clé
primaire.
 Une colonne qui est souvent utilisée
dans un WHERE devrait avoir une clé.
IFT1147 - Introduction à MySQL
IFT1147 - Introduction à MySQL
41
 Ajouter une clé
ALTER TABLE nomTable
ADD key(nomCol, nomCol2);
 Ajouter une colonne
ALTER TABLE nomTable
ADD COLUMN nomCol VARCHAR(40)
AFTER autreCol;
IFT1147 - Introduction à MySQL
42
7