Requêtes sur une table¶
Présentation¶
Langages de requêtes¶
On accède à des informations d'une base de donnée avec un langage de requêtes.
On n'utilise ni variable ni boucle contrairement aux langages de programmation habituels.
On écrit (dans un certain langage) \(\underline{\textsf{ce qu'on veut obtenir}}\) mais pas \(\underline{\textsf{comment l'obtenir}}\). On laisse le SGBD se débrouiller.
Somme des capacités de salles
D'après un exemple de Q. Fortier. On cherche le nombre de places dans des salles de cinéma climatisées à Marseille.
- En Python
- Dans un langage de requête :
SQL¶
Le langage de requêtes le plus utilisé est SQL (\(S\)tructured \(Q\)uery \(L\)angage) Plusieurs implémentations (avec des nuances dans la syntaxe)
- En \(MPI\), nous utilisons \(\text{MySQL}\) open source, gratuit.
- \(\text{Oracle Database}\) : propriétaire, payant
- \(\text{PostgreSQL}\) : open source, gratuit.
- Pour les cours d'ITC, nous utilisons \(\text{SQLite}\) et le navigateur léger \(\text{DB Browser for SQLite}\).
Syntaxe SQL¶
Chaque requête est terminée par un point virgule "\(\texttt{ ; }\)"
SQL n'est pas sensible à la casse (majuscules/minuscules) mais il est d'usage d'écrire les mots clés en majuscules et les noms de tables et colonnes en minuscules.
Types SQL¶
Les attributs peuvent être de type
- \(\color{blue}\texttt{INT}\) entier
- \(\color{blue}\texttt{CHAR(k)}\) chaîne d'au plus \(k\) caractères
- \(\color{blue}\texttt{FLOAT}\) (nombre flottant)
- \(\color{blue}\texttt{BOOLEAN}\) : bouléen (en fait \(0\) ou \(1\))
- D'autres types existent comme un type \(\color{blue}\texttt{TIME}\) mais le programme se limite aux \(4\) précédents.
- Pour les dates, conformément au programme, on utilise des chaînes de caractères au format \(\text{AAAA-MM-JJ}\) : l'ordre lexicographique correspond alors à l'ordre chronologique. De même, les horaires sont écrits au format \(\text{HH-MM-SS}\).
Création¶
La syntaxe de création de table n'est pas au programme. On crée une table \(\texttt{Utilisateur}\) avec une clé primaire \(\texttt{id}\) qui est incrémentée automatiquement à chaque nouvel utilisateur :
Exemple du cours de \(\text{MPI}\)
\(\text{MPI}\) : Le type \(\color{blue}\texttt{VARCHAR(100)}\) indique que les chaînes de caractères ont au plus \(100\) lettres contrairement à \(\color{blue}\texttt{CHAR(100)}\) dont l'occupation en mémoire est figée.
Insertion¶
Syntaxe hors programme
Interrogation de la table¶
Contexte¶
Une fois la table créée et remplie, on pose des questions sur son contenu.
Pour faire tourner les exemples, se rendre sur W3C
Fonction identité¶
Afficher toutes les colonnes de la table client
Choix de colonnes¶
Projection¶
On ne conserve que certaines colonnes, par exemple le nom de client et sa ville :
Il s'agit d'une projection sur une ou plusieurs colonnes.
Filtrer des lignes¶
Clause \(\color{blue}\texttt{WHERE}\) (Sélection)¶
On ne conserve que certaines lignes dont les caractéristiques sont filtrées dans la clause \(\color{blue}\texttt{WHERE}\). Il s'agit d'une Sélection.
Donner tous les renseignement sur les clients mexicains :
Filtrer des colonnes et des lignes¶
On peut enlever des lignes ET des colonnes.
Donner toutes les villes ou vivent des clients en Grande-Bretagne :
Enlever des doublons¶
\(\color{blue}\texttt{DISTINCT}\)¶
On a vu que le SGBD travaille avec des multi-ensembles. Il n'est donc pas rare que les requêtes de projection renvoient des doublons (contrairement aux projections du cours de maths).
Le mot clé \(\color{blue}\texttt{DISTINCT}\) supprime les doublons.
Donner sans doublon les villes des clients anglais.
Figure – Une seule fois Londres
Opérateurs de comparaison¶
- \(\color{blue}\texttt{=}\) (et surtout pas \(\color{blue}\texttt{==}\))
- \(\color{blue}\texttt{<}\), \(\color{blue}\texttt{<=}\)
- \(\color{blue}\texttt{!=}\) (ou son équivalent \(\color{blue}\texttt{<>}\))
- \(\color{blue}\texttt{AND}\), \(\color{blue}\texttt{OR}\), \(\color{blue}\texttt{NOT}\)
- \(\color{blue}\texttt{LIKE}\) (voir plus loin)
- \(\color{blue}\texttt{IS NULL}\) (pour repérer les cases vides ou non renseignées) ; \(\color{blue}\texttt{IS NOT}\)
- \(\color{blue}\texttt{NULL}\) (pour repérer les cases non vides) ;
Calcul avec des colonnes¶
Renommage¶
Mot clé \(\color{blue}\texttt{AS}\)
La somme de la colonne Quantité avec le numéro de produit (ce qui ne signifie rien, bien sûr)
Le renommage permettra d'utiliser ce résultat dans des requêtes plus complexes.
Calcul de carré ou de racine | |
---|---|
Observons que dans ce cas précis, on veut juste un résultat numérique sans lien avec aucune table. D'où l'absence de \(\color{blue}\texttt{FROM}\).
Comparaison¶
Opérateur \(\color{blue}\texttt{LIKE}\)¶
\(\color{blue}\texttt{LIKE}\) est utilisé pour chercher un motif particulier dans une colonne dont le domaine est \(\color{blue}\texttt{CHAR}\). Deux jokers sont utilisés en conjonction avec \(\color{blue}\texttt{LIKE}\)
- Le signe de pourcentage \(\%\) représente zéro, un ou plusieurs caractères.
- L'underscore \(\_\) représente un seul caractère.
Trier avec \(\color{blue}\texttt{ORDER BY}\)¶
Pour trier le résultat attendu par ordre croissant (par défaut -mot clé \(\color{blue}\texttt{ASC}\)) ou décroissant (mot clé \(\color{blue}\texttt{DESC}\)).
Quand plusieurs colonnes sont indiquées, le tri se fait par ordre lexicographique.
Trier les clients par odre décroissant de pays et croissant de nom :
Coût d'un tri en \(O (n \times log(n))\).
Limiter le nombre de lignes¶
\(\color{blue}\texttt{LIMIT}\) pour MYSQL¶
Attention, ce code SQL fonctionne avec \(\text{MySQL}\) mais pas \(\text{SQL SERVER}\). Bien indiquer sur la copie qu'on travaille en \(\text{MySQL}\) \(!!\) Voir ce qu'en dit le W3SCHOOL
Syntaxe en \(\text{MYSQL}\) et \(\text{SQLite}\) (diffère de \(\text{ORACLE}\))
Seulement les \(3\) premières lignes de la réponse :
Affiche les lignes \(0,1,2\). Essayer ici.
Donner un point de départ : \(\color{blue}\texttt{OFFSET}\)¶
Seulement \(3\) lignes après la sixième (incluse) :
Cela affiche les lignes \(6,7,8\). Noter la syntaxe : d'abord \(\color{blue}\texttt{LIMIT}\) ensuite \(\color{blue}\texttt{OFFSET}\).
Même chose avec une syntaxe abrégée :
Noter qu'on met alors le \(\color{blue}\texttt{OFFSET}\) avant le nombre de lignes. Essayer ici.
\(\color{blue}\texttt{LIMIT k OFFSET 0}\) est équivalent à \(\color{blue}\texttt{LIMIT k}\)
Cases vides¶
Le mot clé \(\color{blue}\texttt{NULL}\)¶
\(\color{blue}\texttt{NULL}\) est un mot clé indiquant une case vide.
Deux opérateurs y sont associés :
- \(\color{blue}\texttt{IS NULL}\) (pour repérer les cases vides ou non renseignées) ;
- \(\color{blue}\texttt{IS NOT NULL}\) (pour repérer les cases non vides) ;
Les noms de clients, celui de leur contact et leur adresse pour les clients dont le champ Adress est non vide
Application d'une fonction d'agrégation¶
Il y en a \(5\) à connaître :
Correspondances | |
---|---|
Algèbre relationnelle | \(\color{blue}\texttt{SQL}\) |
comptage ou cardinal | \(\color{blue}\texttt{COUNT}\) |
max | \(\color{blue}\texttt{MAX}\) |
min | \(\color{blue}\texttt{MIN}\) |
somme | \(\color{blue}\texttt{SUM}\) |
moyenne | \(\color{blue}\texttt{AVG}\) (pour "average ") |
Ces fonctions peuvent être utilisées pour des informations statistiques sur TOUTE la table ou bien les mêmes informations mais sur les éléments d'une PARTITION de la table (ce qu'on appelle des agrégats)
Les fonctions \(\color{blue}\texttt{MIN}\),\(\color{blue}\texttt{ MAX}\),\(\color{blue}\texttt{ SUM}\)¶
Syntaxe :
Retourne une table d'une seule ligne et une seule colonne dont le nom est \(\texttt{MAX(nom}\_ \texttt{colonne)}\)
Donner le prix minimum parmi les produits et renommer le résultat
Exercice
Idem avec prix maximum
Donner la somme des prix unitaires de la table produit.
Donner les produits dont le prix unitaire est maximum (plusieurs réponses possibles) (attendre d'avoir vu les requêtes imbriquées)
Moyenne¶
Le prix unitaire moyen des produits :
Compter¶
La fonction \(\color{blue}\texttt{COUNT}\) a un comportement particulier
- \(\color{blue}\texttt{COUNT(a)}\) : Compte le nombre de fois que \(a\) est différent de \(\color{blue}\texttt{NULL}\).
- Souvent on compte le nombre total d'enregistrements avec \(\color{blue}\texttt{COUNT(*)}\).
Le mot clé \(\color{blue}\texttt{IN}\)¶
Un raccourci pour éviter de multiples conditions \(\texttt{OR}\)¶
Pas explicitement au programme (mais pas explicitement interdit)
- Syntaxe \(1\) :
- Syntaxe \(2\) : Dans des requêtes imbriquées (patience)