solutions (un retour vers la question est possible à chaque réponse) |
See You Why? |
Cette page contient toutes les réponses, les solutions aux exercices proposés dans ce cours d'Access.
Un simple 'clic' sur le lien présent à la suite de chaque réponse vous permet de lire ou relire l'énoncé de l'exercice.
Bon amusement avec cette collection d'exercices.
Requête de projection qui affichera tous les champs 'Société' de la table 'Clients' toute entière. |
Requête de jointure (puisqu'elle fait appel à plusieurs tables) qui affichera tous les champs des tables 'Produit' et 'Détail_commande' qui ont un champ commun 'Code_produit'. Ou : la liste des enregistrements de la table 'Produit' qui ont le champ 'Code_produit' qui apparaît aussi dans la table 'Détail_commande'. Ou : la liste des infos concernant les produits commandés et les détails de ces commandes. |
Requête de sélection (ou restriction) qui affichera tous les champs de la table 'Etudiant' dont la ville a été enregistrée... et négligera donc les enregistrements où la ville n'a pas été encodée... ATTENTION : Une erreur fréquemment rencontrée est de faire précéder le NULL de = et non de IS ; ainsi : SELECT * est valable alors que la requête suivante est incorrecte : SELECT * |
Requête de restriction (sélection) qui affichera tous les noms, prénoms et salaires annuels du personnel qui gagne plus de 45 000 par an (12 fois le salaire mensuel... si ce sont des employés), et cela par ordre décroissant de salaire (du plus haut au plus bas) et si égalité de salaire, par ordre alphabétique des noms. |
Le filtre permet de n'afficher que les informations répondant à des critères spécifiques. La requête permet diverses mises en forme des tables: le tri, les filtres, afficher ou non des données, … Tout ce que peut faire un filtre pourra être fait par une requête, mais une requête peut faire bien plus : |
Requête de projection qui affichera tous les champs 'Société' de la table 'Clients' toute entière. |
Requête de projection qui affichera tous les champs 'Société' de la table 'Clients' toute entière. |
SELECT * Dans cet exemple, le lecteur notera l’utilisation du symbole * pour spécifier que l’on souhaite conserver dans le résultat tous les attributs (ou champs) de la relation (ou table) LIVRE. Le lecteur attentif aura noté l'absence du point-virgule final de la requête. |
SELECT Titre Dans cette requête la condition porte sur les attributs (ou champs) Editeur et Genre et le résultat retourné par la requête est la liste des titres. Il n’y a en effet pas nécessairement de liens entre les attributs retournés et ceux sur lesquels portent la condition. Le lecteur attentif aura noté l'absence du point-virgule final de la requête. Pour mieux distinguer les champs des tables, nous suggérons l'écriture suivante : SELECT cTitre |
SELECT D.Titre
|
SELECT A1.Identité |
Analyse préalable
SELECT * Dans cet exemple, le lecteur notera l’utilisation du symbole * pour spécifier que l’on souhaite conserver dans le résultat tous les attributs (ou champs) de la relation (ou table) Clients. |
Analyse préalable
SELECT Clients.Nom, Clients.Prenom Dans cet exemple, le lecteur notera l’utilisation du point qui sépare le nom de la table (ou relation) et les attributs (ou champs). SELECT Nom, Prenom |
Analyse préalable
SELECT Clients.Nom, Clients.Prenom Dans cet exemple, le lecteur notera l’utilisation du point qui sépare le nom de la table (ou relation) et les attributs (ou champs). SELECT Nom, Prenom |
Analyse préalable
SELECT Clients.Nom, Clients.Tel Le lecteur attentif aura remarqué que la condition ne doit pas porter sur un champ qui doit être affiché. Les prénoms n'apparaissent pas dans les champs à présenter à l'écran... puisque l'utilisateur a demandé les clients se prénomment Marc ou Philippe, il devinera (on espère) que les prénoms des clients affichés sont... Marc ou Philippe. Dans cet exemple, une dernière fois, le lecteur notera l’utilisation du point qui sépare le nom de la table (ou relation) et les attributs (ou champs). SELECT Nom, Tel Un lecteur attentif aura remarqué (merci Fred) que la réponse donnée ici n'est pas celle de la question : "Afficher les nom et prénom des clients dont les prénoms sont Marc ou Philippe", mais plutôt de la question : "Afficher les nom et numéro de téléphone des clients dont les prénoms sont Marc ou Philippe". |
Analyse préalable
SELECT Clients.Nom, Clients.Tel Dans cet exemple, une erreur fréquemment rencontrée est de limiter le critère à Comme dans la question 17, le lecteur attentif aura noté que la réponse notée ici est la réponse à "Afficher les nom et numéro de téléphone (et pas nom et prénom) des clients dont le nom commence par une lettre comprise entre B et E.". D'autres lecteurs, tout aussi attentifs, pourraient faire remarquer qu'une autre solution pouvait être acceptée : |
Analyse préalable
SELECT DISTINCT Clients.Ville Dans cet exemple, le paramètre DISTINCT qui élimine les doublons est nécessaire ; dans le cas contraire, toutes les villes seraient affichées... autant de fois qu'elles apparaissent dans la liste... inutile de lire 300 fois Mouscron si l'on a 300 clients mouscronnois. |
Analyse préalable
SELECT Commande.Num Dans cet exemple, les champs Codecli de la table Clients et de la table Commande n'ont servi quà établir le lien entre les deux tables. |
Analyse préalable
SELECT Commande.Num Un ordre de date croissant est l'ordre chronologique... donc, ici, l'ordre est l'inverse de l'ordre chronologique, donc descendant. |
Analyse préalable
SELECT Produits.Désignation, Produits.PU_HTVA*1.21 AS PU_TVAC Il n'y a que deux éléments à afficher... ils sont séparés par une virgule ; L'opérateur AS permet de créer un nouveau champ, résultat d'un calcul sur un champ existant ; Access travaille avec le point décimal, pas la virgule décimale... il y aurait risque de confusion avec les séparateurs de champs. |
Analyse préalable
SELECT COUNT (Produits.Codeprod) AS Q_prod Il n'y a qu'un seul élément à afficher... qui n'est pas un élément de la table, mais résulte d'un calcul opéré sur un/plusieurs champs de la table. La fonction Count(...) est une fonction de regroupement... elle dénombre les champs qui répondent à la condtion donnée dans WHERE. L'opérateur AS permet de nommer, créer ce nouvel élément, résultat d'un calcul (d'une fonction statistique) portant sur ce champ existant [le lecteur aura remarqué que n'importe quel champ aurait pu convenir, puisqu'il s'agit de compter le nombre d'enregistrements répondant au critère] ; Access travaille avec le point décimal, pas la virgule décimale... il y aurait risque de confusion avec les séparateurs de champs. Le lecteur ayant observé qu'il était fait mention de plusieurs tables dans l'énoncé se sera étonné de voir cet exercice présent ici et pas dans la série d'exercices concernant les jointures. La résolution ne fait appel qu'à une seule table, donc pas de jointure. |
Analyse préalable
SELECT SUM (Comporter.Quantite) AS Q_prodvend Il n'y a qu'un seul élément à afficher... qui n'est pas un élément de la table, mais résulte d'un calcul opéré sur un/plusieurs champs de la table. La fonction Sum(...) est une fonction de regroupement... elle fait la somme des champs qui répondent à la condtion donnée dans WHERE. L'opérateur AS permet de nommer, créer ce nouvel élément, résultat d'un calcul (d'une fonction statistique) portant sur ce champ existant [le lecteur aura remarqué que seul le champ Comporter.Quantite aurait pu convenir, puisqu'il s'agit de faire la somme des quantités vendues de ce produit pour toute les commandes qui comportaient ce produit] ; Ici aussi, le lecteur qui a observé qu'il était fait mention de plusieurs tables dans l'énoncé, se sera étonné de voir cet exercice présent ici et pas dans la série d'exercices concernant les jointures. La résolution ne fait appel qu'à une seule table, donc pas de jointure. |
Analyse préalable
SELECT AVG (Produits.PU_HTVA) AS Prix_moyen Il n'y a qu'un seul élément à afficher, Prix_moyen... qui n'est pas un élément de la table, mais résulte d'un calcul opéré sur tous les champs 'PU_HTVA' de la table. La fonction Avg(...) est une fonction de regroupement... elle fait la moyenne des champs qui répondent à la condition donnée dans WHERE (même si dans ce cas, il n'y a pas de WHERE). L'opérateur AS permet de nommer, créer ce nouvel élément, résultat d'un calcul (d'une fonction statistique) portant sur ce champ existant [le lecteur aura remarqué que seul le champ Produits.PU_HTVA aurait pu convenir, puisqu'il s'agit de faire la moyenne des prix HTVA pour tous les produits] ; La fonction MOYENNE se note AVG, raccourci de AVERAGE. |
Analyse préalable
SELECT MAX (Produits.PU_HTVA) AS Prix_maximal Il n'y a qu'un seul élément à afficher, Prix_maximal... qui n'est pas un élément de la table, mais résulte d'un calcul opéré sur tous les champs 'PU_HTVA' de la table. La fonction Max(...) est une fonction de regroupement... elle dénombre les champs qui répondent à la condition donnée dans WHERE (même si dans ce cas, il n'y a pas de condition WHERE). L'opérateur AS permet de nommer, créer ce nouvel élément, résultat d'un calcul (d'une fonction statistique) portant sur ce champ existant [le lecteur aura remarqué que seul le champ Produits.PU_HTVA aurait pu convenir, puisqu'il s'agit de trouver la plus grande valeur des prix HTVA pour tous les produits] ; La fonction MAXIMUM se note MAX, et le lecteur aura deviné le sens de MIN. |
Analyse préalable
SELECT Comporter.Num, COUNT (Comporter.Codeprod) AS Nbre_ref Il y a plusieurs éléments à afficher, Nbre_ref... qui ne sont pas des éléments de la table, mais résultent (pour chaque Num de commande) d'un calcul opéré sur tous les champs 'Codeprod' de la table 'Comporter'. La fonction Count(...) est une fonction de regroupement... elle dénombre les champs qui répondent à la condition donnée dans WHERE (inexistante ici). L'opérateur AS permet de nommer, créer ce nouvel élément, résultat d'un calcul (d'une fonction statistique) portant sur ce champ existant... sans que ce soit sur tous les champs de la table, mais bien sur des champs regroupés (par Num de commande) ; Tous les champs ne faisant pas partie d’une fonction d’agrégat de l’ordre SELECT (donc ici, le champ 'Num') doivent être repris dans la clause GROUP BY. La clause GROUP BY permet de créer des groupes d’enregistrements sur lesquels pourront être utilisées les fonctions d’agrégat. Elle est nécessaire dès lors que l’on souhaite afficher des données issues des tables et des données issues de fonctions d’agrégat. Le lecteur aura compris que ceci explique le pourquoi du paragraphe précédent. |
Analyse préalable
SELECT Comporter.Num, COUNT (Comporter.Codeprod) AS Nbre_ref Le lecteur relira ce qui a été dit dans la question (et la réponse) 27. La clause HAVING permet d’appliquer des sélections sur les regroupements créés à l’aide de la clause GROUP BY (nous les avons appelés filtres dans notre analyse préalable). Le lecteur pourrait confondre les conditions introduites par WHERE et les 'filtres' introduits par HAVING : Tous les champs ne faisant pas partie d’une fonction d’agrégat de l’ordre SELECT (donc ici, le champ 'Num') doivent être repris dans la clause GROUP BY ; La clause GROUP BY permet de créer des groupes d’enregistrements sur lesquels pourront être utilisées les fonctions d’agrégat et de filtres sur ces agrégats. Elle est nécessaire dès lors que l’on souhaite afficher des données issues des tables et des données issues de fonctions d’agrégat. |
Analyse préalable
En requêteur graphique : En SQL : SELECT Medicament.Mmed, Medicament.Mlib, Medicament.Mtaux, Medicament.Mprix, Medicament.Mtaux * Medicament.Mprix AS Remb, (1-Medicament.Mtaux)*Medicament.Mprix AS Part, Remb + Part AS Tot Le lecteur relira ce qui a été dit dans la question (et la réponse) 27. La clause HAVING permet d’appliquer des sélections sur les regroupements créés à l’aide de la clause GROUP BY (nous les avons appelés filtres dans notre analyse préalable). Le lecteur pourrait confondre les conditions introduites par WHERE et les 'filtres' introduits par HAVING : contrairement à l’ordre WHERE qui sélectionne les enregistrements, la clause HAVING sélectionne les résultats d’une fonction d’agrégat. Tous les champs ne faisant pas partie d’une fonction d’agrégat de l’ordre SELECT (donc ici, le champ 'Num') doivent être repris dans la clause GROUP BY ; La clause GROUP BY permet de créer des groupes d’enregistrements sur lesquels pourront être utilisées les fonctions d’agrégat et de filtres sur ces agrégats. Elle est nécessaire dès lors que l’on souhaite afficher des données issues des tables et des données issues de fonctions d’agrégat. |
SELECT Code Client SUM commandes FROM Client, Articles WHERE Client, Code client = Utiliser.code client AND Code client = P0152
Cette requête totalise la somme de toutes les commandes d'un client qui a comme clef P0152. On remarquera cependant les incorrections suivantes : |
Analyse préalable
INSERT INTO Produits (Codeprod, Designation, PU_HTVA) Le lecteur notera que la requête d'insertion de nouveaux enregistrements nécessite : ATTENTION, les valeurs des champs nouveaux entrées ne peuvent pas contenir d'apostrophes... sinon confusion entre les apostrophes délimitateurs de champs. :-( |
Analyse préalable
UPDATE Produits Le lecteur notera que la requête de modification de nouveaux enregistrements nécessite : ATTENTION, les valeurs des champs nouveaux entrées ne peuvent pas contenir d'apostrophes... sinon confusion entre les apostrophes délimitateurs de champs. :-( |
Analyse préalable
UPDATE Produits Le lecteur notera une dernière fois que la requête de modification de nouveaux enregistrements nécessite : Le lecteur aura compris qu'on aurait pu modifier les prix des articles en magasin qui coûtaient plus de 5 €... ou toute autre précision. ATTENTION, les valeurs des champs nouveaux entrées ne peuvent pas contenir d'apostrophes... sinon confusion entre les apostrophes délimitateurs de champs. :-( |
Analyse préalable
DELETE FROM Clients Le lecteur notera une dernière fois que la requête de suppression d'enregistrements nécessite : ATTENTION, si le WHERE est absent... tous les enregistrements seront effacés... quelle tristesse. |
Analyse préalable :
Le but de la requête est donc de saisir toutes les informations demandées pour un client spécifique. |
Analyse préalable
SELECT SUM (Comporter.Quantite) AS Q_prodvend Il n'y a qu'un seul élément à afficher... qui n'est pas un élément de la table, mais résulte d'un calcul opéré sur un/plusieurs champs des différentes tables. La fonction Sum(...) est une fonction de regroupement... elle fait la somme des champs qui répondent aux conditions données dans WHERE. L'opérateur AS permet de nommer, créer ce nouvel élément, résultat d'un calcul (d'une fonction statistique) portant sur ce champ existant [le lecteur aura remarqué que seuls les champs Vente.qté (ou V.qté) et Produit.prix (ou P.prix) auraient pu convenir, puisqu'il s'agit de faire la somme des produits des quantités vendues de ce produit par le prix du produit, pour toute les commandes qui comportaient un ou plusieurs produits] ; SELECT SUM([qté]*[prix]) AS [total à payer] |
SELECT nom, prénom, adresse, intitule, type, fournisseur, qté, prix_total, |
SELECT Enom |
SELECT NomCours, Note |
SELECT year(dateDeNaissance), count(*) AS combien La liste ne commencera par forcément par l'année de naissance la plus ancienne, mais sera affichée par ordre des années de naissance rencontrées dans la table... le lecteur pourrait supposé que l'ordre des naissances et l'ordre d'établissement de la table soit identique... c'est faire sans penser qu'un étudiant de quarante ans aurait pu s'inscrire en l'an 2000... et dans une école qui a plus de 160 ans d'histoire... |
SELECT year(dateDeNaissance), count(*) AS combien 1.- 2.- |
SELECT year(dateDeNaissance), count(*) AS combien Le lecteur se rappellera que dans des regroupements, la sélection ne s'effectue pas par un WHERE, mais par un HAVING. La requête se transformera donc en : Comme le suggère la question, les codes postaux commençant par :
|
24 requêtes concernant une table unique des employés d'une entreprise : emp (nom, num, fonction, nsup, embauche,salaire, comm, ndept) où 1. Donner les noms et les départements des employés gagnant entre 20000 et 25000.
|
Le code SQL exécuté est le suivant : SELECT tblVacances.NomEmployé, tblVacances.DébutVac, tblVacances.FinVac Le lecteur notera la conversion en format américain des dates entrées en format européen... Le lecteur notera également l'importance des parenthèses : Rappelons que : * NOT est appliqué avant AND. En résumé, De même, 1 + 2 * 3 = 7 et (1 + 2) * 3 = 9 Généralement une requête de ce type sera la source d'un état. |
SELECT Nom, Prénom, Fonction Le lecteur attentif pourrait s'étonner qu'Access note d'office 'requête sélection', alors qu'il ne s'agit ici que d'une projection, puisqu'il n'y a aucun critère de sélection (where). Access ne fait pas cette différence théorique. |
Analyse préalable
SELECT nom, COUNT(*) AS [nombre de cours animé]
Analyse préalable
SELECT libellé
Analyse préalable
SELECT nom |
Clients (Codecli, Nom, Prenom, Adresse, CP, Ville, Tel) Les requêtes suivantes ne donneront pas forcément la même réponse : SELECT Nom, Date et SELECT Nom, Date car n'apparaîtront pas dans la seconde requête les clients dont le téléphone n'aura pas été encodé dans la table Clients... Les pros d'Access parlent de jointure naturelle quand le lien entre les tables est fait par la clef primaire d'une table (Codecli) qui est une clef secondaire (ou étrangère) de l'autre table ; c'est le cas ici. On aurait dû préférer écrire : SELECT Nom, Date ou, encore mieux : SELECT Nom, Date mais ce type de jointure exige que les champs qui servent à faire la jointure soit strictement identiques... y compris le nom du champ... |
Clients (Codecli, Nom, Prenom, Adresse, CP, Ville, Tel) Expliquer pourquoi la requête suivante devient d'une plus grande utilité : SELECT Nom, Date Notre but était d'afficher chaque nom de client avec le(s) date(s) de commande(s) qu'il a faite(s)... Le lecteur aura noter l'oubli du point-virgule qui doit achever toute requête SQL. Signalons au lecteur qu'il était possible d'employer ici la technique du surnommage : on attribue un surnom à chacune des tables présente dans la partie FROM du SELECT ; ainsi, on aurait pu avoir la requête suivante : SELECT Nom, Date |
Clients (Codecli, Nom, Prenom, Adresse, CP, Ville, Tel) Expliquer pourquoi la requête suivante n'est pas d'une plus grande utilité : SELECT Nom, Date Nous n'avons pas fait mieux, car nous avons créé une clause toujours vraie, un peu à la manièreb de 1 = 1 ! Il est donc nécessaire d'indiquer au compilateur la provenance de chacune des champs Codecli et donc d'opérer une distinction entre l'une et l'autre colonne (ou champ ou attribut). |
Clients (Codecli, Nom, Prenom, Adresse, CP, Ville, Tel) La requête suivante n'est d'aucune utilité : SELECT Nom, Date Car cette requête ne possède pas de critère de jointure entre une table et l'autre (Clients et Commande). Même si notre intention était d'avoir la liste des clients et les dates de leur(s) commande(s). Dans cette requête, le compilateur SQL calcule le produit cartésien des deux ensembles, c'est à dire qu'à chaque ligne de la première table (Clients), il accole l'ensemble des lignes de la seconde (Commande) à la manière d'une "multiplication des petits pains" ! Nous verrons qu'il existe une autre manière, normalisée cette fois, de générer ce produit cartésien. Mais cette requête est à proscrire. Dans notre exemple elle génère autant de lignes... que le nombre de clients multiplié par le nombre de commandes... Utile ? Il faut donc définir absolument un critère de jointure. |
Pour chaque participant afficher le numéro matricule, le nom, le prénom ainsi que le nombre de cours auxquels il a participé. Analyse préalable
SELECT matricule, nom, prénom, COUNT(*) AS [nombre de cours]
Afficher le numéro matricule, le nom et le prénom ainsi que le nombre total d’heures prestées par chaque animateur. Analyse préalable
SELECT animateurs.matricule_animateur, nom, prénom, SUM(nbre_heures) Ces deux exercices se ressemblent étrangement... mais pour le premier il faudra compter le nombre d'enregistrements par participant, tandis que pour le deuxième il faudra faire la somme du contenu de chaque champ nbre_heures par animateur. |
Afficher pour chaque entreprise (code et nom de l’entreprise) le nombre de participants triés suivant l’ordre croissant des noms d’entreprise. Analyse préalable
SELECT entreprises.code_entreprise, entreprises.nom, COUNT(*) |
SELECT * Le lecteur se rappellera que le joker '*' signifie 'toutes rubriques' ou 'tous les champs'. |
SELECT * |
SELECT Société, Adresse, [Code postal], Ville, Téléphone, Fax Le lecteur aura observé que les conventions informatiques relatives à la portabilité des fichiers ont été peu utilisées dans cet exercice : il aurait été profitable de ne pas utiliser de caractères accentués dans les noms de champs, de même, l'emploi d'espace dans les noms de champs est compensé par l'emploi des crochets. Attention : La rubrique ou champ Nom n’existe pas dans Clients, et Adresse est insuffisant, il faut y ajouter les champs 'code postal' et 'ville'. |
. |
. |
. |
Analyse préalable
Il ne s'agit pas ici d'une requête de jointure, puisqu'il n'est fait appel qu'à une seule table... comme on travaille dans une base comportant plusieurs tables, il peut être prudent de rappeler le nom de cette table. On a affaire à une requête paramétrée ; en effet, l'utilisateur devra répondre à une question [entrez la date (m/jj/aa)]. La traduction SQL de la requête du requêteur graphique est : A) SELECT Coulées.[Code Equipe], Coulées.[date de fabrication], Count(Coulées.[nombre de brames]) AS [CompteDenombre de brames] Mais, un lecteur attentif devrait nous faire remarquer que la requête ci-dessus ne compte pas le nombre de brames, mais le nombre de coulées, sans tenir compte de la valeur de l'argument [nombre de brames] de chaque coulée... Count ne fait que compter le nombre d'enregistrements, Sum fait la somme du contenu d'une colonne... Pour en tenir compte, il aurait fallu non pas les compter (le nombre de fois que l'argument apparaît), mais en faire leur somme... d'où, la réponse (non conforme à notre requête graphique, qui aurait dû mentionner 'somme' au lieu de 'compte')... SELECT Coulées.[Code Equipe], Coulées.[date de fabrication], Sum(Coulées.[nombre de brames]) AS [CompteDenombre de brames] B) Quelle est la production journalière du jour dont on entre la date ? |
Analyse préalable
Un seul champ à afficher (Num) de la table Commande, mais ce champ peut avoir différentes valeurs. Requête de jointure puisqu'on travaille dans 2 tables unifiées par 'Clients.Codecli = Commande.Codecli'. Un classement par ordre de date descendant, cela veut donc dire en commençant par les plus récentes commandes et en allant vers les plus anciennes. A) Notre but est donc d'afficher le (ou les) numéro(s) de commande(s) qui ont été passées par un client (mais rien ne garantit qu'il soit unique) s'appelant 'Homère Dalors', en commençant par les commandes les plus récentes. B) S'il s'agissait d'un OR, notre but aurait été d'afficher le (ou les) numéro(s) de commande(s) qui ont été passées par tous les clients prénommés 'Homère' ou dont le nom de famille est 'Dalors', en commençant par les commandes les plus récentes.
|
Analyse préalable
SELECT Employes.Nom, Employes.Prenom Dans cet exemple, le lecteur notera l’utilisation du point qui sépare le nom de la table (ou relation) et les attributs (ou champs). SELECT Nom, Prenom On notera qu'Access sous Windows ne nécessite pas l'emploi des guillemets... comme il s'agit d'un champ de type 'texte', Access notera ces guillemets d'office. De même, il marquerait d'un # les champs de type 'date' et rien pour les champs de type 'numérique' ou 'monétaire'. $$$image req graph |
Afficher pour chaque participant son nom et son prénom, le nom de son entreprise ainsi que les thèmes (en toutes lettres) des cours auxquels il a participés (triés suivant les numéros matricules des participants et des thèmes) Analyse préalable
SELECT participants.nom, prénom, entreprises.nom, thèmes.désignation Excellente utilisation de jointures multiples. Elles ont été résolues ci-avant par des WHERE, méthode d'access pour les versions précédentes... l'avenir fera usage de l'insruction JOIN...
|
Afficher pour chaque cours le code cours, le nom et le prénom de l’animateur responsable. Analyse préalable
SELECT code_cours, nom, prénom
Afficher pour chaque cours son code, le thème et le nom et le prénom de l’animateur responsable. Analyse préalable
SELECT code_cours, désignation, nom, prénom |
Afficher le code entreprise et le nombre total de participants par entreprise. Analyse préalable
SELECT code_entreprise, COUNT(*) AS [nombre de participants] Afficher le numéro matricule et le nombre total d’heures prestées pour les animateurs ayant presté plus de 10 heures. Analyse préalable
SELECT matricule_animateur, SUM(nbre_heures) AS [nombre d'heures prestées] Afficher le numéro matricule et le nombre total d’heures prestées pour les animateurs ayant presté plus de 10 heures et qui sont nés en 68. Analyse préalable
SELECT matricule_animateur, SUM(nbre_heures) AS [nombre d'heures prestées] Le lecteur attentif pourrait se demander s'il n'était pas plus facile de considérer la condition (matricule_animateur like "1968*") comme filtre à la place de la considérer comme condition... l'ordinateur devrait alors faire les sommes pour tous les animateurs, calcul inutile si l'animateur n'a pas un matricule commençant par "1968"... Le lecteur aura aussi remarqué que la condition sur un regroupement ne commence pas par un WHERE, mais bien par HAVING... |
Calculer le total des heures prestées par l’animateur ayant le numéro matricule 19800202222. Analyse préalable
SELECT SUM(nbre_heures) Afficher le numéro matricule et le nombre total d’heures prestées par chaque animateur tirés suivant l’ordre croissant des numéros matricule. Analyse préalable
SELECT matricule_animateur, SUM(nbre_heures) |
Calculer le total des heures prestées par les animateurs pour tous les cours. Analyse préalable
SELECT SUM(nbre_heures) AS [total des heures prestées] Calculer le total des heures prestées par les animateurs pour le cours no 005. Analyse préalable
SELECT SUM(nbre_heures) AS [total des heures prestées pour le cours 005] |
Quel est le code du cours dont le droit d’inscription est le plus élevé ? Analyse préalable
SELECT code_cours Quel est le code du cours dont le droit d’inscription est le plus bas ? Analyse préalable
SELECT code_cours Ces deux exercices peuvent servir d'exemples pour ceux qui veulent introduire la notion de "requêtes imbriquées". Il s'agit en effet de requêtes qui font appel au(x) résultat(s) d'une autre requête (que nous avons notée en rouge ci-dessus. Le lecteur sera attentif au jeu de parenthèses... celles encadrant la requête et celles nécessaires dans la requête. |
Calculer la moyenne des droits d’inscription, des primes de responsabilité et des tarifs heure. Analyse préalable
SELECT AVG(droit_inscip) AS [droit d’inscription moyen], Combien de cours organise-t-on pour chaque niveau ? Analyse préalable
SELECT niveau, COUNT(*) AS [nombre de cours] |
Analyse préalable
SELECT COUNT(*) AS [nombre total de cours] 2 . Combien de participants a-t-on eus dans tous les cours ? Analyse préalable
SELECT COUNT(*) AS [nombre total de participants] 3 . Combien de participants a-t-on eus pour le cours no 026 ? Analyse préalable
SELECT COUNT(*) AS [nombre participants au cours 026]
|
Avec le requêteur graphique : En langage SQL : SELECT Count(Leçon.Id_moniteur) AS NB Le lecteur... |
Avec le requêteur graphique : En langage SQL, variante préférée avec JOIN : SELECT Count(Leçon.Id_moniteur) AS NB En langage SQL, variante possible avec WHERE : SELECT Count(Leçon.Id_moniteur) AS NB Le lecteur attentif aura remarqué la redondance de parenthèses inutiles dans la dernière ligne des deux variantes : HAVING (((Moniteur.Nom_moniteur)="suzuki")); les bleues n'auraient dû être employées que si un nom de table ou de champ comportaient des espaces ; |
SELECT COUNT(*) AS [nombre de participants nés en 68] Cette requête comptera le nombre d'enregistrements qui répondent au critère défini dans le 'where'. |
SELECT nom, prénom Cet exemple illustre bien la différence entre |
SELECT nom, prénom Cet autre exemple illustre bien la différence entre les caractères '*' et '?' dans un LIKE. |
SELECT nom, prenom |
Afficher tous les noms et prénoms des participants dont le nom commence avec la lettre N |
SELECT code_cours, droit_inscrip, prime_resp |
Les requêtes (1) et (3) donneront le même résultat [Afficher les codes des cours et les dates des cours qui ont eu lieu 8 mars 2007 et 10 septembre 2007] ; attention au sens français des ET et OU et des traductions rigoureuses en logique de AND et OR : (1) (2) (3) (4) (5) |
Afficher les matricules des animateurs responsables et la date des cours qui ont eu lieu entre le 1er janvier et 31 janvier 2007. |
SELECT code_cours, date, code_thème Cet exemple rappellera au lecteur la nécessité d'entourer une date des signes 'dièze' dans toute requête SQL, et de terminer sa requête par un point-virgule... |
SELECT code_entreprise, nom, prénom |
1.- 5 champs seront affichés : matricule, nom, prénom, localité et code_entreprise. 2.- la question ne précise pas le nombre d'enregistrements (= de données) que compte cette table de la base, donc impossible de répondre. Le lecteur attentif aura remarqué qu'un effort a été fait pour éviter les espaces dans le nom des champs (usage du signe 'underscore _ '), mais que des caractères accentués ont malheureusement été employés... |
SELECT DISTINCT date Le lecteur aura remarqué que, par défaut, l'odre est ascendant ; il est donc inutile de préciser la ASC... si l'on veut l'ordre inverse, il faut préciser DESC en fin de ligne ORDER BY. |
SELECT nom, prénom Rappelons au lecteur que dans l'exercice présent et dans celui-ci, il aurait été favorable de ne pas employer de caractères accentués pour les noms des champs. De même, le lecteur attentif aura noté qu'il manque le point-virgule obligatoire en fin de toute instruction SQL. |
. |
Analyse préalable
Champs concernés | PU_HTVA (champ à corriger) |
Tables concernées | Produits |
Conditions | aucune |
Regroupement | aucun |
Filtre | aucun |
Classement | aucun |