SQL1a.LID Langage d'Interrogation des Données

SIO > S1_Commun > . > S1C8_Donnees > sql1a_lid1.md

Quelques définitions préliminaires (ou rappels) :

Soit la table suivante :

nom prenom ville
1 Einstein Alfred New-York
2 Cousteau Jacques-Yves Toulon
3 Ecco Umberto Milano

Comment ça marche ?

Notions de base, les trois clauses importantes : SELECT, FROM et WHERE.

Introduction

Voici la table Client dont le schéma est {id, nomCli, adrCli, cpCli, villeCli, paysCli} dont id est clé primaire et qui contient 5 lignes.

id nomCli adrCli cpCli villeCli paysCli
1 Air France Par ci, par là 75000 Paris FRA
15 SAI Sur la Terre 67000 Strasbourg FRA
123 Faurecia 15, rue de l'industrie 67390 Marckolsheim FRA
357 Timken Quelque part 67000 Strasbourg FRA
456 Brain AG HAID 7390 Freiburg in Briesgau GER


Si on observe la table Client et son contenu ci-dessus, comment faire pour retrouver le n° du client "SAI" (=15) ?

  • --> On extrait le numéro du client de la table client pour lequel le nom du client est "SAI"

Ou

  • --> On sélectionne le champ id de la table Client le champ nomCli="SAI"

Ce qui nous donne la valeur : 15

En SQL, ça donne :

[sql]
SELECT id FROM Client WHERE nomCli="SAI" ;

Il y a trois mots clés (ou clauses) du SQL dans cette requête, que l'on peut traduire par :

  • SELECT = sélectionner/afficher des colonnes,
  • FROM = de ou des tables,
  • WHERE = où les lignes correspondent à la condition indiquée.

Effectivement, on sélectionne la colonne numéro du client (id) de la table client (client) le nom du client (nomCli) est "SAI".
On obtient la table suivante qui se résume à une seule valeur :

id

Important !

  • Dans SELECT on met les colonnes qu'on veut afficher dans le résultat.
  • Dans FROM on met les tables où on cherche les données.
  • Dans WHERE on met les conditions pour ne garder que cetaines lignes de la base.

En Conclusion

Le SQL est une phrase en anlgais qui s'exprime avec les mots clés : SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, ...

Restriction avec WHERE

Sélectionner quelques lignes dans la table.

Principe

Une restriction est une liste de lignes limitée à certains critères de restriction des lignes (ou familièrement des critères de sélection)
On n'affiche pas toute la table, la liste est restreinte à certaines lignes.
L'ensemble des critères de sélection forment une condition de restriction de la liste.

Remarque Comme on veut afficher tous les champs (colonnes) de la table, on met une * (joker étoile) derrière 'SELECT', à la place des noms de champs.

Observer la requête suivante et surtout, la condition de restriction qui est écrite dans WHERE :

[sql]
SELECT * FROM Client WHERE nomCli="SAI" ;

On obtient alors la table contenant une ligne (enregistrement) avec tous les champs :

id nomCli adrCli cpCli villeCli paysCli
15 SAI Sur la Terre 67000 Strasbourg FRA

Ceci est une restriction : la liste est restreinte à quelques lignes (ici une seule) de la table d'origine.
NB : La restriction est souvent appelée abusivement sélection, ce qui peut semer la confusion avec la clause 'SELECT' !

Construire la condition de restriction

Une condition est une suite de comparaisons.
Les comparaisons sont construites avec des champs ou des valeurs et des signes de comparaison : < inférieur à, > supérieur à, etc. ...
Les comparaisons sont assemblées, pour faire une condition, avec des opérateurs logiques : AND (et) et OR (ou bien).

On verra plus loin d'autres opérateurs de comparaison et opérateurs logiques.

Comparaison booléenne

Le résultat d'une comparaison est toujours vrai ou faux. C'est un résultat booléen (0 ou 1).

Exemples de comparaisons

conditions exemples opérandes opérateur
x>y x et y >
age < ageMini age et ageMini <
idCli=15 x et la valeur 15 =
client.id = idClient ls champ de la table client et le champ idClient =
nom LIKE "toto%" nom et la valeur textuelle "toto%" ; % est un joker LIKE (comme)
date BETWEEN 01/01/2015 AND 31/12/2015 date, 01/01/2015 et 31/12/2015 BETWEEN AND (entre ... et ...)

Oui, oui, le dernier exemple est bien un opérateur. Voir plus loin.

Condition logique

La condition de sélection est composée de comparaisons séparées par des connecteurs logiques (ET, OU => AND, OR)

Exemples de conditions

condition opérateur
x>y AND y>z AND (et)
idCli=15 AND Acheter.refArt=Article.refArt AND
idCli<15 OR idCli>100 OR (ou)
idCli=15 OR cpClient = 67000 OR (ou)
numCompte="63" XOR numCompte="67" XOR (ou exclusif)

AND : (et) signifie que les deux conditions doivent être réunies pour que la ligne soit valide,
OR : (ou) signifie que l'une des deux conditions suffit pour que la ligne soit valide.
XOR : (ou) signifie que l'une des deux conditions est vraie, mais pas les deux, pour que la ligne soit valide.
Il est possible d'ajouter NOT pour obtenir la négation de l'opérateur logique.

