Pages web et plus SQL

Prérequis

Vous avez un serveur local qui fonctionne, avec PhPMyAdmin

Vous avez au moins une base de données créée dans PhP MyAdmin (voir cours Créer une base de données avec PhPMyAdmin )


Introduction

Nous allons rappeler comment faire des requêtes SQL (celles vues dans le cours précédent PhPMyAdmin et SQ) puis nous allons directement les exécuter depuis une page web. Pour cela, nous ferons un rappel sur comment connecter une base de données dans un site web avec PDO. SI cela fonctionne déjà en ayant suivi le cours précédent, vous pouvez passer à la suite.

Enfin, nous verrons de nouvelles fonctionnalités SQL.

Vous pouvez suivre ce cours avec la base de données vue dans le cours sur l'utilisation de PhPMyAdmin et SQL pour laquelle sont fournies les corrections. Vous pouvez également le faire avec votre propre base de données.

Ce cours propose un aperçu des fonctionnalités et des instructions de SQL. Pour plus d'instruction SQL dans la documentation: https://sql.sh

Sommaire

Se connecter à une base de données dans une page web

La première étape pour utiliser une base de données directement dans votre page web, c'est de vous y connecter via votre page web.

Pour cela, nous allons utiliser PDO. Cette étape doit déjà fonctionner suite au cours PhPMyAdmin et SQL. Si c'est le cas, passez directement aux sections avec les requêtes SQL.


Pour établir une connexion avec une base de données en local, voici la procédure:

Sur votre serveur web (MAMP, XAMMP...), verifier que votre serveur web est activé.

Si vous ne l'avez pas, vous pouvez importer la base de données Filiere pour ce cours: Fichier Filière-2.sql à importer pour créer les tables de la base de données Filiere


Maintenant, vous devez avoir une base de données dans PhPMyAdmin avec laquelle vous allez vous connecter en local via votre site web.

Instruction PhP à mettre dans votre page pour vous connecter

Nous allons utiliser l'instruction suivante pour se connecter sur votre base de données, avec en gras les éléments à modifier selon votre cas.

Pour vous connecter, il vous faut les droits, vous vous authentifiez donc avec un login et un mot de passe.


Voici plus de détails, partie par partie:

  • $bdd = : l'accès à la base de données, une fois la connexion faite, est stocké dans une variable (ici, le nom de cette variable PhP est bdd)

  • new PDO( : demande de l'initialisation de l'accès

  • " : (premier paramètre composé de:)

    • mysql:host=localhost; : nom de la source des données

    • dbname=mabase; : nom de la base de données

    • charset=utf8 : encodage

  • ", (fin du premier paramètre)

  • "mabase_login", login de l'utilisateur de la base

  • "mabase_mdp", mot de passe de l'utilisateur

  • array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); enregistremebt des erreurs si la connexion ne fonctionne pas.



<?php

$bdd = new PDO( "mysql:host=localhost;dbname=mabase;charset=utf8", "mabase_login", "mabase_mdp", array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));


?>

A ce stade, nous récuperons l'erreur, mais nous ne l'affichons pas si la connexion échoue. Nous allons donc mettre cette instruction dans un bloc Try Catch (c'est à dire Essayer, si ça ne fonctionne pas Intercepter l'erreur), ci-contre en italique:



<?php try {

$bdd = new PDO( "mysql:host=localhost;dbname=mabase;charset=utf8", "mabase_login", "mabase_mdp", array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));

}

catch (Exception $e) {

die('Erreur fatale : ' . $e->getMessage());

}


?>

Si vous avez téléchargé et importé le fichier Filiere-2.sql, , vous utiliserez mysql:host=localhost;dbname=Filiere. Sinon, utiliser les nom de votre base de données à la place de Filiere.


Il ne reste donc qu'à obtenir un login et un mot de passe pour la base de données


Nous allons maintenant créer un identifiant et un mot de passe pour la base de données via PhPmyAdmin, afin de nous connecter

<?php try {

$bdd = new PDO( "mysql:host=localhost;dbname=Filiere;charset=utf8", "mabase_login", "mabase_mdp", array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));

}

catch (Exception $e) {

die('Erreur fatale : ' . $e->getMessage());

}



Créer votre compte utilisateur dans PhPMyAdmin

Sur la page PhPMyAdmin, aller sur l'accueil en cliquant sur l'icone de la maison en haut à gauche.

Dans l'onglet Compte utilisateur, vous voyez la liste des utilisateurs.

En dessous de la liste des comptes, cliquer sur Ajouter un compte d'utilisateur

  • Saisissez un nom utilisateur (celui que vous mettrez dans l'instruction vue précédemment), dans mon cas, j'ai mis lauren en minuscules.

  • Sélectionner Local à Nom d'hôte

  • Choisissez un mot de passe (celui que vous mettrez dans l'instruction vue précédemment). Pour la suite de l'exemple, j'ai renseigné un mot de passe particulièrement mauvais: admin


Afin de pouvoir réaliser l'ensemble des requêtes SQL, j'ai choisi dans Editer les privilièges, de Tout cocher.

Attention: pour votre site web, cela est déconseillé, car il serait alors possible d'effacer des données, des tables etc.


Cliquer sur Exécuter en bas à droite.

Le nouveau compte a été créé:

Connectez-vous à votre base de données avec votre compte utilisateur nouvellement créé


Retournez à votre code source PhP.

Remplacer, dans l'instruction, "mabase_login", "mabase_mdp" par votre login utilisateur et votre mot de passe nouvellement créé.

Dans mons cas, j'écrirais:

<?php try {

$bdd=new PDO("mysql:host=localhost;dbname=Filiere;charset=utf8", "lauren", "admin",

array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

}

catch (Exception $e) {

die('Erreur fatale : ' . $e->getMessage());

}

<?php try {

$bdd = new PDO( "mysql:host=localhost;dbname=Filiere;charset=utf8", "mabase_login", "mabase_mdp", array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));

}

catch (Exception $e) {

die('Erreur fatale : ' . $e->getMessage());

}



Vous pouvez intégrer cette instruction dans une page, afin de voir si la page s'affiche (connexion réussie) ou s'il y a une Erreur Fatale, dans quel cas la connexion n'a pas marché.


Veillez à ouvrir votre page web via votre serveur web, sinon cela ne fonctionnera pas

CAS 1: la page s'affiche, la connexion à la base de données a réussi

CAS 2: une erreur s'affiche, la connexion à la base de données n'a pas abouti

Requêtes dans une page web: Fonctionnement général

Vous êtes connecté.e.s à votre base de données, maintenant il reste à effectuer les requêtes depuis votre page web.

Le principe est très simple:

  • vous tapez votre requête dans une chaine de caractère en PhP

  • vous exécuter la requête en utilisant la variable utilisée pour la connexion avec votre base de données ($bdd dans la section précédente) ave query

Vous voulez faire la requête "SELECT * FROM Cours" ? ll vous suffit d'utiliser cette chaine de caractère avec query() et votre variable $bdd. Vous verrez dans les section suivante comment afficher les resultats pour les requêtes SELECT.

<?php

$instructions = "SELECT * FROM Cours";

$requete = $bdd -> query ($instructions);

?>

Le cas des requêtes préparées

Imaginons que l'on souhaite changer faire un SELECT mais que l'on puisse changer les conditions après le WHERE (par exemple, les lettres que l'on cherche ou la clef primaire) ou les valeurs que l'on veut ajouter dans une base de données (par exemple, quand on crée un nouveau compte utilisateur, on ne sait pas en avance le nom, l'age et le mot de passe).

Dans ce cas, on fait un référence à la base de donnée ($bdd) avec prepare, puis on remplace, dans la requête, les valeurs par un marqueur avec un nom précédé de deux points. On associe dans bindValue le nom du marqueur et la valeur qui remplace le marqueur, puis on exécute.

Attention, ces marqueurs ne peuvent remplacer que des paramètres, après le mot clef WHERE par exemple. Par exemple, dans le deuxième exemple, la valeur de l'idCours pourra être modifié en fonction du contexte (utilisateur, formulaire, etc.)


Exemple de requêtes préparées SANS marqueurs

<?php

$requete = $bdd->prepare("SELECT * FROM Cours");

$requete->execute();

?>


Exemple de requêtes préparées AVEC marqueurs

<?php

$requete = $bdd->prepare("SELECT * FROM Cours WHERE idCours=:monID");

$laValeurdeID= "3";

$requete->bindValue('monID',$laValeurdeID,PDO::PARAM_STR );

$requete->execute();

?>




Note importante: quand une requête renvoie quelque chose, elle renvoie un tableau associatif dans une variable PhP (l'équivalent d'une Map en JavaScript). Cette variable prend les valeurs de la requête, mais, "n'en fait rien". Pour les afficher, il faut les utiliser avec un echo par exemple. Voici un exemple, juste après, pour utiliser les valeurs retournées par une requête select, en les affichant.

Utiliser les résultats d'un SELECT

La variable $requete (après le exécute), est d'un type un peu particulier. Pour récupérer les résultats, nous allons "aller chercher" (litteralement: fetch) les résultats ligne par ligne. Pour cela, on utilise une boucle while qui s'arrête quand il n'y a plus de résultat à traiter.

La ligne est un tableau associatif, où on récupère la valeur de la cellule en fonction de la clef (la clef est ici le nom de la colonne dans la base de données). Par exemple, pour récupérer la valeur dans la colonne Nom pour tous les resultats, on utilise, en plus de la requête précédente:


<?php


while ( $ligne = $requete->fetch() ) {

echo "<p> Valeur du champ:". $ligne['NomDeLaColonne']."</p>";


}


?>

Ajouter et supprimer une occurrence (une ligne)

Rappel:

Pour créer une nouvelle occurrence :

INSERT INTO maTable ( attribut1, attribut2, attribut3) VALUES (valeur1Attribut1, valeur1Attribut2, valeur1Attribut3)


Pour créer plusieurs occurences:

INSERT INTO maTable ( attribut1, attribut2, attribut3) VALUES (valeur1Attribut1, valeur1Attribut2, valeur1Attribut3), (valeur2Attribut1, valeur2Attribut2, valeur2Attribut3), (valeur3Attribut1, valeur3Attribut2, valeur3Attribut3),


Pour supprimer une occurrence:

DELETE FROM maTable WHERE maClefPrimaire = valeurDeClefPrimaire


On peut également utiliser n'importe quelle condition avec WHERE

Rappel Ajout

Aller dans PhPMyAdmin, puis sur l'onglet SQL

Ecrivez la requête pour créer une nouvelle UE:


Votre occurrence a été ajouté dans votre table:

Exercice 1. Faites une requête pour ajouter une UE, mais depuis votre page web au lieu d'utiliser PhPMyAdmin

<?php

$requeteInsert= "INSERT INTO UE (idUE, Nom, CreditECTS) VALUES (NULL, 'Analyse de donnée', '4')";

$insertion=$bdd -> query($requeteInsert);


?>

Exercice 2. Faites une requête préparée pour ajouter une UE, mais depuis votre page web

<? php

$requeteInsert= $bdd -> prepare("INSERT INTO UE (idUE, Nom, CreditECTS) VALUES (NULL, :nom,:credits)");


$leNom= "Environnement numerique";

$lesCredits = "4";


$requeteInsert->bindValue('credits', $lesCredits,PDO::PARAM_STR );

$requeteInsert->bindValue('nom',$leNom,PDO::PARAM_STR );

$requeteInsert->execute();

?>

Rappel Suppression

Aller dans PhPMyAdmin, puis sur l'onglet SQL

Ecrivez la requête pour supprimer la dernière UE créée.

Votre occurrence a été supprimée de votre table:



Exercice 3. Faites une requête pour supprimer l'UE, mais depuis votre page web au lieu d'utiliser PhPMyAdmin

<?php

$requeteDelete= "DELETE FROM UE WHERE idUE='10'";

$insertion=$bdd -> query($requeteDelete);

?>

Exercice 4. Faites une requête préparée pour supprimer une UE, mais depuis votre page web

<?php

$requeteDelete=$bdd -> prepare("DELETE FROM UE WHERE idUE=:id");

$leID="11";

$requeteDelete->bindValue('id',$leID,PDO::PARAM_STR );

$requeteDelete->execute();

?>


Requêtes SQL pour interroger une table

Selectionner tout le contenu d'une table

Si une table s'appelle MATABLE dans une base de données, on peut sélectionner toutes les données de la table avec l'instruction suivante:

SELECT * FROM MATABLE


Rappel dans PhPMyAdmin

Dans PhPMyAdmin, selectionner une base de données (ici, Filiere) dans l'aborescence à gauche.

Aller dans l'onglet SQL. Nous allons tenter de sélectionner toutes les évaluations enregistrées dans la base de données.

Nous souhaitons donc "sélectionner" + "tous les attributs" des occurrences + "de la table Evaluation".

La requête correspondante est donc:

SELECT * FROM Evaluation

Ecrivez cette requête dans l'encadré dédié et cliquez sur Exécuter

Une fois exécutée, l'ensemble des occurences de la table (il y en a 4 ici) et l'ensemble des attributs (idEvaluation, Modalites, Debut, Fin, Sujet et idCours) est affiché

Exercice 5. Dans une base de données, par exemple Filiere, récupérer l'ensemble des données d'une autre relation, par exemple Cours via PhPMyAdmin

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Cours dans l'encadré

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Exercice 6. Faites la même chose dans votre page web avec et afficher les resultats avec fetch()

La première chose est de récupérer les résultats dans une variable. Pour cela on peut utiliser une requête ou une requête préparé


Si on a choisi de faire une requête traditionnelle:


$instructions= "SELECT * FROM Cours";

$requete=$bdd -> query($instructions);


Si on a choisi de faire une requête préparée (attention, le nom de la table n'est PAS un paramètre):


$requete=$bdd -> prepare("SELECT * FROM Cours");

$requete->execute();



Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p> idCours: ". $ligne['idCours'].", Nom du cours: ". $ligne['NomCours'].", UE asociée au cours: ". $ligne['idUE']."</p>";

}

Selectionner le contenu de certains attributs d'une table

Rappel:


SELECT NomDeLaColonne FROM MATABLE


SELECT NomDeLaColonneA , NomDeLaColonneB FROM MATABLE


Exemple dans PhPMyAdmin

Dans PhPMyAdmin, selectionner une base de données (ici, Filiere) et ller dans l'onglet SQL.

Nous souhaitons donc "sélectionner" + "les modalités, la fin et le sujet" des occurrences + "de la table Evaluation".

La requête correspondante est donc:

SELECT Modalites, Fin, Sujet FROM Evaluation

Ecrivez cette requête dans l'encadré dédié et cliquez sur Exécuter.

Seuls ces trois attributs sont affichés.

Exercice 7

Question 1. Dans une base de données, par exemple Filiere, récupérer un seul des attributs des données d'une autre relation, par exemple NomCours dans Cours

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT NomCours FROM Cours dans l'encadré

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Question 2. Faites la même chose dans votre page web avec et afficher les resultats avec fetch()

La première chose est de récupérer les résultats dans une variable. Pour cela on peut utiliser une requête ou une requête préparé


Si on a choisi de faire une requête traditionnelle:


$instructions= "SELECT NomCours FROM Cours";

$requete=$bdd -> query($instructions);


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare("SELECT NomCours FROM Cours");

$requete->execute();



Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p> "Nom du cours ". $ligne['NomCours']."</p>";

}

Question 3. Dans une base de données, par exemple Filiere, récupérer deux des attributs des données d'une autre relation, par exemple NomPersonne et PrenomPersonne dans Personne

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT NomPersonne,PrenomPersonne FROM Personne

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Question 4. Faites la même chose dans votre page web avec et afficher les resultats avec fetch()

La première chose est de récupérer les résultats dans une variable. Pour cela on peut utiliser une requête ou une requête préparé


Si on a choisi de faire une requête traditionnelle:


$instructions= "SELECT NomPersonne,PrenomPersonne FROM Personne";

$requete=$bdd -> query($instructions);


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare("SELECT NomPersonne,PrenomPersonne FROM Personne");

$requete->execute();



Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p>Nom :". $ligne['NomPersonne'].", prénom: ". $ligne['PrenomPersonne']."</p>";


}

Selectionner les occurences d'une table respectant certaines contraintes

On rajoute le mot clef WHERE à la fin de la requête SELECT suivi de la contrainte.

Cela est indépendant de la première partie de la requête, où on choisit les attributs à retourner par la requête

Seulement les lignes où un attribut a une valeur donnée:

SELECT * FROM MATABLE Colonne1="maValeur"


SELECT Colonne2, Colonne3 FROM MATABLE Colonne1="maValeur"


Exemple dans PhPMyAdmin avec la table Filière:

SELECT * FROM Evaluation WHERE idCours="2"

SELECT Modalites, Sujet FROM Evaluation WHERE idCours="2"


Exercice 8. Dans une base de données, par exemple Filiere, récupérer la liste des occurrences d'une relation ayant une certaine valeur pour un attribut donné, par exemple la liste des occurrences de Personne ayant comme nom de famille Monster.

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Personne WHERE NomPersonne="Monster"

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Exercice 9. Faites la même chose dans votre page web avec et afficher les resultats avec fetch()

La première chose est de récupérer les résultats dans une variable. Pour cela on peut utiliser une requête ou une requête préparé


Si on a choisi de faire une requête traditionnelle:


$instructions= " SELECT * FROM Personne WHERE NomPersonne='Monster' ";

$requete=$bdd -> query($instructions);


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare(" SELECT * FROM Personne WHERE NomPersonne=:nom");

$laValeur='Monster';

$requete->bindValue('nom',$laValeur,PDO::PARAM_STR );

$requete->execute();




Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p>Nom :". $ligne['NomPersonne'].", prénom: ". $ligne['PrenomPersonne']."</p>";


}

Seulement les lignes où un attribut prend une des valeurs d'une liste:

SELECT * FROM MATABLE WHERE Colonne1 IN ( "maValeur1", "maValeur2" )


Exemple dans PhPMyAdmin avec la table Filière:

SELECT * FROM Evaluation WHERE Modalites IN ("Dossier", "Projet")

SELECT Sujet, Fin FROM Evaluation WHERE Modalites IN ("Dossier", "Projet")

Exercice 10

Dans une base de données, par exemple Filiere, récupérer la liste des occurrences d'une relation ayant un attribut dans une liste de trois valeurs, par exemple la liste des occurrences de Personne ayant comme nom de famille Monster, Thevin ou JadorelUCO

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Personne WHERE NomPersonne IN ("Monster", "Thevin", "JadorelUCO") dans l'encadré

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Exercice 11. Faites la même chose dans votre page web avec et afficher les resultats avec fetch()

La première chose est de récupérer les résultats dans une variable. Pour cela on peut utiliser une requête ou une requête préparé


Si on a choisi de faire une requête traditionnelle:


$instructions= "SELECT * FROM Personne WHERE NomPersonne IN ('Monster', 'Thevin', 'JadorelUCO') ";

$requete=$bdd -> query($instructions);


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare("SELECT * FROM Personne WHERE NomPersonne IN (:valeur1, :valeur2, :valeur3)");


$laValeur1="Monster";

$laValeur2="Thevin";

$laValeur3= "JadorelUCO";

$requete->bindValue('valeur1',$laValeur1,PDO::PARAM_STR );

$requete->bindValue('valeur2',$laValeur2,PDO::PARAM_STR );

$requete->bindValue('valeur3',$laValeur3,PDO::PARAM_STR );


$requete->execute();



Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p>Nom :". $ligne['NomPersonne'].", prénom: ". $ligne['PrenomPersonne']."</p>";


}

Seulement les lignes où un attribut est inférieur, supérieur ou entre deux valeurs:

SELECT * FROM MATABLE WHERE Colonne1 < "maValeur1"

SELECT * FROM MATABLE WHERE Colonne1 > "maValeur2"

SELECT * FROM MATABLE WHERE Colonne1 BETWEEN "maValeur1" AND "maValeur2"


Exemple dans PhPMyAdmin avec la table Filière:

SELECT * FROM Evaluation WHERE Fin < '2020-12-24 23:59:00'

SELECT * FROM Evaluation WHERE Fin > '2021-01-01 00:00:01'

SELECT * FROM Evaluation WHERE Fin BETWEEN '2020-12-24 23:59:00' AND '2021-01-01 00:00:01'

Exercice 12. Dans une base de données, par exemple Filiere, récupérer la liste des occurrences d'une relation ayant un attribut dans un intervalle, par exemple la liste des occurrences de Personne ayant un idPersonne entre 4 et 25

Dans PhPMyAdmin, en étant dans la bonne base de données:

  • Etape 1: cliquer sur l'onglet SQL

  • Etape 2: taper SELECT * FROM Personne WHERE idPersonne BETWEEN "4" AND "25" dans l'encadré

  • Etape 3: cliquer sur Exécuter

  • Etape 4: les résultats apparaissent

