select
select
select
Nous attaquons alors les sujets de SQL (structured query language), et comment ce langage nous aide à implémenter l'algÚbre relationnelle !
Le rĂȘve : rĂ©cupĂ©rer uniquement les donnĂ©es nĂ©cessaires : pas plus, pas moins !!
... et d'ailleurs, aussi vite possible !
Commençons par la commande select
.
Ă la base, SQL avait l'objectif de ressembler Ă un langage "naturel" (anglais) :
Select a-list-of-attributes from a-list-of-relations where attribute(s)-satisy-this-condition
Enfin, le rĂ©sultat est moins formel qu'un langage de programmation (on peut exprimer nos souhaits de plusieurs maniĂšres), mais il y a quand mĂȘme une structure obligatoire.
En revanche, SQL reste déclaratif : on exprime notre résultat désiré, et le SGBDR construit est implémenté un plan d'action pour nous retourner ce résultat.
La commande la plus simple, par exemple, pour extraire quelques attributs de la relation user
de la base de données saas
:
Il est possible d'utiliser de caractĂšres de remplacement :
Mais, il ne faut jamais, jamais, jamais l'utiliser !
Vous risquez de divulguer les attributs sensibles !
Vous rĂ©cupĂ©rez tous les attributs, mĂȘme ceux dont on nâa pas besoin !
Saturer inutilement la bande-passante
Surcharger votre client, mémoire du serveur, ou page web
Ătre facturĂ© (si service cloud qui facture la transmission des donnĂ©es)
Distinct
Regardez la requĂȘte suivante :
Le résultat est :
Pour extraire des tuples uniques (l'ensemble de colonnes est unique) on utilise le mot distinct
:
Notez qu'on voit deux fois le prénom Abdon
parce que c'est l'ensemble des colonnes qui est utilisé pour déterminer si la ligne est unique (et dans ce cas, le gender
est différent).
Opérations sur les attributs
On peut transformer les résultats au passage :
Ici :
on transforme le nom de chaque action en majuscule
on calcule le TVA du budget retourné en multipliant par 20%. On renomme l'attribut avec le mot clé
as
Il y a une gamme de fonctions disponibles comme upper
, selon l'implémentation, par exemple :
concat(a, b) : fusionner deux chaines de caractĂšre
length(a) : retourner le nombre de caractĂšres
etc. ... une liste se trouve ici : https://www.sqlservertutorial.net/sql-server-string-functions/
La clause where
where
Essayez toujours de minimiser la quantité de données retournée en filtrant les résultats avec la clause where
:
Les opérateurs de comparaison sont :
=
: Ă©gale Ă<>
: pas Ă©gale Ă (aussi,!=
)<=
,<
,>=
,>
On combine les clauses pour créer des conditions complexes :
and
: opĂ©rateur et (Ă©quivalent Ă&&
en javascript)or
: opĂ©rateur ou (Ă©quivalent Ă||
en javascript)not
: opĂ©rateur nĂ©gation (Ă©quivalent Ă!
en javascript)
Essayez de toujours filtrer les données autant possibles avant qu'elles arrivent coté client !
Utiliser des fonctions dans vos clauses where
aussi !
Normalement, la comparaison entre deux attributs de type string est sensible au cas. Ceci peut changer selon le type de SGBDR et sa configuration.
Dans le doute, on peut utiliser les fonctions type UPPER
ou LOWER
pour normaliser la valeur Ă un cas prĂ©cis. Par exemple, si on utilise l'adresse email comme identifiant, il faut qu'on puisse valider l'identitĂ© du compte malgrĂ© le bruit qui peut venir du client. Imaginons le cas oĂč l'utilisateur ne fait pas attention Ă la capitalisation, et en plus, il y a du blanc dans le string envoyĂ© :
L'opérateur like
like
LâopĂ©rateur like
permet le filtrage par motif :
Le pourcentage (%
) agit comme un caractĂšre de remplacement (wildcard) pour plusieurs caractĂšres.
%
: corresponde Ă nâimporte quel substring (chaĂźne de caractĂšres de nâimporte quelle longueur)_
: correspondre Ă un seul caractĂšre
Par exemple :
like "_ _ _"
: va trouver les textes de longueur 3 précisémentlike "_ _ _%"
: va trouver les strings dâau moins 3 caractĂšres
Comme sur UNIX, on peut Ă©chapper un pourcentage avec l'antislash \
si on cherche le caractĂšre %
(ou _
) :
Les valeurs null
null
Que faire quand il y a des valeurs manquantes ? Quel sens avec des opérateurs mathématiques ou en comparant avec des vraies valeurs ?
Par exemple, la phrase suivante veut dire quoi exactement ?
Pour traiter ce cas un peu anormal, SQL utilise une valeur unknown
. Donc :
A < null
=unknown
true and null
=unknown
false and null
=false
true or null
=true
false or null
=unknown
not unknown
=unknown
Utilisez null
ou unknown
comme critĂšres avec des clauses suivantes :
is null
is unknown
is not null
is not unknown
Par exemple :
Croiser plusieurs tables
Je veux récupérer la liste des intervenants avec leur nom, prénom et statut :
Notez le suivant de l'exemple ci-dessus :
Je peux sĂ©lectionner les attributs sans prĂ©ciser la table d'origine, car il n'y a pas dâambiguĂŻtĂ©. Sinon, je serais obligĂ© de spĂ©cifier la table concernĂ©e (ex.
user.givenName
, etanimator.status
).Je précise la condition de jointure pour limiter le résultat du produit cartésien.
Essayez la phrase suivante :
Vous arrivez à expliquer le résultat ?
Je peux croiser plusieurs relations, mais parfois la phrase devient longue. Le mot clé as
(pour créer des alias) sont pratiques pour plus facilement structurer las phrase :
Notez les 2 fonctions du mot clé as
dans l'exemple :
Pour renommer les attributs dans le résultat
Pour créer un alias pour plus facilement adresser les attributs dans les clauses
where
etselect
.
Le mot clé as
: un outil puissant pour l'auto-comparaison !
as
: un outil puissant pour l'auto-comparaison !Je veux savoir s'il existe des interventions qui sont facturĂ©es plus chĂšres que celles en Ăle-de-France.
Nous allons regarder la table action
, notamment les champs budget
et address_french_regionId
.
Nous utilisons notre connaissance du produit cartĂ©sien pour faire cette requĂȘte ! Je sais qu'Ă la base, on peut juste Ă©numĂ©rer toutes les combinaisons d'intervention possible avec :
Le mot clé as
me permet de traiter la mĂȘme relation comme deux relations diffĂ©rentes !
Le résultat est :
On voit dans le résultat (limité à 10 lignes) :
Sur la partie droite, on démultiplie l'action "Petit Acier Saucisses" avec toutes les actions sur le gauche.
Il suffit de chercher les lignes sur lesquelles :
le budget de la partie gauche est supérieur à la partie droite
la région de la partie gauche n'est pas IDF (et pas nulle) et la région de la partie droite est IDF.
Cette fois, on constate qu'on ne retient uniquement des valeurs du cĂŽtĂ© gauche qui satisfont les conditions. Mais, vu que les 2 relations sont dĂ©multipliĂ©es : pour chaque relation du gauche, son budget peut ĂȘtre supĂ©rieur Ă plusieurs sur le cĂŽtĂ© droit :
Dans ce cas, il suffit d'extraire uniquement des interventions "uniques" qui répondent aux contraintes, avec le mot clé distinct
(et en enlevant les attributs du cÎté droit) :
Vous allez remarquer que si on enlĂšve la limit 10
Ă la fin de la phrase, la requĂȘte prend beaucoup de temps.
Pourquoi ?
Notre relation action
contient 32334 lignes. Pour construire le produit cartĂ©sien, il faut produire 32334*32334 lignes. Ceci peut ĂȘtre trĂšs long ! Il y a peut-ĂȘtre une meilleure façon de concevoir notre requĂȘte SQL pour rĂ©duire le temps d'exĂ©cution.
Exercice
Les exercices suivants sont basés sur la base de données SAKILA, une base de données de test fourni par MySQL.
Récupérez la base SAKILA ici.
Question 1
Trouvez la liste dâacteurs avec le prĂ©nom « Joe », et affichez seulement son ID, prĂ©nom et nom de famille. Nâaffichez que son ID, prĂ©nom et nom de famille.
Question 2
Trouvez tous les acteurs dont le nom de famille contient les lettres « gen » Nâaffichez que son ID, prĂ©nom et nom de famille.
Question 3
Trouvez tous les acteurs dont le nom de famille contient les lettres « li », et trier par nom de famille puis par prĂ©nom. Nâaffichez que son ID, prĂ©nom et nom de famille.
Question 4
Cherchez tous les pays qui ont une ville dont le nom commence par « San ». Nâaffichez que le nom du pays, et enlevez les duplications.
Question 5
Trouvez tous les films dans lequel joue lâacteur « Nick Wahlberg »
Question 6
Trouvez tous les films de type « comedy » avec un rating de « PG » ou « G ».
DerniĂšre mise Ă jour