Langage Manipulation de Données 1
2024-09-20
SQL est langage permettant :
interrogation des données (requêtes)
définition des données et des contraintes structurelles sur celles-ci
manipulation des données (insertion, suppression, mise à jour)
définition des vues et des index
administration des bases de données
Nous utiliserons le dialecte PostgreSQL
A standard is reviewed every 5 years (roughly)
Une instruction SQL permet de combiner :
restriction/filtrage (sélection) \(\sigma\)
projection \(\pi\)
renommage \(\rho\)
…
. . .
On peut faire autrement : dans les extensions du langage R
, notamment celles qui relèvent de tidyverse
, on associe des fonctions à chaque opérateur de l’algèbre relationnelle. Pour opérateurs qui portent sur une seule table, le premier argument de chaque fonction est toujours la table sur laquelle on opère. Les autres arguments sont soit les attributs de projection, soit la spécification d’une condition de sélection, soit …
L’usage d’un opérateur pipe
(comme dans Unix) permet de composer de facon lisible les opérations.
<table> |>
filter(<condition> ) |>
select(<liste attribut>) |>
...
*
: sélection de tous les attributs (le schéma reste inchangé)
[...]
: clause, expression facultative.
DISTINCT
: supprime les doublons.
Equivalent à : Fournisseur
Equivalent à : \(\sigma_{\texttt{Ville}=\texttt{'Paris'}}(\texttt{Fournisseur})\)
La structure de base d’une requête s’appuie sur les trois mots clés suivants :
SELECT
correspond à l’opérateur de projection sur la liste d’attributs demandée, il peut aussi être suivi de fonctions d’attributs
FROM
indique la ou les relations concernées
WHERE
précise une condition et correspond à l’opération de restriction/sélection en algèbre relationnelle.
WHERE ...
)Une condition se construit à l’aide des opérations suivantes :
=, <>, >,<, >=, <=
WHERE ...
)Combinaison de conditions à l’aide des opérateurs logiques: AND
, OR
, NOT
Attention aux priorités dans l’évaluation des expressions logiques
Attention aux valeurs manquantes
WHERE ...
(suite)Test BETWEEN permettant de vérifier si la valeur d’un attribut est comprise entre deux constantes
Éviter de manipuler les dates et heures comme des chaînes de caractères
WHERE ...
(suite)NULL
signifiant que la valeur est égale à NULL
(c-à-d est inconnue)Attention aux valeurs manquantes
WHERE ...
(suite)Test d’appartenance IN
qui permet de vérifier si la valeur d’un attribut appartient à une liste de constantes,
WHERE ...
(suite)Test LIKE
permettant de vérifier si un attribut de type chaîne de caractères contient une ou plusieurs sous-chaînes
\(\_\) : remplace n’importe quel caractère
\(\%\) : remplace n’importe quelle chaîne de caractères.
Quand l’information est dispersée sur plusieurs tables, on utilise des jointures
utiliser plusieurs tables dans la clause FROM
faire intervenir des conditions complexes impliquant ces tables dans la clause WHERE
World
Images et tables créées grâce à DbSchema
img
* 🔑 ⬋ | id | integer |
* | name | text |
* | countrycode | char(3) |
* | district | text |
* | population | integer |
* 🔑 ⬋ | code | char(3) |
* | name | text |
* | continent | text |
* | region | text |
* | surfacearea | real |
indepyear | smallint | |
* | population | integer |
lifeexpectancy | real | |
gnp | numeric(10,2) | |
gnpold | numeric(10,2) | |
* | localname | text |
* | governmentform | text |
headofstate | text | |
⬈ | capital | integer |
* | code2 | char(2) |
country_capital_fkey | ( capital ) ref world.city (id) |
country_continent_check | ((continent = ‘Asia’::text) OR (continent = ‘Europe’::text) OR (continent = ‘North America’::text) OR (continent = ‘Africa’::text) OR (continent = ‘Oceania’::text) OR (continent = ‘Antarctica’::text) OR (continent = ‘South America’::text)) |
* 🔑 ⬈ | countrycode | char(3) |
* 🔑 | language | text |
* | isofficial | boolean |
* | percentage | real |
countrylanguage_countrycode_fkey | ( countrycode ) ref world.country (code) |
world
Quels sont les pays qui portent le même nom que leur capitale ?
qui correspond à
\[\pi_{\text{name\_country}}(\sigma_{\text{capital}=\text{id} \wedge \text{name\_country}=\text{name\_city}}(\text{country}\times \text{city}))\]
autrement dit à
\[\pi_{\text{name\_country}}(\text{country} \bowtie_{\text{capital}=\text{id} \wedge \text{name\_country}=\text{name\_city}} \text{city}))\]
Quels sont les pays qui portent le même nom que leur capitale ?
qui correspond à
\[\pi_{\text{name\_country}}(\sigma_{\text{capital}=id \wedge \text{name\_country}=\text{name\_city}}(\text{country} \times \text{city}))\]
Si on veut faire une jointure d’une table avec elle-même, on utilise AS pour obtenir deux tables de noms différents
Quels sont les noms des pays où le français est parlé ?
SELECT name_country
FROM country, countrylanguage
WHERE country.countrycode=countrylanguage.countrycode
AND language='French';
Syntaxe normalisée pour la jointure naturelle~: NATURAL JOIN
Quels sont les pays dont une ville a le même nom qu’une langue parlée dans ce pays~?
LEFT OUTER JOIN (resp. RIGHT OUTER JOIN) : on garde les tuples de la table de gauche (resp. droite) qui n’ont pas de complément dans l’autre table, la condition étant spécifiée dans la clause ON
FULL OUTER JOIN : on garde les tuples de chacune des tables qui n’ont pas de complément.
On complète les valeurs non renseignées par NULL
renvoie 8 lignes.
Requêtes SQL simples
MA15Y030 – Bases de Données – L3 MIASHS – UParis Cité