Pour comparer un champ avec plusieurs valeurs, on va mettre autant de comparaisons que de valeurs :

  • /ex. CP=68000 OR CP=67000.

Il est STRICTEMENT INTERDIT d'écrire : CP=68000 OR 67000 !!! ça ne fonctionne pas !

Projection avec SELECT

N'afficher que quelques colonnes de la liste des colonnes possibles de la table (ou des tables), avec SELECT.

Pour afficher tous les champs (colonnes) de la table ou les tables, on met une ***** derrière 'SELECT', à la place des noms de champs.
Mais, comme au théatre des ombres chinoises, on peut limiter le nombre de champs affichés en mettant des noms de champs à la place de l'étoile (comme dans le premier exemple).
On obtient alors une projection de la table selon les champs sélectionnés.

Exemple : pour avoir les noms des clients, faire : SELECT nomCli FROM Client ;
Le résultat est la liste suivante :

nomCli
Air France
SAI
Faurecia
Timken
Brain AG

C'est la projection de la table client, selon nomCli

Associer Projection et Restriction

Restreindre une projection c'est jouer avec SELECT et WHERE ensembles.

Rien de plus simple, voir l'exemple du début, c'est la force du SQL.

Exemple : pour avoir les noms des clients français :

[sql]
SELECT nomCli FROM Client WHERE paysCli="FRA";


Le résultat est la liste ci-contre ; il manque Brain AG qui n'est pas en france (GER = Allemagne) :

nomCli
Air France
SAI
Faurecia
Timken

Applications

Exemples ou exercices pour comprendre.

Dans la table Article ci contre, observer les requêtes et résultats ci-après :

Comment obtenir ?

Comment obtenir ?la référence (projection) de l'article "manille" (restriction) ?
En français : Sélection de refArt de Article où descArt="manille"
En SQL :

[sql]
SELECT refArt FROM Article WHERE descArt="manille" ;

Résultat :

refArt
A2

Comment obtenir ?

Comment obtenir la liste des références et poids des articles dont le poids est supérieur à 1Kg ?
En français : Sélection de refArt et poids de Article où poidsArt>1
En SQL :

[sql]
SELECT refArt, poidsArt FROM Article WHERE poidsArt>1 ;

Résultat :

refArt poidsArt
A1 15,000
A4 1,300

Comment obtenir ?

Comment obtenir la liste des références articles dont le poids est entre 500g et 2Kg ?
En français : Sélection de refArt et poids de Article où poidsArt>0,5 et poidsArt<2
En SQL :

[sql]
SELECT refArt, poidsArt FROM Article WHERE poidsArt > 0.5 AND poidsArt < 2 ;


Certaines fonctions de SQL permettent aussi de faire :

[sql]
SELECT refArt FROM Article WHERE poidsArt BETWEEN 0.5 AND 1 ;

Résultat :

refArt descArt poidsArt
A3 Sextant 0,450
A4 Bouée 1,300

Note : les constantes alphanumériques sont écrites entre guillemets ("a") ou entre apostrophes ('a'). Les virgules décimales sont remplacées par des points (comme aux US et en GB), la virgule servant à séparer des noms de champs, de table, d'éléments dans une liste.

Valeurs particulières

Comme dans tous les langages, il est intéressant de récupérer des valeurs particulière. en voici une sélection :

valeur description usage
TRUE VRAI Valeur booléenne vraie ; 1=1 -> vrai
FALSE Faux Valeur booléenne fausse ; 1<1 \-> faux
NULL valeur nulle permet de vérifier si un champ est rempli, trouvé dans une table
sysdate() date du système pour obtenir la date du jour YYYY/MM/DD. Voir le format dans l'aide
now() date et heure du système pour obtenir la date et l'heure du jour YYYY/MM/DD HH:NN:SS. Voir le format dans l'aide

Il en existe d'autres vus au cours des cours.

Conclusion

Structure générale et résultat d'une requête. Définitions et synthèse

1. Structure globale d'une requête

Une requête est structurée en clauses qui sont les mot clés :

[sql]
	SELECT <liste de champs (1)>
	FROM   <liste de tables (2)>
	WHERE  <condition de sélection (3)>
(1) liste de champs ou *

On donne ici les champs, séparés par des ",", que l'on veut afficher. Seuls les champs qui sont parmi ceux des tables de la liste des tables sont possibles.
Si on veut voir tous les champs dans le résultat, on remplace la liste des champs par .

(2) liste de tables

Liste de tables séparés par des ",".
Une table ne peut être utilisée qu'une seule fois (sinon, il faut la renommer).

Attention aux confusions de champs

Des tables différentes peuvent avoir des champs de même nom (typiquement le champ id ou une clé étrangère qui référence une clé primaire du même nom).
Dans ce cas, il faut ajouter le nom de la table DEVANT le nom du champ.
/ex : 'Acheter.refArt' signifie : 'le champ refArt de la table Acheter', ce n'est pas le même champ que Article.refArt.