Exercice 13. Faites la même chose dans votre page web avec et afficher les resultats avec fetch()

La première chose est de récupérer les résultats dans une variable. Pour cela on peut utiliser une requête ou une requête préparé


Si on a choisi de faire une requête traditionnelle:


$instructions= "SELECT * FROM Personne WHERE idPersonne BETWEEN '4' AND '25' ";

$requete=$bdd -> query($instructions);


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare("SELECT * FROM Personne WHERE idPersonne BETWEEN :valeurUn AND :valeurDeux");

$laValeurUn="4";

$laValeurDeux="25";


$requete->bindValue('valeurUn',$laValeurUn,PDO::PARAM_STR );

$requete->bindValue('valeurDeux',$laValeurDeux,PDO::PARAM_STR );


$requete->execute();




Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p>Nom :". $ligne['NomPersonne'].", prénom: ". $ligne['PrenomPersonne']."</p>";


}

Vous savez utiliser des requêtes dans une page web!


Maintenant, voyons un peu plus de possibilités avec SQL

D'autres fonctionnalités en SQL

Modifier des valeurs selon certaines conditions

En SQL, vous pouvez mettre à jour des valeurs de la table selon certaines conditions spécifiées avec un WHERE par exemple. Il s'agit de UPDATE. On pourra modifier un mot de passe d'un compte utilisateur en fonction de la clef primaire par exemple.


