6.6 KiB
title | date | tags | categories | |||||
---|---|---|---|---|---|---|---|---|
Base de données avancées : Le langage SQL | 2022-02-11 |
|
|
SQL, pour Structured Query Langage est un langage de programmation servant à interagir avec des bases de données relationelles. Il regroupe plusieurs fonctionnalités :
- Définition des données : créations des relations appelées ici les tables
- Manipulation des données : interrogation, insertion, supression et mise à jour des données contenues dans les tables
- Contrôle des données : permissions, contrôle d'intégrités.
L'usage veut que les mots clés du langage soit écrits en majuscule, mais ce n'est qu'un usage.
Une requête écrite en SQL se termine par un point-virgule. Il est aussi
possible d'ajouter des commentaires en commençant la ligne avec --
.
La projection
Elle s'exprime avec la command SELECT
, Il est possible de supprimer les
doublons avec le DISTINCT
. il est assi possible d'afficher tous les attributs
d'une tables avec *
.
-- afficher les noms prénom des cyclistes
SELECT nom, prenom
FROM cyclistes;
-- afficher tous les attributs de la table cyclistes
SELECT *
FROM cyclistes
-- Afficher les couleurs de vélo disponibles
SELECT DISTINCT couleur
FROM velos;
La selection
Elle s'exprime avec la clause WHERE
. Il est possible d'utiliser des opérateurs
de comparaison (<, >, !=, <=, >=) ou des connecteurs (not
, and
, or
). Il
est aussi possible de founir un intervale comme prédicat avec BETWEEN
.
Il est possible d'utiliser %
pour remplacer un nombre indéfini de caractères
et _
pour en remplacer un seul.
-- Afficher le modèle et la taille des vélos bleus Gitanes
SELECT modele, taille
FROM velos
WHERE marque = 'Gitane'
AND couleur = 'bleu`;
-- Afficher les marques, modèles et couleurs des vélos de plus de 26 pouces
SELECT marque, couleur
FROM velos
WHERE taille > 26;
Les operation binaires
Il est bon de rapeller que les opération binaires se font que sur la base de relations compatibles. On en dénombre 3 en SQL :
- l'union avec
UNION
- l'intersection avec
INTERSECT
- la différence avec
MINUS
(Oracle) ouEXCEPT
(PostgreSQL). Il n'y pas d'opérateur de différence dans MySQL.
-- afficher le modèle des vélo de marque Gitane et Motobécane
SELECT marque, modele
FROM velos
WHERE marque = 'Gitane'
UNION
SELECT marque, modele
FROM velos
WHERE marque = 'Motobécane';
-- afficher les vélo rouge à 6 vitesses
SELECT marque, modele
FROM velos
WHERE vitesses = 6
INTERSECT
SELECT marque, modele
FROM velos
WHERE couleur = 'rouge';
Les jointures
Pour acceder aux attributs commun de deux relation, il nous faut utiliser la notation pointée.
Il existe deux syntaxe possible pour exprimer des jointures naturelles : une
ancienne via une clause WHERE
et une autre pus moderne via le mot clé JOIN
.
-- nouvelle sytaxe
SELECT date, description , marque, modele
FROM velos
JOIN repatation ON reparations.code_velo = velos.code_velo
WHERE marque = 'Gitane';
-- ancienne syntaxe
SELECT date, description , marque, modele
FROM velos, reparations
WHERE reparations.code_velo = velos.code_velo
AND marque = 'Gitane';
Pour simplifier l'écriture des clause WHERE
et AND
, il est possible
d'assigner des alias pour nos tables.
SELECT date, description , marque, modele
FROM velos AS v
JOIN repatation AS r ON r.code_velo = v.code_velo
WHERE marque = 'Gitane';
Cette notation est très utile dans le cadre des auto-jointures.
opérateur d'appartenance
Permet de tester si un élément appartient (ou non) à un ensemble.
-- afficher les cycliste ayant un velo 6 vitesses Motobécane
SELECT nom, prenom
FROM cyclistes
WHERE velo_id IN (
SELECT velo_id
FROM velos
WHERE vitesses = 6
AND marque = 'Motobécane'
);
Il est posible d'exprimer la négation avec le mot clé NOT
opérateur d'existance
La requête s'exécute si celle imbriqué dans le EXIST
retourne une valeur.
comme pour IN
, il est possible d'exprimer la négation avec NOT
.
-- trouver les marques vélos qui on servi lors des course de Trouville
SELECT DISTINCT marques
FROM velos
WHERE velos_id IN (
SELECT velo_id
FROM course
WHERE ville = 'Trouville'
);
les quantificateurs
Ils permettent de réaliser une comparaison entre ne attribut et un ensemble de
valeurs. Em plus de l'opérateur de compataison, il faut indiquer si l;on compare
sur n'importe quelle valeur (any
) ou toutes les valeurs (all
).
-- trouver les vélos qui ont plus de vitesse que tous les VTT
SELECT marque, modele
FROM velos,
WHERE vitesse >all(
SELECT vitesses
FROM velos
WHERE type = 'VTT'
);
Les opérateurs arithmétiques et ensemblistes
Les opérateurs arithmétiques et ensemblistes se positionnent dans les clauses
SELECT
ou WHERE
. Les opérateurs arithmétiques comprennnent l'addition, la
soustraction, la multiplication et la division. Les fonctions arithmériques
comprennent (entre autres) la valeur absolue ABS
, l'exponentielle EXP
, la
racine carré SQRT
etc.
Les fonctions ensemblistes comprennent (entre autres) le comptage COUNT
, les
la valeur minimale MIN
et maximale MAX
, la somme SUM
, la moyenne AVG
etc.
-- compter le nombre de vélos au total
SELECT COUNT(*)
FROM velos;
-- prix moyen calculé sur l'ensemble vélos
SELECT AVR(prix)
FROM velos;
Opérateurs de groupes
Afin de partitionner les résutats d'une fonction ensembliste (aussi appelée
fonction d'aggrégation). il est possible d'utiliser l'opérateur GROUP BY
.
-- coumpter le nombre de modèle disponible pour chaque marque
SELECT marque COUNT(modele)
FROM velo
GROUP BY marque;
Il est possible d'appliquer une selection sur une fonction d'aggrégation avec la
clause HAVING
:
-- afficher les marque ayant plus de 3 modèles disponibles
SELECT marque
FROM velos
HAVING COUNT(modele) > 3;
classement des résultats
Avec la clause ORDER BY
, il est possible de classer les résultats d'une
requête en fonction d'une colonne. Il est possible de définir un tri croissant
avec ASC
ou décroissant avec DESC
:
SELECT modele, prix
FROM velo
WHERE marque = 'Gitane'
ORDER BY prix ASC;
La division en SQL
Pour rappel, la division permet, par exemple, de trouver les cyclistes qui ont participé à toutes les courses.
Il n'existe pas d'opérateur de division en SQL, mais il est poussible d'utiliser
HAVING
:
SELECT id_cycliste, nom, prenom
FROM cyclistes
JOIN courses USING(id_cycliste)
GROUP BY id_cycliste, nom, prenom
HAVING COUNT(id_course) = (SELECT COUNT(*) FROM courses);