Exercice SQL

Fermé
nistarok Messages postés 304 Date d'inscription vendredi 27 juillet 2012 Statut Membre Dernière intervention 18 avril 2023 - 15 nov. 2016 à 15:19
nistarok Messages postés 304 Date d'inscription vendredi 27 juillet 2012 Statut Membre Dernière intervention 18 avril 2023 - 16 nov. 2016 à 11:13
Bonjour,

Je révise un concours en informatique, et évidemment j'ai l'annale mais pas le corrigé, ce qui fait que je galère royalement en SQL vu que je n'y connais rien.
Pourriez-vous m'aider svp ?

Exercice :

On a la base suivante ;

PILOTE (NUMPIL, NOMPIL, ADR, SAL)
AVION (NUMAV, NOMAV, CAPACITE, LOC)
VOL (NUMVOL, NUMPIL, NUMAV, VILLE_DEP, VILLE_ARR, H_DEP, H_ARR)

numpil : clé de PILOTE, nombre entier
nompil : nom du pilote, chaîne de caractères
adr : ville du pilote, chaîne de caractères
sal : salaire du pilote, nombre entier

numav : clé de AVION, nombre entier
capacite : nbr de places d'un avion, nombre entier
loc : ville de l'aéroport d'attache de l'avion, chaîne de caractère

numvol : clé de VOL, nombre entier
ville_dep : ville de départ du vol, chaîne de caractère
ville_arr : ville d'arrivée du vol, chaîne de caractère
h_dep : heure de départ du vol, nombre entier entre 0 et 23
h_arr : heure d'arrivée du vol, nombre entier entre 0 et 23


1) Quels sont les pilots ne conduisant que des avions de plus de 300 places ?

J'ai répondu : SELECT numpil FROM vol WHERE numav < 300

2) Quels sont les pilotes bordelais ne pilotant que des avions arrivant au moins une fois à Bordeaux ?

3) Quel est le salaire maximum d'un pilote niçois ?

4) Quel est le salaire maximum d'un pilote et quels sont les pilotes qui le perçoivent ?


Merci de votre aide !
A voir également:

1 réponse

jordane45 Messages postés 38424 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 février 2025 4 734
16 nov. 2016 à 00:27
Bonjour,

Nous ne sommes pas là pour faire les exercices à ta place.

Donc je veux bien t'aider (et éventuellement corriger) mais c'est tout.

La première réponse que tu donnes est fausse....
Ne connais tu pas les JOINTURES sur les tables ?
Car NUMAV < 300.... voudrait dire que tu ne cherches que les NUMÉROS d'avions qui seraient inférieur à 300 ... et non leur CAPACITE.
Et puis... à la question "quels sont les pilotes...." je ne suis pas sûr que seul leur ID suffise... mais je pense qu'il faut prendre leur nom également.
Bref...
La requête serait du genre :
SELECT *
FROM vol V
LEFT JOIN pilote P ON P.NUMPIL = V.NUMPIL
LEFT JOIN avion A ON A.NUMAV = V.NUMAV
WHERE A.CAPACITE > 300


Pour les autres questions... tu vas devoir utiliser des fonctions comme MAX / MIN
Je te laisse chercher...

PS: Tu peux t'amuser à tester en LOCAL en installant par exemple un xampp sur ton ORDI et en accédant à la BDD depuis phpmyadmin ou via un logiciel comme HeidiSql (https://codes-sources.commentcamarche.net/faq/10778-heidisql-tester-ses-requetes-sql


Le code de création des tables est le suivant :
-- --------------------------------------------------------
-- Hôte:                         127.0.0.1
-- Version du serveur:           5.6.12-log - MySQL Community Server (GPL)
-- Serveur OS:                   Win32
-- HeidiSQL Version:             9.1.0.4867
-- --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

-- Export de la structure de la base pour test3
CREATE DATABASE IF NOT EXISTS `test3` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `test3`;


-- Export de la structure de table test3. avion
CREATE TABLE IF NOT EXISTS `avion` (
  `NUMAV` int(11) NOT NULL AUTO_INCREMENT,
  `NOMAV` varchar(50) DEFAULT NULL,
  `CAPACITE` varchar(50) DEFAULT NULL,
  `LOC` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`NUMAV`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- L'exportation de données n'été pas sélectionné.


-- Export de la structure de table test3. pilote
CREATE TABLE IF NOT EXISTS `pilote` (
  `NUMPIL` int(11) NOT NULL AUTO_INCREMENT,
  `NOMPIL` varchar(50) DEFAULT NULL,
  ` ADR` varchar(50) DEFAULT NULL,
  `SAL` double DEFAULT NULL,
  PRIMARY KEY (`NUMPIL`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

-- L'exportation de données n'été pas sélectionné.


-- Export de la structure de table test3. vol
CREATE TABLE IF NOT EXISTS `vol` (
  `NUMVOL` int(11) NOT NULL AUTO_INCREMENT,
  `NUMPIL` int(11) DEFAULT NULL,
  `NUMAV` int(11) DEFAULT NULL,
  `VILLE_DEP` varchar(50) DEFAULT NULL,
  `VILLE_ARR` varchar(50) DEFAULT NULL,
  `H_DEP` datetime DEFAULT NULL,
  `H_ARR` datetime DEFAULT NULL,
  PRIMARY KEY (`NUMVOL`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- L'exportation de données n'été pas sélectionné.
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;


Tu pourras t'amuser à ajouter (ou modifier) des entrées dans tes différentes tables et ainsi tester tes requêtes pour voir ce qu'elles te retournent.

Par contre... j'ai l'impression que ton niveau de SQL est très bas..... commence par suivre quelques tutos sur le net avant de te lancer.


0
nistarok Messages postés 304 Date d'inscription vendredi 27 juillet 2012 Statut Membre Dernière intervention 18 avril 2023 23
16 nov. 2016 à 10:40
Salut Jordane,

Oui je suis nul en sql j'en ai jamais fait. Après l'idée n'est pas qu'on file la réponse toute cuite ça sert à rien. C'est juste que je ne sais pas quel est le début de la logique de ce langage.

En fait donc mon idée c'était ça :

Alors je commence par un select vu que c'est la commande qui affiche. J'ai vu que la base "VOL" contient "numpil" (clé de pilote) et "numav" (clé de avion). Mes collègues m'ont dit que les clés (je sais pas si elles sont étrangères ou primaires) sont fixes alors moi j'avais dans l'idée que cette clé prend le paramètre de sa table si on le recherche (exemple si capacite = 300 alors numav = 300).

Soit :

SELECT numpil (je choisis les noms du pilote) FROM vol (dans la table vol qui a les clés des deux autres tables) WHERE numav < 300 (où numav = capacité est strictement supérieur à 300)

Mais... Non.

Bon si je comprends ta première explication :

SELECT * (je sélectionne tout les résultats)
FROM vol V (depuis la table vol, parce qu'il y a les clés de numav et numpil ?)
LEFT JOIN pilote P ON P.numpil = V.numpil (on croise / on joint les pilotes de la table numpil avec ceux de la table vol d'où l'intérêt mettre les variables "P" et "V")
LEFT JOIN avion A ON A.numav = V.numav (on croise / on joint les avions de la table numav avec ceux de la table vol d'où l'intérêt mettre les variables "A" et "V")
WHERE A.capacite > 300 (où la capacité de l'avion (table avion définie par "A" est supérieure à 300)

En résumé on met en croise les noms de pilotes de la table "pilote" et de la table "vol quand les résultats sont égaux, idem pour les avions quand la capacité de ces avions est strictement supérieure à 300.

Bon je vais réfléchir sur la 2.
0
jordane45 Messages postés 38424 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 février 2025 4 734 > nistarok Messages postés 304 Date d'inscription vendredi 27 juillet 2012 Statut Membre Dernière intervention 18 avril 2023
16 nov. 2016 à 10:57

Bon si je comprends ta première explication :

SELECT * (je sélectionne tout les résultats)
FROM vol V (depuis la table vol, parce qu'il y a les clés de numav et numpil ?)
LEFT JOIN pilote P ON P.numpil = V.numpil (on croise / on joint les pilotes de la table numpil avec ceux de la table vol d'où l'intérêt mettre les variables "P" et "V")
LEFT JOIN avion A ON A.numav = V.numav (on croise / on joint les avions de la table numav avec ceux de la table vol d'où l'intérêt mettre les variables "A" et "V")
WHERE A.capacite > 300 (où la capacité de l'avion (table avion définie par "A" est supérieure à 300)

Oui. tu as 20/20 ^^
0
nistarok Messages postés 304 Date d'inscription vendredi 27 juillet 2012 Statut Membre Dernière intervention 18 avril 2023 23
16 nov. 2016 à 11:13
Là pour le deuxième il faut que je trouve les nom de pilotes (nompil) habitant bordeaux (adr = bordeaux). Ensuite les croiser avec la table vol quand (ville_arr = adr et min 1).
Je vois pas trop comment l'écrire mais je vais essayer :

SELECT *
FROM vol V
LEFT JOIN pilote P on P.numpil = V.numpil
WHEN P.adr = V.ville_arr
MIN 1



Je sais que c'est pas ça j'arrive pas à ordonner tout ça.

L'idée c'est de faire croiser les noms de pilotes de la table numpil avec celle de numvol quand l'adresse du pilote (P.adr) est identifique à la ville d'atterrissage de l'avion (V.ville_att). Après le min est pas cohérent mais je sais pas où le mettre. Il doit me manquer quelque chose c'est clair.
0