• Aucun résultat trouvé

2018-W03-4 JudicaëlCourant RequêtesSQL

N/A
N/A
Protected

Academic year: 2022

Partager "2018-W03-4 JudicaëlCourant RequêtesSQL"

Copied!
24
0
0

Texte intégral

(1)

Requêtes SQL

Judicaël Courant

Informatique Commune, MP/MP*

2018-W03-4

(2)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Lignes directrices

1 Exemple étudié

2 La requête SELECT élémentaire

3 Sous-requêtes

4 RequêtesSELECTcomplexes

(3)

On va travailler sur un exemple de base de données cinématographique (simpliste) qui comprendra les tables suivantes :

Personnedécrivant les personnes (acteurs et réalisateurs) qui nous intéresseront.

Filmqui nous donnera les titres des films et leurs dates de réalisation.

Acteurqui nous dira qui a joué quel personnage dans quel film.

(4)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Table des personnes (Personne)

nom prénom date_naissance

Kubrick Stanley 1928

Spielberg Steven 1946

Eastwood Clint 1930

Cumberbatch Benedict 1976

Freeman Martin 1971

Leone Sergio 1929

McGuigan Paul 1963

Sellers Peter 1925

Coppola Francis Ford 1939

Coppola Sofia 1971

(5)

Table des films (Film)

titre date_film

Gran Torino 2008

The good, the Bad and the Ugly 1966

Study in Pink 2010

Schindler’s List 1993

Dr Strangelove 1964

Invictus 2009

(6)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Table des acteurs (Acteur)

nom prenom titre personnage

Eastwood Clint The good, the Bad and the Ugly Blondie Eastwood Clint Gran Torino Walt Kowalski Cumberbatch Benedict Study in Pink Sherlock Holmes Freeman Martin Study in Pink Dr John Watson Selers Peters Dr Strangelove Dr Strangelove Selers Peters Dr Strangelove Group Capt. Lionel Mandrake

Selers Peters Dr Strangelove President Merkin Muffley

(7)

Table des réalisateurs (Realisateur)

titre nom prenom

Gran Torino Eastwood Clint

The good, the Bad and the Ugly Leone Sergio

Study in Pink McGuigan Paul Schindler’s List Spielberg Steven Dr Strangelove Kubrick Stanley

Invictus Eastwood Clint

(8)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Syntaxe

La requête a la forme suivante : 4 SELECT [DISTINCT]champs 1 FROMtables

2 WHEREexpression-filtrage

3 GROUP BYexpression-regroupement 5 HAVINGexpression-filtrage

6 ORDER BYexpression-ordre

Lire la requête dans l’ordre des numéros pour comprendre ce qu’elle fait !

(9)

Syntaxe

La requête a la forme suivante : 4 SELECT [DISTINCT]champs 1 FROMtables

2 WHEREexpression-filtrage

3 GROUP BYexpression-regroupement 5 HAVINGexpression-filtrage

6 ORDER BYexpression-ordre

Lire la requête dans l’ordre des numéros pour comprendre ce qu’elle fait !

(10)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Exemple 1

Dresser une table des triplets(n,p,a)des acteurs nommésd et prénomméspayant joué dans un film l’annéea.

SELECT DISTINCT nom, prenom, date_film FROM Film JOIN Acteur

ON Film.titre = Acteur.titre;

Alternativement :

SELECT DISTINCT nom, prenom, date_film FROM Film, Acteur

WHERE Film.titre = Acteur.titre;

(11)

Exemple 2

Dresser une table des triplets(n,p,n0,p0)des réalisateurs prénommésp et nommésnayant dirigé l’acteur nommén0 et prénommép0 strictement avant l’année 2010.

SELECT DISTINCT R.nom, R.prenom, A.nom, A.prenom FROM Film AS F

JOIN Acteur AS A ON A.titre = F.titre JOIN Realisateur AS R ON R.titre = F.titre WHERE date_film < 2010;

(12)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Exemple 3

Et si on veut le nombre d’acteurs dirigés par un réalisateur : SELECT R.nom, R.prenom, COUNT(*)

FROM Film AS F

JOIN Acteur AS A ON A.titre = F.titre JOIN Realisateur AS R ON R.titre = F.titre WHERE date_film < 2010

GROUP BY R.nom, R.prenom;

Il y a un petit problème, le voyez-vous ? (Combien Kubrick a t-il dirigé d’acteurs ?)

(13)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Exemple 3 (bis)

Pour le corriger, on peut tenter :

SELECT R.nom, R.prenom, COUNT(DISTINCT A.nom) FROM Film AS F

JOIN Acteur AS A ON A.titre = F.titre JOIN Realisateur AS R ON R.titre = F.titre WHERE date_film < 2010

GROUP BY R.nom, R.prenom;

n’est pas grammatical en SQL. . .

(14)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Exemple 3 (bis)

Pour le corriger, on peut tenter :

SELECT R.nom, R.prenom, COUNT(DISTINCT A.nom) FROM Film AS F

JOIN Acteur AS A ON A.titre = F.titre JOIN Realisateur AS R ON R.titre = F.titre WHERE date_film < 2010

GROUP BY R.nom, R.prenom;

Maison peut a priori avoir deux acteurs différents avec le même nom.

MalheureusementCOUNT(DISTINCT R.nom, R.prenom) n’est pas grammatical en SQL. . .

(15)

Exemple 3 (bis)

Pour le corriger, on peut tenter :

SELECT R.nom, R.prenom, COUNT(DISTINCT A.nom) FROM Film AS F

JOIN Acteur AS A ON A.titre = F.titre JOIN Realisateur AS R ON R.titre = F.titre WHERE date_film < 2010

