Vous êtes sur la page 1sur 32

Implémentation d’une BD

sur MySQL
et initiation au SQL

UCAD/FST/DMI/LPCM

M. DIENG Abdoulaye Mars 2011


Sommaire
1. Qu’est ce que MySQL?
2. Qu’est ce que SQL?
3. Création et sélection d’une BD
4. Création d’une table
Les types de données MySQL
5. Maintenance d’une table
6. Insertion de données
7. Mise à jour et suppression de données
8. Consultation de données
9. Droits d’accès aux données
MySQL
késako?
• Système de gestion de base de données relationnelles.
• Logiciel permettant de créer des bases de données, de les
exploiter (en y effectuant notamment des recherches des
modifications ou des tris) et de contrôler l’accès aux données.
• Ses principaux concurrents sont PostgreSQL, MS SQL Server,
DB2 et Oracle mais ses atouts majeurs sont:
 performances élevées;
 coût réduit et accessibilité du code source;
 simplicité de configuration et d’apprentissage;
 portabilité;
 communication aisée avec la plupart des langages de
programmation (C, C++, VB, C#, PHP, Python, Java, Perl, ...)
 Wikipedia, Google, Yahoo!, Youtube, Adobe, Airbus, AFP,
Reuters, BBC News, Alcatel-Lucent utilisent tous MySQL.
MySQL
historique
• 1994 : l’entreprise australienne Hugues Technologies développe
le SGBD mSQL (mini-SQL).
• Mai 1995 : la société suédoise MySQL AB crée la 1ère version de
MySQL à partir de mSQL.
• Juin 2000 : MySQL passe en licence GPL avec sa version 3.
• Mars 2003 : stabilisation de la version 4 avec le moteur
transactionnel InnoDB
• Octobre 2005 : stabilisation de la version 5 et rachat du moteur
transactionnel InnoDB par Oracle Corporation.
• Avril 2007 : première version alpha de la version 6 avec
intégration du moteur transactionnel Falcon (alternative libre
d’innoDB)
• Janvier 2008 : rachat de MySQL AB par Sun Microsystems
• Avril 2009 : rachat de Sun Microsystems par Oracle Corporation
approuvé en janvier 2010 par la commission européenne.
MySQL
connexion au serveur
• MySQL fonctionne en mode client-serveur.
• Avec EasyPHP, il y a +ieurs manières de se connecter au serveur:
 en ligne de commande
1) Lancer la console DOS en cliquant sur exécuter du menu démarrer.
2) Se mettre sur le répertoire des exécutables de mysql :
cd C:\Program Files\EasyPHP1-8\mysql\bin
3) Taper mysql –u root –h localhost
pour que le client mysql se connecte au serveur mysql local
(localhost) avec l’utilisateur root (administrateur) sans mot de passe
 avec l’interface graphique PhPMyAdmin
click droit sur l’icône d’EasyPHP>administration>Gestion BDD
 avec des scripts (écrit en PHP par exemple)
