Bases des bases de données

À partir d'une table Client(IdClient, Nom) et d'une table Commande(IdCommande, IdClient, Montant), on veut obtenir le nom des clients qui n'ont jamais passé de commande. Quelle instruction SQL est correcte ?

  1. ASELECT Nom FROM Client WHERE EXISTS (SELECT * FROM Commande WHERE Commande.IdClient = Client.IdClient)
  2. BSELECT Nom FROM Client WHERE NOT EXISTS (SELECT * FROM Commande)
  3. CSELECT Nom FROM Client WHERE NOT EXISTS (SELECT * FROM Commande WHERE Commande.IdClient = Client.IdClient)
Afficher la réponse et l'explication

Réponse : C. SELECT Nom FROM Client WHERE NOT EXISTS (SELECT * FROM Commande WHERE Commande.IdClient = Client.IdClient)

EXISTS est un prédicat qui est vrai si la sous-requête entre parenthèses renvoie au moins une ligne, et faux si elle n'en renvoie aucune ; NOT EXISTS est l'inverse. Utiliser une colonne de la table externe à l'intérieur de la sous-requête, comme dans Commande.IdClient = Client.IdClient, en fait une sous-requête corrélée qui vérifie, pour chaque ligne de la table externe Client, si ce client a des commandes. Combiné à NOT EXISTS, seuls les clients sans aucune commande restent. Avec EXISTS, on obtient l'inverse : les clients qui ont déjà commandé. Sans condition reliant la sous-requête au client, la sous-requête renvoie toujours des lignes dès que la table Commande en contient au moins une ; NOT EXISTS est alors toujours faux et le résultat compte 0 ligne. On peut aussi obtenir le même résultat avec un LEFT OUTER JOIN, en sélectionnant les lignes où les colonnes côté Commande sont NULL.

S'entraîner sur ce thème Retour au thème

Autres questions sur Bases des bases de données

  1. Quelle proposition décrit correctement une vue (view) dans une base de données relationnelle ?
  2. Quel est le but principal de la normalisation des tables d'une base de données relationnelle ?
  3. La clé primaire d'une table Commande(NumCommande, NumArticle, Quantite, NumClient, NomClient) est {NumCommande, NumArticle}, et ses dépendances fonctionnelles sont {NumCommande, NumArticle} → Quantite, NumCommande → NumClient et NumClient → NomClient. Quel est le résultat correct de la normalisation de cette table jusqu'à la troisième forme normale (3NF) ?
  4. La clé primaire d'une table Employe(NumEmploye, Nom, CodeService, NomService) est NumEmploye, et chaque colonne contient une seule valeur. Les dépendances fonctionnelles sont NumEmploye → Nom, NumEmploye → CodeService et CodeService → NomService. Quelle proposition indique correctement la forme normale de cette table ?
  5. Dans une base de données utilisée surtout pour la lecture et l'agrégation, des tables issues de la normalisation sont parfois délibérément fusionnées en une seule, de sorte que les mêmes données sont stockées en double (dénormalisation). Quelle combinaison associe correctement un avantage et un inconvénient de cette conception ?