GROUP BY R.nom, R.prenom;

Maison peut a priori avoir deux acteurs différents avec le même nom.

MalheureusementCOUNT(DISTINCT R.nom, R.prenom) n’est pas grammatical en SQL. . .

(16)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Interlude : une requête bizarre

La requête suivante est invalide :

SELECT R.nom, R.prenom, date_film, COUNT(*) FROM Film AS F

JOIN Acteur AS A ON A.titre = F.titre JOIN Realisateur AS R ON R.titre = F.titre WHERE date_film < 2010

GROUP BY R.nom, R.prenom;

Règle : lorsqu’on utiliseGROUP BY, dans leSELECT, seuls peuvent apparaître les colonnes sélectionnées pour faire le regroupement ou des valeurs agrégées.

(17)

Interlude : une requête bizarre

La requête suivante est invalide :

SELECT R.nom, R.prenom, date_film, COUNT(*) FROM Film AS F

JOIN Acteur AS A ON A.titre = F.titre JOIN Realisateur AS R ON R.titre = F.titre WHERE date_film < 2010

GROUP BY R.nom, R.prenom;

Règle : lorsqu’on utiliseGROUP BY, dans leSELECT, seuls peuvent apparaître les colonnes sélectionnées pour faire le regroupement ou des valeurs agrégées.

(18)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Exemple 4

Comme précédemment, on veut les réalisateurs et le nombre d’acteurs qu’ils ont dirigé mais uniquement pour ceux qui ont au moins dirigé deux acteurs.

SELECT R.nom, R.prenom,

COUNT(DISTINCT R.nom) AS total FROM Film AS F

JOIN Acteur AS A ON A.titre = F.titre JOIN Realisateur AS R ON R.titre = F.titre WHERE date_film < 2010

GROUP BY R.nom, R.prenom HAVING total >= 2;

(19)

Exemple 5

On veut enfin trier le résultat par ordre décroissant de nombre d’acteurs dirigés puis de nom puis de prénom :

SELECT R.nom, R.prenom,

COUNT(DISTINCT R.nom) AS total FROM Film AS F

JOIN Acteur AS A ON A.titre = F.titre JOIN Realisateur AS R ON R.titre = F.titre WHERE date_film < 2010

GROUP BY R.nom, R.prenom HAVING total >= 2

ORDER BY total DESC, R.nom ASC, R.prenom ASC;

(20)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Principe

Pour réussir à résoudre le problème des doublons dans la table précédente, il suffirait de savoir remplacer la jointure de la requête précédente par une expression qui donnerait la table des quadruplets(n,p,n0,p0)disant qui a dirigé qui, sans doublon.

Ça tombe bien : en SQL, partout où on peut mettre un nom de table, on peut remplacer ce nom par une sous-requête SELECT.

(21)

Principe

Pour réussir à résoudre le problème des doublons dans la table précédente, il suffirait de savoir remplacer la jointure de la requête précédente par une expression qui donnerait la table des quadruplets(n,p,n0,p0)disant qui a dirigé qui, sans doublon.

Ça tombe bien : en SQL, partout où on peut mettre un nom de table, on peut remplacer ce nom par une sous-requête SELECT.

(22)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Mise en œuvre

Cela permet d’écrire

SELECT n, p, COUNT(*) AS total FROM

(SELECT DISTINCT R.nom AS n, R.prenom, R.nom, R.prenom

FROM Film AS F

JOIN Acteur AS A ON A.titre = F.titre JOIN Realisateur AS R ON R.titre = F.titre WHERE date_film < 2010)

GROUP BY n, p HAVING total >= 2;

(23)

Principe

On peut obtenir la réunion de tables produites par plusieurs requêtes élémentaires avec le mot cléUNIONde la façon suivante :

SELECT... FROM... WHERE... GROUP BY... HAVING...

UNION

SELECT... FROM... WHERE... GROUP BY... HAVING...

...

SELECT... FROM... WHERE... GROUP BY... HAVING...

ORDER BY...

Notez qu’il n’y a qu’une seule clauseORDER BYpour l’ensemble des clauses.

(24)

Exemple étudié La requête SELECT élémentaire Sous-requêtes RequêtesSELECTcomplexes

Opérateurs disponibles

En plus de l’opérateurUNION, on peut utiliser INTERSECTpour calculer l’intersection.

EXCEPTpour calculer la différence.

Références

Documents relatifs

- Les données saisies sont élémentaires le plus souvent mais peuvent parfois être calculées.. - Elles doivent

Exemple étudié La requête SELECT élémentaire Sous-requêtes Requêtes SELECT complexes.. On va travailler sur un exemple de base de données cinématographique (simpliste) qui

Les fonctions sont mises en œuvre dans la plupart des SGBD ; il arrive cependant que des différences existent au niveau du nom d’une fonction, ou bien ses paramètres.. IL

Les fonctions sont mises en œuvre dans la plupart des SGBD ; il arrive cependant que des différences existent au niveau du nom d’une fonction, ou bien ses paramètres.. è

Le graphe d’un programme Datalog est le graphe dont les noeuds sont les relations du schéma intensionnel et dans lequel il existe une arête (R; S) s’il existe une règle avec R dans

Pour un certain langage de requêtes Q, quelle est la complexité du calcul de Q(D) en fonction de la taille de la requête Q 2 Q et de la base de données D

Avec Likes(drinker, beer) et Frequents(drinker, bar), trouver les beers que Likes au moins un des clients du Joe’s Bar?.

Note importante : Le dictionnaire ou l’encyclopédie est un fichier TXT qui doit être référencé dans le programme sans le chemin, ce qui implique qu’il doit figurer dans