$id_cnx=mysql_connect('localhost', 'root', '')
• Dans tous les cas, une fois la connexion au serveur établie, la
communication se fait avec un langage appelé SQL (Structured
Query Language)
SQL
késako?
• SQL (Structured query language ou langage structuré de
requêtes) est un pseudo-langage informatique (de type
requête) standard et normalisé (documenté).
• SQL est destiné à créer, à manipuler et à contrôler une base
de données relationnelle avec :
– un langage de définition de données (LDD);
– un langage de manipulation de donnée (LMD);
– un langage de contrôle de données (LCD);
– un langage de contrôle des transactions (LCT).
• Ce cours se focalisera sur les trois premiers langages.
• SQL est adopté par les principaux SGBDR (DB2, Microsoft
Access, MySQL, PostgreSQL, Oracle, …)
SQL
historique
• 1970 : Edgar Codd d’IBM crée le modèle relationnel qui inspira
le développement du langage SEQUEL (Structured English Query
Language ou langage d'interrogation structuré en anglais).
• 1975 : Donald Chamberlain et Raymond Boyce d’IBM
contractent le SEQUEL en SQL
• 1986 : première norme SQL1
• 1992 : SQL2 = SQL1 + de nouvelles instructions (ex : JOIN)
• 1999 : SQL3 = SQL2 + approche orienté objet
• 2003 : SQL2003 = SQL3 + quelques modifications mineures
(ex: SQL/XML)
• 2008 : SQL2008 = SQL2003 + quelques modifications mineures
(ex: limitation du nbr de lignes sélectionnées OFFSET/FETCH)
Les identificateurs de MySQL
• Un identificateur est un nom donné à une base de données,
une table, un attribut ou un alias.
• Un identificateur est formé de lettres alphabétiques et de
chiffres ainsi que du caractère _ (espace souligné) permettant
une plus grande lisibilité.
• Il comporte au maximum 64 caractères donc doit être explicite
• Les bases de données et les tables sont codées directement
dans le système de fichiers : Windows n’est pas sensible à la
casse de MySQL, tandis que Unix l’est.
• Le point « . » est un caractère réservé utilisé comme séparateur
entre le nom d’une base et celui d’une table ou entre le nom
d’une table et celui d’un attribut.
• Eviter d’utiliser les mots réservés du SQL ou du MySQL comme
identificateur
Création et sélection d’une BD
• Avec MySQL, les bases de données sont implémentées
comme des répertoires contenant des fichiers qui
correspondent aux tables dans les bases de données.
• Une base de données se crée avec :
CREATE DATABASE [IF NOT EXISTS] nom_de_la_base;
• La création d'une base de données ne la sélectionne pas pour
l'utilisation ; il faut le faire explicitement avec:
USE nom_de_la_base;
• Une base de données est détruite par:
DROP DATABASE [IF EXISTS] nom_de_la_base;
Création d’une table
syntaxe
CREATE TABLE [IF NOT EXISTS] nomTable(
nomAttribut1 typeAttribut1 [NOT NULL][AUTO_INCREMENT],
nomAttribut2 typeAttribut2 [NOT NULL],

PRIMARY KEY(nomattribut1[,nomattribut2, …]) );
• NOT NULL force l’attribut à prendre une valeur de son domaine.
• AUTO_INCREMENT s’applique à un entier qui sera augmenté de
1 à chaque nouvelle insertion.
• PRIMARY KEY : précise la ou les colonnes composant la clef
primaire (identifiant unique) de la table.
ATTENTION : nécessite que chaque colonne concourant à la clef
soit NOT NULL.
Création d’une table
avec une clé étrangère
• On appelle « clé étrangère » (foreign key) une colonne ou une
combinaison de colonnes utilisée pour établir et conserver une
liaison entre les données de deux tables.
• Avec MySQL, les deux tables doivent être de type InnoDB.
• Exemple :
CREATE TABLE parent(id_p INT NOT NULL, nom_p VARCHAR(20)
prenom_p VARCHAR(20),PRIMARY KEY(id_p)) TYPE=INNODB;
CREATE TABLE fille(id_f INT, parent_id INT, prenom_f VARCHAR(20)
PRIMARY KEY (id_f), FOREIGN KEY (parent_id) REFERENCES parent(id_p)
ON DELETE CASCADE ON UPDATE CASCADE
) TYPE=INNODB;
• ON DELETE CASCADE (resp. ON UPDATE CASCADE) indique qu'en
cas de suppression (resp. modification) d'une ligne de la table
parente, InnoDB va automatiquement effacer (resp. modifier)
toute les lignes de la table fille qui sont liées à cette ligne.
Création d’une table
Types de données MySQL (les petits entiers)
• TINYINT[(M)] [UNSIGNED] [ZEROFILL] 1 octet
Très petits entiers signés [ -128 ; 127]
ou non-signés [ 0 ; 255]

• SMALLINT[(M)] [UNSIGNED] [ZEROFILL] 2 octets


Petits entiers signés [ -32 768 ; 32 767]
ou non-signés [ 0 ; 65 535]

M indique la taille de l’affichage.


UNSIGNED accepte uniquement des nombres positif.
ZEROFILL permet d'ajouter éventuellement des zéros (à
gauche) à l'affichage pour avoir le nombre de caractères
spécifié par M.
En spécifiant ZEROFILL pour une colonne, MySQL ajoutera
automatiquement l'attribut UNSIGNED à la colonne.
Création d’une table
Types de données MySQL (les entiers)
• MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] 3 octets
Entiers signés [-8 388 608 ; 8 388 607]
ou non-signés [ 0 ; 16 777 215]

• INT[(M)] [UNSIGNED] [ZEROFILL] 4 octets


Grands entiers signés [-2 147 483 648 ; 2 147 483 647]
ou non-signés [ 0 ; 4 294 967 295]

• BIGINT[(M)] [UNSIGNED] [ZEROFILL] 8 octets


