Niveau : Terminale générale, enseignement de spécialité NSI
L'exemple que nous allons traiter est la mise en place d'une
base de données permettant de gérer les résultats d'un examen, type baccalauréat.
Télécharger le logiciel suivant : UwAmp
Décompressez-le dans U:\UwAmp sur l'ordinateur du lycée ou dans C:\Uwamp du votre ordinateur portable
Exécuter UwAmp.exe et autorisez à communiquer sur les réseaux privés
Si tout va bien vous devriez voir cette fenêtre :
Choisir la version php-7.0.3, changer la configuration du serveur apache pour accélérer les accès au serveur comme suit :
Cliquez sur l'icône de configuration d'Apache
Ajoutez les lignes suivantes :
AcceptFilter http none AcceptFilter https none EnableSendfile off EnableMMAP off
puis enregistrez
Cliquez sur PhpMyAdmin
Entrer l'utilisateur : root et le mot de passe : root puis exécuter.
Si la page met trop de temps à s'actualiser remplacer localtost par l'adresse IP locale de votre ordinateur
Vous allez créer une base donnée qui contiendra les notes des candidats du baccalauréat général.
Le personnel administratif d'un lycée pourra renseigner les données concernant les élèves de l'établissement.
Le chef d'établissement pourra renseigner l'avis émis par le conseil de classe pour chaque élèves (Preuves, Satisfaisant ou très satisfaisant)
Pour simplifier la note des candidats, on ne tiendra pas compte des options. Chaque candidat aura un nombre de points compris entre 0 et 2000.
Un candidat totalisant une moyenne :
A l'issue des épreuves, les jurys du premier tour se réunissent et pourront accéder aux résultats des candidats anonymés, ainsi qu'aux avis donnés par le conseil de classe. Ils pourront attribuer, aux candidats proches des limites ci-dessus, des points jury pour franchir ces limites.
Notre base de données sera composée d’une table candidats, d’une table resultats.
C'est avec le logiciel UwAmp que nous allons créer notre base de données relationnelle SQL.
SQL (Structured Query Language) est un langage permettant de communiquer avec une base de données
La première étape est de créer la base de données et de lui donner un nom. On appellera baccalaureat en tapant la commande SQL : CREATE DATABASE (voir image ci-dessous) puis cliquer sur Exécuter. (éviter les caractères accentués et les espaces)
Les commandes peuvent être écrites en minuscule. Si on enchaine plusieurs commandes SQL, on les sépare par un ;
On peut vérifier si la base a été créé avec la commande SHOW DATABASES. On peut aussi la voir dans l'arbre de gauche.
Si vous voulez supprimer une base de données, utilisez la commande DROP DATABASE baccalaureat.
Vous allez créer 2 tables dont le schéma relationnel est représenté ci-dessous :
Tapez la commande SQL suivante :
USE baccalaureat
qui permet de sélectionner la base de données baccalaureat
Tapez la requête SQL suivante, permettant de créer la table suivante :
candidats (num_candidat, num_anonymat, nom, prenom, date_naissance, num_etablissement)
Tapez la requête SQL permettant de créer la table suivante :
resultats (num_resultat, #num_anonymat, avis, points, moyenne, decision, points_jury)
Chaque relation va contenir des données d'un certain type ou domaine :
varchar(10)
: Chaine de 10 caractères maxiint(11)
: Entier compris entre - 2 147 483 648 et 2 147 483 647smallint(6)
: Entier compris entre -32 768 à 32 767float
: Nombre réeldate
: Date au format aaaa-mm-jjNOT NULL
: relation qui devra obligatoirement être saisiDEFAULT NULL
: si le relation n'est pas renseigné il prendra la valeur NULLSi vous avez fait une erreur dans une table et vous souhaiter supprimer une table, exécuter la commande SQL :
DROP nom_de_la_table
Faire valider votre travail par le professeur (1).
On désire que la relation num_resultat
soit auto-incrémenté pour ne pas avoir à le saisir.
Dans la table candidats, num_anonymat, qui est la clé primaire, est le parent de num_anonymat de la table resultats.
num_anonymat de la table candidat est la clé étrangère de num_anonymat de la table résultats.
Si on modifie ou supprime le numéro d'anonymat dans l'une des tables,
l'autre table sera également affectée grâce aux instructions ON DELETE CASCADE ON UPDATE CASCADE
.
Vérification : cliquer sur la base de données baccalaureat, cliquez sur plus et choisir concepteur
On voit bien la relation qui a été mise en place entre les champs num_candidat des deux tables ainsi que les types des champs.
Faire valider votre travail par le professeur (2).
ATTENTION : Il faut commencer par garnir la table candidats à cause du champ num_anonymat qui est la clé étrangère de num_anonymat de la table resultats.
L'instruction SQL :
INSERT INTO table (champ1,champ2,...) VALUES (valeur1,valeur2,...)
En utilisant la requête SQL INSERT INTO
, ajoutez les 2 candidats suivants dans la table candidats :
num_candidat | num_anonymat | nom | prenom | date _naissance | num_etablissement |
---|---|---|---|---|---|
202168001 | B21A05226 | ABBOU | STEEVE | 2003-11-03 | 0681768C |
202168002 | B21A05072 | ABED | ALDO | 2002-09-16 | 0681768C |
Pour afficher toutes les données de la table candidats classées par ordre croissant on exécute la requête SQL suivante :"
Garnir la table resultats
avec les données suivantes :
num_anonymat | avis | points | moyenne |
---|---|---|---|
B21A05226 | Preuves | 902 | 9.02 |
B21A05072 | Très Favorable | 1750 | 17.5 |
Faire valider votre travail par le professeur en exécutant les deux requêtes permettant d'afficher les données des deux tables. (3).
On commence à nouveau par sélectionner la table candidats, puis cliquer sur l'onglet importation et importer le fichier candidats.csv
Il est important d'importer les candidats avant d'importer les resultats. De toute façon si la base de données est bien structurée un message d'erreur apparaîtra.
En faire de même pour la table resultats : resultats.csv
Faire valider votre travail par le professeur en affichant les données des tables (4) :
Le jury souhaite afficher tous les candidats Admis au baccalauréat : ceux ayant une moyenne de 10/20 et plus.
SELECT * FROM resultats WHERE moyenne>=10 ORDER BY moyenne DESC
Ecrire la requête permettant d'afficher les candidats qui passent le second groupe
Faire valider par le professeur (5).
Elle se fera par la requête SQL suivante, que vous devrez compléter en remplaçant les ? par la bonne condition :
Vérifiez le résultat :
Faire valider votre travail par le professeur (6).
Le jury souhaite attribuer des points supplémentaires aux candidats proche du seuil "Refusé" :
Trouver deux requêtes permettant d'afficher les candidats "Refusés" et les classer par moyenne décroissante
Résultat :
Faire valider votre travail par le professeur (7).
Le jury souhaite rattraper les candidats ci-dessus ayant un avis favorable en leur attribuant des points jury leur permettant d'obtenir 800 points.
La syntaxe de la requête SQL sera :
UPDATE table SET nom_champ1 = valeur1 WHERE nom_champ2 = valeur2
Vérifier le résultat en affichant les candidats ayant des points_jury non null (IS NOT NULL)
Enregistrez vos commandes SQL ci-dessous et justifiez quels sont les seuls champs qu'on peut mettre après la condition WHERE :
Faire valider votre travail par le professeur (8).
Compléter puis exécuter la requête SQL suivante
Réexécutez la requête SQL du paragraphe 2.7 permettant d'attribuer les décisions
Résultat :
Faire valider votre travail par le professeur (9).
Pour afficher les résultats, l'établissement devra avoir accès aux deux tables pour lever l'anonymat
Il s'agit de joindre les données des deux tables par la commande JOIN :
sur le champ commun num_anonymat de la table resultats et le champ num_anonymat
de la table candidats :
ON resultat.num_anonymat = candidats.num_anonymat
A lieu de sélectionner toutes les champs (*) on peut sélectionner uniquement les champs qui nous intéressent. Testez la requête SQL ci-dessous :
Ecrire la requête SQL permettant d'afficher le nom, le prenom, la moyenne, les points jurry et le numéro de l'établissement, des candidats classés par nom ayant reçu des points du jury
Résultat
Faire valider votre travail par le professeur (10).
Ecrire la requête SQL permettant d'afficher le numéro du candidat, le nom, le prénom le numéro de résultat, la décision et les points jury des candidats classés par nom et prénom dans l'ordre croissant, uniquement de l'établissement 0681768C
Résultat
Faire valider votre travail par le professeur (11).
On remarque que les deux candidats ABBOU Steeve et ABED ALDO apparaissent 2 fois
Cette erreur provient de l'importation du fichier csv où ces candidats n'auraient pas dû y figurer.
Syntaxe SQL de la suppression :
DELETE FROM table WHERE condition
Trouver les 2 requêtes permettant de supprimer les 2 résultats en trop. Veillez à choisir la bonne relation lors de la condition de suppression. Avant d'exécuter la requête vous pouvez cliquer sur le bouton Simuler la requête pour vérifier qu'on ne supprimer qu'une ligne à chaque fois.
Faire valider votre travail par le professeur (12).
La fonction COUNT() permet de compter le nombre d'enregistrement dans une table ou d'une requête
SELECT COUNT(*) FROM table SELECT COUNT(*) FROM table WHERE condition SELECT COUNT(champ) FROM table SELECT COUNT(DISTINCT champ) FROM table
Exemple : compter le nombre de candidat Admis :
SELECT COUNT(*) FROM resultats WHERE decision LIKE "Admis%"
Le caractère % remplace tous les autres caractères existants. Il peut être placé avant et/ou après le mot clé recherché. %Admis% recherche le mot Admis dans n'importe quelle position
Plus de détails ici https://sql.sh/cours/where/like
Trouver deux requêtes avec des conditions différentes permettant d'afficher le nombre de candidats ayant reçu une mention. Notez le nombre de mentions
Faire valider votre travail par le professeur (13).
Trouver la requête permettant d'afficher le nombre de candidats Refusés dans l'établissement 0681505T
Faire valider votre travail par le professeur (14).
Que retourne l'instruction SQL suivante :
SELECT COUNT(DISTINCT num_etablissement) FROM candidats
Faire valider votre travail par le professeur (15).
Vous pouvez vous aider de la documentation suivante : https://sql.sh/fonctions/agregation/count
Ecrire les 2 requêtes SQL permettant d'afficher la moyenne de chaque établissement 0681768C et 0681505T avec une précision au centième, ainsi que les deux requêtes permettant d'afficher la plus petite et la plus grande des moyennes.
Vous utiliserez les fonctions ROUND(AVG(champ),nombre de chiffres après la virgule), MIN() et MAX()
Faire valider votre travail par le professeur (16).
Découvrir toutes les fonctions et requêtes sur le site Internet https://sql.sh/
Créer la table etablissements (num_etablissement, nom, adresse, cp, ville, telephone)
Domaines :
Insérer les données suivantes :
Ajouter un index sur le champ num_etablissement de la table candidats, puis créer la jointure entre num_etablissement de la table etablissement et num_etablissement de la table candidats
En cas d'erreur, vérifier que les deux champs num_etablissement des deux tables, soient identiques en tous points et que les numéros d'établissement soient bien renseignés dans la table etablissements.
Vérifier le fonctionnement de la requête suivante, réalisant une jointure entre 3 tables :
Faire valider votre travail par le professeur et lui indiquer où se trouve la clé primaire et étrangère (17).
Créer la table utilisateurs (num_utilisateur, nom, prenom, id, mdp, role, #num_etablissement)
Domaines:
Les champs nom et prénoms et num_etablissement sont NULL par défaut
Le champ id (identifiant) doit être unique (index ou key)
Le champ mdp doit pouvoir contenir 40 caractères, car il sera crypté par un algorithme de hashage non décryptable (sha1)
Insérer les données suivantes dans les champs :
Créer la jointure entre les champs communs des 2 tables
Trouver la requête permettant de sélectionner le rôle, le num_etablissement où l'identifiant est égal à 'alavoisier' et le mot de passe est égal à sha1('secret5')
Résultat attendu :
Faire valider votre travail par le professeur (18).
Lorsque la base de données est transférée sur Internet, il faudra remplacer le mot de passe root par un mot de passe fort, s'assurer d'envoyer les formulaires avec la méthode POST pour les données sensibles et de passer le site en HTTPS
Restreindre l'accès aux données en fonction des rôles et l'appartenance à un établissement, pour éviter qu'un lycée n'accède aux données d'un autre lycée.
Seul un utilisateur de type jury a le droit de changer les points_jury et ne peut pas lever l'anonymat d'un candidat ou connaitre l'établissement du candidat
Seul l'administrateur de la base de données aura accès à toutes les données sauf les mots de passe en clair des utilisateurs qui sont cryptés
Il reste à créer les formulaires, en langage html et php, permettant à chaque type d'utilisateur d'avoir une IHM personnalisée. C'est ainsi qu'on peut limiter l'accès aux données
Cet aspect pourra être développé dans un projet plus tard ou pour les plus rapides maintenant.
Sinon passer à l'exercice
Il contient les informations identifiant, nom de la base et mot de passe de la session root, permettant de se connecter à la base de données
Copier puis coller ce code dans notepad++ puis enregistrez le comme db_connect.php dans UwAmp/www/baccalaureat
Pour accéder à la page utilisateur selon son rôle, il faudra commencer par s'authentifier
code html et php :
Copier puis coller ce code dans notepad++ puis enregistrez le comme index.php dans UwAmp/www/baccalaureat
Seuls les proviseurs et les administrateurs peuvent accéder à cette page
code html et php :
Copier puis coller ce code dans notepad++ puis enregistrez le comme proviseur.php dans UwAmp/www/baccalaureat
On y met les liens vers toutes les autres pages proviseur, cpe, jury...
code html et php :
Copier puis coller ce code dans notepad++ puis enregistrez le comme admin.php dans UwAmp/www/baccalaureat
Tester le fonctionnement en utilisant un navigateur Internet, renseigner l'url localhost, cliquez sur www puis baccalauréat
identifiez-vous comme administrateur, puis comment proviseur et vérifier les droits d'accès aux différentes pages.
Créer la page cpe.php permettant de choisir et d'enregistrer l'avis en utilisant une liste déroulante <option> voir www.w3schools.com
Créer la page jury.php qui permettra d'afficher les résultats des candidats
Faire apparaitre les points jury dans un formulaire input et avec une méthode POST permettant d'enregistrer les modifications
Lorsque des points jury sont attribués, mettre à jour la décision
On dispose d'une base de données des pokemons ayant la structure suivante
Lister les clés primaires et étrangères de chaque table. Quelle seront les 3 premières tables à remplir ?
Importer dans PHPMyAdmin la base de données des pokemons suivante : télécharger le fichier
Trouvez et sauvegardez les requêtes et commandes SQL permettant de :
Fond : Texte : Tables : Thème Python:
Contenu sous licence CT BY-NC-SA 3.0
Pascal Hassenforder 15/08/2021
MAJ le 30/11/2023