• Aucun résultat trouvé

De la demande formulée à la requête SQL. Proposition de démarche pour la construction d une requête

N/A
N/A
Protected

Academic year: 2022

Partager "De la demande formulée à la requête SQL. Proposition de démarche pour la construction d une requête"

Copied!
15
0
0

Texte intégral

(1)

De la demande formulée à la requête SQL

Proposition de démarche

pour la construction d’une requête

(2)

Démarche

Bien comprendre le modèle relationnel proposé

Rechercher la correspondance des mots de la phrase avec les noms de colonnes demandées

déterminer des calculs nécessaires

Rechercher les moyens d’obtenir ces colonnes : quel « chemin » cohérent en utilisant les liens entre les tables (clef étrangère -> clef primaire)

?

Écrire la requête SQL

(3)

Modèle de données

Coefficient (idCoef, salBase)

idCoef : PK

Salarie (idSal, nomSal, idCoef)

idSal : PK / idCoef : FK vers coefficient (idCoef)

Projet (idProj, titreProjet, idSalResp)

idProj : PK / idSalResp : FK vers salarie (idSal)

Tache (idTache, nomTache, idProj)

idTache : PK / idProj : FK vers projet (idProj)

Realiser (idSal, idTache, dateRealiser,nbheures)

idSal, idTache, dateExecuter : PK / idSal : FK vers salarie (idSal), idTache : FK vers tache

PK = Primary Key = clef primaire / FK = Foreign Key = clef étrangère

(4)

Modèle de données

Coefficient (idCoef, salBase)

Salarie (idSal, nomSal, idCoef)

Projet (idProj, titre, budg, datFin, idSalResp)

Tache (idTache, nomTache, idProj)

Realiser (idSal, idTache, dateRealiser, nbheures) (=)

(=) (=)

(=)

(=)

(5)

Question posée :

Lister les projets terminés dont le budget a été dépassé, classés du plus grand au plus petit dépassement

Compléments :

Lister : numéro, titre, budget et réalisé du projet

Un projet est terminé quand sa date de fin est renseignée

Le ‘réalisé’ d’un projet correspond aux heures

réalisées au coût horaire selon le coefficient

(6)

Quelles données ? Quel chemin ?

Coefficient (idCoef, salBase)

Salarie (idSal, nomSal, idCoef)

Projet (idProj, titre, budg, datFin, idSalResp)

Tache (idTache, nomTache, idProj)

Realiser (idSal, idTache, dateRealiser, nbheures) (=)

(=)

(=) (=)

NOT NULL

* SUM

<

-1-

-3- -2-

-4-

-

DESC

(7)

SQL, proposition de réponse

SELECT

P.idProj, titre, budget, SUM(nbHeures*salBase)

FROM

Projet P INNER JOIN Tache T ON P.idProj = T.idProj

INNER JOIN realiser R ON T.idTache = R.idTache

INNER JOIN salarie S ON R.idSal = S.idSal

INNER JOIN coefficient C ON S.idCoef = C.idCoef

WHERE

datFin IS NOT NULL

GROUP BY

P.idProj, titre, budget

HAVING

budget < SUM(nbHeures*salBase)

ORDER BY

(SUM(

nbHeures*salBase) – budget ) DESC

;

(8)

SQL, proposition de réponse avec alias de colonne

SELECT

P.idProj, titre, budget, SUM(nbHeures*salBase) AS realise

FROM

Projet P INNER JOIN Tache T ON P.idProj = T.idProj

INNER JOIN realiser R ON T.idTache = R.idTache

INNER JOIN salarie S ON R.idSal = S.idSal

INNER JOIN coefficient C ON S.idCoef = C.idCoef

WHERE

datFin IS NOT NULL

GROUP BY

P.idProj, titre, budget

HAVING

budget < realise

ORDER BY

(realise

– budget ) DESC

;

(9)

SQL, proposition de réponse

avec alias de colonne et USING

SELECT

idProj, titre, budget, SUM(nbHeures*salBase) AS realise