Très grands entiers
signés [-9 223 372 036 854 775 808 ;
9 223 372 036 854 775 807 ]
ou non-signés [ 0 ; 18 446 744 073 709 551 615 ]
Création d’une table
Types de données MySQL (les réels)
• FLOAT(précision) [ZEROFILL] 4 ou 8 oct
Nombre à virgule flottante avec
simple précision (si précision <=24)
ou double précision (si précision est entre 25 et 53).

• FLOAT[(M,D)] [ZEROFILL] 4 octets


Nombre à virgule flottante, en précision simple.
Les valeurs possibles vont de
-3.402823466E+38 à 3.402823466E+38.

M indique la taille de l'affichage


D est le nombre de décimales.
Création d’une table
Types de données MySQL (les réels)
• DOUBLE[(M,D)] [ZEROFILL] 8 octets
Nombre à virgule flottante, en précision double.
Les valeurs possibles vont de
-1.7976931348623157E+308 à 1.7976931348623157E+308.

• DECIMAL[(M[,D])] [ZEROFILL]
Nombres à virgule flottante stockés comme des chaînes de
caractères.
Occupe M+2 octets si D > 0, M+1 octets si D = 0
Création d’une table
Types de données MySQL (le temps)

• DATE 3 octets
Stocke une date au format 'AAAA-MM-JJ'
allant de '1000-01-01' à '9999-12-31‘

• DATETIME 8 octets
Stocke une date et une heure au format
'AAAA-MM-JJ HH:MM:SS' allant de
'1000-01-01 00:00:00' à '9999-12-31 23:59:59'
Création d’une table
Types de données MySQL (le temps)

• TIMESTAMP [M] 4 octets


Stocke une date sous forme numérique allant de
'1970-01-01 00:00:00' à l'année 2037.
L'affichage dépend des valeurs de M : AAAAMMJJHHMMSS,
AAMMJJHHMMSS, AAAAMMJJ, ou AAMMJJ pour M égal
respectivement à 14 (ou absent), 12, 8, et 6

• TIME 3 octets
Stocke l'heure au format 'HH:MM:SS',
allant de '-838:59:59' à '838:59:59‘

• YEAR[(4|2)] 1 octet
Stocke l’année à 4 (par défaut) ou 2 chiffres allant de 1901 à
2155 ( 4 chiffres) et de 1970-2069 (2 chiffres).
Création d’une table
Types de données MySQL (les caractères)

• CHAR (M) [BINARY]


Stocke une chaîne de caractère de taille fixe M (de 0 à 255).
BINARY permet de tenir compte de la casse.

• VARCHAR (M) [BINARY]


Stocke des chaînes de 255 caractères maximum.
Économise de l’espace mémoire mais ralentit la recherche.

• TINYBLOB et TINYTEXT
Stockent des fichiers ou du texte de 255 caractères maximum.
Le 1er aura un contenu de type binaire (sensible à la casse)
Le 2nd aura un contenu de type ASCII (insensible à la casse)
• BLOB et TEXT
Stockent des fichiers ou du texte de 65 535 caractères
maximum.
Création d’une table
Types de données MySQL (les caractères)

• MEDIUMBLOB et MEDIUMTEXT
Stockent des fichiers ou du texte de 16 777 215 caractères
maximum.
• LONGBLOB et LONGTEXT
Stockent des fichiers ou du texte de 4 294 967 295 caractères
maximum.