(3) Conditions et comparaisons

UNE seule condition de sélection/restriction. Elle est composée d'une ou plusieurs comparaisons, reliées par des opérateurs logiques.
Une comparaison est souvent composée de deux opérandes (champ ou constantes) séparées par un opérateur de comparaison.

2. Mais quel est le résultat d'une requête ? (on s'demande b'en, hein?)

Eh bien, une requête produit soit :

  • Une valeur lorsque le résultat est unique (intersection d'une colonne et d'une ligne, d'un champ et d'un enregistrement)
  • Une liste si le résultat est composée d'une seule colonne =1 seul champ.
  • Une table dont les colonnes sont indiquées derrière la clause SELECT et les lignes celles qui ont été sélectionnée par les conditions de sélection (jointure comprise, cf. chap. suivant) de la clause WHERE.

3. Définitions

Projection et restriction, sélection opérateurs d'algèbre relationnelle :

  • Une projection est la sélection de champs parmi ceux disponibles dans les tables du FROM : R = Projection (, ).
  • Une restriction est une sélection d'enregistrements (lignes, clause WHERE) dans la table résultat, afin de choisir des enregistrements parmi l'ensemble de ceux présents dans les tables du FROM.
  • Il existe un troisième opérateur, la jointure, vue plus loin.

Ces termes d'algèbre relationnelle sont à connaître, même si, en pratique, on parlera globalement de sélection car on a souvent (toujours) une association de projection et de sélection.

Cependant, l'usage courant est de parler de sélection pour tout type de requête commençant par la clause SELECT.

4. Synthèse des mots clés des clauses du SQL - sélection simple

Mot clé Description
SELECT (projection) Sélection de champs ou fonction d'agrégation (=qui regroupe plusieurs lignes : SUM, COUNT, ...) ou * pour tous les champs
FROM Nom de la ou des tables nécessaires à la requête ; seuls les champs de ces tables sont dispo pour la requête
WHERE (restriction) Condition, assemblage d'une ou plusieurs comparaisons entre les valeurs des champs ou des constantes
GROUP BY Agrégation, groupes de lignes ; un groupement est demandé si une fonction d'agrégation est utilisée dans SELECT
HAVING Conditions sur les groupes
ORDER BY Tri, suivi d'une liste de champs avec, pour chacun, le sens du tri : rien ou ASC =croissant (= ascendant), DESC = décroissant (= descendant)

Algèbre relationnelle

Définitions des opérations vues plus haut et dans le cours suivant sous forme mathématiques.

  • En algèbre relationnelle, les lignes d'une table sont des tuples, les colonnes ou champs sont des propriétés.
  • Une table est une relation entre des attributs et contient des tuples qui forment cette relation.
  • Opération unaire : c'est une opération algébrique qui ne concerne qu'une seule relation

Projection

Opération unaire qui consiste à produire une relation résultat dont le contenu sont des tuples dont les propriétés sont un sous-ensemble de la relation initiale.

Soit la relation R1 = {A1, A2, A3, A4, ...}  
R2 = Projection (R1, A1, A3) = {A1, A3}  

Remarque : les éventuels doublons produits ne sont plus identifiables de façon unique. Ils sont donc équivalents et confondus.

Restriction

Opération unaire qui consiste à produire une relation résultat dont le contenu sont un sous-ensemble des tuples de la relation initiale.

Soit la relation R1 = {A1, A2, A3, A4, ...}  
Soit la condition C  
R2 = Restriction (R1, C) = {A1, A2, A3, A4, ...} et R2 est inclue dans R1

Produit (cartésien)

Le produit cartésien est une opération binaire (deux relations).
Le produit R1 X R2 (X est commutative) produit une relation R3. R3 est composés des propriétés de R1 et de R2 juxtaposées.

Les tuples de R3 sont la combinaison de charque tuples venant de R1 avec chaque tuple de R2. Reformulé, c'est l'ensemble des combinaisons possibles entre les tuples de R1 et ceux de R2.

Synonymes : Produit

Soit les relation R1 = {A1, A2} et R2= {B1, B2}  
R3 = Produit (R1, R2) = R1 X R2 ; schéma R3 ={A1, A2, B1, B2} 
 
Si les tuples de R1 = (T1, T2, T3)
Et les tuples de R2 = (T4, R5)
Alors R3 = (T1+T, T1+T5, T2+T4, T2+T5, T3+T4, T3+T5)

Le résultat, sous forme de table :

Tx Tx
T1 T4
T1 T5
T2 T4
T2 T5
T3 T4
T3 T5

Jointure

La jointure est une opération binaire (c'est à dire portant sur deux relations).
La jointure de R1 et R2, étant donné une condition C portant sur des attributs de R1 et de R2, de même domaine, produit une relation R3 ayant pour schéma la juxtaposition de ceux des relations R1 et R2 et pour tuples l'ensemble de ceux obtenus par concaténation des tuples de R1 et de R2, et qui vérifient la condition C.

A suivre ...

Voilà, les bases sont posées, consrtuisons des requêtes là dessus.
A voir : les vidéos ci-dessous.