FROM

Projet INNER JOIN Tache USING (idProj)

INNER JOIN realiser USING (idTache)

INNER JOIN salarie USING (idSal)

INNER JOIN coefficient USING (idCoef)

WHERE

datFin IS NOT NULL

GROUP BY

idProj, titre, budget

HAVING

budget < realise

ORDER BY

(realise

– budget ) DESC

;

(10)

Question posée

1 - Lister les salariés (numéro et nom) responsables de projets; classer par

ordre alphabétique …

2 - … qui n’ont participé à la réalisation

d’aucune tâche

(11)

SQL, proposition de réponse 1

SELECT

idSal, nomSal

FROM

salarie

WHERE

idSal IN

(SELECT DISTINCT idSalResp FROM projet)

ORDER BY

nomSal ;

Ou bien :

SELECT

DISTINCT idSal, nomSal

FROM

Salarie INNER JOIN projet ON idSal = idSalResp

ORDER BY

nomSal ;

Responsables de projets

(12)

SQL, proposition de réponse 2

SELECT

idSal, nomSal

FROM

salarie

WHERE

idSal IN

(SELECT DISTINCT idSalResp FROM projet)

AND

NOT ( idSal IN

(SELECT DISTINCT idSal FROM realiser)

)

ORDER BY

nomSal

;

qui n’ont participé à la réalisation d’aucune

tâche

(13)

Question posée (plus difficile…)

Plusieurs salariés peuvent travailler sur la même tâche : lister les salariés qui ont travaillé en même temps que

‘Pierre’ pendant la période du 2 au 5

janvier 2005

(14)

SQL, proposition de réponse étape 1

dates auxquelles Pierre a travaillé pendant la période

SELECT

DISTINCT dateRealiser

FROM

realiser

WHERE

idSal =

(SELECT idSal FROM salarie WHERE nomsal = ‘Pierre’)

AND dateRealiser BETWEEN ’02/01/2005’ AND ’05/01/2005’ ;

(15)

SQL, proposition de réponse Etape 2

Les salariés qui ont travaillé en même temps que Pierre

SELECT

DISTINCT idSal, nomSal

FROM

salarie

WHERE

idSal IN

(SELECT DISTINCT idSal FROM realiser WHERE dateRealiser

IN

(

SELECT DISTINCT dateRealiser FROM realiser WHERE idSal

= (SELECT idSal FROM salarie WHERE nomsal = ‘Pierre’) AND dateRealiser BETWEEN ’02/01/2005’ AND ’05/01/2005’

)

)

AND idSal <> (SELECT idSal FROM salarie WHERE nomsal = ‘Pierre’) ;

Références

Documents relatifs

Certains dÈlais sont vide car les commandes en questions n'ont pas encore ÈtÈ livrÈes (valeur NULL).

The communication area of Tape Loader-Monitor C contains a four-character equipment configuration field in locations 151-154 (octal 227-232), which is used by Update

LE PRODUIT CARTESIEN (ou jointure croisée) ASSOCIE CHACUNE DES LIGNES D’UNE TABLE AVEC TOUTES LES LIGNES D’UNE AUTRE TABLE IL CONSERVE TOUTES LES LIGNES DE TOUTES LES

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.. è

Les requêtes utilisant l’ordre SQL SELECT ont permis la construction de réponses sous forme de lignes d’un certain nombre de colonnes issues d’une ou plusieurs tables.. En

= (SELECT idSal FROM salarie WHERE nomsal = ‘Pierre’) AND dateRealiser BETWEEN ’02/01/2005’ AND ’05/01/2005’. AND idSal &lt;&gt; (SELECT idSal FROM salarie WHERE nomsal

2 Le penseur 1880 1500.00 2 Rodin Auguste 1840 FRANCE. Les bourgeois

La lettre doit préciser l’objet de l’entretien (mais il n’est pas obligé d’indiquer les causes qui lui font envisager le licenciement : Cour de cassation, chambre sociale,