• ENUM('valeur_possible1','valeur_possible2', ...)
Énumération de valeurs. Une valeur parmi 65535.
• SET('valeur_possible1','valeur_possible2', ...)
Ensemble de valeurs. Une ou plusieurs valeurs parmi 64.
• NB 1 : On peut donc associer ENUM aux champs de
type radio , et SET aux champs de type checkbox;
• NB 2 : Ces deux types peuvent contenir des valeurs null.
Maintenance d’une table
• Suppression de table :
DROP TABLE nom_table;
• Ajouter un attribut :
ALTER TABLE nom_table ADD definition [First|After attribut]
• Supprimer un attribut :
ALTER TABLE nom_table DROP attribut
• Modifier la définition d’un attribut:
ALTER TABLE nom_table ALTER attribut nouvelle_definiton
• Changer la valeur par défaut d’un attribut:
ALTER TABLE nom_table ALTER attribut {SET DEFAULT valeur}
• Créer une clé primaire :
ALTER TABLE nom_table ADD PRIMARY KEY (attribut)
• Supprimer une clé primaire :
ALTER TABLE nom_table DROP PRIMARY KEY
Insertion de données
INSERT INTO nom_table
[(nomattribut1,...,nomattributN)]
VALUES (valeur1,...,valeurN),
[(autre_valeur1,...,autre_valeurN)];
• Les attributs qui ne sont pas mentionnés prendront
leur valeur par défaut.
• Si les noms d’attributs sont omis il faut fournir une
valeur pour toute les colonnes dans l'ordre dans
lequel elle ont été spécifiées lors de la création de la
table.
• Les valeurs chaînes de caractère sont entre '…'.
Màj et suppression de données
• Syntaxe de mise à jour de données:
UPDATE nom_table
SET nom_col1=new_valeur1, nom_col2=new_valeur2, …
[WHERE prédicat]
• Syntaxe de suppression de données
DELETE FROM nom_table
[WHERE prédicat]
• WHERE ,clause de filtre, introduit un prédicat (1 ou +sieurs
expressions conditionnelles) pour spécifier les enregistrements
à modifier ou à supprimer.
• ATTENTION : Si WHERE est omise, les modif. ou suppressions
sont appliquées à la totalité des enregistrements de la table.
consultation de données
syntaxe
SELECT [DISTINCT] * ou liste_de_champs (séparés par ,)
FROM nom_table [WHERE prédicat]
[GROUP BY critère_de_regroupement
HAVING prédicat]
[ORDER BY liste_de_colonnes (séparés par ,)]
[LIMIT nbr_de_lignes_à_retourner [OFFSET nbr_lignes_à_ignorer]]
• * sélectionne tous les champs de la table
• DISTINCT élimine les doublons dans le résultat
• WHERE introduit un prédicat pour spécifier les enregistrements
à sélectionner.
• GROUP BY permet de définir des regroupements
d’enregistrements afin d’effectuer des calculs statistiques.
• HAVING (filtre après sélection) spécifie un prédicat sur des
groupes d'enregistrements générés par la clause GROUP BY ou
des fonctions d’agrégat.
consultation de données
syntaxe(suite et fin)
• ORDER BY permet de trier (ASC par défaut ou DESC) les lignes du
résultat en fonction d’une ou ide +sieurs colonne(s) listée(s) dans
la SELECT.
• LIMIT et OFFSET permettent de ne récupérer qu'une partie des
lignes engendrées par le reste de la requête.
• LIMIT spécifie le nombre de lignes à retourner depuis le début du
jeu de résultat.
• OFFSET indique le nombre de lignes à ignorer depuis le début du
jeu de résultat.
• Lors de l'utilisation de LIMIT, il est nécessaire d'utiliser une
clause ORDER BY contraignant les lignes résultantes dans un
ordre unique.
• LIMIT et OFFSET sont très utiles pour afficher un catalogue
volumineux en plusieurs pages.
consultation de données
prédicat (1/2)
Pour exprimer un prédicat on peut utiliser:
• les opérateurs arithmétiques : +,-,*,/,% ;
• les opérateurs booléens : AND, OR, NOT ;
• les opérateurs de comparaison : =, != (ou < >), <, >, <=, >= ;
• IS [ NOT ] NULL pour tester si la valeur est NULL (vide) ou
non;
• [ NOT ] EXIST ( SELECT ... ) pour tester si la sélection renvoi
quelque chose ou non;
• [ NOT ] BETWEEN val_1 AND val_2 pour tester si la valeur est
entre val_1 et val_2 (incluses)
consultation de données
prédicat (2/2)
• [ NOT ] IN (var_1, var_2, ...) / [ NOT ] IN ( SELECT ... ) pour
tester si la variable est dans la liste/sous-requête
• operateur ALL (var_1, var_2, ...) / operateur ALL ( SELECT ... )
pour tester si la valeur est <, >, <=, >= à toutes les valeurs de la
liste/sous-requête
• operateur ANY (var_1, var_2, ...) / operateur ANY ( SELECT ... )
pour tester si la valeur est <, >, <=, >= à au moins une valeur de
la liste/sous-requête
• [ NOT ] LIKE '%chaîne_%' pour tester si la variable ressemble
ou non à la chaîne
– '%' remplace une chaîne
– '_' remplace un caractère
consultation de données
fonctions d’agrégat

• SELECT COUNT(*) FROM nom_table