"Créer" des colonnes en SQL

Si vous vous souvenez bien, dans une base de données, en théorie, on ne stocke que ce que l'on ne peut pas récupérer autrement. Par exemple, on ne stockera pas le nombre d'adhérants s'il suffit de compter le nombre d'occurences dans une table Adhérent.

En SQL, vous pouvez créer vos propres "colonnes" qui permettent de récuperer ce type d'informations, en utilisant par exemple des instructions SQL comme COUNT pour compter les occurences, faire des calculs, connaitre le minimum ou le maximum de certaines valeurs, faire des sommes, etc.


Quelques instructions utiles pour les dates

Nous verrons quelques instructions utiles pour manipuler les dates.



Update

Les requêtes UPDATE permettent de mettre à jour une valeur ancienneValeur par nouvelleValeur dans la colonne attribut de la table maTable pour toutes les occurrences de la table avec l'instruction suivante. On utilise le mot clef UPDATE, suivi du nom de la table, puis du mot clef SET, du nom de l'attribut où la valeur doit être modifié puis de "=" et de la nouvelle valeur qu'il doit prendre:

UPDATE maTable SET attribut=nouvelleValeur


Imaginons, par exemple, que l'on souhaite remplacer tous les prénoms (attribut prenom) d'une table Personne par "M. ou Mme ou Autre". On écrira:

