IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 MySQL Discussion :

Entraide sql BDD


Sujet :

MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2015
    Messages : 55
    Points : 29
    Points
    29
    Par défaut Entraide sql BDD
    Hello,

    Je suis nouveau sur le forum.
    Je fais un exo d'sql et j'aimerais savoir si je vais dans le droit chemin.

    Voici la BDD (désolé c'est flou)
    Nom : test SQL.jpg
Affichages : 337
Taille : 780,8 Ko

    Question 1 : Write SQL to show details of manager who manages more than 3 employees

    ma réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select * from employees em, job_history jh, departments dep
    where jh.employees_ID=em.employees_ID
    and jh.end_data is null
    and dep.manager_ID=em.manager_ID
    having (em.employees_ID)>3;
    Question 2 : Write SQL to show country name, city and number of departments where department has more than 5 employees

    ma réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select co.country_name, lo.city, lo.postal_code
    from countries co, locations lo, employees em, departments dep
    where co.countries_ID=lo.countries_ID
    and lo.location_ID=dep.location_ID
    and dep.manager_ID=em.manager_ID
    having (em.employees_ID)>5;

    Question 3 : Write SQL to show the details of employees drawing the highest salary in the department

    ma réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select em.*, jo.jobs_titles
    from employees em, jobs jo
    where em.job_ID=k=jo.em.job_ID
    and max(max_salary);
    Question 4 : Write SQL to show employee name, job title, start date and end date of past jobs of all employees with commission percentage null

    ma réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select em.first_name,em.last_name, jo.jobs_titles, jh.start_date, jh.end_date
    from employees em, jobs jo, job_history jh
    where em.commission_pct is null;

    Merci pour votre aide

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    1) Les jointures s'écrivent depuis plus de 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    2) Il vaut mieux éviter la guerre des étoiles !

    Question 1 : Write SQL to show details of manager who manages more than 3 employees
    Bizarrerie du modèle : un employé peut avoir un manager direct (manager_id dans la table employees) et le manager de son département (manager id dans la table departments) !

    Je ne pense pas qu'il soit utile d'interroger la table job_history. Cette table stocke, à mon avis, l'historique des emplois passés de chaque employé mais l'appartenance actuelle de l'employé figure dans la table employees, via department_id.

    Votre requête est fausse !
    HAVING s'emploie avec GROUP BY et vous ne faites pas de comptage.

    Résolvez ce qui vous est demandé par étapes...
    1) Faites une première requête disant quel est le nombre d'employés par département ?
    2) Améliorez cette requête en ne retenant que les départements qui ont plus de 3 employés.
    3) Faites une jointure (avec JOIN) pour récupérer les informations du manager de chaque département conservé.



    Vos autres réponses sont du même acabit alors commencez par résoudre celle première question.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2015
    Messages : 55
    Points : 29
    Points
    29
    Par défaut
    Hello Cinephil,
    bon ça fait mal mais c'est constructif
    Je revois ça :

    Question 1 : details of manager who manages more than 3 employees

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select em.first_name, em.last_name, em.email, em.phone_number 
    from employees em 
    inner join departments dep
    on em.manager_ID=dep.manager_ID
    where count (em.employees_ID)>3;
    Question 2 : country name, city and number of departments where department has more than 5 employees

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select co.country_name, lo.city, lo.postal_code
    from countries co
    inner join locations lo 
    on co.countries_ID=lo.countries_ID
     
    inner join departments dep
    on lo.location_ID=dep.location_ID
     
    inner join employees em
    on dep.manager_ID=em.manager_ID
     
    where count (em.employees_ID)>5;
    (je pense que mes jointures sont foireuses)

    Question 3 : details of employees drawing the highest salary in the department

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select em.first_name, em.last_name, em.email, em.phone_number, em.salary
    from employees em
    inner join jobs jo
    on em.job_ID=k=jo.em.job_ID
    where max(max_salary);
    Question 4 : employee name, job title, start date and end date of past jobs of all employees with commission percentage null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select em.first_name,em.last_name, jo.job_title, jh.start_date, jh.end_date, 
    from employees em
    inner join job_history jh
    on em.employee_id=jh.employee_id
    on em.department_id=jh.department_id
     
    inner join job jo
    on em.job_id=jo.job_id
     
    where em.commission_pct is null;

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par tofoo Voir le message
    Question 1 : details of manager who manages more than 3 employees

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select em.first_name, em.last_name, em.email, em.phone_number 
    from employees em 
    inner join departments dep
    on em.manager_ID=dep.manager_ID
    where count (em.employees_ID)>3;
    La jointure ne va ramener qu'une seule ligne par département puisqu'elle est là pour ramener les informations du manager du département.
    Que va donner count (em.employees_ID) ?
    ==> 1
    Que va donner la restriction where count (em.employees_ID)>3 ?
    ==> Aucune ligne ne va passer le filtre.
    Que va ramener la requête ?
    ==> 0 ligne !

    De plus, sauf lorsqu'on fait un simple SELECT COUNT(*) FROM une_table, COUNT s'emploie toujours avec GROUP BY.

    Reprenons ce que j'ai écrit hier :
    [QUOTE=CinéPhil]Résolvez ce qui vous est demandé par étapes...
    1) Faites une première requête disant quel est le nombre d'employés par département ?[quote]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DEPARTMENT_ID, COUNT(*) AS EMPLOYEES_QUANTITY
    FROM EMPLOYEES
    GROUP BY DEPARTMENT_ID
    2) Améliorez cette requête en ne retenant que les départements qui ont plus de 3 employés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DEPARTMENT_ID, COUNT(*) AS EMPLOYEES_QUANTITY
    FROM EMPLOYEES
    GROUP BY DEPARTMENT_ID
    HAVING COUNT(*) > 3
    On n'a même plus besoin d'avoir le comptage dans le SELECT puisque ce qui nous intéresse pour la suite, c'est le département.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DEPARTMENT_ID
    FROM EMPLOYEES
    GROUP BY DEPARTMENT_ID
    HAVING COUNT(*) > 3
    3) Faites une jointure (avec JOIN) pour récupérer les informations du manager de chaque département conservé.
    Et voici donc la requête finale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT d.DEPARTMENT_ID, d.DEPARTMENT_NAME,
    	e.EMPLOYEE_ID, e.FIRST_NAME, e.LAST_NAME, e.EMAIL, e.PHONE_NUMBER -- éventuelles autres colonnes
    FROM 
    (
    	SELECT DEPARTMENT_ID
    	FROM EMPLOYEES
    	GROUP BY DEPARTMENT_ID
    	HAVING COUNT(*) > 3
    ) tmp 
    INNER JOIN DEPARTMENTS d ON d.DEPARTMENT_ID = tmp.DEPARTMENT_ID
    	INNER JOIN EMPLOYEES e ON e.EMPLOYEE_ID = d.MANAGER_ID
    Bon, en fait il fallait deux jointures.
    On aurait pu aussi ramener le MANAGER_ID dès la requête de comptage mais si les données ne sont pas fiables et que des employés du département D n'aient pas tous le MANAGER_ID du département D dans la table EMPLOYEES, ça ramènerait plusieurs managers pour un département.
    => Ceci montre que cette BDD est mal modélisée.



    Même problème d'utilisation du COUNT sans GROUP BY sur les autres requêtes ; je vous laisse les corriger.

    Vous devriez vous installer MySQL, implémenter la BDD et tester vos requêtes. Vous verriez ainsi vos erreurs en direct.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2015
    Messages : 55
    Points : 29
    Points
    29
    Par défaut
    Ok c'était moins facile que je le pensais.

    Je vais bosser les 3 autres requêtes dans ce sens, merci !

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2015
    Messages : 55
    Points : 29
    Points
    29
    Par défaut
    Hello,
    Je reviens vers toi, je n'ai pas touché a la query 3 par contre.

    Question 2 : country name, city and number of departments where department has more than 5 employees

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     SELECT co.country_name, lo.city, lo.postal_code
    FROM 
    (
    	SELECT DEPARTMENT_ID    -- on reste dans l'esprit de la 1ere requête
    	FROM EMPLOYEES
    	GROUP BY DEPARTMENT_ID
    	HAVING COUNT(*) > 5
    ) tmp 
     
    INNER JOIN DEPARTMENTS d ON temp.manager_ID=d.manager_ID
    INNER JOIN locations lo ON lo.location_ID=d.location_ID
    INNER JOIN countries co ON co.countries_ID=lo.countries_ID;

    Question 3 : details of employees drawing the highest salary in the department

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT em.first_name, em.last_name, em.email, em.phone_number, em.salary
    FROM employees em
    INNER JOIN jobs jo ON em.job_ID=k=jo.em.job_ID
    where max(max_salary);
    Question 4 : employee name, job title, start date and end date of past jobs of all employees with commission percentage null

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT em.first_name,em.last_name, jo.job_title, jh.start_date, jh.end_date, 
    FROM employees em
    INNER JOIN job_history jh ON em.employee_id=jh.employee_id
    INNER JOIN ON em.department_id=jh.department_id   --tabe déjà citée, formulation ok, répétition ou renommage em1 ?
    INNER JOIN job jo ON em.job_id=jo.job_id

    Cinephil, j'ai installé "MySQL Workbench 6.3 CE" et "PLSQL Developer" mais je n'ai pas encore réussi a les mettre en localhost.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2015
    Messages : 55
    Points : 29
    Points
    29
    Par défaut
    Hello,
    Est ce que les 3 requêtes semblent ok à votre avis ?
    Thanks

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Question 2 : country name, city and number of departments where department has more than 5 employees
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     SELECT co.country_name, lo.city, lo.postal_code
    FROM 
    (
    	SELECT DEPARTMENT_ID    -- on reste dans l'esprit de la 1ere requête
    	FROM EMPLOYEES
    	GROUP BY DEPARTMENT_ID
    	HAVING COUNT(*) > 5
    ) tmp 
     
    INNER JOIN DEPARTMENTS d ON temp.manager_ID=d.manager_ID
    INNER JOIN locations lo ON lo.location_ID=d.location_ID
    INNER JOIN countries co ON co.countries_ID=lo.countries_ID;
    Petit extrait de votre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FROM 
    (
    	SELECT DEPARTMENT_ID    -- on reste dans l'esprit de la 1ere requête
    	FROM EMPLOYEES
    -- ...
    ) tmp 
     
    INNER JOIN DEPARTMENTS d ON temp.manager_ID=d.manager_ID
    Où est "temp" qui est utilisé dans la condition de jointure ?
    Où est manager_ID dans ce temp ?

    => Si vous aviez essayé la requête, vous auriez vu l'erreur !

    Question 3 : details of employees drawing the highest salary in the department
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT em.first_name, em.last_name, em.email, em.phone_number, em.salary
    FROM employees em
    INNER JOIN jobs jo ON em.job_ID=k=jo.em.job_ID
    where max(max_salary);
    Ce morceau de requête ne veut rien dire !
    Une requête se lit comme une phrase. Voici la traduction en français de votre requête :
    "Sélectionner les colonnes em.first_name, em.last_name, em.email, em.phone_number, em.salary
    de la table employees d'alias em
    jointe à la table jobs d'alias jo sur la condition de jointure em.job_ID=k=jo.em.job_ID <== 2 égalités ? !!!
    Où le maximum de max_salary <= Quelle est la fin de la phrase ?

    ==> Commencez par faire une requête qui cherche quel est le plus grand salaire par département puis faites une jointure de cette requête avec la table des employés pour avoir le détail des employés ayant ce plus gros salaire.

    Question 4 : employee name, job title, start date and end date of past jobs of all employees with commission percentage null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT em.first_name,em.last_name, jo.job_title, jh.start_date, jh.end_date, 
    FROM employees em
    INNER JOIN job_history jh ON em.employee_id=jh.employee_id
    INNER JOIN ON em.department_id=jh.department_id   --tabe déjà citée, formulation ok, répétition ou renommage em1 ?
    INNER JOIN job jo ON em.job_id=jo.job_id
    Où est cette condition ?
    with commission percentage null
    INNER JOIN ON em.department_id=jh.department_id --tabe déjà citée, formulation ok, répétition ou renommage em1 ?
    Non, derrière un JOIN, il faut toujours une table ou une sous-requête.

    Cinephil, j'ai installé "MySQL Workbench 6.3 CE" et "PLSQL Developer" mais je n'ai pas encore réussi a les mettre en localhost.
    A priori, pas besoin des deux. Par contre, vous avez aussi installé un serveur MySQL j'espère ?
    MySQL Workbench peut présenter quelques difficultés pour le faire causer avec la base de données. Il y a déjà eu plusieurs discussion à ce sujet. Faites une recherche dans le forum.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2015
    Messages : 55
    Points : 29
    Points
    29
    Par défaut
    Hello,

    Question 2 :
    Ok j'ai codé tmp<>temp...

    Question 3 :
    ça implique une sous requête comme les 2 1eres questions ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT em.first_name, em.last_name, em.email, em.phone_number, em.salary
    FROM 
    (
    SELECT max(max_salary)
    FROM jobs
    ) jo
    INNER JOIN employees em ON em.job_ID=jo.em.job_ID;

    Question 4 :
    Effectivement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT em.first_name,em.last_name, jo.job_title, jh.start_date, jh.end_date, 
    FROM employees em
    INNER JOIN job_history jh ON em.employee_id=jh.employee_id
    INNER JOIN employees em  ON em.department_id=jh.department_id   
    INNER JOIN job jo ON em.job_id=jo.job_id
    where em.commission_pct is null;
    J'avais easyphp dans le passé mais je t'avouerai que je ne suis pas super à l'aise avec ça. Je vais me documenter sur les forums

  10. #10
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Pour travailler en local, et donc apprendre, et faire plein de tests, je vous conseille :
    - UWAMP (serveur apache local, avec implémentation de Mysql et de PHP)
    - Heidi SQL, client graphique mysql, permettant de travailler les données et de saisir facilement les requetes.

    Pierre

Discussions similaires

  1. Cherche éditeur SQL / BDD
    Par Seth77 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/12/2012, 22h48
  2. [MySQL] Ou trouver l'erreur SQL + BDD
    Par Blueyes50 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 25/05/2012, 17h34
  3. [MySQL] Fichier texte vs SQL (bdd de 700 Mo)
    Par shepounet dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/01/2012, 18h49
  4. [SQL/BDD] Ajout massif de donnees dans une base mysql
    Par tomWag dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/05/2006, 19h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo