Fiche de révision

Le langage SQL avancé


Nous continuons à explorer les commandes SQL avec des requêtes plus élaborées avec l'exemple de base de données de la fiche https://www.annabac.com/revision-bac/le-langage-sql.

ILa commande WHERE

La commande WHERE permet de spécifier des critères de sélection. Par exemple, pour savoir quels sont les élèves qui ont plus de 14 en maths ou plus de 18 en informatique :

Tableau de 3 lignes, 5 colonnes ;Corps du tableau de 3 lignes ;Ligne 1 : ; SELECT Nom; On obtient :; ; Nom; Ligne 2 : ; FROM Table_notes; ; ; ----------; Ligne 3 : ; WHERE Maths>14 OR Info>18;; ; ; Zoe;

IIModifications

On peut modifier des valeurs dans une table avec UPDATE :

Tableau de 1 lignes, 2 colonnes ;Corps du tableau de 1 lignes ;Ligne 1 : ; UPDATE [Table] SET [attribut = valeur] WHERE [attribut = valeur];

Par exemple, pour donner 16 en maths à Joe :

Tableau de 3 lignes, 2 colonnes ;Corps du tableau de 3 lignes ;Ligne 1 : ; UPDATE Table_notes -- le nom de la table; Ligne 2 : ; SET Maths = 16 -- l'attribut à changer et sa valeur; Ligne 3 : ; WHERE Nom = 'Joe'-- l'attribut servant à filter;

On peut supprimer une ligne avec DELETE :

Tableau de 1 lignes, 2 colonnes ;Corps du tableau de 1 lignes ;Ligne 1 : ; DELETE FROM [Table] WHERE [condition];

Par exemple, pour enlever les lignes dont les notes de maths sont inférieures à 14 :

Tableau de 2 lignes, 2 colonnes ;Corps du tableau de 2 lignes ;Ligne 1 : ; DELETE FROM Table_notes; Ligne 2 : ; WHERE Maths <= 14;;

On peut ajouter une colonne avec ALTER TABLE :

Tableau de 1 lignes, 2 colonnes ;Corps du tableau de 1 lignes ;Ligne 1 : ; ALTER TABLE [Table] ADD COLUMN [définition de la colonne];

Par exemple, pour ajouter une colonne pour enregistrer la classe de l'élève :

Tableau de 2 lignes, 2 colonnes ;Corps du tableau de 2 lignes ;Ligne 1 : ; ALTER TABLE Table_notes ADD COLUMN Classe TEXT;; Ligne 2 : ; SELECT * FROM Table_notes;;

On obtient :

Tableau de 5 lignes, 6 colonnes ;Corps du tableau de 5 lignes ;Ligne 1 : ; Nom; Maths; Anglais; Info; Classe; Ligne 2 : ; --------; --------; --------; --------; --------; Ligne 3 : ; Joe; 14; 17; 18; ; Ligne 4 : ; Zoe; 19; 15; 17; ; Ligne 5 : ; Anne; 18; 19; ; ;

On peut renommer une table :

Tableau de 1 lignes, 2 colonnes ;Corps du tableau de 1 lignes ;Ligne 1 : ; ALTER TABLE [Table] RENAME TO [nouveau nom de la table];

On peut supprimer une table avec DROP TABLE :

Tableau de 1 lignes, 2 colonnes ;Corps du tableau de 1 lignes ;Ligne 1 : ; DROP TABLE Table_notes;;

IIIFonctions de groupes (agrégation)

Les fonctions de groupe permettent d'obtenir des informations sur un ensemble de lignes en travaillant sur les colonnes et non pas sur les lignes comme avec WHERE. Par exemple :

AVG calcule la moyenne d'une colonne ;

SUM calcule la somme d'une colonne ;

MIN, MAX calculent le minimum et le maximum d'une colonne ;

COUNT donne le nombre de lignes d'une colonne.

Exemple : comptons combien d'élèves ont plus de 15 en maths.

Tableau de 1 lignes, 2 colonnes ;Corps du tableau de 1 lignes ;Ligne 1 : ; SELECT COUNT(*) FROM Table_notes WHERE Maths > 15;;

On obtient :

Tableau de 1 lignes, 2 colonnes ;Corps du tableau de 1 lignes ;Ligne 1 : ; 2;

IVLe tri : ORDER BY

Trions les lignes par ordre croissant des notes de maths et, en cas d'égalité, des notes d'informatique.

Tableau de 3 lignes, 2 colonnes ;Corps du tableau de 3 lignes ;Ligne 1 : ; SELECT Nom, Maths, Info; Ligne 2 : ; FROM Table_notes; Ligne 3 : ; ORDER BY Maths, Info ASC;;

On obtient :

Tableau de 5 lignes, 4 colonnes ;Corps du tableau de 5 lignes ;Ligne 1 : ; Nom; Maths; Info; Ligne 2 : ; --------; --------; --------; Ligne 3 : ; Joe; 14; 18; Ligne 4 : ; Anne; 18; 19; Ligne 5 : ; Zoe; 19; 17;

V Les jointures

Une jointure permet d'associer plusieurs tables dans une même requête.

Par exemple, supposons que nous disposions d'une table associant à chaque note sa mention, alors que nous avons déjà une table associant à chaque élève ses notes. Nous voudrions créer une table liant le nom des élèves à leur mention correspondant à leur note de maths.

Voici un extrait d'une table Table_mentions :

Tableau de 6 lignes, 3 colonnes ;Corps du tableau de 6 lignes ;Ligne 1 : ; Note; Mention; Ligne 2 : ; --------; --------; Ligne 3 : ; 14; cool; Ligne 4 : ; 17; la star; Ligne 5 : ; 18; la folie; Ligne 6 : ; 19; trop ouf;

Nous allons joindre la table Table_notes et la table Table_mentions en reliant les lignes telles que la note de maths de la 1re table soit égale à la note de la 2e table :

Tableau de 3 lignes, 2 colonnes ;Corps du tableau de 3 lignes ;Ligne 1 : ; SELECT Nom, Mention AS Mention_maths; Ligne 2 : ; FROM Table_notes AS n; Ligne 3 : ; JOIN Table_mentions AS m ON n.Maths = m.Note;;

On obtient :

Tableau de 5 lignes, 3 colonnes ;Corps du tableau de 5 lignes ;Ligne 1 : ; Nom; Mention_maths; Ligne 2 : ; --------; -------------; Ligne 3 : ; Joe; cool; Ligne 4 : ; Zoe; trop ouf; Ligne 5 : ; Anne; la folie;

Si on veut créer une table à partir de cette sélection et la réutiliser, on emploie la syntaxe :

Tableau de 1 lignes, 2 colonnes ;Corps du tableau de 1 lignes ;Ligne 1 : ; CREATE TABLE Appreciations AS SELECT Nom, Mention ... ;

VI Un exemple de faille de sécurité : l'injection SQL

Il est très important de sécuriser ses BDD qui peuvent contenir des données sensibles. Or il est courant de demander aux utilisateurs des données (nom, mot de passe…) qui sont introduites dans la base. Un utilisateur malveillant pourrait alors entrer du code SQL au lieu de son nom et détruire la base ou bien récupérer des données.

Par exemple, on peut demander à un utilisateur d'entrer un pseudo sans précaution via ce code en Python avec la bibliothèque bottle-sqlite :

Tableau de 2 lignes, 2 colonnes ;Corps du tableau de 2 lignes ;Ligne 1 : ; p = input('Quel est votre pseudo ?'); Ligne 2 : ; db.execute(f

Si l'utilisateur rentre le pseudo 'Joe'; DROP TABLE inscrits; alors la requête exécutée est :

Tableau de 1 lignes, 2 colonnes ;Corps du tableau de 1 lignes ;Ligne 1 : ; SELECT * FROM inscrits WHERE pseudo = 'Joe'; DROP TABLE inscrits;;

Joe sera bien ajouté, mais une nouvelle requête est ajoutée qui va détruire la table à l'insu de l'administrateur.

Il est recommandé de faire vérifier les entrées avant de lancer la requête, par exemple à l'aide d'expressions régulières ou en utilisant des paramètres SQL comme ici :

Tableau de 1 lignes, 2 colonnes ;Corps du tableau de 1 lignes ;Ligne 1 : ; db.execute('SELECT * FROM inscrits WHERE pseudo=?', pseudo);

SQLite va vérifier que le paramètre pseudo ne contient aucun code créant une requête avant d'exécuter la requête SELECT et ensuite remplacera le ? par la valeur de pseudo vérifiée (requête préparée).

Pour lire la suite

Je m'abonne

Et j'accède à l'ensemble
des contenus du site