UPDATE Personne SET prenom="M. ou Mme ou Autre";


Il est possible de ne faire des modifications que sous certaines conditions, en ajoutant un WHERE

UPDATE maTable SET attribut=nouvelleValeur WHERE condition


Imaginons, par exemple, que l'on souhaite remplacer tous les prénoms (attribut prenom) d'une table Personne par "Mme" si c'est une personne enregistrée avec un genre F dans la base de données. On écrira:

UPDATE Personne SET prenom="Mme" WHERE genre="F";

Exercice 14

Question 1. Dans la table Cours, modifier le nom du cours avec l'id 1 pour que le nom soit "Algo"

UPDATE Cours SET NomCours="Algo" WHERE idCours="1"

Question 2. Faites la même chose dans votre page web en utilisant une requête préparée avec un marqueur pour l'Id et afficher les resultats avec fetch()


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare("UPDATE Cours SET NomCours='Algo' WHERE idCours=:monId")

");

$lIDCHoisi="1";


$requete->bindValue('monId',$lIDCHoisi,PDO::PARAM_STR );

$requete->execute();




Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p>Nom :". $ligne['NomCours']." </p>";


}

Count

COUNT permet de compter le nombre d'occurences récupérées, par exemple via un SELECT. On utilise le mot clef COUNT autour d'un * pour obtenir le nombre d'occurences dans une table

