NUMERIQUE ET SCIENCES INFORMATIQUES

Niveau : Terminale générale, enseignement de spécialité NSI

 

D
É
C
O
N
N
E
C
T
É

Base de données relationnelle et langage SQL

1 - Installation d'un serveur sur votre ordinateur

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

dossiers uwamp

Exécuter UwAmp.exe et autorisez à communiquer sur les réseaux privés

firewall

Si tout va bien vous devriez voir cette fenêtre :

Uwamp

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

phpMyAdmin

Ajoutez les lignes suivantes :

AcceptFilter http none
AcceptFilter https none
EnableSendfile off
EnableMMAP off

puis enregistrez

phpMyAdmin

Cliquez sur PhpMyAdmin

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

2 - Création de la base de données

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 :

  • inférieure à 8/20 n'obtiendra pas son bac et sera "Refusé"
  • supérieur ou égale à 8/20 et inférieure à 10/20 devra passer l'oral de rattrapage : "Passe le second groupe"
  • supérieur ou égale à 10/20 et inférieure à 12/20 aura son bac sans mention : "Admis"
  • supérieur ou égale à 12/20 et inférieure à 14/20 aura son bac avec mention : "Admis Mention Assez Bien"
  • supérieur ou égale à 14/20 et inférieure à 16/20 aura son bac avec mention : "Admis Mention Bien"
  • supérieur ou égale à 16/20 et inférieure à 18/20 aura son bac avec mention : "Admis Mention Très Bien"
  • supérieur ou égale à 18/20 aura son bac avec mention : "Admis Mention Très Bien avec félicitation du jury"

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)

create

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.

dbase

Si vous voulez supprimer une base de données, utilisez la commande DROP DATABASE baccalaureat.

2.1 - Création des tables

Vous allez créer 2 tables dont le schéma relationnel est représenté ci-dessous :

  • la table resultats contiendra les résultats des candidats
  • la table candidats contiendra les informations des candidats
tables

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 maxi
  • int(11) : Entier compris entre - 2 147 483 648 et 2 147 483 647
  • smallint(6) : Entier compris entre -32 768 à 32 767
  • float : Nombre réel
  • date : Date au format aaaa-mm-jj
  • NOT NULL : relation qui devra obligatoirement être saisi
  • DEFAULT NULL : si le relation n'est pas renseigné il prendra la valeur NULL

Si vous avez fait une erreur dans une table et vous souhaiter supprimer une table, exécuter la commande SQL :

DROP nom_de_la_table

non validé Faire valider votre travail par le professeur (1).

2.2 - Création des clés primaires et des indexes (KEY)

On désire que la relation num_resultat soit auto-incrémenté pour ne pas avoir à le saisir.

2.3 - Ajout des relations entre les tables

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

    table 

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.

non validé Faire valider votre travail par le professeur (2).

2.4 - Ajout de données dans les tables

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_candidatnum_anonymatnomprenomdate _naissancenum_etablissement
202168001B21A05226ABBOUSTEEVE2003-11-030681768C
202168002B21A05072ABEDALDO2002-09-160681768C

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_anonymatavispointsmoyenne
B21A05226Preuves9029.02
B21A05072Très Favorable175017.5

non validé Faire valider votre travail par le professeur en exécutant les deux requêtes permettant d'afficher les données des deux tables. (3).

2.5- Importation des données

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.

import

En faire de même pour la table resultats : resultats.csv

non validé Faire valider votre travail par le professeur en affichant les données des tables (4) :

  • candidats classées par numéro de candidat croissant,
  • résultats classées par numéro de résultat croissant.

2.6- Requêtes SQL

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 

sql

Ecrire la requête permettant d'afficher les candidats qui passent le second groupe

non validé Faire valider par le professeur (5).

2.7 - Attribution des décisions

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 :

sql

non validé Faire valider votre travail par le professeur (6).

2.8- Modifier un champ

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 :

sql

non validé 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)

sql

Enregistrez vos commandes SQL ci-dessous et justifiez quels sont les seuls champs qu'on peut mettre après la condition WHERE :

sql

non validé Faire valider votre travail par le professeur (8).

2.9- Modification des moyennes prenant en compte les points attribués par le jury

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 :

sql

non validé Faire valider votre travail par le professeur (9).

2.10 - Affichage des résultats et jointures entre deux tables

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 :

join

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

sql

non validé 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

sql

non validé Faire valider votre travail par le professeur (11).

2.11 - Suppression d'une donnée dans une table

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.

sql

non validé Faire valider votre travail par le professeur (12).

2.12 - Compter le nombre de candidats

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

non validé 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

non validé Faire valider votre travail par le professeur (14).

Que retourne l'instruction SQL suivante :

SELECT COUNT(DISTINCT num_etablissement) FROM candidats

non validé 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()

non validé Faire valider votre travail par le professeur (16).

Découvrir toutes les fonctions et requêtes sur le site Internet https://sql.sh/

3 - Travail à réaliser en autonomie :

3.1 - Table etablissement

Créer la table etablissements (num_etablissement, nom, adresse, cp, ville, telephone)

Domaines :

  • num_etablissement : varchar(10)
  • nom : varchar(50)
  • adresse : varchar(50)
  • cp : varchar(6)
  • ville : varchar(25)
  • téléphone : varchar(25)

Insérer les données suivantes :

  • ('0681768C','Lycée Laurent de Lavoisier','42 rue Lavoisier','68200','MULHOUSE','03 89 42 29 95')
  • ('0681505T','Lycée Lambert','73 Rue Josué Heilmann',68100,'MULHOUSE','03 89 33 16 55')

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 :

sql

non validé Faire valider votre travail par le professeur et lui indiquer où se trouve la clé primaire et étrangère (17).

3.2 - Table utilisateurs

Créer la table utilisateurs (num_utilisateur, nom, prenom, id, mdp, role, #num_etablissement)

Domaines:

  • num_utilisateur : int(11) autoincrémenté
  • nom : varchar(25)
  • prenom : varchar(25)
  • id : varchar(50)
  • mdp : varchar(40)
  • role : varchar(25)
  • num_etablissement : varchar(10)

    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 :

  • (id,mdp,role,num_etablissement) les valeurs ('jury1',sha1('secret1'),'jury','0681768C')
  • (id,mdp,role,num_etablissement) les valeurs ('jury2',sha1('secret2'),'jury','0681505T')
  • (nom,prenom,id,mdp,role,num_etablissement) les valeurs ('LAMBERT','Jean-Henri','jlambert',sha1('secret3'),'proviseur','0681505T')
  • (nom,prenom,id,mdp,role,num_etablissement) les valeurs ('HUGUENOT','Pierre','phuguenot',sha1('secret4'),'cpe','0681505T')
  • (nom,prenom,id,mdp,role,num_etablissement) les valeurs ('LAVOISIER','Antoine Laurent','alavoisier',sha1('secret5'),'proviseur','0681768C')
  • (nom,prenom,id,mdp,role,num_etablissement) les valeurs ('PAULZE','Marie-Anne Pierrette','mpaulze',sha1('secret6'),'cpe','0681768C')
  • (nom,prenom,id,mdp,role) les valeurs (votre nom,votre prenom,votre identifiant,sha1(votre mot de passe),'administrateur')

sql

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 l'identifiant est égal à 'alavoisier' et le mot de passe est égal à sha1('secret5')

Résultat attendu :

sql

non validé Faire valider votre travail par le professeur (18).

4 - Conclusion

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

5 - Interfaces Homme Machine du baccalauréat à faire par les plus rapides :

6 - Exercices :

On dispose d'une base de données des pokemons ayant la structure suivante

DB pokemons

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: