SQL⚓︎
Sources: https://monlyceenumerique.fr/nsi_terminale/bdd/bdd2.php
Nous l'avons compris au chapitre précédent, l’accès aux données d’une base de données relationnelle s’effectue grâce à des requêtes SQL (le plus souvent). Nous verrons ici celles nous permettant d’interroget et de mettre à jour.
1. Les commandes d'interrogation de la base⚓︎
Il existe plusieurs types de requêtes pour interroger une table.
1.1. La projection⚓︎
La projection d'une table permet d'obtenir une partie des champs de la table. Elle utilise la commande SELECT.
On sélectionne les colonnes de notre relation.
Example
Relation : Joueur(IdJoueur,nomJoueur,pnomJoueur)
Quelques exemples de requêtes SQL :
-
Obtenir toutes les informations sur tous les joueurs :
SELECT * FROM joueur; -
Obtenir le nom et les prénoms des joueurs :
SELECT nomJoueur,pNomJoueur FROM joueur;
1.2. La sélection⚓︎
La sélection d'une table permet de choisir une partie des lignes de la table. On utilise le mot clé WHERE suivie du (ou des) critère(s).
Voici une liste d'opérateurs :
| Commande | Explications |
|---|---|
| LIKE | Comme. Exemple nomJoueur LIKE 'Terez' |
| BETWEEN | Entre |
| IN | Dans |
| AND | Intersection |
| OR | Union |
| NOT | Négation |
| <,>, <=,>= | Utilisables sur des données numériques |
| % | Symbole qui représente une chaîne de caractères. |
| _ | Symbole qui représente un caractère |
Example
Relation : personne(Id,nom,pNom,ville,tel,email)
Quelques exemples de requêtes SQL :
-
Obtenir les noms et prénoms des personnes qui habitent Aubervilliers :
SELECT nom, pNom FROM personne WHERE ville = 'AUBERVILLIERS'; -
Obtenir le nom et les numéros de téléphone des personnes qui habitent Aubervilliers ou Saint-Denis :
SELECT nom, tel FROM personne WHERE ville = 'AUBERVILLIERS' or ville = 'SAINT-DENIS'; -
Obtenir le nom et les adresses mails des personnes ayant une adresse de type 'gmail' :
SELECT nom, email FROM personne WHERE email LIKE '%gmail.com';
Note
Le caractère % permet de remplacer n'importe quelle chaine de caractères.
Note
Le caractère _ permet de remplacer n'importe quel caractère.
Note
Par défaut, LIKE est insensible à la casse
1.3. La jointure⚓︎
La jointure permet de mettre en relation plusieurs tables. La jointure utilise les clés primaires et étrangères des tables qu'elle met en relation. Elle utilise les mots clés JOIN ON.
Example
Schéma relationnel tournoi.sql:
-
joueur(idJoueur, nomJoueur, pnomJoueur)
-
partie(idPartie, #idJoueur1 => joueur, #idJoueur2 => joueur, score1, score2, #idVainqueur => joueur)
Les clés idJoueur1,idJoueur2 et idVainqueur sont des clés étrangères reliées à idJoueur
-
Je cherche à connaître les identifiants des parties gagnées par Bob LEPONGE (idjoueur=3).
SELECT idvainqueur, idpartie FROM partie WHERE idvainqueur = 3; -
Mais cette requête ne renvoie que des ids (des entiers) donc je ne vois pas les noms des joueurs. J'aimerais que soit affiché le nom du gagnant et non pas son identifiant. Pour cela il faut que je relie les tables joueur et partie car le nom des joueurs est une information de la table joueur mais l'id du vainqueur est une information de la table partie :
SELECT nomjoueur, idpartie FROM partie JOIN joueur ON idjoueur=idvainqueur WHERE idjoueur = 3;En cas de conflit possible entre les noms des attributs, on peut
préfixerles noms par le nom des tables :SELECT joueur.nomjoueur, partie.idpartie FROM partie JOIN joueur ON joueur.idjoueur=partie.idvainqueur WHERE joueur.nomJoueur LIKE "LEPONGE";
Beaucoup plus complexe
Si je veux maintenant le nom des deux joueurs, je vais avoir besoin de trois jointures:
SELECT
p.idpartie,
j1.nomJoueur AS nomJoueur1,
j1.pnomJoueur AS pnomJoueur1,
j2.nomJoueur AS nomJoueur2,
j2.pnomJoueur AS pnomJoueur2,
j3.nomJoueur AS nomGagnant,
j3.pnomJoueur AS pnomGagnant
FROM partie p
JOIN joueur AS j1 ON p.idJoueur1 = j1.idJoueur
JOIN joueur AS j2 ON p.idJoueur2 = j2.idJoueur
JOIN joueur AS j3 ON p.idvainqueur = j3.idJoueur
WHERE j3.nomJoueur LIKE "LEPONGE";
1.4. Aggrégation⚓︎
L'aggrégation permet de grouper des lignes pour en calculer la somme, les compter, en trouver le maximum ou le minimum.
| Commande | Explication |
|---|---|
| SUM(attribut) | Fonction d'agrégations : additionner les valeurs d'un champ numérique. |
| AVG(attribut) | Fonction d'agrégations : calculer la moyenne des valeurs d'un champ numérique. |
| MIN(attribut) et MAX(attribut) | Fonction d'agrégations : obtenir la valeur maximale ou minimale d'un champ numérique. |
| COUNT(Attribut) | Fonction d'agrégations : compter des enregistrements |
Example
SELECT joueur.nomjoueur, COUNT(partie.idpartie) FROM joueur JOIN partie ON joueur.idjoueur=partie.idvainqueur WHERE joueur.nomJoueur LIKE "LEPONGE";
1.5 Tri⚓︎
Le Tri permet de trier les lignes selon un critère.
| Commande | Description |
|---|---|
| ORDER BY attribut | Trier par ordre croissant. |
| ORDER BY attribut DESC | Trier par ordre décroissant. |
Example
SELECT nomjoueur, idpartie FROM partie JOIN joueur ON idjoueur=idvainqueur WHERE nomJoueur = "Leponge" ORDER BY max(score1,score2) DESC;
2. Les commandes de modification de la base⚓︎
Il est possible d'insérer, de supprimer ou de mettre à jour des données.
Les syntaxes sont les suivantes :
| Commande/mot-clé | Explications/syntaxe |
|---|---|
| INSERT INTO nom table (champ1,champ2, ...) VALUES (valeur1,valeur2, ...) ; | Insertion des données. On ajoute un \(n\)-uplet. Exemple : INSERT INTO JOUEUR (idJoueur,nomJoueur,pnomJoueur) VALUES (6,'Smatik','Karim') |
| UPDATE nom_table SET ... WHERE ... | Modifier des données. Exemple : UPDATE partie SET idvainqueur = 1 WHERE idpartie=1 |
| DELETE FROM nom_table WHERE .... | Suppression des données. On supprime toute la ligne identifiée par le critère qui suit le mot-clé WHERE. Exemple : DELETE FROM partie WHERE idpartie=10 |
Example
Mofification d'un score
UPDATE partie SET score1 = 55 WHERE idpartie = 1;
3. Tableau synthétique des mots clés⚓︎
Certaines commande du langage SQL ne font pas des attendues du programme de terminale NSI.
Commandes exigibles : SELECT, FROM, WHERE, JOIN, UPDATE, INSERT, DELETE, DISTINCT, ORDER BY, fonctions d'agrégations (COUNT, MAX, MIN, AVG, SUM).
| Commande/mot-clé | Explications/syntaxe |
|---|---|
| SELECT attribut1,attribut2, ... FROM nom_table | Sélection en projection. Exemple : SELECT * FROM joueur |
| SELECT DISTINCT attribut1,attribut2, ... FROM nom_table | Idem commande précédente en évitant de retourner des doublons |
| JOIN ... ON | Jointure pour relier deux ou plusieurs tables. Exemple : SELECT nomJoueur,idpartie FROM joueur JOIN partie ON idjoueur=idvainqueur WHERE idvainqueur=3; |
| AS | Renommer une colonne. SELECT nomJoueur AS Vainqueur FROM Joueur WHERE idVainqueur=3 |
| ORDER BY attribut | Trier par ordre croissant. |
| ORDER BY attribut DESC | Trier par ordre décroissant. |
| SUM(attribut) | Fonction d'agrégations : additionner les valeurs d'un champ numérique. |
| AVG(attribut) | Fonction d'agrégations : calculer la moyenne des valeurs d'un champ numérique. |
| MIN(attribut) et MAX(attribut) | Fonction d'agrégations : obtenir la valeur maximale ou minimale d'un champ numérique. |
| COUNT(Attribut) | Fonction d'agrégations : compter des enregistrements |
| LIKE | Comme. Exemple nomJoueur LIKE 'Terez' |
| BETWEEN | Entre |
| IN | Dans |
| AND | Intersection |
| OR | Union |
| NOT | Négation |
| <,>, <=,>= | Utilisables sur des données numériques |
| % | Symbole qui représente une chaîne de caractères. |
| _ | Symbole qui représente un caractère |
| INSERT INTO nom table (champ1,champ2, ...) VALUES (valeur1,valeur2, ...) ; | Insertion des données. On ajoute un \(n\)-uplet. Exemple : INSERT INTO JOUEUR (idJoueur,nomJoueur,pnomJoueur) VALUES (6,Smatik,Karim) |
| UPDATE nom_table SET ... WHERE ... | Modifier des données. Exemple : UPDATE partie SET idvainqueur = 1 WHERE idpartie=1 |
| DELETE FROM nom_table WHERE .... | Suppression des données. On supprime toute la ligne identifiée par le critère qi suit le mot-clé WHERE. Exemple : DELETE FROM partie WHERE idpartie=10 |
Note
Le même nom d'attribut pour être utilisé dans deux tables différents : il est nécessaire alors de préciser le nom de la table que l'on considère en préfixant le nom de l'attribut par celui de la table : table.attribut.
Note
De plus, il est possible d'utiliser des alias au lieu du nom complet de la table grâce à l'instruction AS, ce qui permet par exemple de réduire la longeur de la requête.
4. Des accès pour vous entraîner⚓︎
Il existe quelques bases de données accessibles sur le web pour vous entraîner dans vos requêtes.