SELECT COUNT(*) FROM maTable


Imaginons, par exemple, que l'on souhaite connaitre le nombre de personnes enregistrées dans une table Personne. On écrira:

SELECT COUNT(*) FROM Personne



Il est possible de ne compter que les occurrences respectant certaines conditions, en ajoutant un WHERE

SELECT COUNT(*) FROM maTable WHERE condition


Imaginons, par exemple, que l'on souhaite compter le nombre de personnes enregistrées dans une table Personne qui ont un genre F dans la base de données. On écrira:

SELECT COUNT(*) FROM Personne WHERE genre="F";

Exercice 15

Question 1. Dans la base de données Filière, compter le nombre d'UEs

SELECT COUNT(*) FROM UE

Question 2. Si vous faites cette requête dans PhPMyAdmin, quel est le nom de la colonne qui indique le résultat?

COUNT(*)

Question 3. Dans la base de données Filière, compter le nombre d'UEs ayant un "a" dans le nom

SELECT COUNT(*) FROM UE WHERE Nom LIKE "%a%"

Question 4. Faites la même chose dans votre page web en utilisant une requête préparée et afficher le resultat avec fetch()


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare("SELECT COUNT(*) FROM UE WHERE Nom LIKE :like ")

");

$monLike="%a%";


$requete->bindValue('like',$monLike,PDO::PARAM_STR );

$requete->execute();




Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p>Nombre :". $ligne['Count(*)']." </p>";


}

CURRENT DATE

Pour connaitre la date du jour (Jour, mois, année), vous pouvez utiliser CURRENT_DATE. Pour connaitre la date actuelle, il suffit de faire:

SELECT CURRENT_DATE


Pour connaitre l'heure en cours, vous pouvez utiliser CURRENT_TIME. Pour connaitre l'heure actuelle, il suffit de faire:

SELECT CURRENT_TIME


Pour connaitrela date et l'heure en cours, vous pouvez utiliser CURRENT_TIMESTAMP. Pour connaitre l'heure actuelle, il suffit de faire:

