M103
M103
120 Heures
1. Concevoir une base de données
Analyser le cahier de charges
SOMMAIRE Modéliser les données
Normaliser les données
Préparer l'environnement
2. Manipuler un SGBD relationnel
Créer une base de données
Réaliser des requêtes SQL
Administrer une base de données
3. Exploiter les fonctionnalités avancées
d'un SGBD relationnel
Maîtriser le langage de programmation procédurale
Optimiser une base de données MySQL
4. S'initier aux bases de données NoSQL
Définir les bases de données NoSQL
Identifier les caractéristiques des BD NoSQL
MODALITÉS PÉDAGOGIQUES
1 2 3 4 5
LE GUIDE DE LA VERSION PDF DES CONTENUS DU CONTENU DES RESSOURCES
SOUTIEN Une version PDF TÉLÉCHARGEABLES INTERACTIF EN LIGNES
Il contient le est mise en ligne Les fiches de Vous disposez de Les ressources sont
résumé théorique sur l'espace résumés ou des contenus consultables en
et le manuel des apprenant et exercices sont interactifs sous synchrone et en
travaux pratiques formateur de la téléchargeables forme d'exercices asynchrone pour
plateforme sur WebForce Life et de cours à s'adapter au
WebForce Life utiliser sur rythme de
WebForce Life l'apprentissage
40 Heures
CHAPITRE 1
ANALYSER UN CAHIER DE CHARGES
05 Heures
CHAPITRE 1
ANALYSER UN CAHIER DE CHARGES
Introduction
• Dans chaque organisation, Il y'a une quantité importante d'informations qui sont échangées afin d'assurer le bon fonctionnement de cette
organisation ainsi que la communication avec son environnement, dans le but d'être utilisables dans les activités opérationnelles quotidiennes
ou encore dans la prise de décision. Ces informations doivent êtres bien organisées et stockées. Il est donc nécessaire pour chaque organisme
d'avoir une structure fonctionnelle et technique de gestion de l'information.
Le système d'information (SI)
• Le système d'information représente l'ensemble des éléments participants aux activités d'acquérir, de stocker, de traiter et de communiquer les
informations au sein d'une organisation. Il se compose des acteurs suivants :
• Dans le cadre d'un système d'information, un projet informatique a pour objectif de construire une application informatique (logiciel et base de
données) qui va servir comme un support informatisé, inclus dans un système d'information organisationnel.
les technologies..
Introduction
• Le cahier de charges représente les attentes et les besoins du client ainsi que les contraintes du client.
• En procédant à la lecture du cahier de charges, il faut définir le périmètre du projet :
• Le contexte du projet.
• L'ensemble des données que le système est supposé gérer et stocker.
• Les conditions et règles de gestion exprimées par le client.
Il faut aussi définir les limites du projet et répondre aux questions suivantes :
• Quels sont les éléments de données cités par le document ?
• Qui fait quoi ?
PARTIE 1
• Le périmètre du projet correspond à la délimitation précise du projet. Il s'agit de la liste des objectifs, des produits livrables, des affectations,
des dépenses et des délais qui doivent être respectés. Ces termes de références définissent aussi les limites du projet. Si le périmètre d'un
projet est efficacement tracé, la gestion des améliorations qui surviennent lors de la mise en œuvre et de la maintenance devient plus simple.
• Concernant un projet lié aux SI (mise en place d'un nouvel ERP, évolution d'un SI en fonction d'une nouvelle organisation, développement
d'une plateforme web, etc.), le périmètre total est l'identification et le recensement des applications/modules impactés par le projet.
• A partir du cahier de charges ainsi que des échanges avec les porteurs du projet, on peut définir le périmètre et dresser les limites du projet en
suivant les étapes suivantes :
3. Définir les tâches et les activités du projet 4. Définir les contraintes du projet
• Il s'agit des moyens qui vont permettre la création des • Les trois principales contraintes d'un projet sont le budget, le temps et la
livrables et la réalisation des buts du projet. Les livrables portée :
sont ainsi découpés en tâches et activités distinctes. Ceci • Contrainte de budget ou coût : L'ensemble des ressources financières (frais
permet de faciliter la gestion des projets surtout quand la des matériels, services et ressources humaines) nécessaires pour la
complexité est importante. réalisation du projet dans le respect des limites et délais prédéfinis.
• Exemple : Pour créer le formulaire d'inscription on doit : • Contrainte de temps : Le calendrier de livraison du projet en totalité ainsi
• Choisir et rédiger un exemplaire du formulaire que des différentes phases du projet.
• Développer une interface de saisie du formulaire • Contrainte de portée : La définition des objectifs, des livrables, des
• Créer une base de données pour stocker les informations fonctionnalités et des tâches à accomplir pour la finalisation du projet.
du formulaire • Exemple : Voici quelques contraintes applicables à votre questionnaire client :
PARTIE 1
Introduction
• On inclut souvent dans un projet informatique : les bases de données et le système informatique comprenant les ressources et infrastructures
réseau, les applications et aussi les règles et dispositifs de sécurité.
• L'élaboration des bases de données afin de gérer l'accès aux données, le stockage et le traitement représentent un pilier du livrable d'un projet.
• Le cahier de charges relatif à un projet informatique indique les différents volets qui concernent ce projet, notamment la gestion des données.
Définition
• Une des fonctions d'un système informatique dans une organisation est de stocker et gérer les données nécessaires à son bon fonctionnement,
d'où la nécessité du concept des bases de données.
Objectifs
• Centraliser le stockage des informations
• Faciliter l'accès à l'information
PARTIE 1
• Assurer la justesse et la cohérence des informations stockées surtout lors des modifications
• Garantir l'intégrité et la confidentialité des données
• La conception d'une base de données passe par quatre phases comme illustré par le schéma :
1. Analyse du cahier de charges et clarification du besoin du client.
2. Conception d'un modèle conceptuel qui représente tous les éléments nécessaires du projet.
3. Traduction du modèle conceptuel en modèle logique.
4. Implémentation de la base de données proposée.
• Dans le schéma ci-contre, la première étape de la conception d'une base de données se base sur l'analyse pertinente du cahier de charges et la
bonne compréhension des besoins exprimés par les utilisateurs. Elle est essentielle et délicate en même temps.
• Durée, etc.
• Une table (ou entité) SESSION qui contiendra des attributs :
• Code Formation
• Date
• Lieu, etc.
Copyright - Tout droit réservé - OFPPT 23
CHAPITRE 2
MODÉLISER LES DONNÉES
20 heures
CHAPITRE 2
MODÉLISER LES DONNÉES
• Toujours dans le même sillage de l'exemple du cahier de charges relatif au centre de formation, les contraintes ci-après ont été identifiées :
• Un étudiant peut être inscrit dans plusieurs sessions de formations.
• La formation peut se tenir en plusieurs sessions.
• Un étudiant ne peut pas être inscrit à plusieurs sessions de la même formation.
• Une formation n'est ouverte que s'il y a plus de 10 étudiants inscrits.
• Une formation peut faire partie de plusieurs spécialités.
• Le tableau ci-après récapitule les règles de gestion relatives toujours au même exemple :
1 Un élément de l'entité ÉTUDIANT peut être associé à plusieurs éléments de l'entité SESSION.
3 Un élément de l'entité FORMATION peut être associé à plusieurs éléments de l'entité SESSION.
4 Un élément de l'entité FORMATION peut être associé à un ou plusieurs éléments de l'entité SPÉCIALITÉ.
Il s'agit d' « objets » qui vont par la C'est une information élémentaire, qui Il s'agit d'occurrences ou exemples des
suite être des entités du schéma entité- ne peut pas être décomposée. Elle se données d'un concept.
association. Ce sont des éléments trouve souvent liée à un concept.
complexes qui peuvent être Exemples : «G434568» valeur de la
décomposés en plusieurs informations Exemples : CIN, durée de la formation, donnée : numéro de la CIN, relative au
sous formes de « données ». nom de la session, salle, adresse concept : étudiant.
PARTIE 1
Exemple :
• Le centre de formation « CF excellence » offre des formations aux étudiants des villes suivantes : Tanger, Rabat et Casablanca.
• On constate que :
• « CF excellence » n'est pas une donnée, c'est le nom de l'organisation.
• Formation, étudiant, session, spécialité sont des concepts.
• Il y a une donnée rattachée au concept Étudiant qui est « Nom Ville ».
• Tanger, Rabat et Casablanca sont des valeurs de la donnée « Nom Ville ».
• Il y a un lien entre les concepts Formation et Étudiant.
PARTIE 1
Exemple : « Ville » Exemple : « Nom » Exemple : code CIN Par exemple : PRIX
tout court n'est pas relatif a l'étudiant et numéro CIN. TTC = PRIX_HT * TVA
précis. et « Nom » relatif à la • Il faut garder une • Les données à
session. seule description et retenir seront :
• On optera plutôt
pour « Ville • Il faut renommer les supprimer les PRIX_HT et TVA.
deux données en : autres synonymes.
PARTIE 1
étudiant ».
« Nom étudiant » et
« Nom Session ».
Bonnes pratiques
• Afin d'uniformiser la nomenclature des données, on adopte une formule se composant de : objet (en minuscules) + raccourcis de nom du
concept qu'elle représente (première lettre en majuscule).
Exemple :
• Numéro CIN de l'étudiant → numCINEtu
• Titre de la formation → titreForm
Le Dictionnaire des données relatif à notre exemple de la gestion du centre de formation est comme suit : (1/2)
Bonnes pratiques
• Le Dictionnaire des données relatif à notre exemple de la gestion du centre de formation : (2/2)
Code donnée Désignation Type Taille Observation
codeForm Code de la formation Alphanumérique 9 Identifiant de la formation
titreForm Titre de la formation Alphanumérique 30
dureeForm Durée de la formation Numérique 3
prixForm Prix de la formation Numérique 5
codeSess Code de la session Alphanumérique 9 Identifiant de la session
nomSess Nom de la session Alphanumérique 30
dateDebutSess Date du début de la session Date
dateFinSess Date de la fin de la session Date
codeSpec Code de la spécialité Alphanumérique 10
PARTIE 1
• Pour le concept Formation, la valeur du Code de Formation ID01 détermine que le titre de la formation est « Introduction au développement ».
• On peut déduire que :
• Le code de formation détermine une seule occurrence du titre de formation.
• Le titre de formation dépend du code de formation.
• Cette relation est symbolisée sous cette forme : codeForm -> titreForm.
PARTIE 1
• Cette relation n'est pas réversible : plusieurs formations peuvent avoir le même titre.
Exemple :
• Voici la liste des dépendances fonctionnelles construite à partir du dictionnaire des données de notre exemple du centre de formation :
AdresseEtu
codeSess → dateDebutSess numCINEtu + codeSess → typeCours
codeSess → dateFinSess
numCINEtu → nomForm 1) Un étudiant peut être inscrit dans plusieurs formation à la fois.
1) Cette dépendance suggère que l'on peut déduire le nom de la formation à partir du code de CIN de l'étudiant. Ceci n'est pas correct dû à la
règle de gestion qui indique qu'un élève peut être inscrit dans plusieurs formations.
2) Cette dépendance suggère que l'on peut déduire le nom de la spécialité à partir du code de la formation. Ceci n'est pas correct dû à la règle
de gestion qui indique qu'une formation peut apparaitre dans le curriculum de plusieurs spécialités.
PARTIE 1
3) Cette dépendance suggère que l'on peut déduire le nom de la formation à partir du nom de l'étudiant. Ceci n'est pas correct car d'une part,
le nom de l'étudiant n'est pas un identifiant, et d'une autre part aucune relation directe n'existe entre ces deux attributs.
TypeCours
numCINEtu codeSess codeForm codeSpec
Définition
• La phase de conception des systèmes d'information, et bien évidemment les bases de données, nécessite le recours à des méthodes de
modélisation. C'est-à-dire la représentation virtuelle des processus et données de telle façon à bien comprendre l'existant et bien définir les
futures livrables.
Il existe plusieurs méthodes d'analyse et de conception. Une des méthodes les plus utilisées étant la méthode MERISE.
Qu'est-ce que la méthode Merise ?
• La méthode Merise (Méthode d'étude et de réalisation informatique pour les systèmes d'entreprise) date de la fin des années 1970 en
France. Il s'agit d'une méthode d'analyse et de conception de systèmes d'information qui se base sur le principe de la séparation des données
et des traitements.
• La méthode Merise propose une démarche basée sur trois niveaux (ou cycles) : la conception, l'organisation et la technique. En effet, modéliser
un système revient à produire une analyse globale de sa fonction : Décrire ce qu'il fait avant de se focaliser sur comment il le fait. Les données
étant séparées des traitements, il faut vérifier la concordance entre données et traitements afin de vérifier que toutes les données nécessaires
aux traitements sont présentes et qu'il n'y a pas de données superflues. Les trois niveaux de représentation des données, sont détaillés ci-
dessous.
Niveau conceptuel : Niveau logique : Niveau physique :
le modèle conceptuel des données le modèle logique des données le modèle physique des données
PARTIE 1
(MCD) décrit les entités du monde (MLD) adapte le modèle conceptuel (MPD) permet d'établir la manière
réel, en terme d'objets, de au contexte organisationnel. Il s'agit concrète dont la base de données
propriétés et de relations, d'une transcription du MCD dans un sera construite.
indépendamment de toute formalisme adapté à une
technique d'organisation et implémentation ultérieure sous
d'implantation des données. forme de base de données.
Copyright - Tout droit réservé - OFPPT 43
02 - Modélisation des données
Règles de passage du graphe DF au MCD
• À partir du Dictionnaire des données, on regroupe les données élémentaires par concept appelé entité. Une entité est un élément unique
décrit par un ensemble de propriétés (aussi appelées attributs). Une de ces propriétés est la source des dépendances fonctionnelles avec le
reste des propriétés. Elle joue le rôle d'un identifiant unique de l'entité.
• Le nom d'une entité est souvent un nom représentant un « objet de gestion ».
• Exemple : Étudiant, Formation, Article, Fournisseur, etc.
• Une entité est formalisée comme suit : Nom de l'entité
- Identifiant
- Propriété 1
- Propriété 2
- …
• Une entité est aussi l'ensemble des occurrences.
Exemple d'occurrences de l'entité FORMATION :
PARTIE 1
ID01 CCP01
Introduction au développement Python
3 30
2500 3000
• Les données du dictionnaire des données qui dépendent de plusieurs entités sont mises dans l'association (porteuse) qui relie ces entités. Une
association est dite binaire si elle relie entre deux entités, et tertiaire si elle relie entre trois entités.
Exemple :
• La règle de gestion : « Un étudiant est inscrit dans une session d'une formation » ainsi que « lors de l'inscription l'étudiant choisit le type de
cours » sera représentée par l'association « est inscrit ». Cette association porte la donnée : typeCours.
PARTIE 1
Session
Étudiant
Est inscrit - CodeSess
- numCINEtu
typeCours - nomSess
- nomEtu
- dateDebut
- prenomEtu
- ….
• Les cardinalités indiquent le nombre de fois où une entité est concernée par une association. Elles sont déduites des règles de gestion. Il y a
trois valeurs typiques : 0, 1 et N (plusieurs).
• Les entités liées par une association possèdent chacune deux cardinalités : minimum et maximum. En effet, pour une association entre deux
entités, il y aura quatre cardinalités à définir.
• Les cardinalités sont déduites à partir des règles de gestion. Ces règles sont propres à l'organisation étudiée et expriment des contraintes sur le
modèle.
Remarque :
• Il se peut qu'il y ait des règles de gestion qui imposent un nombre précis de cardinalités. Ceci devra être géré par des traitements
PARTIE 1
supplémentaires.
Session
Étudiant
1,1 Est inscrit 0,n - CodeSess
- numCINEtu
typeCours - nomSess
- nomEtu
- dateDebut
- prenomEtu
- ….
Cardinalité Signification
Au plus un : chaque occurrence de l'entité n'est pas obligatoirement concernée par l'association et si elle l'est, c'est au plus une
0, 1
seule fois.
1, 1 Un et un seul : chaque occurrence de l'entité est concernée par l'association exactement une fois.
Zéro, un ou plusieurs : chaque occurrence de l'entité n'est pas obligatoirement concernée par l'association et si elle l'est, elle
0, N
peut l'être plusieurs fois.
1, N Au moins un : chaque occurrence est concernée par l'association et peut l'être plusieurs fois.
PARTIE 1
• Le passage du graphe des dépendances fonctionnelles au MCD se fait en respectant les règles suivantes :
RÈGLES OBSERVATIONS
N°5 fonctionnelles) peuvent exister dans un MCD sans pour association non fonctionnelle ou CIM (Contrainte
autant faire partie du graphe des DF. d'Intégrité Multiple).
• Le graphe des DF permet de construire un Modèle Conceptuel de Données (MCD) fiable. Même si les dépendances fonctionnelles sont la
plupart du temps évidentes et ne nécessitent pas une représentation graphique, le graphe des DF aide toutefois à distinguer entre les futures
éléments du MCD
Type de cours
numCINEtu codeSess codeForm codeSpec
PARTIE 1
RÈGLES
Session Formation
Étudiant
0,n Est inscrit 0,n - CodeSess 1,1 Concerne 0,n - CodeForm
- numCINEtu
typeCours - nomSess - titreForm
- nomEtu
- dateDebut - dureeForm
- prenomEtu
- …. - ….
• À ce stade, il est possible d'élaborer le MCD complet à partir des entités et associations ainsi que les données du dictionnaire des données.
• Toutes les entités du MCD doivent être reliées à, au moins, une association.
• En cas de modèle complexe, il faut commencer par les entités et associations élémentaires puis itérer en complétant progressivement
jusqu'à ce que le modèle semble raisonnablement complet.
PARTIE 1
Session Formation
Étudiant
0,n Est inscrit 0,n - codeSess 1,1 Concerne 0,n - codeForm
- numCINEtu
typeCours - nomSess - titreForm
- nomEtu
- dateDebut - dureeForm
- prenomEtu
- …. - ….
1,n
Appartient
0,n
Spécialité
PARTIE 1
- codeSpec
- nomSpec
- ….
10 heures
CHAPITRE 3
NORMALISER LES DONNÉES
1. Formes normales
2. Règles de passage du MCD au MLD normalisé
03 - Normaliser les données
Formes normales
Formes normales
• Les formes normales permettent la décomposition des entités en des relations, sans perdre d'informations, en se basant sur les dépendances
fonctionnelles, dans le but de construire un schéma conceptuel représentant de manière correcte les associations canoniques du monde réel.
• Au niveau de la base de données, ce travail permet d'éviter les redondances et facilite la maintenance des données.
• Une relation est en première forme normale si, et seulement si, tous ses attributs sont atomiques et sont en dépendance fonctionnelle avec
l'identifiant de cette relation. Ceci dit, dans un attribut, on ne peut avoir qu'une seule valeur. Un attribut est atomique s'il ne contient qu'une
seule valeur pour un tuple (une ligne de données), c'est a dire qu'il ne regroupe pas un ensemble de plusieurs valeurs.
Exemple :
• La relation : Formation (codeForm, titreForm, codeSpec, etc.) : Cette relation n'est pas en 1FN car l'attribut « codeSpec » n'est pas en
dépendance fonctionnelle avec l'identifiant codeFom
• La relation : Étudiant (numCINEtu, nomEtu, prenoms, etc.) : Cette relation n'est pas en 1FN si on stocke plusieurs valeurs dans l'attribut
« prenoms ». La forme correcte serait : Étudiant (numCINEtu, nomEtu, prenom1, prenom2, prenom3...).
• Une relation est en deuxième forme normale si elle vérifie les deux conditions suivantes :
• Être en 1FN.
• Les attributs non clé dépendent de la totalité de la clé, et non d'une partie de la clé.
• Dans le cas échéant, il faut diviser la relation en plusieurs relations regroupant un groupe d'attributs qui vérifieront la dépendance entre chaque
partie de la clé et la clé entière.
Exemple :
• Une relation est en troisième forme normale si elle vérifie les deux conditions suivantes :
• Être en 2FN.
• Chacun des attributs de la relation ne dépend que de la clé et non pas d'un autre attribut de la relation.
• C'est-à-dire que toutes les dépendances fonctionnelles entre la clé primaire et les autres attributs doivent être directes, et ce pour éliminer les
transitivités et les dépendances entres les attributs non clé.
• Dans le cas échéant, diviser la relation en autant de relations que de dépendances entre attributs non clés.
Exemple :
• Une relation est en FNBC si elle vérifie les deux conditions suivantes :
• Être en 3FN.
• Les seules dépendances fonctionnelles élémentaires existantes dans les relations sont celles de la clé vers les attributs non clés.
• Cette règle permet d'éliminer les redondances créées par des dépendances entre parties de clés ainsi que celles déjà éliminées par la 3FN.
Exemple :
• Si "commune + ville" déterminent la région et la population, on a aussi ville qui détermine région.
• Les trois premières formes normales se focalisent sur des aspects très conceptuels et évidents, mais ne permettent pas d'éliminer toutes les
redondances.
• On fait alors recours aux formes 4FN et NF4 pour ajouter une dimension de traitement de l'information et faciliter la mise à jour des données de
la base.
• Une relation est en quatrième forme normale lorsqu' elle vérifie les deux conditions suivantes :
• Être en 3FN.
• Si, et seulement si, les dépendances multi-valuées élémentaires sont celles dans lesquelles une clé détermine la valeur d'une colonne.
PARTIE 1
une valeur de la colonne Version V, il faudra parcourir et supprimer toutes les combinaisons ou Modèle = X et Version = V. Le recours à la forme
4FN permet d'éviter ce genre de problèmes et ainsi on doit décomposer la table en deux relations :
• DispoCouleur : (Modèle, Couleur)
• DispoVersion : (Modèle, Version)
1. Formes normales
2. Règles de passage du MCD au MLD normalisé
03 - Normaliser les données
Règles de passage du MCD au MLD normalisé
Du MCD AU MLD :
Ensemble des règles MCD
Niveau conceptuel En formalisme Entité-Relation
MLD
Niveau logique
(Relationnel)
nomEtu
• ÉTUDIANT (numCINEtu,prenomEtu, dateNaissEtu, niveauEtu, nomVilleEtu, AdresseEtu) prenomEtu
dateNaissEtu
niveauEtu
nomVilleEtu
AdresseEtu
- codeSess
- codeForm
- nomSess
- titreForm
- dateDebut
- dureeForm
- codeForm
- ….
- ….
• Un étudiant peut n'être inscrit à aucune session de formations comme il peut être inscrit à plusieurs.
• Une session peut n'avoir aucun étudiant inscrit, comme elle peut avoir plusieurs étudiants inscrits.
• L'association « est inscrit » est transformée en une nouvelle entité « Inscription ».
PARTIE 1
Marin Voilier
1,1 Pilote 1,1
- numMarin - numVoilier
- nomMarin - nomVoilier
- nomVoilier - nomMarin
Micro CD-ROM
1,1 Equiper 1,1
- numMicro - numCD
- marqueMicro - marqueCD
Engager
Écurie 0,n 0,n Saison Écurie Saison
Engager - nomEcurie#
- nomEcurie salaire - idSaison - nomEcurie - idSaison# - idSaison
- numPilote#
- salaire
0,n
Pilote Pilote
- numPilote - numPilote
PARTIE 1
- nomPilote - nomPilote
• Saison (idSaison)
• Pilote(numPilote, nomPilote)
• Écurie (nomEcurie)
• Engager (idSaison#, numPilote#, nomEcurie#, salaire)
Session Formation
Étudiant
0,n Est inscrit 0,n - CodeSess 1,1 Concerne 0,n - CodeForm
- numCINEtu
typeCours - nomSess - titreForm
- nomEtu
- dateDebut - dureeForm
- prenomEtu
- …. - ….
1,n
Appartient
0,n
Spécialité
PARTIE 1
- CodeSpec
- nomSpec
- ….
Combinaison
- codeForm
- codeSpec
Spécialité
- codeSpec
PARTIE 1
- nomSpec
- ….
Remarques :
• Deux nouvelles entités ajoutées : Inscription et Combinaison identifiées respectivement pas les clés (codeSess,numCINEtu) et
(codeSpec,codeForm).
• L'association entre Session et Formation est traduite par l'ajout de la clé : codeForm dans l'entité Session.
05 heures
CHAPITRE 4
PRÉPARER L'ENVIRONNEMENT
Introduction
• Dans la première partie de ce cours on a suivi les étapes de conception d'une base de données, depuis la lecture du cahier de charges jusqu'à
l'élaboration des modèles conceptuel et logique de données (MCD et MLD).
• La modélisation a donc pour but de convertir la conception complexe en diagrammes représentant les données de manière simple et facile à
comprendre. Ainsi, les outils de modélisation de données permettront de dessiner ces diagrammes et créer les structures logiques et physiques
de la base de données.
• Il existe différents outils de modélisation souvent adaptés aux besoins de l'utilisateur en termes de systèmes d'exploitation, architecture et
serveur de base de données. Parmi les fonctionnalités, on trouve : la création de structure de données à partir de diagrammes, l'ingénierie en
amont et en aval, la fonction d'importation et d'exportation, la documentation, la prise en charge de plusieurs bases de données, le reporting,
etc.
Fonctionnalités :
• Modélisation et reverse engineering.
• Création des modèles ER complexes.
• La gestion des bases de données.
• La documentation.
• La création, l'exécution et l'optimisation des requêtes SQL
via des outils visuels.
PARTIE 1
• Une des plus intéressantes fonctionnalités de l'outil MySQL Workbench est la possibilité de créer et gérer des modèles de données. Dans ce
chapitre, on va suivre les étapes nécessaires pour concevoir un schéma simple à l'aide de MySQL Workbench. Ce schéma pourrait ensuite être
exploité pour générer un script SQL et le transmettre à un serveur de base de données pour créer la base de données physique correspondante.
• Rappelons les MCD et MLD relatifs au centre de formation qu’on a vu dans le chapitre précédent :
MCD
Session Formation
Étudiant Spécialité
0,n Est inscrit 0,n - codeSess 1,1 Concerne 0,n - codeForm 1,n Appartient 0,n
- numCINEtu - codeSpec
typeCours - nomSess - titreForm
- nomEtu - nomSpec
- dateDebut - dureeForm
- prenomEtu - ….
- …. - ….
MLD
PARTIE 1
Session Formation
Étudiant Inscription Spécialité
Combinaison
- codeSess - codeForm
- numCINEtu - codeSess - codeSpec
- nomSess - titreForm - codeForm
- nomEtu - numCINEtu - nomSpec
- dateDebut - dureeForm - codeSpec
- prenomEtu - typeCour - ….
- …. - ….
• On commence par définir les propriétés du schéma en double-cliquant sur l'onglet intitulé « mydb MySQL Schéma ».
PARTIE 1
• Pour ce, on peut utiliser l'interface graphique du design ou en définissant les clés étrangères.
PARTIE 1
Session
Etudiant
0,n Est inscrit 0,n - codeSess
- numCINEtu
typeCours - nomSess
- nomEtu
- dateDebut
- prenomEtu
- ….
« session ».
• L'outil crée automatiquement une table d'association ETUDIANT_has_SESSION qu'on peut renommer : « Inscription ».
• On remarque que le système a déjà créé une clé primaire (numCINEtu, codeSession).
PARTIE 1
Session Formation
- codeSess 1,1 Concerne 0,n - codeForm
- nomSess - titreForm
- dateDebut - dureeForm
- …. - ….
• Dans le reste de cette partie du cours, on va installer et configurer l'édition du serveur MySQL Community.
• La version MySQL community server 8.0 peut être téléchargée sur le lien suivant :
• https ://dev.MySQL.com/get/Downloads/MySQLInstaller/MySQL-installer-community-8.0.19.0.msi
• Cette version comporte aussi l'outil Workbench qu’on a utilisé pour la modélisation des bases de données.
PARTIE 1
• Workbench sert aussi à assurer l'administration, la gestion, la maintenance, la sécurité et les différentes tâches de développement des bases de
données.
• Une fois le téléchargement terminé, lancer le fichier d'installation. Le programme prompte à choisir un type d'installation :
• Developer default : si on souhaite créer une machine de développement, on peut utiliser cette option. Elle comporte les composants
requis pour le développement d'applications, par exemple : MySQL Server, MySQL Shell, MySQL connectors et MySQL.
• Server only : si on souhaite créer un serveur de base de données autonome avec des composants spécifiques.
• Custom : si les besoins se limitent à quelques composants, on peut utiliser cette option.
PARTIE 1
• Afin de démarrer, arrêter ou redémarrer un service, cliquer sur la connexion relative pour avoir accès au menu de gestion de ce service. Sur le
volet « INSTANCE », on trouve « Startup/Shutdown ».
• Cette page permet de manager les services.
PARTIE 1
•
PARTIE 1
• Taper « services.msc ».
• Chercher le service MySQL sur la liste
des services Windows.
• Cliquer sur « stop », « start » or
« restart ».
• Arrêter le service
/etc/init.d/MySQLd start
/etc/init.d/MySQLd stop
/etc/init.d/MySQLd restart
• Le port 3306 est le port par défaut du protocole classique MySQL. Il est utilisé par le client MySQL, les connecteurs MySQL et d'autres utilitaires.
• Le port du X Protocol (MySQLx_port), utilisé par des composants clients comme MySQL Shell, MySQL Connectors et MySQL Router, est calculé
en multipliant le port utilisé pour le protocole MySQL classique par 10.
Clients MySQL vers le serveur Oui, sauf si on utilise uniquement le port Du serveur au client
33060/TCP Oui
MySQL (protocole X) 3306 MySQL
• Exemple :
PARTIE 1
• Sur Windows :
• Trouver le fichier de configuration « my.ini » dans le répertoire suivant :
C :\ProgramData\MySQL\MySQL Server 8.0\ (ProgramData est un dossier caché)
Noter qu'il faut redémarrer les services après le changement des ports.
45 heures
CHAPITRE 1
Créer une Base de Données
17 heures
CHAPITRE 1
Créer une Base de Données
Une base de données est une structure permettant de stocker un grand nombre d'informations afin d'en faciliter l'utilisation.
• Le fait de structurer les données a pour but d'assurer les fonctions fondamentales suivantes :
• Ces fonctions sont assurées au moyen des Système de Gestion de Bases de Données SGBD
PARTIE 2
Les vues, ou pseudo-tables (Views) • offrant une vue particulière des données aux utilisateurs ;
Les fonctions définies par l'utilisateur (UDF) • permettant de renvoyer soit une valeur, soit une table ;
PARTIE 2
Les procédures stockées • exécutées par l'utilisateur pour produire un résultat donné ;
Types de SGBD
constituées de lignes et de
colonnes.
Exemples de SGBD :
• Il s'agit d'un langage d'interrogation des bases de données relationnelles qui permet d'effectuer les tâches suivantes :
• Définition et modification de la structure de la base de données
• Interrogation et modification non procédurale (c'est à dire interactive) de la base de données
• Contrôle de sécurité et d'intégrité de la base
• Sauvegarde et restauration des bases
• Le langage SQL n'est pas sensible à la casse, cela signifie que l'on peut aussi bien écrire les instructions en minuscules qu'en majuscule.
• Le langage de commandes SQL peut être réparti en quatre catégories :
LDD (Langage de définition LMD (Langage de LQD (Langage des queries LCD (Langage de contrôle
des données) manipulation des données) des données) des données)
• langage de manipulation • il permet de consulter et • langage de requêtes sur les • il permet de gérer les
des structures de la base. de modifier le contenu de données. privilèges et les différents
la base de données. droits d'accès à la base de
PARTIE 2
données.
Les interfaces des SGBD offrent la possibilité de créer des bases de données. Cette opération est aussi possible à partir de la ligne de commande.
• Syntaxe :
• Pour créer une base de données nommée « nom_base », il suffit d'utiliser la requête suivante : 'CREATE DATABASE nom_base'
• Options :
• La syntaxe utilisée pour chacune des options qui peuvent accompagner la commande CREATE DATABASE dépendent du SGBD utilisé. Il
convient alors de vérifier la documentation du SGBD pour avoir une idée sur les différentes options possibles : définition des jeux de
caractères, le propriétaire de la base, les limites de connexion, etc.
PARTIE 2
• Le nom de la base de données doit être unique. Si une autre base existe avec le même nom, MySQL retourne une erreur.
• Utiliser l'option IF NOT EXISTS pour créer conditionnellement une base de données si elle n'existe pas.
• On peut spécifier les options CHARACTER SET et COLLATE ainsi que le classement de la nouvelle base de données. Sinon MySQL utilisera les
valeurs par défaut pour la nouvelle base de données.
PARTIE 2
• Se connecter au serveur MySQL avec un compte utilisateur disposant du privilège CREATE DATABASE.
• On peut utiliser la commande SHOW CREATE DATABASE pour examiner la base de données créée :
• Enfin, sélectionner la base de données nouvellement créée avec laquelle on veut travailler en utilisant la commande USE :
Moteurs de stockage
• Le moteur de stockage d'un SGBD, aussi appelé moteur de table, est l'ensemble d'algorithmes qui permettent de stocker et d'accéder aux
données. En général, les SGBD utilisent un seul moteur de stockage qui est optimisé au mieux pour la lecture, l'écriture et la suppression de
données.
• MySQL se distingue des autres SGBD par le fait de donner à l'utilisateur le libre choix d'utiliser un moteur de table parmi plusieurs moteurs
différents. Ces moteurs de stockage peuvent être transactionnels ou non-transactionnels.
• On se retrouve ainsi avec des bases où plusieurs moteurs peuvent coexister. C'est un choix de conception qui a ses avantages et ses
inconvénients.
PARTIE 2
Moteurs de stockage
• Afin de consulter la liste des engins mis à notre disposition par MySQL, on peut exécuter la commande « SHOW ENGINES ; » sur la ligne de
commande MySQL comme suit :
PARTIE 2
Moteurs de stockage
• Chacun de ces moteurs de table possèdent des caractéristiques propres qui peuvent représenter des atouts ou des inconvénients selon le type
d'application qui aura besoin d'une base de données.
directement dans la mémoire vive, sans passer par le disque dur • Ne consomme pas de place sur serveur et elles disparaissent
pour stocker les données. Ceci est en fait le moteur de stockage le disque dur • Pas de champs BLOB ou TEXT
le plus rapide que propose MySQL, mais aussi le plus dangereux.
Afin de faciliter le choix, pour une petite base, sans liens entre les tables, et dont la cohérence des données n'est pas vitale, on peut opter pour
MyISAM. Dans les autres cas, choisir InnoDB.
Copyright - Tout droit réservé - OFPPT 149
CHAPITRE 1
Créer une Base de Données
• Le nom de la table, « IF NOT EXISTS » est une commande optionnelle et permet de vérifier si une table avec le même nom existe déjà.
• La liste des colonnes de cette table, séparées par des virgules.
• La liste des contraintes comme UNIQUE, CHECK, PRIMARY KEY et FOREIGN KEY.
• Le moteur de stockage avec la clause : ENGINE. Si on n'utilise pas cette option, MySQL va utiliser le moteur définit par default : InnoDB.
Avec :
• Type_donnee : le type et la taille des données qui vont être stockées dans cette colonne ( numériques, caractères, date, etc.).
Les types de données, qui représentent la nature des valeurs stockées dans une colonne, appartiennent à trois catégories : Numérique,
date/heure et chaîne (caractères). Voici les listes des types supportés par MySQL.
1 - Type de données numériques
TINYBLOB 0-255 Pas plus de 255 caractères dans une chaîne binaire
Définition
• Une contrainte d'intégrité est une règle qui définit la cohérence d'une donnée ou d'un ensemble de données de la BD. Les contraintes peuvent
avoir une portée sur une colonne ou sur une table lorsque la contrainte porte sur plusieurs colonnes.
1 - PRIMARY KEY
• Une clé primaire est une colonne ou un ensemble de colonnes qui identifie de manière unique chacune des lignes de la table. Cette colonne
doit vérifier les conditions suivantes :
• Une clé primaire doit contenir des valeurs uniques. Si la clé primaire se compose de plusieurs colonnes, la combinaison de valeurs dans
ces colonnes doit être unique.
• Une colonne de clé primaire ne peut pas avoir de valeurs NULL. Toute tentative d'insertion ou de mise à jour de NULL dans les colonnes
de clé primaire entraînera une erreur. Noter que MySQL ajoute implicitement une contrainte NOT NULL aux colonnes de clé primaire.
• Lorsqu'on définit une clé primaire pour une table, MySQL crée automatiquement un index appelé PRIMARY.
PARTIE 2
En général, la clé primaire d'une table est définie dans l'instruction CREATE TABLE.
Si la clé primaire est une seule colonne, PRIMARY KEY (contrainte de colonne) est utilisée avec la syntaxe suivante :
...
);
PARTIE 2
Si la clé primaire est composée de plusieurs colonnes, PRIMARY KEY (contrainte de table) est utilisée avec la syntaxe suivante :
primary_key_colonne1 type_donnee,
primary_key_colonne2 type_donnee,
...,
);
2 - FOREIGN KEY
• Une clé étrangère est une colonne ou un groupe de colonnes d'une table qui fait référence à une colonne ou à un groupe de colonnes d'une
autre table.
• La clé étrangère impose des contraintes sur les données des tables associées, ce qui permet à MySQL de maintenir l'intégrité référentielle.
Exemple : Rappelons la relation entres les tables etudiant et inscription de notre base de données CentreFormation.
PARTIE 2
• Chaque étudiant peut avoir aucune ou plusieurs inscriptions, et chaque inscription appartient à un étudiant unique.
• Cette relation est traduite au niveau du MLD par une clé étrangère dans la table inscription (référencée) qui renvoie à la colonne
identifiante de la table etudiant : numCINEtu.
• La table etudiant est appelée table parent ou table référencée, et la table inscription est appelée table enfant ou table de référencement.
CONSTRAINT fk1_inscription
FOREIGN KEY (numCINEtu)
REFERENCES etudiant(numCINEtu)
PARTIE 2
CONSTRAINT nom_contrainte
FOREIGN KEY (nom_colonne)
REFERENCES table_parent(nom_colonne_p)
[ON DELETE reference_option]
[ON UPDATE reference_option]
Avec :
• reference_option : détermine l'action que MySQL effectuera lorsque les valeurs des colonnes de clé parent seront supprimées (ON DELETE) ou
mises à jour (ON UPDATE).
3 - NOT NULL
• La contrainte NOT NULL est une contrainte de colonne qui garantit que les valeurs stockées dans une colonne ne sont pas NULL.
4 - DEFAULT
• La contrainte DEFAULT permet de spécifier une valeur par défaut pour une colonne :
• Dans cette syntaxe, le mot clé DEFAULT est suivi par la valeur par défaut de la colonne. Le type de la valeur par défaut doit correspondre au type
PARTIE 2
de données de la colonne.
5- UNIQUE
• UNIQUE est une contrainte d'intégrité qui garantit que les valeurs d'une colonne ou d'un groupe de colonnes sont uniques. Ainsi elle peut être
une contrainte de colonne ou une contrainte de table.
• Afin de définir la contrainte UNIQUE pour une colonne lors de la création de la table, on utilise cette syntaxe :
• Pour définir une contrainte UNIQUE pour plusieurs colonnes (contrainte de table), on utilise la syntaxe suivante :
CREATE TABLE nom_table(
nom_colonne1 definition_colonne,
nom_colonne2 definition_colonne,
...,
UNIQUE(nom_colonne1, nom_colonne2,..)
PARTIE 2
);
• Si on définit la contrainte UNIQUE sans la nommer, MySQL génère automatiquement un nom pour celle-ci.
[CONSTRAINT nom_contrainte]
UNIQUE(liste_colonne)
6 - CHECK
• La contrainte CHECK assure que les valeurs stockées dans une colonne ou un groupe de colonnes satisfont à une expression booléenne. Elle est
ainsi considérée comme une contrainte de colonne et une contrainte de table.
• A partir de la version MySQL 8.0.16, la contrainte CHECK de table et de colonne est prise en charge lors de la création de la table, et ce pour
tous les moteurs de stockage.
• Voici la syntaxe à utiliser :
• Où il faudra :
• Spécifier le nom de la contrainte à créer. Si le nom de la contrainte est omis, MySQL génère automatiquement un nom avec la convention
suivante : nom_table_chk_n (n étant un entier).
• Spécifier une expression booléenne qui doit être évaluée à TRUE ou FALSE pour chaque ligne de la table. Si l'expression est évaluée à
FALSE, les valeurs entrées violent la contrainte.
• En option, spécifier la clause d'application pour indiquer si la contrainte de vérification est appliquée.
PARTIE 2
• Utiliser ENFORCED ou omettre simplement la clause ENFORCED pour créer et appliquer la contrainte.
• Utiliser NOT ENFORCED pour créer la contrainte mais ne pas l'appliquer.
6 - CHECK : suite
Exemple 1 : Contrainte de colonne
• Contrainte CHECK
description VARCHAR(40),
);
PARTIE 2
• La contrainte check assure que lors de l'insertion, la valeur de chacune des colonnes cout et prix sera >= 0.
6 - CHECK : suite
Exemple 2 : Contrainte de table
• Contrainte CHECK
description VARCHAR(40),
CONSTRAINT produits_chk_prix_et_cout
CHECK(price >= cost)
);
PARTIE 2
• Dans cette requête, on a ajouté une contrainte CHECK nommée produits_chk_prix_et_cout comme contrainte de table, qui assure que la
valeur du prix doit toujours être supérieure à la valeur du coût pour chaque élément de la table produit.
• La commande DROP TABLE supprime définitivement une table et ses données de la base de données. Dans MySQL, on peut également
supprimer plusieurs tables à la fois en suivant la syntaxe de base :
• L'option TEMPORARY permet de supprimer uniquement les tables temporaires. Ceci prévient que l'utilisateur supprime accidentellement des
tables non temporaires.
PARTIE 2
• L'option IF EXISTS fait que MySQL supprime une table uniquement si elle existe. Si on supprime une table inexistante avec l'option IF EXISTS,
MySQL génère une NOTE, qui peut être récupérée à l'aide de l'instruction SHOW WARNINGS.
• Noter que l'instruction DROP TABLE supprime uniquement les tables. Il ne supprime pas les privilèges utilisateur spécifiques associés aux tables.
Par conséquent, si on crée une table avec le même nom que celle supprimée, MySQL appliquera les privilèges existants à la nouvelle table, ce
qui peut poser un risque de sécurité.
• Enfin, pour exécuter DROP TABLE, l'utilisateur doit disposer des privilèges DROP pour la table qu'il va supprimer.
PARTIE 2
• ALTER TABLE est la commande utilisée pour changer la structure d'une table :
...;
);
• Ajouter plusieurs colonnes à la table Produits :
);
• Cette modification peut porter sur le type ainsi que les contraintes associées à cette colonne en utilisant la syntaxe suivante :
...;
PARTIE 2
• Définir cette colonne comme clé primaire de la table « Produits » via l'ajout de la contrainte PRIMARY KEY.
);
Exemple :
• Pour renommer la colonne « cout » en « cout_produit » on exécute la commande suivante :
);
Exemple :
• Supprimer la colonne « description » de la table « Produits» :
RENAME TO nouveau_nom_table ;
Exemple :
• Renommer la table « Produits » en « Articles » :
RENAME TO Articles ;
UNIQUE (liste_colonnes);
• Supprimer la contrainte UNIQUE : Il faut supprimer l'index que MySQL crée pour cette contrainte et qui porte le même nom.
23 heures
CHAPITRE 2
Réaliser des requêtes SQL
1. Requêtes LMD
2. Requêtes de sélection
3. Vues
4. Tables temporaires
5. Expression du SGBD
6. Fonctions d'agrégation du SGBD
7. Sous requêtes
8. Requêtes de l'union
9. Jointures
02 - Réaliser des requêtes SQL
Requêtes LMD
Dans ce qui suit, on va utiliser les requêtes SQL –LMD : Langage de Manipulation de Données (LMD).
INSERT :
• La commande INSERT permet d'insérer une ou plusieurs lignes de données dans une table selon la syntaxe suivante :
On doit spécifier :
• Le nom de la table ainsi qu'une liste de ses colonnes séparées par des virgules entre parenthèses.
• La liste de valeurs à insérer dans ces colonnes, séparées par des virgules.
• Le nombre de colonnes et de valeurs doit être le même. De plus, les positions des colonnes doivent correspondre aux positions de leurs valeurs.
• Pour les colonnes, qui ne figurent pas dans la liste, spécifiées, MySQL insère les valeurs par défaut ou alors NULL si elles ne sont pas spécifiées.
• Si une colonne est définie comme une colonne AUTO_INCREMENT, MySQL génère un entier séquentiel à chaque fois qu'une ligne est insérée
dans la table.
• Les lignes à ajouter dans la table sont séparées par des virgules dans la clause VALUES.
PARTIE 2
INSERT : Exemples
• Soit la table « Produit » créée à partir de la requête suivante :
• On ajoute le produit suivant : Numéro du Produit est P12, son prix est 14 et son cout égale 12.
• Voici la commande à exécuter :
PARTIE 2
INSERT : Exemples
2. Numéro du Produit : P100, description : Laptop, cout : 120, prix : 140, ajouté : aujourd'hui.
INSERT : Exemples
• Voici le contenu de la table après l'exécution de ces requêtes :
• On remarque que :
• La description non spécifiée dans le premier INSERT a été remplacée par la valeur par défaut : 'Non spécifié'
• Pour insérer une valeur de date dans une colonne, il faut utiliser le format 'YYYY-MM-DD' ou :
• YYYY représente une année à quatre chiffres.
PARTIE 2
UPDATE
• L'instruction UPDATE permet de mettre à jour les données d'une table. Elle sert à modifier les valeurs dans une ou plusieurs colonnes d'une
seule ligne ou de plusieurs lignes, selon la syntaxe suivante :
UPDATE nom_table
SET
nom_colonne1 = expr1,
nom_colonne2 = expr2,
...
[WHERE
condition];
• On doit spécifier :
• Le nom de la table dont on souhaite mettre à jour les données.
• La colonne qui va être mise à jour et la nouvelle valeur dans la clause SET.
PARTIE 2
• Pour mettre à jour les valeurs dans plusieurs colonnes, on utilise une liste d'affectations séparées par des virgules.
• En option, définir une condition dans la clause WHERE. Si cette étape est omise, l'instruction UPDATE modifiera toutes les lignes de la
table.
UPDATE : Exemples
• Rappel de la table Produits :
UPDATE Produits
SET
PARTIE 2
Date_ajout = '2021-12-31'
WHERE Num_Produit='P12';
UPDATE : Exemples
• Modifier les données de telle façon que Description ='Non specifie' et Prix = 1.5*cout :
UPDATE Produits
SET
description = 'Non specifie',
Prix = 1.5*cout ;
DELETE
• L'instruction DELETE permet de supprimer une ou plusieurs lignes d'une table en utilisant la syntaxe suivante :
• Cette instruction permet d'utiliser,en option, une condition pour spécifier les lignes à supprimer dans la clause WHERE, si cette dernière est
omise, l'instruction DELETE supprimera toutes les lignes de la table.
• Pour une table qui a une contrainte de clé étrangère, lorsqu’on supprime des lignes de la table parent, les lignes de la table enfant peuvent
aussi être supprimées automatiquement à l'aide de l'option ON DELETE CASCADE.
PARTIE 2
DELETE : Exemples
• De la table Produit :
1. Requêtes LMD
2. Requêtes de sélection
3. Vues
4. Tables temporaires
5. Expression du SGBD
6. Fonctions d'agrégation du SGBD
7. Sous requêtes
8. Requêtes de l'union
9. Jointures
02 - Réaliser des requêtes SQL
Requêtes de sélection
SELECT
• L'instruction SELECT permet de consulter les données et de les présenter triées et/ou regroupées suivant certains critères.
SELECT [Liste_select]
FROM nom_table;
• Spécifier une ou plusieurs colonnes à partir desquelles on veut sélectionner des données après le mot-clé SELECT : Pour sélectionner
toute les colonnes de la table, on utilise « SELECT * » , sinon on spécifie les noms des colonnes séparés par une virgule (,).
• Spécifier le nom de la table à partir de laquelle on veut sélectionner des données après le mot-clé FROM.
• N.B : Lors de l'exécution de l'instruction SELECT, MySQL évalue la clause FROM avant la clause SELECT
PARTIE 2
FROM SELECT
SELECT
Exemples de requêtes SELECT simples
PARTIE 2
SELECT
Options de la Requête SELECT
• La requête SQL plus avancée prend la forme suivante :
GROUP ORDER
FROM WHERE HAVING SELECT DISTINCT
PARTIE 2
BY BY
DISTINCT
DISTINCT est une option qui permet de supprimer les lignes en double.
PARTIE 2
WHERE
• WHERE définit la liste des conditions que les données recherchées doivent vérifier. La condition de recherche est une combinaison d'une ou
plusieurs expressions utilisant les opérateurs logiques AND, OR et NOT. L'instruction SELECT inclura toute ligne qui satisfait la condition de
recherche dans le jeu de résultats.
• WHERE est aussi utilisé dans UPDATE ou DELETE pour spécifier les lignes à mettre à jour ou à supprimer.
PARTIE 2
GROUP BY
• La clause GROUP BY regroupe un ensemble de lignes dans un ensemble de lignes récapitulatives par valeurs de colonnes ou d'expressions. La
clause GROUP BY renvoie une ligne pour chaque groupe, ceci réduit le nombre de lignes dans le jeu de résultats.
• En pratique, on utilise souvent la clause GROUP BY avec des fonctions d'agrégation telles que SUM, AVG, MAX, MIN et COUNT. La fonction
d'agrégation qui apparaît dans la clause SELECT fournit les informations de chaque groupe.
• Exemple :
PARTIE 2
HAVING
La clause HAVING est utilisée dans l'instruction SELECT pour spécifier des conditions de filtre pour un groupe de lignes ou d'agrégats. Elle est
souvent utilisée avec GROUP BY pour filtrer les groupes en fonction d'une condition spécifiée. Si la clause GROUP BY est omise, HAVING se
comporte comme la clause WHERE.
PARTIE 2
ORDER BY
• La clause ORDER BY est utilisée pour trier les lignes du jeu de résultats. Elle peut porter sur plusieurs colonnes, chacune suivie, en option, de
l'ordre de tri utilisé : ascendant ASC ou descendant DESC. L'ordre de tri par défaut étant ASC.
• Exemple :
PARTIE 2
1. Requêtes LMD
2. Requêtes de sélection
3. Vues
4. Tables temporaires
5. Expression du SGBD
6. Fonctions d'agrégation du SGBD
7. Sous requêtes
8. Requêtes de l'union
9. Jointures
02 - Réaliser des requêtes SQL
Les vues
Les vues
▪ Les vues sont des objets de base de données qui permettent d'enregistrer une requête particulière sous forme de table. Cela permet
d'enregistrer les résultats afin de pouvoir les utiliser ultérieurement.
▪ Remarques
• Les vues dans MySQL sont interrogeables, ce qui signifie qu’on peut les inclure dans une autre requête, un peu comme une table
dans MySQL.
PARTIE 2
• Les vues peuvent également être mises à jour car on peut insérer, mettre à jour et supprimer des lignes dans la table sous-jacente
si la vue ne peut pas contenir les éléments suivants : MIN, MAX, SUM, AVG, COUNT, DISTINCT, GROUP BY, HAVING, UNION, LEFT
JOIN ou OUTER JOIN.
1. Requêtes LMD
2. Requêtes de sélection
3. Vues
4. Tables temporaires
5. Expression du SGBD
6. Fonctions d'agrégation du SGBD
7. Sous requêtes
8. Requêtes de l'union
9. Jointures
02 - Réaliser des requêtes SQL
Les tables temporaires
• Une table temporaire est un type spécial de table qui permet de stocker un ensemble de résultats temporaires, qu’on peut
réutiliser plusieurs fois au cours d'une même session.
• Une table temporaire est très pratique lorsqu'il est impossible ou coûteux d'interroger des données nécessitant une seule
instruction SELECT avec les clauses JOIN. Dans ce cas, on peut utiliser une table temporaire pour stocker le résultat immédiat et
utiliser une autre requête pour le traiter.
• MySQL supprime automatiquement la table temporaire lorsque la session se termine ou que la connexion est interrompue.
• On peut utiliser l'instruction DROP TABLE pour supprimer explicitement une table temporaire lorsqu’elle n’est plus utilisée.
• Une table temporaire n'est disponible et accessible qu'au client qui la crée.
PARTIE 2
• Une table temporaire peut avoir le même nom qu'une table normale dans une base de données, dans ce cas, cette
dernière est masquée par la table temporaire dans les requêtes.
1. Requêtes LMD
2. Requêtes de sélection
3. Vues
4. Tables temporaires
5. Expression du SGBD
6. Fonctions d'agrégation du SGBD
7. Sous requêtes
8. Requêtes de l'union
9. Jointures
02 - Réaliser des requêtes SQL
Expression du SGBD
Expression du SGBD
• Une expression se compose d'ensemble de colonnes, constantes et fonctions combinées au moyen d'opérateurs. On trouve les expressions
dans les différentes parties du SELECT : en tant que colonne résultat, dans les clauses WHERE, HAVING, et ORDER BY.
Expressions de chaînes de
Expressions arithmétiques Expressions de dates
caractères
• Afin d'utiliser des données de types différents dans la même expression, on peut utiliser les fonctions de conversion dont dispose le langage
SQL. Celles-ci permettent de convertir des chaînes de caractères en date ou en nombre selon le besoin.
PARTIE 2
• Un opérateur est un symbole spécifiant une action exécutée sur une ou plusieurs expressions. On trouve en SQL, différentes catégories
d'opérateurs.
• + addition
• - soustraction
• * multiplication
• / division
• Une expression arithmétique peut comporter plusieurs opérateurs. Dans ce cas, le résultat de l'expression peut varier selon l'ordre dans lequel
sont effectuées les opérations. Les opérateurs de multiplication et de division sont prioritaires par rapport aux opérateurs d'addition et de
soustraction. Des parenthèses peuvent être utilisées pour forcer l'évaluation de l'expression dans un ordre différent de celui découlant de la
priorité des opérateurs.
• Au moyen des opérateurs arithmétiques + et -, il est possible de construire les expressions suivantes :
• date +/- nombre : le résultat est une date obtenue en ajoutant/soustrayant le nombre de jours à la date.
• date2 - date1 : le résultat est le nombre de jours entre les deux dates.
PARTIE 2
• Ils peuvent s'utiliser sur toutes les expressions composées de données structurées.
Opérateur BETWEEN
• On utilise BETWEEN pour tester si une valeur est comprise entre une valeur minimale et une autre maximale. La syntaxe de l'opérateur
BETWEEN : valeur BETWEEN Minimum AND Maximum
Exemple :
PARTIE 2
La liste des produits dont la description commence par 'L' La liste des produits qui ont '2' dans la case avant dernière de leur Num_Produit
Copyright - Tout droit réservé - OFPPT 220
02 - Réaliser des requêtes SQL
Expression du SGBD
• MySQL, comme les autres SGBD, propose de nombreuses fonctions intégrées qui permettent de manipuler les données utilisateurs ou les
données du système.
• Fonctions mathématiques
• Fonctions de conversion
• La liste exhaustive des fonctions MySQL est disponible sur le lien : https ://dev.MySQL.com/doc/refman/8.0/en/functions.html
PARTIE 2
Ce sont des fonctions ayant un ou plusieurs nombres comme arguments, et qui renvoient une valeur numérique.
Fonction Description
CEIL() Renvoie la plus petite valeur entière supérieure ou égale au nombre d'entrée
FLOOR() Renvoie la plus grande valeur entière non supérieure au nombre d'entrée
SUBSTRING_INDEX Renvoyer une sous-chaîne à partir d'une chaîne avant un nombre spécifié d'occurrences d'un délimiteur
TRIM Supprimer les caractères indésirables d'une chaîne
FIND_IN_SET Rechercher une chaîne dans une liste de chaînes séparées par des virgules
FORMAT Mettre en forme une chaîne avec le format spécifié
UPPER Convertir une chaîne en majuscule
Copyright - Tout droit réservé - OFPPT 223
02 - Réaliser des requêtes SQL
Expression du SGBD
• TO_CHAR(date,format) : Renvoie la conversion d'une date en chaîne de caractères. Le format indique quelle partie de la date doit apparaître.
• TO_DATE(chaîne,format) : Permet de convertir une chaîne de caractères en donnée de type date. Le format est identique à celui de la
fonction TO_CHAR().
1. Requêtes LMD
2. Requêtes de sélection
3. Expression du SGBD
4. Fonctions d'agrégation du SGBD
5. Sous requêtes
6. Requêtes de l'union
7. Jointures
02 - Réaliser des requêtes SQL
Fonctions d'agrégation du SGBD
• Une fonction d'agrégation effectue un calcul sur plusieurs valeurs et renvoie une seule valeur.
• Les fonctions d'agrégation les plus utilisés : SUM, AVG, COUNT, MAX et MIN.
• Les fonctions d'agrégation sont souvent utilisées avec la clause GROUP BY pour calculer une valeur agrégée pour chaque groupe, par exemple la
valeur moyenne par groupe ou la somme des valeurs dans chaque groupe.
La fonction SUM()
• La fonction SUM() retourne la somme des valeurs d'une colonne.
• L’exemple suivant illustre l'utilisation de la fonction d'agrégation SUM() avec une clause GROUP BY :
Nom Valeur ∑
A 10 SELECT
Nom SUM (Valeur)
Nom,
A 20 SUM(Valeur) A 30
FROM
PARTIE 2
B 40
Sample_table B 40
C 20 GROUP BY
Nom; C 70
C 50
La fonction SUM()
Exemple :
PARTIE 2
La fonction AVG()
La fonction COUNT()
La fonction COUNT() retourne le nombre d'enregistrements sélectionnés.
Exemple :
PARTIE 2
La fonction MAX/MIN
Les fonctions MAX() et MIN() retournent respectivement le maximum et le minimum des valeurs des enregistrements sélectionnés.
Exemple :
1. Requêtes LMD
2. Requêtes de sélection
3. Expression du SGBD
4. Fonctions d'agrégation du SGBD
5. Sous requêtes
6. Requêtes de l'union
7. Jointures
02 - Réaliser des requêtes SQL
Sous requêtes
• Une sous-requête est une requête imbriquée dans une autre requête telle que SELECT, INSERT, UPDATE ou DELETE.
• Une sous-requête est appelée « requête interne » tandis que la requête qui contient la sous-requête est appelée une requête externe. La
requête dite interne est évaluée pour chaque ligne de la requête externe.
• Une sous-requête peut être utilisée partout où une expression est utilisée et doit être fermée entre parenthèses.
Exemple
• La table Produits :
PARTIE 2
• On utilise des opérateurs de comparaison, par exemple =, >, < pour comparer une seule valeur renvoyée par la sous-requête avec l'expression
dans la clause WHERE.
• Si une sous-requête renvoie plusieurs valeurs, on peut utiliser d'autres opérateurs tels que l'opérateur IN ou NOT IN dans la clause WHERE.
• Afficher la liste des produits de la table Produits qui existent dans la table Sales :
PARTIE 2
• On peut utiliser les opérateurs ANY, ou ALL pour comparer la valeur d'une expression avec les valeurs d'un attribut d'une requête interne.
• Le mot-clé ALL spécifie tous les éléments retournés tandis que le mot-clé ANY spécifie l'un d'entre eux.
• Afficher les produits dont le cout est Inferieur à tous les prix des produits.
PARTIE 2
• Lorsqu'une sous-requête est utilisée avec l'opérateur EXISTS ou NOT EXISTS, une sous-requête renvoie une valeur booléenne TRUE ou FALSE.
• Afficher les produits avec une colonne supplémentaire indiquant si le produit est présent dans la table Sales :
PARTIE 2
1. Requêtes LMD
2. Requêtes de sélection
3. Expression du SGBD
4. Fonctions d'agrégation du SGBD
5. Sous requêtes
6. Requêtes de l'union
7. Jointures
02 - Réaliser des requêtes SQL
Requêtes de l'union
• La combinaison des résultats des requêtes consiste à transformer deux ou plusieurs jeux de résultat en un seul.
• Les jeux de résultats combinés doivent tous avoir la même structure : même nombre de colonnes et même types de données.
Opérateur UNION
• L'opérateur UNION permet de combiner deux ou plusieurs ensembles de résultats de requêtes en un seul ensemble de résultats. Voici la
syntaxe d'utilisation de l'opérateur UNION :
SELECT column_list1
UNION [DISTINCT | ALL]
SELECT column_list2
UNION [DISTINCT | ALL]
PARTIE 2
SELECT column_list3
...
Opérateur UNION
• Par défaut, l'opérateur UNION supprime les lignes en double même si on ne spécifie pas l'opérateur DISTINCT.
• Soient les deux tables :
Group1 Group2
ID ID
1 2
2 3
3 4
• La requête UNION :
PARTIE 2
• Si on utilise UNION ALL explicitement, les lignes dupliquées, sont affichées dans le résultat. Du fait que UNION ALL ne gère pas les doublons, il
s'exécute plus rapidement que UNION DISTINCT.
PARTIE 2
Opérateur UNION
• Le diagramme de Venn suivant illustre l'union de deux ensembles de résultats provenant des tables Group1 et Group2 :
PARTIE 2
Opérateur INTERSECT
• L'opérateur INTERSECT compare les ensembles de résultats de deux requêtes ou plus et renvoie les lignes distinctes générées par les deux
requêtes.
• MySQL ne prend pas en charge l'opérateur INTERSECT. Cependant, on peut l'émuler en utilisant les jointures.
Opérateur INTERSECT
Contrairement à l'opérateur UNION, l'opérateur INTERSECT renvoie l'intersection entre deux cercles.
• Donc la requête :
• Renvoie :
ID
2
3
PARTIE 2
• L'opérateur MINUS compare les résultats de deux requêtes et renvoie des lignes distinctes du jeu de résultats de la première requête qui
n'apparaissent pas dans le jeu de résultats de la deuxième requête. MySQL ne prend pas en charge l'opérateur MINUS. Cependant, On peut
l'émuler en utilisant les jointures.
• Donc la requête :
•
(SELECT ID FROM Group1)
MINUS
PARTIE 2
• Revoie : ID
1
1. Requêtes LMD
2. Requêtes de sélection
3. Expression du SGBD
4. Fonctions d'agrégation du SGBD
5. Sous requêtes
6. Requêtes de l'union
7. Jointures
02 - Réaliser des requêtes SQL
Jointures
• Une base de données relationnelle se compose de plusieurs tables liées entre elles à l'aide de colonnes communes, appelées clés étrangères.
• Dans l'exemple « centre de formation » déjà présenté dans ce cours on trouve que les deux tables « etudiant » et « inscription » sont liées a
l'aide de la colonne : numCINEtu
PARTIE 2
• Afin d'avoir plus d'information sur les étudiants ou les inscriptions, on a besoin de chercher dans les deux tables à la fois. D'où la nécessité des
jointures.
• La jointure consiste à rechercher entre deux tables ayant un attribut commun (même type et même domaine de définition) tous les tuples (les
lignes) pour lesquels ces attributs ont la même valeur.
• Pour joindre des tables, on utilise la clause de jointure dans l'instruction SELECT après la clause FROM.
PARTIE 2
• Noter que MySQL ne prend pas en charge la jointure FULL OUTER JOIN.
INNER JOIN
• INNER JOIN joint deux tables en fonction d'une condition connue sous le nom de prédicat de jointure.
• Elle spécifie ainsi toutes les paires correspondantes de lignes renvoyées et ignore les lignes n'ayant pas de correspondance entre les deux
tables.
• La clause INNER JOIN ne retient que les lignes des deux tables pour lesquelles l'expression exprimée au niveau de ON se vérifie.
Exemple :
PARTIE 2
Produits Sales
INNER JOIN
• Afin d’afficher, pour chaque produit vendu, son prix, sa description et la quantité qui a été vendue, on a besoin de joindre les deux tables
comme suit :
SELECT
P.Num_Produit,
P.Description,
P.prix,
S.quantite
FROM
Produits P
INNER JOIN Sales S ON P.Num_Produit=S.Num_Produit;
• Dans l’exemple, INNER JOIN utilise les valeurs des colonnes de « Num_Produit » dans les tables « Produits » et « Sales » pour faire la
correspondance.
PARTIE 2
INNER JOIN
• Si la colonne de jointure a le même nom dans les deux tables objets de la jointure, on peut utiliser la syntaxe suivante :
SELECT
P.Num_Produit,
P.Description,
P.prix,
S.quantite
FROM
Produits P
INNER JOIN Sales S USING (Num_Produit);
PARTIE 2
LEFT JOIN
• Lors de la jointure de deux tables à l'aide d'une jointure gauche, les concepts de tables gauche et droite sont introduits.
• La jointure gauche sélectionne les données à partir de la table de gauche. Pour chaque ligne de la table de gauche, la jointure de gauche est
comparée à chaque ligne de la table de droite.
• Si les valeurs des deux lignes satisfont la condition de jointure, la clause de jointure gauche crée une nouvelle ligne, dont les colonnes sont les
colonnes des lignes des deux tables, et inclut cette ligne dans le jeu de résultats.
• Si les valeurs des deux lignes ne correspondent pas, la clause de jointure gauche crée toujours une nouvelle ligne dont les colonnes contiennent
les colonnes de la ligne de la table de gauche et NULL pour les colonnes de la ligne de la table de droite.
• En d'autres termes, la jointure gauche sélectionne toutes les données de la table de gauche, qu'il existe ou non des lignes correspondantes dans
la table de droite.
PARTIE 2
LEFT JOIN
Exemple :
SELECT
P.Num_Produit,
P.Description,
P.prix,
S.quantite
FROM
Produits P
LEFT JOIN Sales S ON P.Num_Produit=S.Num_Produit;
LEFT JOIN
• Le résultat de l’exemple précédent est :
RIGHT JOIN
• La clause de jointure droite est similaire à la clause de jointure gauche sauf que le traitement des tables gauche et droite est inversé.
• La jointure droite commence à sélectionner les données de la table de droite au lieu de la table de gauche : RIGHT JOIN sélectionne toutes les
lignes de la table de droite et fait correspondre les lignes de la table de gauche.
• Si une ligne de la table de droite n'a pas correspondances dans la table de gauche, la colonne de la table de gauche aura NULL dans le jeu de
résultats final.
Exemple :
SELECT
S.Num_Produit,
S.Quantite,
P.prix
FROM
Sales S
PARTIE 2
• Ou alors
RIGHT JOIN Produits S USING(Num_Produit) ;
RIGHT JOIN
• Le résultat de l’exemple précédent est :
CROSS JOIN
Contrairement à autres types de jointures, la jointure croisée n'a pas de condition de jointure. Elle crée le produit cartésien des lignes des tables
jointes. La jointure croisée combine chaque ligne de la première table avec chaque ligne de la table de droite pour créer le jeu de résultats.
Exemple :
PARTIE 2
SELF JOIN
• L'auto-jointure est souvent utilisée pour interroger des données hiérarchiques ou pour comparer une ligne avec d'autres lignes dans la même
table.
• Pour effectuer une auto-jointure, on utilise des alias de la table pour ne pas répéter deux fois le même nom de table dans la même requête.
N.B : Référencer une table deux fois ou plus dans une requête sans utiliser d'alias de table provoquera une erreur.
Exemple :
• La colonne IdParent définit le père de chaque personne, qui est aussi un élément de la table « People ».
SELF JOIN
• Afin d'avoir la liste des personnes et leurs parents, il faut utiliser une auto-jointure.
05 heures
CHAPITRE 3
Administrer une base de données
1. Backup/Restore
2. Importation
3. Exportation
4. Commandes de création des comptes utilisateurs
5. Commandes de gestion des privilèges de base
03 - Administrer une base de données
Backup/Restore
Backup
L'outil MySQLdump permet de sauvegarder une ou plusieurs bases de données. Il génère un fichier texte contenant les instructions SQL qui
peuvent recréer les bases de données. MySQLdump est situé dans le répertoire root/bin du répertoire d'installation de MySQL.
PARTIE 2
MySQLdump --user=<username>
--password=<password>
--result-file=<Lien_Fichier_Backup>
--databases <Liste_des_databases>
• Si on veut faire un backup de toutes les bases de données d'une instance MySQL, on remplace l'option : --databases <Liste_des_databases>
par : --all-databases
Exemple :
Réaliser le backup des tables « Produits » et « Sales » de la base de données « dbtest »
• Données seulement :
MySQLdump --user=<username>
PARTIE 2
--password=<password>
--result-file=<Lien_Fichier_Backup>
--no-create-info
--databases <Liste_des_databases>
1. Backup/Restore
2. Importation
3. Exportation
4. Commandes de création des comptes utilisateurs
5. Commandes de gestion des privilèges de base
03 - Administrer une base de données
Importation
Afin d'importer des données sous forme de fichier sql sur MySQL à partir de la ligne de commande, on peut utiliser la commande source comme
dans le cas du restore.
Exemple :
MySQL>source c :\backup\fichier_backup.sql
Il est recommandé d'utiliser la commande source pour restaurer une base de données car elle renvoie des informations très détaillées sur le
processus, notamment des avertissements et des erreurs.
PARTIE 2
L'utilitaire Import data dans Workbench permet aussi de réaliser cette tâche en suivant ces étapes :
3. Cliquer sur Data Import à partir de l'élément Server dans le menu de navigation
PARTIE 2
4. Dans le volet « Data Import from Disk », Section « Import Options », choisir « Import from Self-Contained File », et sélectionner le fichier
SQL qui contient les données à importer.
PARTIE 2
5. Choisir le schéma cible par défaut (Default Target Schema) où les données seront importées. On peut également créer une nouvelle base
de données en choisissant New (Nouveau)
6. Passer sur le volet : Import Progress et choisir Start Import (Démarrer l'importation) pour lancer l'importation
PARTIE 2
7. L’importation peut prendre quelques minutes ou plus en fonction de la taille du fichier « .SQL ». Une fois l'importation terminée, un
message semblable à ce qui suit s’affiche :
PARTIE 2
• MySQL Workbench fournit un outil pour importer des données dans une table. Il permet de modifier les données avant de les charger.
• Voici les étapes à suivre pour importer des données dans une table :
1. Ouvrir la table dans laquelle on veut importer des données
2. Cliquer sur l'icône « Import records from an external file »
PARTIE 2
4. Choisir d'importer les données vers une table qui existe déjà, ou en créer une nouvelle.
PARTIE 2
1. Backup/Restore
2. Importation
3. Exportation
4. Commandes de création des comptes utilisateurs
5. Commandes de gestion des privilèges de base
03 - Administrer une base de données
Exportation
1. Ouvrir MySQL Workbench. Dans la liste des MySQL Connexions, choisir la base de données, puis naviguer dans le menu Server et cliquer
sur « Export Data »
PARTIE 2
données exportées
1. Backup/Restore
2. Importation
3. Exportation
4. Commandes de création des comptes utilisateurs
5. Commandes de gestion des privilèges de base
03 - Administrer une base de données
Commandes de création des comptes utilisateurs
• On utilise la commande CREATE USER pour créer de nouveaux utilisateurs dans le serveur de base de données MySQL.
IDENTIFIED BY 'mot_de_passe';
• nom_compte : Il s'agit du nom du compte à créer et se compose en général de deux parties sous cette forme :
nom_utilisateur@nom_host.
• nom_host : est le nom de l'hôte à partir duquel l'utilisateur se connecte au serveur MySQL. La partie nom d'hôte du nom de compte est
PARTIE 2
optionnelle. Si elle est omise, l'utilisateur peut se connecter depuis n'importe quel hôte.
Exemple :
Exemple :
• Afin de tester le login, on ouvre une autre session MySQL avec le compte « Ahmad » , en utilisant la commande suivante : MySQL – u Ahmad –p
1. Backup/Restore
2. Importation
3. Exportation
4. Commandes de création des comptes utilisateurs
5. Commandes de gestion des privilèges de base
03 - Administrer une base de données
Commandes de gestion des privilèges de base
• Pour qu'un utilisateur puisse accéder aux objets de base de données, il faut d'abord lui accorder des privilèges. Ceci se fait à l'aide de la
commande GRANT.
ON privilege_level
TO nom_utilisateur;
• Pour donner des privilèges au compte « nom_utilisateur », il faut spécifier le/les privilèges à donner ( SELECT, DELETE, UPDATE, ALL, etc.) et sur
quel niveau les appliquer.
PARTIE 2
Niveau de privilèges
Table Routine
PARTIE 2
Colonne
Niveau de privilèges
Table Routine
Colonne
1. Niveau global :
• Les privilèges globaux s'appliquent à toutes les bases de données d'un serveur MySQL. Pour attribuer des privilèges globaux, utiliser la
syntaxe *.*.
Exemple :
GRANT UPDATE
PARTIE 2
ON *.*
TO Ahmad@localhost;
Niveau de privilèges
Table Routine
Colonne
• Ces privilèges s'appliquent à tous les objets d'une base de données. Pour attribuer des privilèges au niveau de la base de données, on
utilise la syntaxe : ON nom_base_de_données.*
Exemple :
GRANT INSERT
PARTIE 2
ON dbtest.*
TO Ahmad@localhost;
Niveau de privilèges
Table Routine
Colonne
3. Niveau Table :
• Les privilèges de table s'appliquent à toutes les colonnes d'une table. Pour attribuer des privilèges au niveau de la table, on utilise la
syntaxe ON nom_base_de_données.nom_table.
Exemple :
GRANT INSERT,DELETE
PARTIE 2
ON dbtest.Produits
TO Ahmad@localhost;
Niveau de privilèges
Table Routine
Colonne
4. Niveau Colonne :
• Les privilèges de colonne s'appliquent à des colonnes uniques dans une table. Spécifier la/les colonnes pour chaque privilège.
Exemple : GRANT
UPDATE(Prix)
ON dbtest.Produits
TO Ahmad@localhost;
Niveau de privilèges
Table Routine
Colonne
5. Niveau Routine :
ON PROCEDURE CalculPrix
PARTIE 2
TO Ahmad@localhost;
Niveau de privilèges
Table Routine
Colonne
6. Niveau Proxy :
• Les privilèges d'utilisateur proxy permettent à un utilisateur externe d'être un proxy pour un autre, c'est-à-dire, d'avoir les privilèges du
deuxième utilisateur. En d'autres termes, l'utilisateur externe est un "utilisateur proxy" (un utilisateur qui peut usurper l'identité ou
devenir un autre utilisateur) et le deuxième utilisateur est un "utilisateur mandaté" (un utilisateur dont l'identité peut être reprise par un
utilisateur proxy).
Exemple :
GRANT PROXY
PARTIE 2
ON root
TO Ahmad@localhost;
Niveau
Privilège Description
Global BD Table Colonne Routine Proxy
ALL [PRIVILEGES] Accorde tous les privilèges au niveau spécifié sauf GRANT OPTION
ALTER Autorise l'utilisation de ALTER TABLE X X X
ALTER ROUTINE Autorise ALTER et DROP des procédures et fonctions stockées X X X
CREATE Autorise la création des bases de données et tables X X X
CREATE ROUTINE Autorise la création des procédures et fonctions stockées X X
CREATE TEMPORARY TABLES Autorise la création des tables temporaires : CREATE TEMPORARY TABLE X X
CREATE USER Autorise l'utilisation de : CREATE USER, DROP USER, RENAME USER et REVOKE ALL PRIVILEGES X
CREATE VIEW Autorise la création et la modification des vues X X X
DELETE Autorise l'utilisation de DELETE X X X
DROP Autorise la suppression des bases de données et des tables X X X
EXECUTE Autorise l'exécution des routines X X X
GRANT OPTION Autorise l'utilisateur à accorder ou révoquer des privilèges d'autres comptes X X X X X
INDEX Autorise la création et la suppression des indexes X X X
INSERT Autorise l'utilisation de INSERT X X X X
PARTIE 2
• Afin de supprimer un ou plusieurs privilèges donnés à des utilisateurs, on utilise la commande REVOKE suivant cette syntaxe :
REVOKE
Privilege1 [,privilege2]..
ON [type_objet] privilege_level
• Il faut spécifier :
• Une liste de privilèges séparés par des virgules qu'on veut révoquer d'un compte d'utilisateur après le mot-clé REVOKE ;
• Un ou plusieurs comptes d'utilisateur dont on souhaite révoquer les privilèges dans la clause FROM.
FROM Ahmad@localhost;
REVOKE SELECT,UPDATE,DELETE
ON dbtest.*
• Niveau global : Les modifications prennent effet lorsque le compte utilisateur se connecte au serveur MySQL dans les sessions
PARTIE 2
prochaines. Les modifications ne sont pas appliquées à tous les utilisateurs actuellement connectés.
• Niveau base de données : Les modifications prennent effet après la prochaine instruction USE.
• Niveaux table et colonne : Les modifications prennent effet sur toutes les requêtes suivantes.
30 heures
CHAPITRE 1
Maîtriser le langage de programmation
procédurale sous MySQL
25 heures
CHAPITRE 1
Maîtriser le langage de programmation
procédurale sous MySQL
Introduction
• Les structures de contrôle habituelles d'un langage de programmation (IF, WHILE, etc.) ne font pas partie intégrante de la norme SQL.
• Elles apparaissent dans une sous-partie optionnelle de la norme (ISO/IEC 9075-5 :1996. Flow-control statements).
• Le Langage Procédural de MySQL (PL+SQL) permet de faire cohabiter les habituelles structures de contrôle
(IF,CASE,WHILE,REPEAT,LOOP) avec des instructions SQL (principalement SELECT, INSERT, UPDATE et DELETE).
• Le langage de programmation procédural / SQL est un langage fondé sur les paradigmes de la programmation procédurale. Il est
structuré pour appliquer et manipuler des requêtes SQL.
Avantages
PARTIE 3
Types de programmes
• PL/SQL est un langage structuré sous forme de blocs.
• Un bloc PL/SQL peut être « externe » ou anonyme, ou alors stocké dans la base de données sous forme de :
PARTIE 3
Procédure stockée •
Fonction Déclencheur
• Un bloc PL/SQL est intégralement envoyé au moteur PL/SQL, qui traite chaque instruction PL/SQL et sous-traite les instructions purement SQL
au moteur SQL, afin de réduire le trafic réseau.
Copyright - Tout droit réservé - OFPPT 309
CHAPITRE 1
Maîtriser le langage de programmation
procédurale sous MySQL
• Lors des conflits potentiels de noms (variables ou colonnes) dans des instructions SQL (principalement INSERT, UPDATE, DELETE et
SELECT), le nom de la variable est prioritairement interprété au détriment de la colonne de la table (de même nom).
• Il ne peut pas contenir des mots réservés, à moins qu'ils soient encadrés par des guillemets.
CHAR (n) Chaînes fixes de 1 à 32757 caractères (différent pour une colonne de table)
RAW Permet de stocker des types de données binaire relativement faibles (<=32767 octets) idem que VARCHAR2.
Les données RAW ne subissent jamais de conversion de caractères lors de leur transfert entre le programme
et la base de données
LONG RAW Idem que LONG mais avec du binaire
• C'est une variable définie par un client qui n'est pas visible par les autres clients. En d'autres termes, une variable définie par l'utilisateur
qui est spécifique à la session.
SELECT
@max_prix := MAX (pu) -- initialiser la variable de session @max_prix par le maximum des prix
FROM
Produits;
SELECT
id, designation, qtstock, pu
PARTIE 3
FROM
produit
WHERE
pu = @max_prix; -- utiliser la variable @max_prix pour lister les produits dont le prix est le max
• Les chaînes de caractères et les dates doivent être entourées de simples quotes ( ' ' )
• La portée d'un objet (variable, curseur ou exception) est limitée au bloc dans lequel il est déclaré.
• En revanche, un objet déclaré dans un sous-bloc n'est pas visible du bloc conteur.
PARTIE 3
• Une session client peut acquérir ou libérer des verrous de table uniquement
pour elle-même.
• Une session client ne peut pas acquérir ou libérer des verrous de table pour
d'autres sessions client.
Syntaxe
Structures de contrôle
• Les blocs PL/SQL traités permettent d'exécuter une suite d'actions les unes à la suite des autres
• Les problèmes réels sont plus complexes. La résolution de certains problèmes se fait sous un ensemble de conditions
• Pour chaque condition, un traitement spécifique sera déclenché. Il est donc possible de contrôler ces instructions dans un bloc, grâce à des
structures de contrôle.
IF-ELSE
END IF;
DELIMITER ;
L'instruction LOOP permet d'exécuter une ou plusieurs CREATE TABLE test (VALUE INT NULL DEFAULT NULL) ;
DECLARE a INT DEFAULT 1 ;
instructions à plusieurs reprises.
simple_loop : LOOP
INSERT INTO test VALUES (a) ;
[labele_debut :] LOOP SET a = a + 1 ;
IF a = 11 THEN
statement_list
LEAVE simple_loop ;
END LOOP [label_fin] END IF ;
END LOOP simple_loop;
UNTIL condition
• On n'a donc pas à le faire. Si on souhaite avoir la possibilité - - Ceci indique le début de la transaction
d'annuler l'instruction INSERT, on doit utiliser une transaction. INSERT INTO mytable VALUES (1, 'foo','bar','bas') ;
SELECT * FROM mytable ;
• Cela peut être fait avec une instruction BEGIN ou une instruction
COMMIT;
START TRANSACTION.
- - Utiliser ROLLBACK au lieu de COMMIT si on veut annuler l'opération
• Une fois qu'on a exécuté une ou plusieurs instructions pour
modifier les données, on doit utiliser COMMIT ou ROLLBACK.
PARTIE 3
COMMIT
Pour enregistrer les modifications
ROLLBACK
Pour annuler les modifications
• Ces commandes ne sont utilisées qu'avec les commandes INSERT, UPDATE et DELETE uniquement.
PARTIE 3
Exemple
• On suppose que le débit ait été un succès, mais que le crédit n'ait pas eu lieu, peut-être à cause de problèmes de base de données.
Dans ce cas, la base de données serait dans un état incohérent.
• Idéalement, on veut que cette transaction (à la fois de crédit et de débit) se produise, sinon aucune d'entre elles ne se produira,
c'est-à-dire que dans ce cas, s'il s'agissait d'une transaction, un échec de crédit aurait entraîné une annulation de l'opération de
débit et il n'y aurait eu aucun changement dans l'état de la base de données.
START TRANSACTION ;
UPDATE compte SET solde = solde – 200 WHERE accountno = 'ACC1' ; - - Débiter le compte ACC1
PARTIE 3
UPDATE compte SET solde = solde + 200 WHERE accountno = 'ACC2' ; - - Créditer le compte ACC2
COMMIT ; - - Valider
• MySQL utilise un thread spécial appelé thread du planificateur d'événements pour exécuter tous les événements planifiés.
• On peut afficher l'état du thread du planificateur d'événements en exécutant la commande SHOW PROCESSLIST :
• D'après l'exemple, un message sera enregistré dans la table « messages », chaque minute, pendant une heure.
Introduction
• Afin d'éviter qu'un programme ne s'arrête dès la première erreur suite à une instruction SQL, il est indispensable de prévoir les cas
potentiels d'erreurs et d'associer à chacun de ces cas la programmation d'une exception (handler).
• Les exceptions peuvent être gérées dans un sous-programme (fonction ou procédure) ou un déclencheur.
• Une exception MySQL correspond à une condition d'erreur et peut être associée à un identificateur (exception nommée).
• Une exception est détectée (aussi dite « levée ») si elle est prévue dans un handler au cours de l'exécution d'un bloc (entre BEGIN et END ).
• Une fois levée, elle fait continuer (ou sortir du bloc) le programme après avoir réalisé une ou plusieurs instructions que le programmeur aura
explicitement spécifiées.
• Deux mécanismes qui peuvent être mis en œuvre pour gérer une exception en MySQL : CONTINUE et EXIT.
PARTIE 3
Syntaxe
DECLARE handler_action HANDLER • CONTINUE : (appelée handler) force à poursuivre l'exécution de programme lorsqu'il se
FOR condition_value [, condition_value] …
passe un événement prévu dans la clause FOR
statement
Handler_action : { • EXIT fait sortir l'exécution du bloc courant entre BEGIN et END
CONTINUE • SQLSTATE : code d'erreur qui permet de couvrir toutes les erreurs d'un état donné.
| EXIT Pour plus de détails consulter (https ://dev.MySQL.com/doc/connector-
| UNDO
j/5.1/en/connector-j-reference-error-sqlstates.html)
}
• SQLWARNING :permet de couvrir toutes les erreurs d'état SQLSTATE débutant par 01.
Condition_value : {
MySQL_error_code • NOT FOUND : permet de couvrir toutes les erreurs d'état SQLSTATE débutant par 02
| SQLSTATE [VALUE] sqlstate_value (relatives à la gestion des curseurs).
| condition_name • SQLEXCEPTION : gère toutes les erreurs qui ne sont ni gérées par SQLWARNING ni par
PARTIE 3
| SQLWARNING
NOT FOUND
| NOT FOUND
| SQL EXCEPTION • statement : une ou plusieurs instructions du langage de MySQL (bloc, appel possibles
} par CALL d'une fonction ou d'une procédure stockée).
DELEMITER//;
CREATE PROCEDURE ps_ajouter_client_Exception1(IN p_nom VARCHAR (200),
IN p_prenom VARCHAR(200),
IN p_adresse VARCHAR(200))
BEGIN
DECLARE flagNOTNULL BOOLEAN DEFAULT 0 ;
BEGIN - - début bloc de déclaration des deux exceptions
DECLARE EXIT HANDLER FOR 1048
SET flagNOTNULL := -1;
INSERT INTO clients (nom, prenom, adresse) VALUES (p_nom, p_prenom, p_adresse);
SELECT 'le client est ajouté avec succès';
PARTIE 3
AS 'Resultat ps_exc_not_found_Exemple1' ;
END IF;
END;
CALL ps_exc_not_found_Exemple1('Dalaj');
DELIMITER // ;
• L'exemple suivant décrit une procédure CREATE PROCEDURE autreErreur ()
qui gère une erreur non spécifique. BEGIN
SELECT 'Une autre erreur est survenue' ;
• Remarque : MySQL ne permet pas, pour END ; //
DELIMITER // ;
l'instant, de récupérer dynamiquement,
CREATE PROCEDURE handlerdemoSQLEXCEPTION ()
au sein d'un sous-programme, le code et BEGIN
le message de l'erreur associée à une DECLARE EXIT HANDLER FOR SQLEXCEPTION CALL autreErreur();
INSERT INTO table_inexistante VALUES (1);
exception levée suite à une instruction SET @x = 99;
SQL, et qui n'a pas été prévue dans un END;//
CALL handlerdemoSQLEXCEPTION();
handler. SELECT @x;
PARTIE 3
• L'exemple suivant décrit une procédure qui gère CREATE TABLE test (code INT, PRIMARY KEY (code));
DELIMITER // ;
une erreur :
CREATE PROCEDURE handlerdemo ()
Sqlstate : ER_DUP_KEY '23000’ BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000'
• Même si une exception de duplication de clé
SET @x2 = 1;
primaire ER_DUP_KEY est causée par l'instruction SET @x = 1;
INSERT INTO test VALUES (1);
insert, l'exécution des instructions après ‘insert’
SET @x = 2;
continue et la variable de session @x est initialisée. INSERT INTO test VALUES (1);
SET @x = 3;
END;//
PARTIE 3
CALL handlerdemo();
SELECT @x;
• Pour intercepter une erreur MySQL et lui attribuer au passage un identificateur, il faut utiliser la clause DECLARE CONDITION.
L'instruction SIGNAL
• On utilise l'instruction SIGNAL pour renvoyer une condition CREATE PROCEDURE ajouter_commande (IN commandeNo,
d'erreur ou d'avertissement à l'appelant à partir d'un sous IN produitCode varchar(45),
IN qte int,
programme : une procédure stockée, une fonction stockée, un
IN prix double,
déclencheur ou un événement. IN ligneNO int )
• L'instruction SIGNAL permet de contrôler les informations à BEGIN
DECLARE C INT ;
renvoyer, telles que la valeur et le message SQLSTATE.
SELECT COUNT (commandeNumber) INTO C
• Pour l'utilisation de l'instruction, on utilise la syntaxe suivante : FROM commandes
WHERE commandeNumber = commandeNo;
SIGNAL SQLSTATE | nom_exception_nomee; - - teste si le numéro de la commande existe
SET info_1 = valeur_1, IF (C != 1) THEN
info_2= valeur_2, … ; SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Commande
PARTIE 3
L'instruction RESIGNAL
• l'instruction RESIGNAL est similaire à l'instruction SIGNAL en termes de fonctionnalité et de syntaxe, sauf que :
• On doit utiliser l'instruction RESIGNAL dans un gestionnaire d'erreurs ou d'avertissements, sinon on obtient un message d'erreur «
RESIGNAL lorsque le gestionnaire n'est pas actif ». Noter qu'on peut utiliser l'instruction SIGNAL n'importe où dans une procédure
stockée.
• On peut omettre tous les attributs de l'instruction RESIGNAL, même la valeur SQLSTATE.
DELIMITER $$
CREATE PROCEDURE Divide (IN numerator INT, IN denominator INT, OUT result double)
BEGIN
DECLARE division_by_zero CONDISTION FOR SQLSTATE '22012' ;
DECLARE CONTINUE HANDLER FOR division_by_zero
RESIGNAL SET MESSAGE_TEXT = 'Division by zero / Denominator cannot be zero';
--
IF denominator = 0 THEN
PARTIE 3
SIGNAL division_by_zero;
ELSE
SET result := numerator / denominator;
END IF ;
END
Définition
▪ Un curseur est une zone mémoire qui est générée côté serveur (mise en cache) et qui permet de traiter individuellement chaque ligne
renvoyée par un SELECT.
▪ Un sous-programme peut travailler avec plusieurs curseurs en même temps. Un curseur, durant son existence (de l'ouverture à la fermeture),
contient en permanence l'adresse de la ligne courante.
précédent ;
Asensitive (insensible )
▪ Toute mise à jour opérée dans la base de données n'est pas répercutée dans le curseur une fois ouvert
(il utilise une copie temporaire des données et ne pointe pas sur les données réelles).
Syntaxe
3. Utilisation de l'instruction FETCH pour récupérer la ligne suivante pointée par le curseur et déplacer le curseur vers la ligne suivante
dans le jeu de résultats.
4. Fermeture du curseur.
DELIMITER $$
Exemple
CREATE PROCEDURE lister_clients (INOUT resultat_txt VARCHAR(4000))
• Ce curseur permet de construire une chaîne contenant BEGIN
les informations des employés. DECLARE finished INTEGER DEFAULT 0 ;
• Remarques : DECLARE v_id INT ;
DECLARE v_nom VARCHAR (100) ;
• Un curseur doit toujours être associé à une DECLARE v_prenom VARCHAR (100) ;
instruction SELECT. DECLARE info VARVHAR (400) DEFAULT '''' ;
• Lorsque on travaille avec le curseur MySQL, on doit DECLARE cur_info_client CURSOR FOR SELECT id,nom,prenom FROM clients;
également déclarer un gestionnaire NOT FOUND DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
pour gérer la situation où le curseur ne trouve OPEN cur_info_client ;
boucle_parcours_clients : LOOP
aucune ligne.
FETCH cur_info_client INTO v_id, v_nomn v_prenom ;
IF finished = 1 THEN
- - Appel de la ps
LEAVE boucle_parcours_clients ;
SET @resultat_txt = '''';
END IF ;
PARTIE 3
CALL lister_clients(@resltat_txt) ;
SET info = CONCAT (v_id, ''-'',v_nom,''-',v_prenom);
SELECT @resultat_txt ; SET resultat_txt = CONCAT (info, '';'',resultat_txt) ;
END LOOP boucle_parcours_clients ;
CLOSE cur_info_client;
END $$
Copyright - Tout droit réservé - OFPPT 346
01 – Maîtriser le langage de programmation
procédurale sous MySQL
Les curseurs
DECLARE info VARCHAR(400) DEFAULT '''' ; SET resultat_txt = CONCAT (info, '';'',resultat_txt) ;
DECLARE cur_info_client CURSOR FOR SELECT id,nom,prenom,adresse END LOOP boucle_parcours_clients ;
FROM clients FOR UPDATE ; CLOSE cur_info_client;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET set finished = 1 ; END $$
OPEN cur_info_client ; DELIMITER ;
Restrictions d'utilisation
Il n'est pas possible de déclarer un curseur FOR UPDATE, si on utilise dans la requête les directives :
▪ DISTINCT ;
▪ GROUP BY;
▪ Un opérateur ensembliste ;
▪ Une fonction d'agrégat.
PARTIE 3
Sous programme
Fonctions : Définition
• Les fonctions peuvent être utilisées pour créer une logique de programmation personnalisée pour la base de données. Ceci est utile dans les
situations où on a du code répété dans plusieurs zones et qu’on souhaite éviter de copier le code plusieurs fois.
• MySQL possède de nombreuses fonctions intégrées qu’on peut appeler pour renvoyer des valeurs ou effectuer des tâches sur des données,
notamment :
• CURRENT_DATE()
• AVG()
• SUM()
• ABS()
• CONCAT()
PARTIE 3
• Ces fonctions peuvent être utilisées dans des instructions SQL, des vues et des procédures stockées.
• MySQL a également un autre type de fonction, connue sous le nom de Fonction Définie par l'Utilisateur (UDF).
• READS SQL DATA : spécifie que la fonction va lire les données de la base de données mais ne modifiera pas les données ;
• MODIFIES SQL DATA : spécifie que la fonction modifiera les données dans la base de données ;
• CONTAINS SQL : spécifie que la fonction aura des instructions SQL. Ces instructions ni lisent ni modifient les données, telles que : SELECT
CURRENT_DATE();
Copyright - Tout droit réservé - OFPPT 352
01 – Maîtriser le langage de programmation
procédurale sous MySQL
Création des procédures stockées et des fonctions
Fonctions : Syntaxe
DLIMITER $$
• Cependant, lorsque on définit des fonctions, des procédures stockées et des déclencheurs, on exécutera souvent plusieurs instructions.
• Définir un délimiteur différent permet d'exécuter toutes les instructions comme une seule unité plutôt qu'individuellement.
Remarques :
• Pour renvoyer une table à partir de MySQL, on utilise une procédure stockée, et non pas une fonction.
PARTIE 3
Procédures stockées
• Les procédures stockées permettent de stocker un ensemble de requêtes SQL, à exécuter en cas de besoin.
• En règle générale, on doit utiliser des procédures stockées lorsqu'une requête ou un ensemble de requêtes doivent être répété régulièrement.
• La procédure stockée peut contenir une instruction conditionnelle telle que IF ou CASE ou les boucles.
• La procédure stockée peut également exécuter une autre procédure stockée ou une fonction qui modularise le code.
• Les procédures stockées sont idéales pour déplacer des tâches de traitement lourdes vers le serveur MySQL.
• Si on imagine qu’on travaille sur une application de vente connectée à une base de données MySQL et qu’on doit enregistrer une vente.
L'application enregistrera une vente en procédant comme suit :
• Détermination du montant total du paiement pour confirmer le paiement
• Calcul de la valeur de vente (coût des ventes * valeur de l'article)
• Calcul de la taxe de vente qui s'applique à la vente
PARTIE 3
Facile à maintenir
• Les procédures stockées sont réutilisables. On peut implémenter la logique métier dans un serveur qui
peut être utilisée par des applications plusieurs fois, ou par différents modules d'une application.
• Une procédure stockée rend la base de données plus cohérente.
• Si une modification est nécessaire, on doit uniquement apporter une modification à la procédure
stockée.
Sécurité
PARTIE 3
• Les procédures stockées sont plus sécurisées que les requêtes AdHoc.
• L'autorisation peut être accordée à l'utilisateur pour exécuter la procédure stockée sans donner
l'autorisation aux tables utilisées dans la procédure stockée.
• La procédure stockée aide à protéger la base de données de SQL Injection.
DELIMITER $$ DELIMITER $$
CREATE PROCEDURE nom_procedure([paramètres]) CREATE PROCEDURE sp_client_par_ville(IN ville VARCHAR(50))
BEGIN BEGIN
le code SQL SELECT *
END $$ FROM clients
WHERE UPPER(adresse) = UPPER(ville);
Syntaxe pour exécuter une procédures stockée
END $$
call nom_procedure([paramètres]);
DELIMITER
- - Appel
call sp_client_par_ville ('rabat');
PARTIE 3
Les procédures stockées MySQL ont trois directions dans lesquelles un paramètre peut être défini :
IN
• La valeur est uniquement transmise à la procédure stockée. Elle est utilisée dans le cadre
de la procédure. Cela revient à fournir une entrée à la procédure stockée.
OUT
• La valeur est uniquement transmise hors de la procédure stockée ; toutes les variables
externes qui ont été affectées à cette position prendront la valeur transmise. Cela revient à
renvoyer des valeurs à partir d'une procédure stockée.
INOUT
• Une variable et sa valeur (ExtVal) sont transmises à la procédure stockée (IntVal) et
PARTIE 3
peuvent y être modifiées. Lorsque la procédure stockée est terminée, la valeur externe
(ExtVal) sera égale à la valeur modifiée (IntVal)
dans une procédure stockée, le programme appelant doit CREATE PROCEDURE sp_client_par_ville(IN ville VARCHAR(50))
passer un argument à la procédure stockée. Cette argument BEGIN
est passé par valeur. SELECT *
FROM clients
WHERE UPPER(adresse) = UPPER(ville);
END $$
DELIMITER ;
- - Appel
call sp_client_par_ville (''agadir'');
PARTIE 3
référence). On passe à la procédure stockée une CREATE PROCEDURE sp_client_par_ville(IN ville VARCHAR(50),
OUT nombre_clients INT)
variable de session dont la valeur peut être modifiée à
l'intérieur de la procédure stockée. BEGIN
SELECT COUNT(*) INTO nombre_clients
• Noter que la procédure stockée ne peut pas accéder à la
FROM clients
valeur initiale du paramètre OUT lorsqu'elle démarre. WHERE UPPER(adresse) = UPPER(ville);
END $$
DELIMITER ;
- - Appel
PARTIE 3
• Pour modifier une procédure stockée on doit supprimer et recréer la procédure stockée à l'aide des instructions DROP PROCEDURE
et CREATE PROCEDURE.
• MySQL Workbench fournit un bon outil qui permet de modifier rapidement une procédure stockée.
Définition
• Un déclencheur est une procédure stockée dans la base de données, qui s'appelle automatiquement à chaque fois qu'un événement
spécial se produit sur la table à laquelle le déclencheur est attaché.
• Un déclencheur peut être utilisé pour valider les données, enregistrer les anciennes et les nouvelles valeurs dans une table d'audit (log)
ou s'assurer que les règles métier sont respectées.
• Par exemple, un déclencheur peut être invoqué lorsqu'une ligne est insérée dans une table spécifique ou lorsque certaines colonnes de
la table sont mises à jour.
Syntaxe
CREATE TRIGGER [nom_declencheur] • [before | after] ( [avant | apres]) : spécifie quand le déclencheur sera exécuté.
[before | after] • {insert | update | delete} ({insérer | mise à jour | supprimer}) : spécifie l'opération
{insert | update | delete} • ON [nom_table] : spécifie le nom de la table associée au déclencheur.
ON [nom_table] • [for each row] : spécifie un déclencheur au niveau de la ligne, c'est-à-dire que le
PARTIE 3
[for each row] déclencheur sera exécuté pour chaque ligne affectée.
[corps_declencheur] • [corps_declencheur] : fournit les opérations à effectuer lorsque le déclencheur est
déclenché.
Types
Exemple
PARTIE 3
Avantages
Les déclencheurs contribuent :
À renforcer l'intégrité des données
Aux tâches qui peuvent être exécutées automatiquement lorsque le déclencheur se déclenche plutôt que d'être planifiées
À auditer les changements de données, enregistrer les événements et prévenir les transactions invalides
On ne peut avoir qu'un seul déclencheur par événement ; On ne peut avoir qu'un seul déclencheur BEFORE UPDATE sur une table donnée, mais
on peut y exécuter plusieurs instructions ;
Ils ne peuvent pas utiliser l'instruction CALL et ils ne peuvent pas créer de tables ou de vues temporaires ;
Les déclencheurs peuvent entraîner des résultats incohérents en fonction de plusieurs facteurs, notamment le type de moteur de base de
données (InnoDB, MyISAM,..) utilisé avec la table à laquelle le déclencheur a été attribué.
OLD/NEW
• le mot-clé OLD est utilisé pour accéder aux valeurs précédentes des données qui sont remplacées par la mise à jour.
• Le mot-clé NEW permet d'accéder aux nouvelles valeurs des données entrantes qui remplaceront l'ancienne ligne, en cas de succès.
• Selon le type de déclencheur créé, les lignes OLD et NEW peuvent ne pas être disponibles :
• C'est-à-dire qu'il n'y a pas de ligne OLD sur un déclencheur INSERT et pas de ligne NEW sur un déclencheur DELETE.
PARTIE 3
- - Creation du trigger
DROP TRIGGER IF EXISTS mise_ajour_moyenne_age ;
DELIMITER //
CREATE TRIGGER mise_ajour_moyenne_age AFTER INSERT
ON clients
FOR EACH ROW
UPDATE moyenne_age SET moyenne = age SELECT (AVG (TIMESTAMPDIFF(YEAR, date_naissance, CURDATE())) FROM clients ;
DELIMITER ;
- - déclencher le triger
INSERT INTO clients (nom, prenom, date_naissance, adresse)
PARTIE 3
VALUES (''Dadi'',''Hamza'',''2000-5-22'',''casa'');
- - afficher la nouvelle valeur de l'age moyen
SELECT * FROM moyenne_age;
- - tester le trigger
UPDATE Clients SET date_naissance = '2010-9-23'
PARTIE 3
WHERE id = 6;
UPDATE Clients SET date_naissance = '1999-9-23'
WHERE id = 7;
SalesChanges.
DELIMITER ;
ON salaries
budget des salaires stockée dans la table FOR EACH ROW
SalaryBudgets après la suppression d'un UPDATE SalaryBudgets
salaire. SET total = total - OLD.salary;
▪ Il n'existe pas une instruction pour modifier un trigger, on doit le supprimer et le LOCK TABLES t1 WRITE ;
DROP TRIGGER t1_bi ;
recréer.
DELIMITER $$
▪ LOCK permet aux sessions client d'acquérir explicitement des verrous de table CREATE TRIGGER t1_bi BEFORE INSERT
dans le but de coopérer avec d'autres sessions pour accéder aux tables, ou ON t1
FOR EACH ROW
d'empêcher d'autres sessions de modifier les tables pendant les périodes où une
BEGIN
session nécessite un accès exclusif à celles-ci. …
▪ NB : MariaDB, dans la version 10.1.4, a ajouté la prise en charge de CREATE OR END $$
DELIMITER ;
REPLACE TRIGGER.
UNLOCK TABLES ;
PARTIE 3
05 heures
CHAPITRE 2
Optimiser une base de données MySQL
Éviter si possible les SELECT * et réduire le nombre de champs, afin de réduire les données chargées en mémoire ;
Éviter d'utiliser des fonctions dans les prédicats : exemple SELECT * FROM TABLE1 WHERE UPPER(COL1)='ABC' ;
Utiliser la jointure interne (inner join), au lieu de la jointure externe (outer join) si possible ;
Compter les requêtes sur chaque page. Un grand nombre de requêtes peut signifier un « problème N+1 », c'est à dire une requête SELECT placée dans
PARTIE 3
une boucle ;
Utiliser les requêtes préparées ou les procédures stockées facilite la mise en câche des requêtes en interne par MySQL et assure un bon niveau de
sécurité ;
Utiliser la clause EXPLAIN pour comprendre le fonctionnement d'une requête et quelles sont les clauses qui impactent sa performance.
• Avant, MySQL utilise le protocole textuel pour communiquer avec le client. Ce protocole a de sérieuses implications sur les performances.
• Pour résoudre ce problème, MySQL a ajouté une nouvelle fonctionnalité appelée instruction préparée depuis la version 4.1.
• Les instances de PreparedStatement contiennent une instruction SQL déjà compilée. D'où le terme prepared. Cela améliore notamment les
performances si cette instruction doit être appelée de nombreuses fois.
• Les instructions SQL des instances de PreparedStatement contiennent un ou plusieurs paramètres d'entrée, non spécifiés lors de la création
de l'instruction. Ces paramètres sont représentés par des points d'interrogation (?). Ces paramètres doivent être spécifiés avant l'exécution.
- - execution
SET @id = '999' ; DEALLOCAT
PREPARE EXECUTE
EXECUTE stm1 USING @id ; E PREPARE
- - libération
DEALLOCATE PREPARE stmt1 ;
Index
• Comme l'index d'un ouvrage aide à atteindre les pages concernées par un mot recherché, un index MySQL permet d'accélérer l'accès
aux données d'une table.
• La plupart des index de MySQL (PRIMARY KEY, UNIQUE, INDEX, et FULLTEXT) sont stockés dans des arbres équilibrés (balanced trees :
B-trees).
• D'autres types d'index existent. On trouve ceux qui portent sur des colonnes SPATIAL (reverse key : R-trees), et ceux appliqués aux
tables MEMORY (tables de hachage : hash).
• L'optimiseur de requête peut utiliser des index pour localiser rapidement les données sans avoir à analyser chaque ligne d'une table
pour une requête donnée.
• Lorsqu'on crée une table avec une clé primaire ou une clé unique, MySQL crée automatiquement un index spécial nommé PRIMARY.
Cet index est appelé index clusterisé.
• L'index PRIMARY est spécial car l'index lui-même est stocké avec les données dans la même table. L'index clusterisé applique l'ordre des
PARTIE 3
Création d'index
USE eshop_app_db;
CREATE UNIQUE INDEX idx_clients_adresse USING BTREE
ON clients (adresse DESC);
Copyright - Tout droit réservé - OFPPT 381
02 - Optimiser une base de données MySQL
Optimisation des requêtes SQL
Index : Avantages
Comme on peut le voir, MySQL n'a eu qu'à localiser 1 ligne à partir de l'index nom_index comme indiqué dans la colonne clé sans parcourir
toute la table.
Stratégie d'indexation
Les points importants qu'on doit prendre en compte dans la stratégie d'indexation sont les suivants :
• Prédire les colonnes qui seront souvent interrogées dans l’application avec WHERE, GROUP BY, HAVING et Clauses ORDER BY ;
• Avoir un index sur les colonnes qui seront utilisées avec des fonctions, telles que SUM (), COUNT (), MIN (), MAX () et AVG () ; pour
en bénéficier en termes de performances ;
• Ne surcharger pas la base de données avec trop d'index, car cela aura un impact sur les performances des clés secondaires MySQL ;
• Prédire avec des index uniques pour accélérer les requêtes de jointure (généralement, les colonnes qui se terminent par _id) ;
• En règle générale, les noms d'utilisateur ou les e-mails comme colonnes sont de bons candidats pour l'indexation ; certaines
PARTIE 3
Surveiller les performances du serveur afin de préconiser les adaptations nécessaires : augmenter la RAM, allouer plus d'espace disque, etc. ;
Utiliser des connexions stables pour éviter trop d'ouvertures et de fermetures de connexion, car c'est très coûteux en terme de performance ;
Activer le log des “slow queries” sur le serveur afin de le vérifier régulièrement ;
Utiliser le système de mise en cache disponible par le SGBD. Sinon, utiliser un système de mise en cache externe (memcached par exemple).
Utilisation d'une clé primaire de type numérique avec une auto-incrémentation (AUTO_INCREMENT) ;
Stocker dans une nouvelle table les données textuelles qui sont trop répétées, et les lier avec une jointure ;
Indexer les données qui sont utilisées dans WHERE, JOIN, ORDER BY et GROUP BY ;
Eviter les index pour les colonnes de type BLOB ou les champs de texte libre ;
Le moteur de données MyISAM est à privilégier par rapport InnoDB pour les requêtes SELECT ;
PARTIE 3
Utiliser un index de type UNIQUE pour les colonnes qui doivent contenir des données uniques et qu’on souhaite être sûr qu'il n'y aura pas
de doublon superflu.
Pour un système de pagination, privilégier l'usage de SQL_CALC_FOUND_ROWS et éviter de faire 2 requêtes, celle contenant les résultats
et l'autre pour compter le nombre de résultats total ;
Nettoyer les données non utiles pour alléger le poids d'une base de données et optimiser le temps d'exécution des requêtes ;
Utiliser une requête OPTIMIZE afin de réorganiser le stockage physique des données et améliorer l'efficacité lors de l'accès aux données ;
Veiller les informations recueillies par le fichier “slow queries” pour améliorer les requêtes ;
PARTIE 3
• Si on utilise des disques durs traditionnels (HDD), on peut effectuer une mise à niveau vers des disques à semi-conducteurs (SSD) pour une
amélioration des performances.
• On peut ajuster la cache mémoire pour améliorer les performances. Si on n'a pas assez de mémoire ou si la mémoire existante n'est pas
optimisée, on peut finir par nuire à nos performances au lieu de les améliorer.
• MyISAM est un ancien style de base de données utilisé pour certaines bases de données MySQL. C'est une conception de base de données
moins efficace. Le plus récent InnoDB prend en charge des fonctionnalités plus avancées et dispose de mécanismes d'optimisation intégrés.
• Envisager d'utiliser un outil d'amélioration automatique des performances( tuning-primer, MySQLTuner, etc.).
PARTIE 3
05 heures
CHAPITRE 1
Définir les bases de données NoSQL
1,5 heures
CHAPITRE 1
Découvrir les bases de données NoSQL
• Les défis majeurs des SGBD étaient toujours le stockage des données et la recherche des données ;
• Les SGBDR sont adaptés à gérer des données bien structurées de types simples (chaines de caractères, entier, etc.) et représentables sous
forme de tables (colonnes => propriétés et lignes => données) ;
• Ils reposent sur le modèle relationnelle d'Edgard Codd et ont prouvé leur efficacité pour des décennies grâce à :
Un ensemble de
Une forte
contraintes
Une séparation structuration des Une représentation Un langage Une forte cohérence
permettant
logique et physique données et un fort tabulaire déclaratif (SQL) transactionnelle
d'assurer l'intégrité
typage
des données
• Mais, les SGBDR ont montré leur limite face aux 3V (Volume, Velocity, Veracity) que caractérisent l’ère actuelle des données (Big Data)
PARTIE 4
• Le NoSQL (Not Only SQL) propose une nouvelle manière de gérer les données, sans respecter forcement le paradigme relationnel ;
• Le NoSQL supporte de nouveaux types de données (xml, collections d'objets, triplets, etc. ) ;
• Ce formalisme propose de relâcher certaines contraintes lourdes du relationnel (structure des données, langage d'interrogation ou la
cohérence) pour favoriser la distribution ;
• Le NoSQL ne remplace pas les bases SQL, il les complète en apportant des avantages en terme de stockage réparti par exemple.
PARTIE 4
Définition
• Le NoSQL est un ensemble de technologies de BD reposant sur un modèle diffèrent du modèle relationnel,
• Les Bases NoSQL sont le fruit du mouvement NoSQL apparu au milieu des années 2000,
• Le mouvement a initialement piloté les besoins Big Data des principaux acteurs du web GAFA ( Google, Amazone, Facebook, Apple, etc.) :
Google avec sa base Apple avec sa base Facebook avec sa base Amazone avec sa base
Hbase FoundationDB Cassandra DynamoDB
• Les serveurs de données NoSQL se caractérisent par des architectures distribuées ce qui leur permettent de mieux répondre aux
PARTIE 4
Les données
Les données sont représentées
sont représentées sous
sous forme formecomposées
de tables de tables d’un les
les données sontreprésentées
données sont représentées
soussous forme
forme de collections
de collections de
de paires
composées de n nombre
ensemble de lignesdedelignes de données,
données. pairesclé-valeur,
clé-valeur,dede documents,
documents, de graphes,
de graphes, etc. etc.
Elles
Elles respectentun
respectent unschéma
schéma stricte
stricteetetstandard.
standard. EllesElles
ne ne possèdentpas
possèdent pasde
de définitions
définitions de
deschéma standard.
schéma standard.
L'augmentation dedelalacharge
L'augmentation charge est géréepar
est gérée parl'augmentation
l'augmentation
du du L'augmentation de la charge est gérée plutôt par l'ajout de
L'augmentation de la charge est gérée plutôt par l'ajout de serveurs
processeur,
processeur, de de la RAM,
la RAM, du etc.
du SSD, SSD,sur
etc.
un sur
seulun seul serveur
serveur :
: Scalabilité serveurs supplémentaires : Scalabilité (mise à l'échelle)
supplémentaires : Scalabilité (mise à l'échelle) horizontale.
(mise
Scalabilité à l'échelle)
(mise verticale.
à l'échelle) verticale. horizontale.
PARTIE 4
Recommandée
Recommandéepar
pardedenombreuses
nombreusesentreprises en en
entreprises raison de de
raison sa
sa structure Recommandée pour les données semi structurées ou même non
structure et deetses
deschémas
ses schémas prédéfinis.
prédéfinis.
Mais, ne convient pas au stockage de données hiérarchiques structurées.
Mais, ne convient pas au stockage de données hiérarchiques.
PARTIE 4
Résumons
NoSQL SQL
Certes NoSQL et SQL permettent de stocker/rechercher de l'information, mais ils ne servent pas pour les mêmes objectifs ce qui rend toute
comparaison subjective voir non justifiée.
Avantages du NoSQL
• Le format de la BD NoSQL est basée essentiellement sur des pairs clé-valeur (par exemple) beaucoup plus simple à mettre en œuvre
• Il est possible de stocker directement des objets manipulés dans des langages de programmation comme des listes, des collections d'objets,
des tableaux de valeurs, etc.
• Les bases de données NoSQL sont pour la plupart Open-source et ne possèdent pas de droits de licence
• Il est très facile d'étendre une base de données NoSQL en rajoutant, tout simplement des serveurs
• Les données sont regroupées par unités logiques et non pas dans des tables ce qui facilite la manipulation. Par exemple, pour avoir les
informations d'un client qui a passé une commande donnée, on n’aura pas besoin de passer par des jointures entre les tables client et
commande
Inconvénients du NoSQL
PARTIE 4
• Absence du concept de clé étrangère, ce qui veut dire qu'il n'y a pas de mécanisme pour vérifier la cohérence des données
• NoSQL n'est pas adaptable aux applications basées sur des transactions sécurisées et fiables (Gestion bancaire par exemple)
3,5 heures
CHAPITRE 2
Identifier les caractéristiques des bases de
données NoSQL
Caractéristiques générales
des bases NoSQL
Manipulation avec
BASE (Basically Manipulation des
performances de
Modèle de données Available, Soft State, Utilisation des données de
Architecture volumes de données
sans schéma Eventually langages qui ne sont structures
distribuée exponentiels (cas
(Schema Free) consistent) au lieu pas uniquement SQL complexes ou
des applications
de ACID imbriquées
Web)
PARTIE 4
• Dans un contexte relationnel, la création d'une base de données commence par la modélisation des entités et associations puis d'en déduire
un schéma de la base
• Cette démarche crée une rigidité dans la phase d'implémentation, puisqu'elle implique d'avoir une vision assez claire des évolutions de
l'application dès le départ et au fil du temps, ce qui n'est pas souvent le cas de nos jours
• Les bases de données NoSQL s'appuient sur des données dénormalisées, non modélisées par des relations, mais plutôt par des
enregistrements (ou documents) intégrés. Il est donc possible d'interagir sans utiliser de langages de requêtes complexe
PARTIE 4
• Exemple
SQL NoSQL
Posts(id,titre)
Posts(id,titre,commentaires)
Commentaires(id, #idPosts,texte)
Posts Commentaires
Posts
Id titre Id idPosts texte
P1 Titre1 Comment1
P1 Titre1 C1 P1 comment1
P2 Titre2 C2 P2 comment2 Comment3
C3 P1 comment3
PARTIE 4
P2 Titre2 Comment2
2- Architecture distribuée
• Le volume de données à stocker ainsi que les traitements demandées par les organismes modernes, ne peuvent plus être satisfaits sur une
seule machine quelque soit sa performance. Même en utilisant un réseau de machine, l'interconnexion entre machines rendent les
traitements très lents ;
• Solution : un patron d'architecture propose de distribuer les traitements (le travail/la charge) sur plusieurs machine puis regrouper les
résultats de chaque machine et les agrèger dans un résultat final → Apparition de MapReduce en 2003 ;
• Les bases de données traditionnelles ne permettent pas l'implantation d'un tel patron d'architecture ;
• Les BD NoSQL sont conçues pour distribuer les données et les traitements associés sur de multiple nœuds(serveurs) →partitionnement
horizontal ;
• Problème : impossible d'avoir en même temps une disponibilité des données satisfaisante, une tolérance au partitionnement et une
PARTIE 4
2- Architecture distribuée
Dans toute base de données, on ne peut respecter au plus que deux propriétés parmi les trois propriétés suivantes :
la cohérence, la disponibilité et la distribution
A savoir :
• Consistency (cohérence) : tous les nœuds(serveurs) sont à jour sur les données au même
Partition
moment ;
tolerance CP
Consistency
• Avaibility (disponibilité) : la perte d'un nœud(serveur) n'empêche pas le système de
AP CA
fonctionner et de servir l'intégralité des données ;
PARTIE 4
3- BASE vs ACID
• Les propriétés ACID ne sont pas partiellement ou totalement applicables dans un contexte NoSQL
• Les bases NoSQL reposent, par contre, sur les propriétés BASE :
• Les bases NoSQL privilégient la disponibilité à la cohérence : AP (Avaibility + Partition tolerance) plutôt que CP (Consistency + Partition
tolerance).
Exemple :
Clé Valeur
PARTIE 4
Ahmed type :Formateur; spec : Dev digital; modules :M102, M104, M106, M203
Les quatre types des bases NoSQL : 2 - Bases de données orientées Document
document
Les documents sont stockés sous forme de fichiers JSON ou XML
Exemples
Clé Ahmed Sanaa Ghizlane
PARTIE 4
Les quatre types des bases NoSQL : 2 - Bases de données orientées Document
Les quatre types des bases NoSQL : 3 - Bases de données orientées Colonne
Il rend possible de focaliser les requêtes sur les colonnes importantes sans avoir à traiter les
données des autres colonnes (jugées alors inutiles pour la requête)
Ce type est adapté aux systèmes avec de gros calculs analytiques ( comptage, moyenne,
somme, etc.)
PARTIE 4
Les quatre types des bases NoSQL : 3 - Bases de données orientées Colonne
Les quatre types des bases NoSQL : 3 - Bases de données orientées Colonne
Les quatre types des bases NoSQL : 3 - Bases de données orientées Colonne
Les quatre types des bases NoSQL : 4 - Bases de données orientées Graphe
Ce type est conçu principalement pour les données fortement interconnectées (comme les
données des réseaux sociaux) avec un nombre indéterminé de relations entre elles
En d'autres termes, c'est le type le mieux approprié pour modéliser le monde réel
PARTIE 4
Les quatre types des bases NoSQL : 4 - Bases de données orientées Graphe
Exemple
Mobile
Dev Int
Digital Artificielle
Ahmed
Type : Sanaa Laila Ghizlane
Formateur Type : Type : Type :
Stagiaire Formateur Stagiaire
PARTIE 4
M105 M201
M102 M202
Coût + ++ ++ ++
Cohérence + ++ + +
Disponibilité ++ + ++ ++
Langages ++ ++ + ++
d'Interrogation
Fonctionnalités Solution hautement La solution la plus Solution mature, populaire. Destinée aux données
disponible avec un populaire. Une Excellente solution pour volumineuses.
langage de requêtes structure souple et grands volumes de données Privilégie le langage et la
performant bonnes besoins de bases distribuées. disponibilité à la
Approprié au performances. Mais langage trop réduit cohérence des données
PARTIE 4