Exercice Base de donnée
TheRogerFederer Messages postés 270 Statut Membre -
la première image :

la deuxième image :

la troisième image :

la quatrième image :

J'ai essayé de faire quelque chose sur chaque question mais je suis débutant (je précise que tout ceci est de niveau débutant), (je suis en BTS info 1ère année) :
1) SELECT automobile.numImma, COUNT(*) AS "nbre d'automobiles référencées"
FROM automobile
2) SELECT automobile.numImma, automobile.modele, marque.nom
FROM automobile, marque
3) SELECT automobile.idEnergie, energie.idEnergie, energie.libelleEnergie
FROM automobile NATURAL JOIN energie USING (idEnergie)
WHERE energie.libelleEnergie = 'diesel'
4) SELECT vrp.idVRP, suiviimpact.idVRP, suiviimpact.km
FROM vrp NATURAL JOIN suiviimpact USING (idVRP)
WHERE vrp.idVRP = suiviimpact.idVRP
AND km DESC
5) SELECT automobile.numImma, automobile.modele, suiviimpact.nbLitres
FROM automobile JOIN suiviimpact USING (numImma)
WHERE nbLitres ASC
6) SELECT automobile.numImma, automobile.dateAchat, automobile.modele
FROM automobile
WHERE dateAchat = MAX (dateAchat)
7) SELECT suiviimpact.km
FROM suiviimpact
WHERE suiviimpact.km DESC
AND idVRP IN (SELECT vrp.idVRP, vrp.dateEmbauche, nom, prenom
FROM vrp, suiviimpact
WHERE dateEmbauche = 1)
8) SELECT suiviimpact.date, automobile.gCO2km AS "empreinte carbone en tonne"
FROM automobile, suiviimpact
WHERE gCO2km = SUM(gCO2km)
AND suiviimpact.date = '2015'
9) Comprend pas la question...............
10) UPDATE pastille
SET idPastille = idPastille + 1
WHERE ..................
INSERT INTO pastille
FROM pastillesEco2015
VALUES (Couleur, Explications, Code)
11) SELECT
FROM energie NATURAL JOIN automobile USING (idEnergie)
WHERE libelleEnergie = 'Essence'
AND automobile.dateAchat BETWEEN '01/01/2006' AND '31/12/2010'
AND idEnergie IN (SELECT automobile.dateAchat, automobile.idEnergie, energie.libelleEnergie
FROM energie NATURAL JOIN automobile USING (idEnergie)
WHERE libelleEnergie = 'diesel'
AND automobile.dateAchat >= '01/01/2011')
- Germain veut gérer les activités de son association avec une base de données. il a commencé à créer des tables dans un fichier, mais il n’est pas sûr du résultat. le fichier à télécharger contient uniquement le schéma de cette base de données. en l’état actuel, que peut-on en déduire ?
- Comment ouvrir un fichier epub ? - Guide
- Fichier bin - Guide
- Le fichier à télécharger contient un mot caché. quel est le format du fichier ? quel est le mot caché ? - Guide
- Fichier .dat - Guide
- Fichier rar - Guide
13 réponses
Plusieurs étudiants débutants en BTS INFO travaillent sur un exercice SQL composé de 11 requêtes SELECT, UPDATE et INSERT, cherchant à comprendre les jointures et les clauses WHERE. Des échanges portent sur l’usage des JOINs, NATURAL JOIN et USING, des besoins de LEFT JOIN, et sur l’interprétation des résultats via pgAdmin et les tests en base. Toutefois, plusieurs réponses critiquent certaines requêtes, proposent des corrections (notamment sur 7, 9, 10 et 11), et recommandent de tester directement sur une base locale pour valider les résultats. Des propositions de clarifications techniques et de documents assurent un suivi progressif, des vérifications côté logique et syntaxe, et laissent entrevoir une progression utile malgré des zones encore ambiguës.
1 - La lecture des Images n'est pas évidentes....
il aurait été préférable que tu marques la question DIRECTEMENT dans le forum .... et qu'en dessous de chacune tu places le code tenté.
(ça nous éviterait de devoir ouvrir l'image.... puis la fermer... puis aller lire la réponse proposée.....etc....)
2 - ... lorsque tu postes du code sur le forum... merci d'utiliser la coloration syntaxique :
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
3 -
Voici déjà la correction à la première question :
SELECT COUNT(automobile.numImma) AS "nbre d'automobiles référencées" FROM automobile
Pour les autres... j'attendrais que tu nous mettes (à la suite de cette discussion) les questions et les réponses proposées telles que je te l'ai décrit dans les points 1 & 2 de ce message.
La question 2 est : Donnez la liste des automobiles accompagnées de leurs marques respectives (immatriculations, modèles et noms de marques).
Voilà ce que j'ai répondu :
SELECT automobile.numImma, automobile.modele, marque.nom FROM automobile, marque
Seulement ... tu as oublié d'indiquer ce qui les lie
SELECT A.numImma, A.modele, M.nom FROM automobile A, marque M WHERE A.qqchose = M.qqchose
=> A toi de remplacer les "qqchose" par les champs qui permettent de faire la jointure.
PS: As tu remarqué que j'utilise des ALIAS pour le nom des tables... c'est plus simple à manipuler et rend le code plus lisible.
J'avais pensé à cela mais ai-je oublié qqch et est-ce que la jointure est bonne ?
SELECT automobile.idEnergie, energie.idEnergie, energie.libelleEnergie FROM automobile NATURAL JOIN energie USING (idEnergie) WHERE energie.libelleEnergie = 'diesel'
Mais au vu de la documentation : https://sql.sh/cours/jointures/natural-join .. j'ai l'impression que c'est bon.
Moi je l'aurai écrit avec une jointure LEFT :
SELECT automobile.idEnergie, energie.idEnergie, energie.libelleEnergie FROM automobile A LEFT JOIN energie E ON E.idEnergie = A.idEnergie WHERE E.libelleEnergie = 'diesel'
J'ai pensé à :
SELECT vrp.idVRP, suiviimpact.idVRP, suiviimpact.km FROM vrp NATURAL JOIN suiviimpact USING (idVRP) WHERE vrp.idVRP = suiviimpact.idVRP AND km DESC
Mais comme je sais que j'ai eu souvent à faire à des sous-requêtes, j'ai bien peur qu'il y en ai une a utiliser.............. et je suis vraiment pas fort avec ce genre de chose..........
Est-ce que tu testes tes requêtes ?
Dans l'idéal... si ce n'est pas déjà fait... tu t'installes un logiciel comme WAMP ou XAMPP ou EASYPHP sur ton PC ...
ça te permettra d'y créer tes différentes TABLES (en mysql )
puis d'y faire tes requêtes pour voir ce qu'elles retournent....
nb: et tu peux evenutellement installer egalement le logiciel HeidiSQL qui permet de taper dans ta BDD directement sans avoir à passer par l'interface phpmyadmin.
Comme ceci : https://codes-sources.commentcamarche.net/faq/10778-heidisql-tester-ses-requetes-sql
Une fois que ces logiciels seront installés, donc ...., testes y tes requêtes.... et regarde si le résultat obtenu te semble correct.
Une sous-requête ne sera pas nécessaire je pense.... par contre... si tu regardes la définition de km (dans ta première image).. tu verras que ce compteur est "journalier" ..... et donc... pour obtenir le TOTAL de KM de chaque VRP .. il va te falloir faire une SOMME (et utiliser un GROUP BY )
perso je ne les connais pas..... mais bon... c'est du PostrgeSQL (et non du Mysql ) ... et ça permet également de mettre en place une BDD... et d'y tester les requêtes....... donc oui... ça VA fonctionner AUSSI.
NB : Comme indiqué... c'est du PostgréSQL (et non du MYSQL.... présente section du FORUM dans laquelle tu as posté ta question !! )
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je viens de me rendre compte que c'est pas possible à créer sur PostgréSQL.......................................... On n'a pas de donnée sur les colonnes (Marque, automobile, energie, etc...........) On ne sait pas si c'est du type character, character varying, numeric, etc..................
Hein ???
C'est une question de ..... logique !
Lorsqu'un champ est nommé .... IDqqchose ... ben... c'est donc un ID et donc...(en général... du NUMERIQUE )
Un champ dateqqchose .. ben .. c'est une DATE
km .. c'est une valeur numérique....
Energie ( Essence / Diesel.. )... ben c'est du TEXTE (du Varchar )
Appuie toi sur le TABLEAU fourni dans ta première image !
Bien sûr .. pour la consomation par litre ... c'est du numérique ( pas besoin dans ta table de marquer "5 L" .... tu ne mets que : "5" ) ....
A toi de jouer.
Regardes la doc :
www.postgresql.org/docs/9.1/static/queries-table-expressions.html
The ON clause is the most general kind of join condition: it takes a Boolean value expression of the same kind as is used in a WHERE clause. A pair of rows from T1 and T2 match if the ON expression evaluates to true.
The USING clause is a shorthand that allows you to take advantage of the specific situation where both sides of the join use the same name for the joining column(s). It takes a comma-separated list of the shared column names and forms a join condition that includes an equality comparison for each one. For example, joining T1 and T2 with USING (a, b) produces the join condition ON T1.a = T2.a AND T1.b = T2.b.
Furthermore, the output of JOIN USING suppresses redundant columns: there is no need to print both of the matched columns, since they must have equal values. While JOIN ON produces all columns from T1 followed by all columns from T2, JOIN USING produces one output column for each of the listed column pairs (in the listed order), followed by any remaining columns from T1, followed by any remaining columns from T2.
Finally, NATURAL is a shorthand form of USING: it forms a USING list consisting of all column names that appear in both input tables. As with USING, these columns appear only once in the output table. If there are no common column names, NATURAL behaves like CROSS JOIN.
A mon avis... utilises, comme je te l'ai proposé, des LEFT JOIN
J'avais pensé à ceci :
SELECT automobile.numImma, automobile.modele, suiviimpact.nbLitres FROM automobile JOIN suiviimpact USING (numImma) ORDER BY nbLitres ASC
En testant il ne me renvoie pas d'erreur...
J'avais pensé à cela :
SELECT automobile.numImma, automobile.dateAchat, automobile.modele FROM automobile WHERE dateAchat = MAX (dateAchat)
Mais il me retourne une erreur ! Je ne dois pas mettre de dateAchat = Max (...) dans un WHERE.
SELECT automobile.numImma, automobile.dateAchat, automobile.modele FROM automobile HAVING dateAchat = MAX (dateAchat)
alors j'obtiens cette erreur :
ERREUR: la colonne « automobile.numimma » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat
LINE 1: SELECT automobile.numImma, automobile.dateAchat, automobile....
^
- Erreur **********
ERREUR: la colonne « automobile.numimma » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat
État SQL :42803
Caractère : 8
Si je ne répond pas... c'est que je n'ai pas le temps....
Donc là .... je suis présent :
voici donc de l'aide ......
Pour la question 9 .... il est demandé de modifier ta BDD ... la requête à fournir sera donc celle qui permet de faire ces modifications ( des ALTER sûrement....)
Pour la 7 ... .. comme indiqué dans la question .. il faut trouver les deux VRP les plus anciens de la boite (donc ceux qui ont été embauchés depuis le plus longtemps...) ... faire la somme respective de leurs kilomètres ... et faire un ORDER sur celui qui a le plus de km ....
..et....Pour les autres.... ben ... comme pour les précédentes.... Montres ce que tu as essayé ....
Sachant que si tu as testé tes requêtes dans ta BDD ... ben tu dois être en mesure de voir si le résultat obtenu te semble correcte ou non.
SELECT SUM (suiviimpact.km) FROM suiviimpact ORDER BY suiviimpact.km DESC AND idVRP IN (SELECT vrp.idVRP, vrp.dateEmbauche, nom, prenom FROM vrp, suiviimpact WHERE dateEmbauche = 1)
Je sais que la date dans dateEmbauche n'est pas bonne car le format ne correspond pas, mais je ne vois pas comment faire autrement ! Pour le reste en testant j'ai ceci comme erreur :
ERREUR: erreur de syntaxe sur ou près de « AND »
LINE 4: AND idVRP IN (SELECT vrp.idVRP, vrp.dateEmbauche, nom, preno...
^
- Erreur **********
ERREUR: erreur de syntaxe sur ou près de « AND »
État SQL :42601
Caractère : 75
ALTER TABLE automobile
ADD COLUMN idPastille numeric (4)
ADD CONSTRAINT fk_pastille FOREIGN KEY (idPastille)
REFERENCES pastille (idPastille)
effectivement avec un alter ça à l'air pas mal
puis on créer la table pastille qui n'existe pas encore :
CREATE TABLE pastille ( idPastille numeric (4) PRIMARY KEY, couleur character varying libelleCouleur character varying )
SELECT T1.idVRP, T1.nom, t1.prenom, SUM(T2.km)
FROM VRP as T1
INNER JOIN suiviimpact as T2
ON T2.idVRP = T1.idVRP
WHERE NOT exists
(SELECT 1
FROM vrp as T3
where T3.dateEmbauche < T1.dateEmbauche)
GROUP BY T1.idVRP, T1.nom, t1.prenom
ORDER BY SUM(T2.km)DESC
Si tu ne poses pas de nouvelle question.... tu n'auras pas de nouvelle réponse !
Et comme avant .... il nous faut la question + la requête que tu as essayé .... (et bien entendu... requête que tu auras testé au préalable directement dans ta BDD..... )
J'ai pensé à faire cela :
SELECT automobile.idEnergie, automobile.numImma, automobile.dateAchat, energie.libelleEnergie
FROM energie NATURAL JOIN automobile USING (idEnergie)
WHERE libelleEnergie = 'Essence'
AND automobile.dateAchat BETWEEN '01/01/2006' AND '31/12/2010'
AND idEnergie IN (SELECT automobile.dateAchat, automobile.idEnergie, energie.libelleEnergie
FROM energie NATURAL JOIN automobile USING (idEnergie)
WHERE libelleEnergie = 'diesel'
AND automobile.dateAchat >= '01/01/2011')
Si oui... c'est que c'est bon non ??!
Mais bon;... Je ferais l'inverse...
Je ferais un SELECT sur la table automobile avec un JOIN sur la table energie.
et je ferais même un CASE WHEN pour spécifier chaque vignette en fonction des différents critères.