SELECT CURRENT_TIMESTAMP


Exercice 16

Question 1. Dans votre site, faites une requête SQL pour connaitre la date et l'heure et afficher le resultat avec fetch()


Si on a choisi de faire une requête préparée:


$requete=$bdd -> prepare("SELECT CURRENT_TIMESTAMP ");


$requete->execute();




Il reste maintenant à afficher les éléments des resultats avec fetch, en affichant chacune des valeurs des colonnes:


while ( $ligne = $requete->fetch() ) {

echo "<p>Nombre :". $ligne['CURRENT_TIMESTAMP']." </p>";


}

Question 2. Dans la base de données Filière, afficher le nombre d'évaluations qui ont une date de rendu à venir

SELECT * FROM Evaluation WHERE fin> CURRENT_TIMESTAMP

Question 3. En utilisant une jointure, afficher la modalité d'une évaluation et le nom du cours de l'évaluation pour les évaluations qui ont une date de rendu à venir

SELECT Evaluation.Modalites, Cours.NomCours FROM Evaluation INNER JOIN COURS ON Evaluation.idCours=Cours.idCours WHERE fin> CURRENT_TIMESTAMP

Jour, mois, année

Pour connaitre l'année d'une date, on encadre la date par YEAR ( ). Par exemple pour connaitre l'année d'aujourd'hui, vous pouvez l'utiliser avec CURRENT_DATE.

SELECT YEAR(CURRENT_DATE)


Pour connaitre le mois d'une date, on encadre la date par MONTH( ) pour le numéro, et MONTHNAME( ) pour le nom du mois. Par exemple pour connaitre le mois d'aujourd'hui, vous pouvez les utiliser avec CURRENT_DATE.

SELECT MONTH(CURRENT_DATE)

SELECT MONTHNAME(CURRENT_DATE)


Pour connaitre le jour d'une date, on encadre la date par DAY( ) pour le numéro, et DAYNAME( ) pour le nom du jour de la semaine. Par exemple pour connaitre le jour d'aujourd'hui, vous pouvez les utiliser avec CURRENT_DATE.

SELECT DAY(CURRENT_DATE)

SELECT DAYNAME(CURRENT_DATE)

Exercice 17

Question 1. Dans la base de données Filière, afficher le jour de rendu des évaluations

SELECT DAYNAME(Fin), Modalites, Debut, Fin FROM Evaluation

Question 2. Dans la base de données Filière, afficher le nombre d'évaluations qui ont une date de rendu un mardi

SELECT * FROM Evaluation WHERE DAYNAME(fin)= "Tuesday"

Faire des sommes

On peut faire des sommes des valeurs des colonnes avec SUM. Par exemple, si on veut calculer la somme des notes d'une table resultat, on pourrait écrire:

SELECT SUM(notes) FROM Resultat


On peut calculer la moyenne en divisant par le nombre d'occurrences:

SELECT (SUM(notes)/COUNT(*) FROM Resultat

Faire des moyennes

On peut faire des moyennes des valeurs des colonnes avec AVG. Par exemple, si on veut calculer la moyenne des notes d'une table Resultat, on pourrait écrire:

SELECT AVG(notes) FROM Resultat


Connaitre le maximum sur une colonne

On peut le maximum des valeurs des colonnes avec MAX. Par exemple, si on veut connaitre la note maximale d'une table Resultat, on pourrait écrire:

SELECT MAX(notes) FROM Resultat


Connaitre le minimum sur une colonne

On peut le minimum des valeurs des colonnes avec MIN. Par exemple, si on veut connaitre la note minimal d'une table Resultat, on pourrait écrire:

SELECT MIN(notes) FROM Resultat


Exercice 18

Question 1. Comment obtiendrez-vous la moyenne des notes d'un étudiant avec un idEtudiant égal à 5?

SELECT AVG(notes) FROM Resultat WHERE idEtudiant='5'