Chapitre 08 Les requêtes d'interrogation en langage SQL
Chapitre 08 Les requêtes d'interrogation en langage SQL
Chapitre 08 Les requêtes d'interrogation en langage SQL
Transformez vos PDF en papier électronique et augmentez vos revenus !
Optimisez vos papiers électroniques pour le SEO, utilisez des backlinks puissants et du contenu multimédia pour maximiser votre visibilité et vos ventes.
<strong>Chapitre</strong> <strong>08</strong><br />
<strong>Les</strong> requêtes <strong>d'interrogation</strong> <strong>en</strong> <strong>langage</strong><br />
<strong>SQL</strong><br />
Introduction<br />
L'étude des requêtes <strong>d'interrogation</strong> de la base de données est séparée <strong>en</strong> deux parties :<br />
- Une première partie permet de revoir le <strong>langage</strong> <strong>SQL</strong> de base qui a été abordé <strong>en</strong><br />
classe de première.<br />
- La deuxième partie complète ces notions <strong>en</strong> abordant les fonctions, les calculs et<br />
les regroupem<strong>en</strong>ts.<br />
La mise <strong>en</strong> situation s'appuie à nouveau sur la base de données de facturation cli<strong>en</strong>t. Il<br />
peut être intéressant de faire travailler les élèves sur informatique (<strong>en</strong> utilisant le fichier<br />
C<strong>08</strong> Mise <strong>en</strong> situation Elève.mdb) pour voir la construction des requêtes des parties<br />
"analyser": Elles peuv<strong>en</strong>t être visualisées <strong>en</strong> <strong>SQL</strong> mais aussi <strong>en</strong> QBE dans le but de<br />
faciliter l'assimilation des différ<strong>en</strong>tes clauses. <strong>Les</strong> réponses aux parties "appliquer"<br />
peuv<strong>en</strong>t aussi être directem<strong>en</strong>t rédigées sous Access afin de bénéficier de l'aide du QBE<br />
pour les élèves <strong>en</strong> difficultés.<br />
L'<strong>en</strong>semble des bases de données servant de support à tous les exercices de ce chapitre<br />
est inclus dans le CDROM. Ceci laisse le choix aux <strong>en</strong>seignants de faire travailler les<br />
élèves sur informatique (pour faciliter les appr<strong>en</strong>tissages) ou par écrit (pour préparer<br />
l'exam<strong>en</strong>).<br />
La création de requêtes sur une base de données purem<strong>en</strong>t comptable est étudiée dans le<br />
TD d'application informatique.<br />
Mise <strong>en</strong> situation<br />
<strong>Les</strong> élèves peuv<strong>en</strong>t travailler directem<strong>en</strong>t sur la base de données fournie sur le CDROM.<br />
<strong>Les</strong> requêtes de la mise <strong>en</strong> situation sont déjà rédigées (sauf celles des parties "appliquer"<br />
uniquem<strong>en</strong>t données dans le corrigé).<br />
Doc. 1 Requête : affichage du nom des cli<strong>en</strong>ts qui habit<strong>en</strong>t Versailles<br />
1.<br />
SELECT : nom du ou des champ(s) à visualiser (Projection)<br />
FROM : la ou les table(s) utilisée(s) dans la requête<br />
WHERE : critère de restriction (Sélection)<br />
2.<br />
Le mot Versailles est du texte. Tous les élém<strong>en</strong>ts <strong>en</strong> format texte doiv<strong>en</strong>t être <strong>en</strong>tourés de<br />
guillemets (sous Access).
3.<br />
SELECT Num_cli<strong>en</strong>t<br />
FROM CLIENT<br />
WHERE Nom_cli<strong>en</strong>t="SRSS";<br />
Doc. 2 Requête : affichage du nom et du téléphone des cli<strong>en</strong>ts qui ont acheté<br />
au moins trois produits id<strong>en</strong>tiques<br />
1.<br />
Pour réaliser cette requête les champs suivants sont nécessaires :<br />
- Nom_cli<strong>en</strong>t et Téléphone (à projeter) cont<strong>en</strong>us dans la table CLIENT<br />
- Quantité (critère de restriction) cont<strong>en</strong>u dans la table LIGNE_FACTURE<br />
Il n'y a pas de li<strong>en</strong> direct <strong>en</strong>tre les relations CLIENT et LIGNE_FACTURE. Il faut donc<br />
inclure la relation FACTURE pour relier les trois relations.<br />
2.<br />
La clause WHERE permet d'effectuer la jointure de la manière suivante :<br />
WHERE Nom de table1.clé primaire = Nom de table2.clé étrangère<br />
3.<br />
SELECT Désignation_produit<br />
FROM PRODUIT, LIGNE_FACTURE<br />
WHERE PRODUIT.Num_produit=LIGNE_FACTURE.Num_produit<br />
AND Num_facture="F0002";<br />
Doc. 3 Analyse d'une requête<br />
1.<br />
La clause BETWEEN permet d'<strong>en</strong>cadrer un critère dans un intervalle.<br />
2.<br />
La clause ORDER BY classe dans l'ordre croissant un champ particulier.<br />
Remarque : Pour effectuer un tri décroissant il faut utiliser ORDER BY nom du champ<br />
DESC<br />
3.<br />
SELECT Désignation_produit<br />
FROM PRODUIT<br />
WHERE Prix_HT BETWEEN 100 AND 400<br />
ORDER BY Désignation_produit;<br />
Doc. 4 <strong>Les</strong> calculs <strong>en</strong> <strong>SQL</strong><br />
1.<br />
Il est possible d'utiliser les quatre opérateurs arithmétiques (+, -, /, *) <strong>en</strong> combinant des<br />
noms de champ et/ou des chiffres.<br />
2.<br />
SELECT Prix_HT*1.196 AS Prix_TTC<br />
FROM PRODUIT<br />
WHERE Num_produit="PR001";<br />
2 – <strong>Chapitre</strong> <strong>08</strong>
Doc. 5 <strong>Les</strong> fonctions <strong>en</strong> <strong>SQL</strong><br />
1.<br />
Requête 1 : Elle affiche la quantité totale des produits v<strong>en</strong>dus dans la facture n° F0002.<br />
Requête 2 : Elle affiche le nombre des produits v<strong>en</strong>dus dans la facture n° F0002.<br />
La fonction SUM permet de réaliser une addition (une somme) des valeurs cont<strong>en</strong>ues<br />
dans le champ spécifié. Cette fonction doit s'appliquer sur un champ au format numérique.<br />
La fonction COUNT compte le nombre d'<strong>en</strong>registrem<strong>en</strong>ts d'une table. Elle est utilisable sur<br />
n'importe quel type de champ (texte, numérique…).<br />
2.<br />
SELECT nom de la fonction (nom du champ) as titre du champ<br />
Le mot clé "as" est facultatif. Il permet de r<strong>en</strong>ommer le champ qui conti<strong>en</strong>t le calcul.<br />
3.<br />
SELECT Min (Prix_HT) AS Prix_le_plus_faible<br />
FROM PRODUIT;<br />
Doc. 6 <strong>Les</strong> regroupem<strong>en</strong>ts<br />
1.<br />
Requête 1 : Elle affiche le numéro des factures pour lesquels il y a au moins deux produits<br />
v<strong>en</strong>dus (la facture F0002 apparaît deux fois car elle conti<strong>en</strong>t deux lignes de deux<br />
produits).<br />
Requête 2 : Elle affiche le numéro des factures pour lesquels il y a au moins deux produits<br />
v<strong>en</strong>dus. Par contre, elle effectue un regroupem<strong>en</strong>t par facture pour éviter d'avoir des<br />
doublons (la facture F0002 n'apparaît plus qu'une fois).<br />
2.<br />
SELECT Désignation_produit<br />
FROM PRODUIT, LIGNE_FACTURE<br />
WHERE PRODUIT.Num_produit=LIGNE_FACTURE.Num_produit<br />
AND Quantité>=2<br />
GROUP BY Désignation_produit;<br />
Doc. 7 <strong>Les</strong> regroupem<strong>en</strong>ts avec restriction<br />
1.<br />
Requête 1 : Elle affiche le nombre de cli<strong>en</strong>ts par ville<br />
Requête 2 : Elle affiche les villes dans lesquelles se trouv<strong>en</strong>t au moins deux cli<strong>en</strong>ts<br />
La clause HAVING permet de spécifier un critère dans le regroupem<strong>en</strong>t<br />
2.<br />
SELECT Count(Num_facture) AS nombre, Num_cli<strong>en</strong>t<br />
FROM FACTURE<br />
GROUP BY Num_cli<strong>en</strong>t<br />
HAVING COUNT (Num_facture)=1;<br />
3
Exercices<br />
Ex. 1 <strong>Les</strong> requêtes de base<br />
1.<br />
SELECT Nomfour<br />
FROM FOURNISSEUR<br />
WHERE ville="Paris";<br />
2.<br />
SELECT Nomfour<br />
FROM FOURNISSEUR<br />
WHERE nomfour like "D*";<br />
3.<br />
SELECT *<br />
FROM COMMANDE<br />
ORDER BY MontantHT;<br />
4.<br />
SELECT Nomfour<br />
FROM FOURNISSEUR, COMMANDE<br />
WHERE FOURNISSEUR.Numfour=COMMANDE.Numfour<br />
AND Numcom="C0002";<br />
5.<br />
SELECT Numcom, MontantHT<br />
FROM COMMANDE<br />
WHERE Date BETWEEN #05/15/2006# AND #05/20/2006#;<br />
6.<br />
SELECT Nomfour, rue, CP, ville<br />
FROM FOURNISSEUR, COMMANDE<br />
WHERE FOURNISSEUR.Numfour=COMMANDE.Numfour<br />
AND MontantHT>1000;<br />
Ex. 2 <strong>Les</strong> calculs et les fonctions<br />
1.<br />
SELECT Sum(MontantHT) AS Montant_total<br />
FROM COMMANDE<br />
WHERE Numfour="40102";<br />
2.<br />
SELECT Count(Numfour) AS Nombre<br />
FROM FOURNISSEUR<br />
WHERE ville = "Paris";<br />
4 – <strong>Chapitre</strong> <strong>08</strong>
3.<br />
SELECT Count(Numcom) AS Nombre<br />
FROM FOURNISSEUR, COMMANDE<br />
WHERE FOURNISSEUR.Numfour = COMMANDE.Numfour<br />
AND Nomfour = "DUPOND";<br />
Ex. 3 <strong>Les</strong> regroupem<strong>en</strong>ts<br />
1.<br />
SELECT Nomfour, Count(Numcom) AS Nombre<br />
FROM FOURNISSEUR, COMMANDE<br />
WHERE FOURNISSEUR.Numfour = COMMANDE.Numfour<br />
GROUP BY Nomfour;<br />
2.<br />
SELECT Nomfour, Sum(MontantHT) AS Montant<br />
FROM FOURNISSEUR, COMMANDE<br />
WHERE FOURNISSEUR.Numfour = COMMANDE.Numfour<br />
AND Date BETWEEN #05/15/2006# AND #05/25/2006#<br />
GROUP BY Nomfour;<br />
3.<br />
SELECT Numfour, Sum(montantHT)*1.055 AS Montant<br />
FROM COMMANDE<br />
GROUP BY Numfour;<br />
Ex. 4 Utilisation de l'<strong>en</strong>semble des paramètres des requêtes <strong>en</strong> <strong>SQL</strong><br />
1.<br />
SELECT Nomcli, Téléphone<br />
FROM CLIENT, VENTE<br />
WHERE CLIENT.Numcli=VENTE.Numcli<br />
AND Montant_HT>10000<br />
ORDER BY Nomcli;<br />
2.<br />
SELECT Sum(Montant_HT) AS CA_total<br />
FROM VENTE;<br />
3.<br />
Cette requête permet d'afficher le nom des commerciaux et leur montant total de<br />
commission sur le chiffre d'affaires.<br />
5
Ex. 5 Utilisation de l'<strong>en</strong>semble des paramètres des requêtes <strong>en</strong> <strong>SQL</strong><br />
1.<br />
SELECT Libellé, Prix_HT<br />
FROM PRODUIT, CATEGORIE<br />
WHERE PRODUIT.Code_cat=CATEGORIE.Code_cat<br />
AND Désignation = "partition"<br />
ORDER BY Libellé;<br />
2.<br />
SELECT *<br />
FROM PRODUIT<br />
WHERE Prix_ht betwe<strong>en</strong> 10 AND 50;<br />
3.<br />
SELECT Count(Num_prod) AS nombre<br />
FROM COMPRENDRE<br />
WHERE Num_com="C0004";<br />
4.<br />
SELECT Libellé, Prix_ht*Quantité AS Montant_total<br />
FROM PRODUIT, COMPRENDRE<br />
WHERE PRODUIT.Num_prod=COMPRENDRE.Num_prod<br />
AND Num_com="C0004";<br />
5.<br />
SELECT Nom_cli, Count(Num_prod) AS Nombre<br />
FROM CLIENT, COMMANDE, COMPRENDRE<br />
WHERE CLIENT.Num_cli = COMMANDE.Num_cli<br />
AND COMMANDE.Num_com = COMPRENDRE.Num_com<br />
GROUP BY Nom_cli<br />
HAVING COUNT (Num_prod)>=2;<br />
Ex. 6 Application informatique<br />
Le corrigé complet est dans le fichier C<strong>08</strong> Appli info Corrigé.mdb sur le CDrom.<br />
<strong>Les</strong> élèves peuv<strong>en</strong>t travailler directem<strong>en</strong>t dans la base de données nommée : C<strong>08</strong> Appli<br />
info Elève.mdb<br />
Rappels:<br />
1. Pour rédiger une requête <strong>SQL</strong> sous ACCESS:<br />
1- Créer une requête <strong>en</strong> mode création<br />
2- Fermer la f<strong>en</strong>être "Ajouter une table"<br />
3- Cliquer sur l'icône <strong>SQL</strong> <strong>en</strong> haut à gauche de l'écran<br />
2. Il est possible de créer ces requêtes <strong>en</strong> QBE et de visualiser leur traduction <strong>en</strong> <strong>SQL</strong>. Mais,<br />
Access utilise le <strong>SQL</strong>2, une notation un peu différ<strong>en</strong>te que celle du <strong>SQL</strong> vu dans ce chapitre.<br />
Remarque: Il aurait été intéressant de réaliser dans ce TD des requêtes pour le journal, le grand<br />
livre, la balance et les docum<strong>en</strong>ts de synthèse. Mais, ces requêtes sont trop complexes pour les<br />
élèves de terminale. Néanmoins, ils pourront les visualiser dans le fichier de la mise <strong>en</strong> situation<br />
du chapitre 10.<br />
6 – <strong>Chapitre</strong> <strong>08</strong>
1.<br />
SELECT Libellé_compte<br />
FROM PLAN_DE_COMPTE<br />
WHERE Num_compte = "218300";<br />
2.<br />
SELECT *<br />
FROM PLAN_DE_COMPTE<br />
WHERE Num_compte like "4*";<br />
3.<br />
SELECT PLAN_DE_COMPTE.Num_compte, Libellé_compte, Débit, Crédit,<br />
Libellé_écriture<br />
FROM PLAN_DE_COMPTE, ECRITURE, ENREGISTREMENT<br />
WHERE PLAN_DE_COMPTE.Num_compte = ENREGISTREMENT.Num_compte<br />
AND ENREGISTREMENT.Num_écriture = ECRITURE.Num_écriture<br />
AND Date_écriture = #07/05/2006#;<br />
4.<br />
SELECT Sum(Crédit) AS solde<br />
FROM ENREGISTREMENT<br />
WHERE Num_compte="401001";<br />
Remarque : pour afficher véritablem<strong>en</strong>t le solde du compte 401001, il faut utiliser la requête suivante :<br />
SELECT Sum(Crédit)-Sum(Débit) AS solde<br />
FROM ENREGISTREMENT<br />
WHERE Num_compte="401001";<br />
5.<br />
SELECT Sum(Crédit) AS solde<br />
FROM ENREGISTREMENT<br />
WHERE num_compte like "401*";<br />
Remarque : pour afficher véritablem<strong>en</strong>t le montant total des dettes fournisseurs, on utilise la requête<br />
suivante :<br />
SELECT sum(Crédit)-sum(Débit) AS solde<br />
FROM ENREGISTREMENT<br />
WHERE num_compte like "401*";<br />
6.<br />
SELECT Sum(Débit)-Sum(Crédit) AS solde<br />
FROM ENREGISTREMENT<br />
WHERE Num_compte = "512000";<br />
7.<br />
SELECT Sum(Débit) AS Total_débit, Sum(Crédit) AS Total_crédit<br />
FROM ENREGISTREMENT;<br />
8.<br />
SELECT Num_écriture, Count(Num_compte) AS Nombre_de_compte<br />
FROM ENREGISTREMENT<br />
GROUP BY num_écriture;<br />
7