Le Langage SQL
Structured Query Language
est un langage informatique destiné à
définir, modifier, exploiter des bases
de données relationnelles.
C ’est un standard supporté par tous
les logiciels SGBDR.
Les trois volets de SQL
DDL (Data Definition Language)
Sert à définir et modifier la structure de la base.
DML (Data Manipulation Language)
Sert à manipuler (ajout, interrogation,
interrogation modification)
le contenu de la base.
DCL (Data Control Language)
Sert à contrôler les accès à la base.
C ’est la partie interrogation du volet DML qui sera
abordée dans ce cours.
Requête sur une simple table
Une requête est une interrogation visant à extraire des
informations d ’une base et pour commencer d ’une table unique.
Le résultat de cette requête est elle même une table qui contient
l ’information désirée.
Table source Requête Table réponse
Cette extraction d ’information s ’opère selon deux
opérations :
Projection : on se limite à certaines colonnes de la
table.
La sélection : on ne retient que les lignes vérifiant une
ou plusieurs conditions spécifiés.
Une même requête peut combiner ces deux opérations
Structure de base d ’une requête SQL
SELECT [DISTINCT] <Liste_Attributs> Exemples :
FROM <Table>
[WHERE <Conditions>] ; SELECT Ftitre
Le mot clé facultatif DISTINCT élimine FROM film;
les doublons de la table réponse.
C ’est là que l ’on précise les attributs
devant figurer dans la table réponse SELECT DISTINCT Cnat
(projection). FROM cineaste;
Dans la clause facultative WHERE, on
spécifie les conditions que doivent vérifier
SELECT Mnom, Mprenom
les lignes (enregistrement) pour figurer
dans la table réponse (sélection). FROM membre;
Le point virgule termine la requête.
Expression d ’une condition
Une condition simple peut être : Exemples :
une comparaison : SELECT *
<Attribut> R <Valeur> FROM film
où R est un des opérateurs : WHERE Fgenre = "Thriller";
=, <, >, <=, >=, <>
SELECT Cnom
l ’appartenance à une liste :
FROM cineaste
<Attribut> IN (<Valeur1>,… )
WHERE Cnaissance > 1950;
l ’appartenance à un intervalle :
<Attribut> BETWEEN <Valeurinf> SELECT Mnom
AND <Valeursup> FROM membre
la ressemblance pour du texte WHERE Mnaissance BETWEEN 1970
<Attribut> LIKE <Motif> AND 1980;
(avec Mysql les jokers sont _ et % au
lieu de ? Et *)
SELECT Cnom, Cprenom
Absence ou non de valeur : FROM cineaste
<Attribut> IS NULL WHERE Cnom LIKE "SC%";
<Attribut> IS NOT NULL
Expression de conditions
Les conditions simples peuvent être Exemples :
connectées par les opérateurs SELECT *
logiques : FROM film
WHERE
La négation : NOT (Fgenre = "Comédie" ) AND (Fnat = "USA");
NOT (<Condition>)
La conjonction AND SELECT Cnom
FROM cineaste
(<Condition1>) AND (<Condition2>)
WHERE
La disjonction OR (Cnaissance > 1980 ) OR (Csexe = "F");
(<Condition1>) OR (<Condition2>)
SELECT Ftitre
Ces opérateurs peuvent se combiner FROM film
en respectant les règles de la WHERE
logique... NOT (Fnat = "USA" ) AND (Fremake IS NULL);
Quelques règles de logique
Le AND et le OR sont associatifs et commutatifs
(C1 OR C2) AND C3 n ’équivaut pas à C1 OR (C2 AND C3) mais
à (C1 AND C3) OR (C2 AND C3)
NOT(C1 OR C2) équivaut à NOT(C1) AND NOT(C2)
NOT(C1 AND C2) équivaut à NOT(C1) OR NOT(C2)
Compléments : présentation de la table réponse
Renommer un attribut ou une table :
Pour renommer un attribut ou la table Exemples :
réponse on utilise le mot clé AS SELECT Ftitre AS Titre
SELECT <Attribut> AS <Nouveau_Nom> FROM film AS Films_1995
FROM <Table> AS <Nouveau_Nom>
WHERE Fannee = 1995;
Trier les lignes de la table réponse :
Pour trier les enregistrements dans la table SELECT *
réponse on ajoute à la fin de la requête une FROM membre
clause ORDER BY
WHERE Msexe = "F"
SELECT… FROM… WHERE...
ORDER BY <Attribut1> [DESC], ORDER BY Mnaissance DESC,
<Attribut2> [DESC]…; Mnom;
Remarque : un attribut peut être utilisé comme
dans la clause ORDER BY même s ’il ne figure pas
dans la clause SELECT.
Requête multitable
Des questions d ’apparence simple :
ex : Quel est le nom du réalisateur de tel film ?
ne peuvent en fait trouver leur réponse
qu ’en explorant le contenu de plusieurs
tables.
C ’est la technique des jointures qui permet
d ’écrire en SQL de telles requêtes...
Produit cartésien de deux tables
Le produit cartésien de deux tables T1 , T2 retourne une
table qui combine chacune des lignes de la première table
avec chacune des lignes de la deuxième :
T1 T2 T1XT2
A 1 A 1
B
X 2 A 2
C 3 A 3
4 A 4
B 1
: :
Cette opération se réalise en SQL en écrivant :
SELECT * FROM T1, T2 ;
Mais elle est à proscrire absolument parce que…
Produit cartésien de deux tables
(suite et fin)
La table réponse n ’a guère de sens : on mélange
tout…
La table réponse peut être énorme :
Si T1 a l1 lignes et c1 colonnes
Si T2 a l2 lignes et c2 colonnes
T1x T2 a c1+c2 colonnes et l1xl2 lignes.
lignes
De quoi mettre à genoux le serveur de données…
Moralité : ne jamais citer deux tables dans une clause
FROM sans imposer une condition de jointure...
jointure
Jointure 1 : Le principe
film
FilmID Ftitre FrealisateurID Fgenre Fnat Fduree Fannee Fremake
F001 Million Dollar Baby C001 Drame USA 132 2004 NULL
: : :
Lajointure
La jointuress’opère
’opère
enenspécifiant
spécifiant
l l’égalité
’égalitéentre
entre
cineaste
l l’occurrence
’occurrencedd’un ’un
CineasteID Cnom Cprenom Cnat Cnaissance Csexe
attributde
attribut delala1°1° C001 EASTWOOD Clint USA 1930 H
tableavec
table avec C040 SWANK Hilary USA 1974 F
l l’occurrence
’occurrence dd’un ’un : :
attributde
attribut delala2°
2°
Seulles
Seul leslignes
lignespour
pourlesquelles
lesquellesces
ces22attributs
attributssont
sont
table.
table. égauxseront
égaux serontincluses
inclusesdans
danslalatable
tableréponse.
réponse.
Jointure 2 : La traduction en SQL
Exemple : quels sont les noms
Syntaxe : des réalisateurs de comédie ?
SELECT <liste_attributs>
FROM <T1> JOIN <T2> SELECT Cnom
ON (<[Link]> = FROM film JOIN cineaste
<[Link]>) ON (FrealisateurID =
[WHERE CineasteID)
<autres_conditions>] ; WHERE
(Fgenre = "Comédie" );
Jointure 3 : le préfixage des attributs
Le préfixage des attributs Exemple, voici la requête précédente
consiste à les faire précéder du préfixée :
nom de la table dont ils sont
issus. On écrit : SELECT [Link]
<Table>.<Attribut> FROM film JOIN cineaste
ON ([Link] = [Link])
Il peut contribuer à la clarté des WHERE
requêtes.
([Link] = "Comédie" ) ;
Il est obligatoire, si deux attributs
issus de deux tables différentes
portent le même nom.
Il sera aussi obligatoire dans les
auto-jointures qui vont suivre...
Jointure 4 : l ’auto-jointure
Il peut arriver que l ’obtention d ’une information exige une double
lecture d ’une même table, par exemple : trouver les titres de films
qui ont des remake. SQL permet alors d ’effectuer une jointure
d ’une table avec elle même en utilisant un « alias ».
SELECT <Liste_attributs>* Exemple :
FROM <T> JOIN <T> AS <T1>
ON (<[Link]> = <[Link]>) SELECT [Link], [Link]
WHERE <Conditions> ; FROM film JOIN film AS f1
ON [Link] = [Link]
* Les attributs doivent être WHERE [Link] IS NOT NULL ;
préfixés pour indiquer s ’ils
proviennent de la 1° lecture <T>
ou de la deuxième <T1>.
Jointure 5 : 3 tables (voir + si affinité)
En fait, bien souvent, c ’est dans trois tables (sinon plus) qu ’il faut
quérir les informations. La jointure de trois tables peut s ’opérer,
selon le cas, suivant deux schémas :
A la queue leu leu...
Table1 Table2 Table3
En patte d ’oie...
Table2
Table1
Table3
Jointure 6 : 3 tables à la queue leu leu
Quels sont les noms et prénoms des acteurs de «Titanic » ? Question
simple, mais dont la réponse exige les visites successives des tables :
film joue cineaste
Exemple :
SELECT <Liste_attributs>
FROM <T1> JOIN <T2> JOIN <T3> SELECT Cnom, Cprenom
ON (<[Link]> = <[Link]>) FROM film JOIN joue JOIN cineaste
ON (<[Link]> = <[Link]>) ON (FilmID = JFilmID)
WHERE <Conditions> ; ON (JCineasteID = CineasteID)
WHERE Ftitre = "Titanic" ;
Jointure 7 : 3 tables en patte d'oie
Quel est le nom du réalisateur de «Titanic » et les notes obtenues ?
Question simple, mais dont la réponse exige les visites des tables :
cineaste
film
Exemple :
note SELECT Ftitre, Cnom, Nnote
SELECT <Liste_attributs>
FROM <T1> JOIN <T2> FROM film JOIN cineaste
ON (<[Link]> = <[Link]>) ON (FrealisateurID = CineasteID)
JOIN <T3> JOIN note
ON (<[Link]> = <[Link]>) ON (FilmID = NFilmID)
WHERE <Conditions> ; WHERE Ftitre = "Titanic" ;
Jointure 8 : jointure "externe"
Jusqu'à présent, seul les lignes où une correspondance était trouvée
entre les attributs des tables jointes figurait dans la table réponse.
Avec les jointures "externes", cette exigence s'évanouit :
SELECT <Liste_attributs> Exemple :
FROM <T1> LEFT [OUTER] JOIN <T2> SELECT DISTINCT Cnom, CineasteID,
ON (<[Link]> = <[Link]) FrealisateurID
WHERE <Conditions> ; FROM cineaste LEFT JOIN film
ON CineasteID = FrealisateurID ;
Dans la table réponse figureront toutes
les lignes issues de la table de gauche Listera tous les cinéastes y compris ceux
T1, y compris celles qui n'ont pas de n'ayant jamais réalisé de films. Pour ces
correspondance dans la table T2. Pour derniers, l'attribut FrealisateurID sera mis
ces dernières l'attribut manquant de la à NULL.
table T2 sera mis à NULL. En ajoutant la clause :
Une construction symétrique se fait WHERE FrealisateurID IS NULL
avec RIGHT au lieu de LEFT.
elle listera donc les "purs" interprètes.
Jointure 9 : jointure "non équi"
Jusqu'à présent, la condition de jointure a été une égalité (on parle
alors d'équi-jointure). Mais il est possible d'utiliser d'autres
opérateurs de comparaison que l'égalité :
SELECT <Liste_attributs> Exemple : quels sont les films tournés
après la date de naissance de "DICAPRIO"
FROM <T1> JOIN <T2>
(Leonardo pour les intimes) ?
ON (<[Link]> R <[Link]>)
WHERE <Conditions> ; SELECT Ftitre, Fannee, Cnaissance
FROM cineaste JOIN film
Où R désigne un des opérateurs de ON (Cnaissance < Fannee)
comparaison: WHERE Cnom = "DICAPRIO" ;
<, <=, >, >=, <>
Le calcul
SQL permet d'effectuer nombre de calculs.
On distingue :
le calcul horizontal qui vise, sur chaque ligne, à
calculer et afficher des valeurs à partir des
valeurs des attributs de la ligne.
Le calcul vertical qui permet l'obtention de
statistiques sur les valeurs d'un attribut
Calcul horizontal 1 : expressions
Ces expressions sont constituée à partir d'attributs, d'opérateurs et
de fonctions. Selon la nature des attributs en jeu, il faut distinguer :
Calcul arithmétique : il utilise les opérateurs classiques de l'arithmétique :
+, -, *, /, DIV, MOD, ^
plus, si besoin est, de nombreuses fonctions...
Exemples : YEAR(CURDATE())- Cnaissance, Fduree DIV 60, Fduree MOD 60
Calcul textuel : il utilise des fonctions de traitement des chaînes de
caractères :
CONCAT(), UPPER(), LOWER(), LENGTH()…
Exemples : CONCAT(Mprenom, ".", Mnom, "@[Link]"), UPPER(Ftitre)
Le calcul horizontal 2 : la mise en place
Ces expressions calculées peuvent Exemples :
se loger dans la clause SELECT pour
SELECT Cnom,
faire apparaître de nouveaux
attributs dans la réponse : YEAR(CURDATE())-Cnaissance AS Age
FROM cineaste ;
SELECT …, <Expression> AS <Nom>,…
SELECT CONCAT(Mprenom, ".", Mnom,"@[Link]")
AS Mail
FROM membre ;
ou dans la clause WHERE pour
exprimer des conditions :
SELECT Ftitre
WHERE (<Expression> R <Valeur>)
AND... FROM film
WHERE LENGTH(Ftitre) < 15 ;
Le calcul vertical 1 : les fonctions
Il vise à donner des statistiques sur les occurrences d'un (ou plusieurs )
attribut en utilisant les fonctions :
COUNT( <Attribut> ) : pour le nombre d'occurrences d'un attribut.
COUNT(DISTINCT <Attribut> ) : pour le nombre d'occurrences distinctes d'un attribut.
COUNT(*) : pour le nombre de lignes d'une table.
et pour les attributs numériques :
SUM( <Attribut> ), pour la somme.
MAX(<Attribut> ), MIN(<Attribut> ), pour le minimum et le maximum.
AVG( <Attribut> ), pour la moyenne.
STD( <Attribut> ), pour l'écart-type.
VARIANCE( <Attribut> ), pour la variance.
Le calcul vertical 2 : la mise en place
La (ou les) fonction de calcul se
loge dans la clause SELECT SELECT COUNT(DISTINCT Cnat)
AS "Nb nationalités"
SELECT ...<Fonction(Attribut)>
AS* <Nom>… FROM cineaste ;
FROM… [WHERE*…];
SELECT AVG(Fduree) AS "Durée moyenne ",
* Le AS est recommandé pour la STD(Fduree) AS "Ecart-type"
lisibilité de la réponse. FROM film
* Si la requête inclut une clause WHERE Fgenre = "Drame";
WHERE le calcul ne prend en
compte que les lignes qu'elle
sélectionne.
Ces fonctions retournent SELECT COUNT(Fgenre), Fgenre
un résultat unique et la table FROM film ;
réponse ne contient donc
qu'une seule ligne. Elles sont
donc incompatibles avec
l'affichage d'un attribut.
Regroupement et calcul
Est il possible de faire opérer ces fonctions statistiques sur des des
groupes de ligne, pour calculer par exemple le nombre de films par
genre ? Oui en utilisant une clause GROUP BY.
SELECT <Attribut_groupement>* , SELECT Fgenre, COUNT(FilmID)
<Fonction(Attribut)> FROM film
FROM <Table> GROUP BY Fgenre ;
GROUP BY <Attribut_groupement>* ;
SELECT Fgenre, COUNT(FilmID)
*<Attribut_groupement> doit figurer
FROM film
impérativement dans les deux clauses.
GROUP BY Fgenre
Une clause HAVING peut être ajoutée HAVING COUNT(FilmID)>2;
pour opérer une sélection sur les groupes :
HAVING <Condition_sur_groupe> SELECT Fgenre, COUNT(FilmID)
Cette condition peut porter sur : FROM film
la valeur retournée par la fonction GROUP BY Fgenre
la valeur de l'attribut de regroupement. HAVING Fgenre <> "SF" ;
Les Requêtes imbriquées
ou sous-requêtes
Une requête interroge des tables pour produire une… table. L’idée donc
de chaîner deux (ou plus) requêtes est donc assez naturelle. Une
requête dite principale va alors utiliser dans sa clause WHERE les
résultats d’une autre requête dite sous-requête.
Le schéma général :
SELECT ...
FROM ...
WHERE <expression> (SELECT
FROM … La sous-requête
)
;
doit être précisé selon la nature du résultat retourné par la sous-requête.
Sous requête 1
La sous-requête retourne une valeur unique d'un
attribut unique
SELECT… Exemple :
FROM.. Liste des films d'une durée
WHERE <attribut> R (SELECT supérieure à la moyenne.
FROM … SELECT Ftitre
) FROM film
; WHERE Fduree > (SELECT
R est un des opérateurs : AVG(Fduree)
=, <, >, <=, >=, <> FROM film)
;
Spécifie comme condition de La sous-requête retourne la durée
sélection pour <attribut> la moyenne des films.
vérification de la comparaison R La requête principale sélectionne les
avec la valeur unique retournée films d'une durée supérieure.
par la sous-requête.
Sous requête 2
La sous-requête retourne une liste de valeurs d'un
attribut unique
SELECT... Exemple :
FROM... Liste des cinéastes dont la nationalité
WHERE <attribut> [NOT] IN n'est pas une nationalité de film.
(SELECT SELECT Cnom
FROM... FROM cineaste
WHERE Cnat NOT IN (SELECT Fnat
)
; FROM film)
;
Spécifie comme condition de
sélection pour <attribut> La sous-requête retourne la liste des pays
l'appartenance IN producteurs de films.
La requête principale sélectionne les
ou non NOT IN cinéastes dont la nationalité n'est pas dans
à la liste retournée par la cette liste.
sous-requête.
Sous requête 3
La sous-requête retourne une liste de valeurs d'un
attribut unique (bis)
SELECT... Exemple :
FROM... Liste des films qui durent plus
WHERE <attribut> R ALL|SOME longtemps que tous les films américains.
(SELECT
SELECT Ftitre
FROM...
FROM film WHERE Fduree > ALL
);
(SELECT Fduree FROM film
R est un des opérateurs : WHERE Fnat ="USA") ;
=, <, >, <=, >=, <>
Avec ALL, la comparaison R doit être La sous-requête retourne la liste des durées
vérifiée pour tous les éléments de la des films américains.
liste La requête principale sélectionne les films
dont la durée est strictement supérieure à
Avec SOME (on peut aussi utiliser toutes les valeurs de cette liste.
ANY), la comparaison doit être vraie
pour un élément au moins de la liste.
Sous requête 4
La sous-requête retourne un n-uplet unique
d'attributs
SELECT... Exemple :
FROM... Liste des films de même genre et
WHERE (<attribut1>, <attribut2>…) R même nationalité que Titanic.
(SELECT SELECT Ftitre
FROM film
FROM...
WHERE (Fgenre, Fnat) =
); (SELECT Fgenre, Fnat
FROM film
Entre n-uplets, les seuls opérateurs
WHERE Ftitre ="Titanic")
de comparaisons possibles sont ;
l'égalité et la différence la sous requête retourne le 2-uplet
R est donc un des opérateurs : (Drame,USA)
=, <> La requête principale sélectionne donc
les films tels que :
(Fgenre, Fnat) = (Drame,USA)
Sous requête 5
La sous-requête retourne une liste de n-uplets
d'attributs (une table avec plusieurs lignes et colonnes)
SELECT... Exemple :
FROM... Liste des membres du club ayant le
WHERE (<attribut1>, <attribut2>…) même âge et le même sexe qu'un
[NOT] IN cinéaste.
(SELECT SELECT Mnom,
FROM... FROM membre
); WHERE (Mnaissance, Msexe) IN
SELECT... (SELECT Cnaissance, Csexe
FROM... FROM cineaste) ;
WHERE (<attribut1>, <attribut2>…)
=|<> SOME|ALL la sous requête retourne une liste de 2-
uplets du genre (1973, H), (1940, F)...
(SELECT
La requête principale sélectionne donc
FROM... les membres pour lesquels :
); (Mnaissance, Msexe) est dans la liste.
Sous requête 6
Sous-requête corrélée (synchronisée)
Dans les schémas précédents, la sous-
requête était exécutée, puis la requête
Exemple :
principale. Dans les requêtes dites Quels sont les films d'un genre différent
corrélées, la sous-requête dépend pour son de celui dont ils sont le remake ?
exécution de la valeur d’un attribut fournie
par la requête principale. L’exécution se
SELECT [Link] FROM film AS F1
fait alors ligne à ligne.
WHERE [Link] <>
SELECT <Liste_attributs> (SELECT [Link] FROM film AS F2
FROM <T1> WHERE [Link] = [Link]) ;
WHERE <T1>.<attribut> R
(SELECT <T2>.<attribut>
FROM <T2>
WHERE <T2>.<attribut> R
<T1> .<attribut>) ;
Sous requête 7
A quoi servent les sous-requêtes ?
Pour certaines questions elles sont indispensables. Par exemple, la
question :
Quels sont les films d'une durée supérieure à la moyenne ?
ne saurait se traduire en SQL sans recourir à cette méthode.
Pour d'autres questions elles sont une alternative à la jointure. Par
exemple :
Quels sont les cinéastes de même âge que Michel Bouquet ?
Peut se traduire :
SELECT [Link], [Link] SELECT Cnom, Cprenom
FROM cineaste JOIN cineaste AS c1 FROM cineaste
ON [Link] = [Link] WHERE Cnaissance = (SELECT Cnaissance
FROM cineaste
WHERE ([Link] = "BOUQUET") ;
WHERE Cnom = "BOUQUET") ;
La méthode des sous-requêtes qui fragmente la question en deux facilite
souvent la mise au point.
Opérateurs ensemblistes 1
Le principe
La table réponse retournée lors de l’exécution d’une requête est
fondamentalement un ensemble d’occurrences. D’où l’idée d’utiliser les
opérateurs ensemblistes :
Réunion : ∪
Intersection : ∩
Différence : -
afin de combiner les résultats de deux requêtes dans une table unique.
Cependant, ce procédé n’est envisageable que si les tables engendrées
par les deux requêtes :
possèdent le même nombre d’attribut,
ont leurs attributs correspondants de même type.
et s'il n'existe pas de solution simple avec OR ou AND.
Opérateurs ensemblistes 2
La mise en œuvre
<requête1> Liste de tous les pays présents dans la base :
UNION (SELECT Fnat FROM film)
UNION
<requete2>
(SELECT Cnat FROM cineaste) ;
Mysql ignore INTERSECT et MINUS, mais on peut y
pallier par des sous-requêtes :
<requête1> Liste des pays de films et de cinéastes :
INTERSECT SELECT DISTINCT Fnat FROM film
WHERE Fnat IN (SELECT Cnat FROM cineaste) ;
<requete2>
Liste des pays de films qui ne sont pas des pays de
cinéastes :
<requête1>
SELECT DISTINCT Fnat FROM film
MINUS WHERE Fnat NOT IN (SELECT Cnat FROM cineaste) ;
<requete2>
Opérateurs ensemblistes 3
Illustration
AUSTRALIE AUTRICHE
BELGIQUE
CANADA COTE D'IVOIRE
HONGRIE MALI CHINE DANEMARK
SENEGAL
POLOGNE SUEDE FRANCE INDE
ITALIE JAPON RUSSIE
YOUGOSLAVIE
UK USA
Pays de cinéastes
Pays de films