Professional Documents
Culture Documents
Facult des Sciences et Techniques Fs Dpartement de Gnie Industriel Master Sciences et Techniques en Gnie Industriel Professeur : F. Kaghat
Introduction
SQL : Structured Query Language (langage structur de requtes) est un langage de requte vers les bases de donnes exploitant le modle relationnel. Chaque SGBD important utilise SQL, et MySQL ne fait pas exception la rgle. SQL a t cr au dbut des annes 70 daprs la thorie des bases de donnes relationnelles, labore par E. F. Godd. Le serveur de base de donnes MySQL est trs souvent utilis avec le langage de cration de pages web dynamiques : PHP.
Dpartement de Gnie Industriel 3
Sommaire
Conception dune table Le moniteur mysql Cration de bases de donnes et de tables Insertion denregistrements Slection de donnes Affichages conditionnels LIKE et NOT LIKE Tri des rsultats de recherche Limitation du nombre de rsultats affichs Mise jour des donnes Suppression denregistrements
Dpartement de Gnie Industriel 4
On va crer une base de donnes quon appellera ma_base et dans laquelle seront conserves des informations concernant des enregistrements dutilisateurs. Elle contiendra une unique table, utilisateurs, compose de plusieurs colonnes destines conserver lidentificateur personnel de lutilisateur, son nom, son prnom, son adresse e-mail, son mot de passe et la date laquelle il sest enregistr. Le nom des colonnes respecte les rgles de grammaire de SQL : noms alphanumriques sans espace avec le blanc soulign (_) possible.
Dpartement de Gnie Industriel 6
Il faut dterminer le type de donnes de chacun des champs qui seront utiliss car il faudra lindiquer lors de la cration de la structure de la base. Pour tout SGBD, il existe 3 catgories principales de donnes: Texte; Nombres; Dates et heures. A lintrieur de chacune de ces catgories, il existe plusieurs variantes, certaines propres MySQL. Le choix de la catgorie la plus approprie a un impact non seulement sur le type des informations pouvant tre conserv mais aussi sur les performances dexploitation ultrieures. Dpartement de Gnie Industriel 8
SMALLINT
SMALLINT UNSIGNED MEDIUMINT MEDIUMINT UNSIGNED INT* INT* UNSIGNED BIGINT
-32768
0 -8388608 0 -2147483648 0 -9223372036854775808
32767
65535 8388607 16777215 2147483647 4294967295 9223372036854775807
BIGINT UNSIGNED
(*) : INTEGER est un synonyme de INT
18446744073709551615
9
Les flottants dits aussi nombres rels sont des nombres virgule. Contrairement aux entiers, leur domaine nest pas continu du fait de limpossibilit de les reprsenter avec une prcision absolue.
nom domaine ngatif : borne infrieure borne suprieure
-3.402823466E+38 -1.175494351E-38 -1.7976931348623157E+308 -2.2250738585072014E-308
FLOAT DOUBLE*
CHAR(M) BINARY
VARCHAR(M)
VARCHAR(M) BINARY
11
Les types TINYTEXT, TEXT, MEDIUMTEXT et LONGTEXT peuvent tre judicieusement remplacs respectivement par TINYBLOB, BLOB, MEDIUMBLOB et LONGBLOB. Ils ne diffrent que par la sensibilit la casse qui caractrise la famille des BLOB. Alors que la famille des TEXT sont insensibles la casse lors des tris et recherches. Les BLOB peuvent tre utiliss pour stocker des donnes binaires. Les VARCHAR, TEXT et BLOB sont de taille variable. Alors que les CHAR et DECIMAL sont de taille fixe.
Dpartement de Gnie Industriel 13
TIMESTAMP(10) TIMESTAMP(12)
TIMESTAMP(14)
AAMMJJHHMM AAMMJJHHMMSS
AAAAMMJJHHMMSS
18
19
Remarques
Les types ENUM et SET sont ne extension de MySQL et nexistent donc pas dans tous les SGBD. Leur emploi limite donc la potabilit dune base de donnes. Lorsquon place une chane de caractres de cinq caractres dans un champ char (2), les trois derniers caractres sont perdus. Cest la mme chose pour tous les champs dont la longueur est dfinie lavance.
20
Dcider du type de donner que contiendra une colonne (tape facile et vidente)
Les nombres (les codes postaux, les prix, ) seront des zones de texte si on choisit de les conserver avec leur ponctuation (caractre euro, tirets, espace), mais on obtiendra de meilleures performances si on les conserve sous forme numrique (on les mettra en forme au moment de leur utilisation). Notre exemple :
Le champ id_utilisateur (qui est numrique) sera un MEDIUMINT (environ 17 millions de valeurs sous forme non signe). La date denregistrement (date_enreg) sera un DATETIME (conserver la date et lheure). Les autres champs seront le plus souvent des VARCHAR puisque leur longueur peut varier dun enregistrement lautre. Le mot de passe sera une chane de caractres de longueur fixe.
Dpartement de Gnie Industriel 22
Dfinir la longueur des zones de texte et des colonnes devant contenir des nombres ainsi que les autres attributs (UNSIGNED ou NOT NULL par exemple). La taille dun champ doit tre choisie la plus petite possible daprs la plus grande valeur quon prvoit dy conserver. Par exp. si le champ id_utilisateur na que 3 chiffres : dfinir la colonne qui le recevra comme un SMALLINT, (ce qui permet de loger 999 utilisateurs). Il sera videmment du type non sign . Dans notre exemple : tous les champs doivent tre renseigns (ils ne peuvent pas avoir la valeur NULL), sauf en ce qui concerne ladresse e-mail.
Dpartement de Gnie Industriel 24
email
mot_de_passe
VARCHAR (40)
CHAR (16) NOT NULL
date_enreg
Le moniteur mysql
Le moniteur mysql
A part lusage de PHP, la faon la plus courante dadresser la serveur MySQL est de passer par le client mysql (aussi appel le moniteur mysql). Avec lui, il est possible de se connecter mysqld (la vritable application, qui contrle les bases de donnes) sur la mme machine ou sur une autre. Il ne faut pas confondre mysql avec MySQL, lequel est le systme de bases de donnes considr dans son ensemble. Sous Windows : on accde au client mysql au moyen dune fentre DOS. Sous Mac OS X ou Linux : Utiliser lapplication Terminal pour cela.
Dpartement de Gnie Industriel 27
Le moniteur mysql
Le client mysql utilise plusieurs arguments parmi lesquels le nom dutilisateur, le mot de passe et le nom de lordinateur hte : Mysql -u nom_d_utilisateur -p -h ordinateur_hte Prsence de loption -p : mysql demandera le mot de passe. Mais on peut spcifier ce dernier sur la ligne de commande en le tapant immdiatement aprs -p. Cette procdure est moins scurise car tout le monde pourra ainsi le voir. Sous mysqld, chaque commande MySQL doit se terminer par un point-virgule (;). On peut donc poursuivre la frappe dune mme commande sur plusieurs lignes conscutives.
Le moniteur mysql
Fonctionnement en ligne de commande (sous Windows): 1. On se place dans le rpertoire o rside mysql : cd program files\easyphp\mysql\bin cd program files\easyPHP-5.3.3\mysql\bin Il ne faut pas terminer la ligne par un (;) : nous ne sommes pas encore sous mysql. 2. mysql -u root -p linvite de mysql saffiche. A partir de maintenant, on devra terminer les commandes par un (;). 3. Slection dune base de donnes (une base de donnes dessai test, prsente avec EasyPHP : Dpartement de Gnie USE test; mysql rpond en affichant Industriel : Database changed. 29
Le moniteur mysql
4. Quitter mysql : exit; mysql rpond en affichant : Bye. Pour quitter mysql : exit; = quit; Si on connat davance le nom de la base de donnes on peut utiliser (pour accder, par exp., la base de donnes test) : mysql -u root test Connatre la liste des commandes reconnues par mysql : mysql --help; Lorsquon envoie des commandes mysql au moyen dun script, les commandes qui sy trouvent ne doivent pas tre termines par un (;).
Dpartement de Gnie Industriel 30
32
33
Lordre dans lequel ces colonnes figurent dans la dclaration dtermine lordre dans lequel elles seront implantes dans la base de donnes. 4. Vrifier que la table a bien t cre et vrifier la structure de la table utilisateurs au moyen des commandes SHOW :
Bien que MySQL soit insensible la casse, on a pris lhabitude dcrire en majuscules les noms des commandes MySQL, ce qui permet de les sparer visuellement des noms de bases de donnes, tables et colonnes. A la place de la commande SHOW COLUMNS FROM, on peut crire: DESCRIBE.
Dpartement de Gnie Industriel 34
Insertion denregistrements
Insertion denregistrements
Il existe deux formats pour enregistrer des valeurs dans une table : 1. On spcifie une une les colonnes garnir et les valeurs y placer :
INSERT INTO nom_base (col1, col2, ) VALUES (val1, val2, ); INSERT INTO nom_base (col4, col8, ) VALUES (val4, val8, );
Cette mthode nous permet de ne saisir que les valeurs non nulles. Les autres se verront automatiquement affecter la valeur NULL ou toute autre valeur qui aurait pu tre spcifie. Si parmi ces colonnes lune dentre elles a lattribut NOT NULL, une erreur sera signale.
Dpartement de Gnie Industriel
36
Insertion denregistrements
2. Saisir autant de valeurs quil y a de colonnes garnir: INSERT INTO nom_base VALUES (val1, val2, NULL, , valn); Il faut que toutes les valeurs soient spcifies , mme si certaines ont la valeur NULL. Sil ny a pas exactement autant de valeurs quil existe de colonnes, une erreur sera signale. On peut affecter des valeurs plusieurs lignes la fois : INSERT INTO nom_base (col1, col2, ) VALUES (val1, val2, ) VALUES (valA, valB, ) VALUES (valx, valy, ); Cette mthode nest pas standard. Elle ne doit pas tre employe avec dautres SGBD que MySQL.
37
Insertion denregistrements
Deux fonctions MySQL: La fonction PASSWORD() : chiffrer les mots de passe qui permettent daccder MySQL. Elle cre une chane de caractres qui a exactement 16 caractres (cest la raison du choix de CHAR (16) dans la table utilisateurs). Lalgorithme de chiffrement est irrversible, c--d quen partant du mot de passe chiffr il ny a aucun moyen de retrouver le mot de passe original. La fonction NOW() : insre un groupe date-heure correspondant au moment de linsertion dans le champ o elle est appele. Il ne faut pas placer une fonction de MySQL entre apostrophes ou entre guillemets. Il ne doit pas y avoir despace entre la parenthse ouvrante et le dernier caractre du nom de la fonction.
Dpartement de Gnie Industriel 38
39
40
Plusieurs lignes de texte taper risque derreurs. Autre moyen plus sr et rapide de procder : crer un script contenant les commandes excuter. On peut enregistrer ce script sous forme de fichier texte (extension .txt). On le place dans un rpertoire qui nous convient, par exp. \program files\easyphp\mysql\data (existe dj). 3. On saisie dans un diteur de texte la mme commande que la prcdente lexception du pointvirgule final, qui nest pas ncessaire lorsque la commande se trouve dans un script.
Dpartement de Gnie Industriel
41
42
Remarques
Pour insrer une valeur contenant une apostrophe ou un guillemet, on doit lchapper avec un antislash : INSERT INTO utilisateurs (prenom, nom) VALUES ('Patrick', 'O\'Maley'); MySQL supprimera automatiquement les espaces terminaux dune valeur insrer dans un champ de type VARCHAR. Dans les versions actuelles de MySQL, le terme INTO qui intervient dans la commande INSERT est facultatif. En gnral, on place les chanes de caractres entre apostrophes et les nombres entre apostrophes ou entre guillemets. Ceci est valable pour toutes les commandes et pas seulement pour INSERT.
44
46
Affichages conditionnels
Affichages conditionnels
SELECT * FROM utilisateurs WHERE nom='Mozart'; SELECT email FROM utilisateurs WHERE prenom='John'; SELECT nom FROM habitants WHERE naissance='2000-01-01';
Les oprateurs les plus couramment utiliss avec une commande SELECT : (ils peuvent tre associs dans des expressions parentses pour permettre une slection plus fouille).
Dpartement de Gnie Industriel 48
Exemples
SELECT * FROM utilisateurs WHERE (id_utilisateur>=33) AND (id_utilisateur<=50); SELECT * FROM utilisateurs WHERE (nom='Mozart') OR (nom='Mozar'); La liste des utilisateurs qui se sont enregistrs partir de six heures du matin et avant sept heures du matin le 22 juillet 2003 : SELECT * FROM utilisateurs WHERE (date_enreg > '2011-04-21 16:10:00') AND (date_enreg < '2011-04-22 16:13:59'); On peut aussi utiliser la clause BETWEEN.
Dpartement de Gnie Industriel
51
Exemples
Slection des noms des utilisateurs dont le prnom est Frantz: Slection des noms des utilisateurs qui nont pas dadresse e-mail:
SELECT * FROM utilisateurs WHERE email IS NULL; ou SELECT * FROM utilisateurs WHERE email =''; Slection de lutilisateur dont le mot de passe est "sonate" : les mots de passe ont t stocks aprs avoir t chiffrs avec la fonction PASSWORD(), il suffit de comparer "sonate" avec le rsultat du chiffrement de ce mot par cette fonction : SELECT * FROM utilisateurs WHERE mot_de_passe=PASSWORD('sonate');
Dpartement de Gnie Industriel 52
Remarques
On peut galement utiliser les oprateurs IN et NOT IN pour savoir si une valeur de champ est ou nest pas dans une liste de valeurs : SELECT * FROM habitants WHERE naissance IN ('2000-01-01', '2001-01-01', '2002-01-01'); On peut faire des calculs lintrieur de notre critre de recherche au moyen des 4 oprateurs usuels. Nous retrouverons, plus loin dans ce chap., les oprateurs de conditions dans dautres emplois quavec une clause SELECT.
Supposons quon recherche quelquun dont le nom peut tre Dupont, Dupond, Dupontel ou Duponk-joly. Cest l quinterviennent les clauses LIKE et NOT LIKE associes aux 2 caractres jokers "_" et "%". "_" correspond nimporte quel caractre unique, A "%" correspond aucun, un ou plusieurs caractres.
SELECT * FROM utilisateurs WHERE nom LIKE 'Dupon%';
tous les noms commenant par "Dupon". Slectionnons tous les enregistrements o le prnom commence par "Joh". La recherche tant insensible la casse trouverait aussi les prnoms commenant par "joh".
SELECT * FROM utilisateurs WHERE prenom LIKE 'Joh%';
Dpartement de Gnie Industriel 55
Slectionnons les utilisateurs (nom, prnom) dont ladresse e-mail nest pas de la forme xxx@menara.ma :
SELECT nom, prenom FROM utilisateurs WHERE email NOT LIKE '%@menara.ma';
Les caractres jokers peuvent tre utiliss au dbut et/ou la fin dune chane de caractre : SELECT * FROM utilisateurs WHERE nom LIKE '_upon%'; Bien que LIKE et NOT LIKE soient normalement utilises avec des chanes de caractres, elles peuvent aussi sappliquer des champs numriques.
Pour utiliser un caractre "_" et "%" dans une condition de recherche avec LIKE ou NOT LIKE, il faut lchapper avec un antislash. Le caractre joker "_" peut sassocier lui-mme. LIKE '__' recherchera toue combinaison de deux caractres.
57
La clause ORDER BY modifie la prsentation des rsultats, par exemple en les triant sur un champ donn dans un certain ordre. Lorsquon ne prcise rien, les rsultas sont prsents dans un ordre imprvisible (probablement dans lordre croissant des cls primaires). SELECT * FROM utilisateurs ORDER BY prenom; SELECT email FROM utilisateurs ORDER BY date_enreg; Par dfaut, le sens du tri effectu par la clause ORDER BY est le sens ascendant (abrg en ASC). Les nombres iront en croissant et les dates, du plus ancien au plus rcent. On peut inverser le sens du tri au moyen de la clause DESC (descendant).
Dpartement de Gnie Industriel 59
Slectionner tous les utilisateurs sur leur nom, par ordre alphabtique : Afficher par ordre alphabtique les champs nom, prnom (dans cet ordre) pour tous les utilisateurs : Afficher tous les utilisateurs par date denregistrement (le plus rcent en tte) :
SELECT prenom, nom FROM utilisateurs ORDER BY nom ASC, prenom ASC;
60
62
(Les lignes sont numrotes partir de 0) La clause LIMIT x, y est la plus frquemment utilise lorsquon veut afficher plusieurs pages de rsultats par tranches de 20 (ou toute autre valeur). La clause LIMIT ne fait pas partie du standard SQL et nest donc pas disponible sur tous les SGBD. La clause LIMIT peut tre prsente dans dautres commandes MySQL et pas seulement dans SELECT.
Dpartement de Gnie Industriel
63
On utilisera une clause WHERE pour slectionner la ligne de la table sur laquelle porteront les modifications. Sinon ces modifications seraient apportes toutes les lignes. Exp. :
Dpartement de Gnie Industriel 65
Comme les suppressions, les mises jour sont lune des plus importantes raisons dutiliser une cl primaire. (cette valeur qui ne devrait jamais changer) peut construire un point de rfrence dans les clauses WHERE mme si chacun des autres champs doit tre modifi. Exemple : On veut modifier ladresse e-mail dun utilisateur (prnom : Fantz nom : Liszt). On commence donc par dterminer la cl primaire de lenregistrement qui mintresse ( modifier) :
67
Remarques
Utilisons toujours une clause WHERE pour faire une mise jour, sauf si nous voulons modifier tous les enregistrements de la table. Pour se protger contre une mise jour accidentelle dun trop grand nombre denregistrements, on peut ajouter une clause LIMIT. On ne doit jamais modifier le champ qui contient la cl primaire car cela pourrait compromettre lintgrit des relations avec une autre table.
Dpartement de Gnie Industriel 68
Suppression denregistrements
Suppression denregistrements
On peut supprimer des enregistrements dune table au moyen de la commande DELETE : DELETE FROM nom_de_la_table WHERE champ='valeur'; Une fois supprim, un enregistrement est perdu sans espoir de rcupration. Par prudence, on peut faire une copie de la table avant toute suppression. Il est fortement recommand de faire figurer une clause WHERE dans la commande de suppression. La requte DELETE FROM nom_de_la_table supprimera tout le contenu dune table mais laissera intacte sa structure.
Suppression denregistrements
La commande TRUNCATE TABLE nom_de_la_table supprimera la totalit de la table ainsi que sa structure mais recrera cette dernire. Le rsultat est identique, mais cette mthode, inspire du SGBD Oracle, est plus rapide et plus sr. Exemple de suppression de donnes : Dterminons dabord la valeur du champ id_utilisateur (cl primaire) de lenregistrement supprimer : SELECT id_utilisateur FROM utilisateurs WHERE prenom='Claudio' AND nom='Monteverdi'; MySQL affiche pour id_utilisateur : 14
Suppression denregistrements
Vrifions ensuite quil sagit bien de lenregistrement que nous voulons supprimer : SELECT * FROM utilisateurs WHERE id_utilisateur=14; Excutons la requte de suppression : DELETE FROM utilisateurs WHERE id_utilisateur=14; Comme pour UPDATE, MySQL affiche un compte rendu dexcution. Lenregistrement qui vient dtre supprim nest plus rcuprable. On peut vrifier la bonne excution de la prcdente requte: SELECT id_utilisateur, prenom, nom FROM utilisateurs ORDER BY id_utilisateur ASC;
72
Suppression denregistrements
On voit que lenregistrement supprim napparat plus
dans la liste des lments de la table. Remarques : Pour supprimer toutes les donnes dune table ainsi que la table elle-mme : DROP TABLE nom_de_la_table; Pour supprimer une base de donnes dans sa totalit (donc ainsi que toutes les tables quelle contient) : DROP DATABASE nom_de_la_base; Depuis MySQL 4.0 on peut lancer une requte DELETE sur plusieurs tables en mme temps.
Dpartement de Gnie Industriel 73
Suppression denregistrements
Pour des raisons de scurit, on peut ajouter une clause LIMIT toute requte de suppression de faon en limiter la porte. On ne doit le faire que si on connat ce nombre lavance : DELETE FROM nom_de_la_table WHERE id=4 LIMIT 1;
74