Compte le nombre d’enregistrement de nom_table
– count(*) : compte aussi les valeurs NULL (vide) ;
– count(attribut) : compte seulement les valeurs non NULL ;
– count(distinct attribut) : une valeur est comptée une seule fois
• SELECT MAX(attribut) FROM nom_table
Renvoie La valeur la plus grande de l’attribut spécifié
• SELECT MIN(attribut) FROM nom_table
Renvoie La valeur la plus petite de l’attribut spécifié
• SELECT AVG(attribut) FROM nom_table
Renvoie la moyenne sur toutes les valeurs de l’attribut spécifié
• SELECT SUM(attribut) FROM nom_table
Renvoie la somme de toutes les valeurs de l’attribut spécifié.
consultation de données
jointure
• Une jointure consiste à faire une sélection de données sur
plusieurs tables.
• Les tables concernées doivent avoir chacune au moins une
colonne contenant un même type d’information
• Syntaxe:
SELECT col1, t1.col2 [AS] alias1col2,
t2.col2 [AS] alias2col2, col3, col4, ...
FROM table1 [AS] t1, table2 [AS] t2, ...
WHERE prédicat_de_jointure
• La condition de jointure est de la forme :
table1.colX = table2.colY ou t1.colX=t2.colY
dans laquelle colX et colY contiennent des données
représentant la même information
• Utiliser éventuellement et optionnellement le mot clé AS
pour renommer des colonnes ou des tables lors de la
consultation de données
jointure avec JOIN
• Un prédicat de jointure faite dans la clause WHERE ne permet
pas de faire la distinction entre ce qui relève du filtrage
(restriction) et ce qui relève de la jointure (extension).
• D’où une autre syntaxe de la jointure :
SELECT col1, t1.col2 [AS] alias1col2,
t2.col2 [AS] alias2col2, col3, col4, …
FROM table1 [AS] t1
[INNER]JOIN table2 [AS] t2, …
ON prédicat_de_jointure ou bien USING (colonne(s) de jointure)
WHERE prédicat_de_filtre
• Le mot clef INNER (facultatif) désigne que seules les lignes
comportant une valeur qui existe dans toutes les tables jointes
seront incluses dans les opérations de la requête.
consultation de données
jointure externe
• La jointure externe permet de prendre aussi en compte, dans
le résultat, les lignes qui n’ont pas de valeur sur les colonnes
de jointure.
• Syntaxe:
SELECT col1, t1.col2 [AS] alias1col2,
t2.col2 [AS] alias2col2, col3, col4, …
FROM table1 [AS] t1
LEFT | RIGHT | FULL [OUTER] JOIN table2 [AS] t2, …
ON prédicat_de_jointure ou USING (colonne(s) de jointure)
WHERE prédicat_de_filtre
• Les mots clefs LEFT, RIGHT et FULL indiquent la manière dont
le moteur de requête doit effectuer la jointure externe.
• LEFT/RIGHT -> la table située à gauche/droite du mot
clef JOIN
• FULL indique que la jointure externe est bilatérale.
consultation de données
jointure externe (exemple)
• Supposons qu’on rajoute les ethnies « Soussou » et
« Bambara » dans la table « ethnies » et que l’on souhaite
afficher les ethnies qui n’ont pas de membre dans la table
« personnes ».
• On rappelle que les tables « ethnies » et « personnes » sont
liées

• La requête à exécuter est la suivante :


SELECT e.nom AS ethnies_pas_representees
FROM ethnies AS e
LEFT JOIN personnes AS p
USING (id_eth)
WHERE p.id_eth is NULL
Droits d’accès aux données
• Syntaxe pour donner des privilèges :
GRANT droit1 [(liste_colonnes)] [, droit2 [(liste_colonnes)] ...]
ON {nom_de_table | * | nom_base.*}
TO nom_utilisateur1 [IDENTIFIED BY 'password']
[, nom_utilisateur2 [IDENTIFIED BY 'password'] ...]
[WITH GRANT OPTION];
• Les droits sur une table sont SELECT , INSERT , UPDATE , DELETE ,
CREATE , DROP , GRANT OPTION , INDEX et ALTER .
• Les droits sur une colonne sont SELECT , INSERT et UPDATE .
• Si une base est sélectionnée, ON * donne des droits sur elle.
• Si aucune base n’est sélectionnée, ON * affecte les droits sur le serveur
• nom_utilisateur est généralement sous la forme user@'host'
• La clause WITH GRANT OPTION, est utilisée pour autoriser la
transmission des droits.
• Syntaxe pour supprimer des privilèges :
REVOKE droit1 [(liste_colonnes)] [, droit2 [(liste_colonnes)] ...]
ON {nom_de_table | * |nom_base.*}
FROM nom_utilisateur1 [, nom_utilisateur2 ...]

Vous aimerez peut-être aussi