Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

comptabilite1_chapitre2_DGC

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 29

TITRE : Système d’information et de Gestion

Déroulement : Cours/TD/TP
Filière : COMPTABILITE & GESTION
Niveau : 1 ère année
Semestre : 3
Prof : TATI LAMBERT
Tél: 06 643 85 23
Année académique 2019-2020
Chapitre 2 : Les requêtes
(SQL)
Objectif :
- Maîtriser la manipulation des données
- Maîtriser l’analyse et la technique qui prévalent à la création d’une
base de donnée (SGBDR Microsoft Access)
I- Les requêtes : syntaxe de base
Une requête (en anglais query) est une question posée à une base de données concernant les informations qu’elle contient.
Toute requête se comprend sur la base d’un raisonnement à 3 temps:
1: exprimer un besoin d’information
Quels sont les professeurs de DGC qui habitent à POINTE NOIRE?
2: programmer grâce au langage SQL le moyen de satisfaire ce besoin
SELECT NomProf, PrenomProf, Ville
FROM PROFESSEUR
WHERE Ville=‘’POINTE NOIRE’’ ;
3: obtenir la réponse formelle
NomProf PrenomProf Ville
TATI LAMBERT POINTE NOIRE
MAZONZA GASTON POINTE NOIRE
Lors d’une évaluation, la phase la plus importante est la phase 2 dans laquelle l’étudiant doit exprimer en SQL les éléments qui
Lui sont proposés
Les règles de base reposent sur les instructions et mots-clés fondamentaux suivants:
- l’ordre SELECT suivi des champs à afficher
- Le mot FROM permettant d’indiquer la ou les table(s) concernée(s)
- L’expression WHERE (pas nécessairement présente) qui exprime à la fois des restrictions et des éléments purement techniques
Exemple :
Voici une requête permettant d’établir une liste d’étudiant (nom, prenom , Tél) restreinte à ceux inscrits à l’UE 118 : système
d’information de gestion, de sexe féminin, habitants POINTE NOIRE et ayant une note au moins égale à 14
SELECT Nom, Prenom, Tel
FROM ETUDIANT, INSCRIRE, UE
WHERE Sexe =‘’F’’
AND Note >=14
AND Ville =‘’POINTE NOIRE’’
AND LibelleUE=‘’SIG’’
AND ETUDIANT.CodeEtud=INSCRIRE.#CodeEtud
AND INSCRIRE.#CodeUE=UE.CodeUE;
Les deux dernières lignes sont des éléments purement technique de la requête permettant de vérifier la jointure entre les
Tables invoquées
La jointure a pour but d’exprimer le lien entre la table ETUDIANT, la table INSCRIRE et la table UE
Les différentes conditions de jointure ou de sélection dans la clause WHERE sont liées par l’opérateur AND pour indiquer que
toutes les conditions doivent être vérifiées
A. LE SELECT
L’instruction SELECT permet la projection qui réduit le nombre de colonnes d’une relation pour n’en garder que certaines
Colonnes
SELECT attribut1, attribut2
FROM table;
Si l’on souhaite éliminer les doublons, il faut utiliser en plus la clause DISTINCT
SELECT DISTINCT attribut2 AS alias1
FROM table;
L’instruction AS permet d’attribuer un nouveau nom à l’attribut projeté. On parle d’alias. Le nom initial de l’attribut sera
Remplacé par l’alias retenu
B. LE FROM

L’instruction FROM a pour objet d’indiquer la ou les table(s) nécessaire(s) à la réalisation de la requête. Certaines requêtes
Peuvent être monotable, mais la plupart sont multitables, ce qui nécessite alors de prévoir la formalité procédurale : la jointure
Règle d’écriture :
SELECT table1.attribut1, table2.attribut2
FROM table1, table2
WHERE critère de jointure ;
Exemple :
SELECT ETUDIANT.Nom, ETUDIANT.Prenom, FILIERE. NomF
FROM ETUDIANT, FILIERE
WHERE FILIERE.CodeF=ETUDIANT.#CodeF;

C. Le WHERE

La clause WHERE exprime la restriction, qui retient seulement les occurrences remplissant les critères exprimés.
Toute condition à vérifier est introduite par la clause WHERE après la clause FROM
Règle d’écriture :
SELECT attribut1, attribut2
FROM table
WHERE condition de sélection;
La condition de sélection exprimée derrière la clause WHERE peut être spécifiée à l’aide :
Des opérateurs de = Égal
comparaison < Inférieur
> Supérieur
<= Inférieur ou égal
>= Supérieur ou égal
<> différent

Des opérateurs logiques AND Et


OR Ou
NOT pas
Des opérateurs IN/NOT IN Dedans/dehors
BETWEEN… AND… Entre … et …
LIKE Comme (pour une chaîne de caractère)
IS [NOT] NULL Est nul ou non nul
II- Les requêtes : Enrichissements
Plusieurs instructions permettent d’enrichir l’affichage d’une requête
A- Le tri
Syntaxe:
- La ou les colonnes permettant de trier l’affichage des résultats sont précédées par la clause ORDER BY
- Pour chaque colonne, il faut préciser le sens du tri, ASC pour un tri en ordre croissant (ascendant) et DESC pour un tri en
en ordre décroissant (descendant)
- Toute colonne triée doit apparaître dans une projection
SELECT attribut1, attribut2, attribut3
FROM table1, table2
WHERE critère de jointure
ORDER BY attribut1 ASC, attribut2 DESC ;
Remarque : par défaut, le tri est ascendant; ASC est donc facultatif
B- Les attributs calculés
Il est possible de créer de nouveaux champs dits calculés. Ces calculs s’appuient sur un ou plusieurs champs numériques
Syntaxes:
- Calcul entre un champ numérique et une valeur numérique
SELECT attribut1 {+, -, *, /) valeur AS alias1
FROM table1;
- Calcul entre deux champs numériques
SELECT attribut1 {+, - , *, /) attribut2 AS alias1
FROM table1;
Il est d’usage de préciser l’alias (le nom de la nouvelle colonne projetée). Cet alias pourra être ensuite utilisé dans les instructions
SQL
C- Les agrégats
Syntaxe : SELECT FONCTION (attribut) AS alias1
FROM table1;
1- les principales fonctions
Il existe plusieurs fonctions standards de calcul et notamment :
Fonctions SQL
SUM(nom du champ) Calcule la somme des valeurs d’un attribut d’une table
MIN(nom du champ) Détermine la plus petite des valeurs d’un attribut d’une
table
MAX(nom du champ) Détermine la plus grande des valeurs d’un attribut
d’une table
AVG(nom du champ) Calcule la moyenne des valeurs d’un attribut d’une
table
COUNT(*) Calcule le nombre de tuples ou d’enregistrements

2- Le groupement ou classement par sous –groupes


Si l’on souhaite que la fonction porte sur des sous-groupes de la table, il faut alors utiliser l’instruction GROUP BY. Chaque
Sous-groupe sera alors réduit à une seule ligne dans la table résultat (un résultat par sous-groupe)
Syntaxe: toutes les colonnes projetées doivent figurer dans la clause GROUP BY , mises à part les fonctions
SELECT attribut2, attribut3, FONCTION (attribut1) AS alias1
FROM table1
GROUP BY attribut2, attribut3;
3- les conditions sur regroupements
L’instruction HAVING permet d’appliquer des prédicats de restrictions sur des résultats de regroupement
Syntaxe:
SELECT attribut2, attribut3, FONCTION (attribut1) AS alias1
FROM table1
GROUP BY attribut2, attribut3;
HAVING condition ;
La condition s’applique sur la fonction (on peut reprendre son alias pour l’exprimer)
D- Les requêtes imbriquées ou sous-requêtes
Une requête imbriquée consiste à inclure une requête comme valeur d’une condition dans une clause WHERE. On utilise
l’opérateur IN (dans) ou NOT IN (pas dedans) ou les opérateurs relationnels (= , < , <=, >, >= , <>)
Syntaxe :
SELECT attribut1, attribut2
FROM nom de la table
WHERE attribut IN (SELECT attribut FROM … WHERE … );
L’utilisation des requêtes imbriquées permet de réunir plusieurs requêtes en une seule
Attention : le résultat de la requête imbriquée ne doit comporter qu’un seul champ
Au final les requêtes les plus complexes peuvent comporter 7 éléments :
1. SELECT Champs projetés, FONCTION AS alias
2. FROM nom des tables
3. WHERE jointures …
4. AND critères de restriction …
5. GROUP BY
6. HAVING
7. ORDER BY ;

III- Les requêtes d’action

A. Requête suppression : DELETE


Cette instruction permet la suppression d’un ou plusieurs enregistrements d’une table en fonction d’un ou de plusieurs
critères déterminés
Syntaxe :
DELETE FROM nom de la table
WHERE condition ;

B. Requête ajout : INSERT


Cette instruction permet d’ajouter à une table un enregistrement ou une série d’enregistrements
1- Insertion d’une seule ligne
Syntaxe :
INSERT INTO nom de la table (nom colonne1, nom colonne2, etc.)
VALUES (valeur1, valeur2, etc.);
2- Insertion à l’aide de sous-requête
Ajout à une table d’une série d’enregistrements provenant d’une ou plusieurs autres tables. Ce qui nécessite une sous-
requête
Syntaxe :
INSERT INTO nom de la table (nom colonne1, nom colonne2, etc )
(SELECT expression1, expression2 … FROM table source WHERE …) ;
Ce type de requête est particulièrement utile lorsqu’une table doit être archivée avant épuration des données

C. Requête mise à jour : UPDATE


Cette instruction permet la mise à jour des valeurs d’un ou plusieurs champs dans une table
Syntaxe :
UPDATE nom de la table
SET nom colonne = expression
WHERE condition ;
Travaux dirigés :

La société LADORE est spécialisée dans la fabrication et la vente des articles de music.
Son activité a été mobilisée au travers du MCD suivant :

CLIENT ARTICLE

N°Client FACTURE Etre facture N°Article


titre (1,n) (1,1) (1,n) (1,n) libellé
Etablir
nom N°Facture Qte PVTTC
prenom dateFacture marque
adresse codefamille
cp
ville
datecréation
I- Schéma relationnel : écrire le schéma relationnel

CLIENT (N°Client , titre, nom, prenom , adresse , cp , ville , datecréation )


FACTURE (N°Facture , datefacture , #N°Client )
ARTICLE (N°Article , libellé , PVTTC , marque , codefamille )
LIGNE FACTURE (#N°Facture , #N°Article , Qte )

II- Relation entre les tables

RELATION

SOURCE DESTINATION

TABLE CHAMP TABLE CHAMP

CLIENT N°Client FACTURE N°Client

FACTURE N°Facture LIGNE FACTURE N°Facture

N°Article LIGNE FACTURE N°Article


ARTICLE
III- Requêtes projection
A. Liste de tous les produits (N°Article, libellé, PVTTC, marque, codefamille)

SELECT Article.N°Article, Article.libellé, Article.PVTTC, Article.marque, Article.codefamille


FROM Article ;
Ou bien
SELECT Article.*
FROM Article;
Ici * signifie que tous les champs de la table article sont projetés
Comme dans FROM, il n’ y a qu’une seule table. Il n’ y a pas de doutes sur l’origine des champs et on pourrait tout
aussi bien écrire :
SELECT *
FROM Article;
B. Liste de tous les clients (nom, prenom, cp)

SELECT Client.nom, Client.prenom, Client.cp


FROM Client ;
C. Liste des numéros de client ayant fait l’objet d’une facturation cette année

SELECT DISTINCT Facture.N°Client AS [N°Client ayant fait l’objet d’une facturation]


FROM Facture;
Ici il s’agit de projeté les N°Client qui ont commandé i.e qui sont clés étrangères dans la table Facture. Un même
numéro client pouvant figurer plusieurs fois dans la table Facture (car clé étrangère), il faut utiliser la clause DISTINCT
Pour supprimer les doublons
IV- Requêtes sélection
A. Liste des clients (nom, prenom) de cp =75010

SELECT Client.nom, Client.prenom


FROM Client
WHERE Client.cp LIKE « 75010 »;
NB : un code postal est un champ alphanumérique
B. Liste des produits (N°Article, libellé, PVTTC) de la famille des ladoréons (code famille INI)

SELECT Article.N°Article, Article.libellé, Article.PVTTC


FROM Article
WHERE Article.codefamille LIKE « INI »;
C. Liste des clients (nom, prenom) habitant POINTE NOIRE ou DOLISIE

SELECT Client.nom, Client.prenom, Client.ville


FROM Client
WHERE Client.ville LIKE « POINTE NOIRE » OR Client.ville LIKE « DOLISIE »;
D. Liste des produits (N°Article, libellé, PVTTC) dont le prix de vente est supérieur à 1000 €

SELECT Article.N°Article, Article.libellé, Article.PVTTC


FROM Article
WHERE Article.PVTTC > 1000 ;
E. Liste des nouveaux clients depuis le 1 er septembre 2014

SELECT Client.*
FROM Client
WHERE Client.datecréation >=#01/09/2014#;
Les champs de type date sont entourés de dièses ou de guillemets
F- Liste des factures (N°Facture, N°Client) établies en octobre 2014

SELECT Facture.N°Facture, Facture.N°Client


FROM Facture
WHERE Facture.datefacture BETWEEN #1/10/2014# AND #31/10/2014# ;

Ou
SELECT Facture.N°Facture, Facture.N°Client
FROM Facture
WHERE Facture.datefacture >=#1/10/2014#
AND Facture.datefacture <=#31/10/2014# ;

Ou
SELECT Facture.N°Facture, Facture.N°Client
FROM Facture
WHERE MONTH(Facture.datefacture) =10
AND YEAR(Facture.datefacture) = 2014 ;
G. Liste des produits (N°Article, libellé et PVTTC) dont le libellé commence par « etui »

SELECT Article.N°Article, Article.libellé, Article.PVTTC


FROM Article
WHERE Article.libellé LIKE « etui* »;
H. Liste des produits (N°Article, libellé et PVTTC) dont le libellé comprend « soprani »

SELECT Article.N°Article, Article.libellé, Article.PVTTC


FROM Article
WHERE Article.libellé LIKE « *soprani* »;
LIKE « *soprani* » permet de sélectionner tous les libellés qui contiennent « soprani » puisque l’astérisque peut être remplacé
Par n’importe quelle chaîne de caractères

V- Requêtes avec jointure


A. Liste des clients (nom, prenom ) ayant commandé

SELECT DISTINCT Client.nom, Client.prenom


FROM Client, Facture
WHERE Client.N°Client=Facture.#N°Client ;

Un client qui a commandé est un client dont le numéro figure dans la table Facture
Ici il ne faut garder qu’une seule fois le nom et le prénom des clients qui ont fait plusieurs commandes ( et dont les numéros se
trouvent donc plusieurs fois dans la table Facture) d’où la clause DISTINCT
B. Liste des clients (nom, prenom ) ayant commandé au premier semestre 2014

SELECT DISTINCT Client.nom, Client.prenom


FROM Client, Facture
WHERE Client.N°Client=Facture.#N°Client
AND Facture.datefacture BETWEEN #1/1/2014# AND #30/6/2014# ;
C. Liste des quantités d’articles vendus par facture (N°Facture, N°Article, libellé, Qte, PVTTC)

SELECT [LIGNE FACTURE].N°Facture, [LIGNE FACTURE].N°Article, N°Article.libellé, [LIGNE FACTURE].Qte, N°Article.PVTTC


FROM Article, [LIGNE FACTURE]
WHERE Article.N°Article=[LIGNE FACTURE].#N°Article ;
La table LIGNE FACTURE comportant un espace, il faut mettre son nom entre crochets pour la requête SQL puisse s’exécuter
D. Liste des articles (N°Article, libellé, Qte, PVTTC) achetés par les clients (nom, prenom, cp)

SELECT Article.N°Article, Article.libellé, [LIGNE FACTURE].Qte, Article.PVTTC, Client.nom, Client.prenom, Client.cp


FROM Article, [LIGNE FACTURE], Facture, Client
WHERE Article.N°Article=[LIGNE FACTURE].#N°Article
AND Facture.N°Facture=[LIGNE FACTURE].#N°Facture
AND Client.N°Client=Facture.#N°Client ;

VI- Requêtes triées


A-Liste clients (nom, prenom) par ordre alphabétique
SELECT Client.nom, Client.prenom
FROM Client
ORDER BY Client.nom, client.prenom ASC ;
Le ASC est facultatif car il n’y a ici qu’un ordre de tri
Le tri s’effectue d’abord sur le nom puis sur le prénom (de la gauche vers la droite)
B. Liste des articles (N°Article, libellé, PVTTC) classés du plus cher au moins cher

SELECT Article.N°Article, Article.libellé, Article.PVTTC


FROM Article
ORDER BY Article.PVTTC DESC ;
DESC est obligatoire puisque par défaut le tri est ASC
C. Liste des clients (N°Client, nom, prenom, et date de création) par ancienneté

SELECT Client.N°Client, Client.nom, Client.prenom, Client.datecréation


FROM Client
ORDER BY Client.datecréation ASC;
NB : une date est un nombre de jours depuis le 1 er janvier 1900. La date la plus ancienne est donc celle qui a le plus petit
nombre de jours
VII- Requêtes calculées
A. On souhaite connaître le prix de vente HT des articles, la TVA étant de 20%
SELECT Article.N°Article, Article.libellé, Article.PVTTC /1,2 AS [PV HT]
FROM Article ;

B. On souhaite connaître tous les montants des lignes de commande (N°Facture, N°Article, Qte, PVTTC, MontantLC)
SELECT [LIGNE FACTURE].N°Facture, [LIGNE FACTURE].N°Article, [LIGNE FACTURE].Qte, Article.PVTTC, [Article].[PVTTC]*[LIGNE
FACTURE].[Qte] AS MontantLC
FROM Article, [LIGNE FACTURE]
VIII- Requêtes avec agrégats
A. Agrégats simples
1. Combien y a-t-il de client dans la base?

SELECT Count(*) AS Nb_Clients


FROM Client;
L’argument d’un count est toujours: * puisque c’est le nombre de lignes (ou de tuples ou d’enregistrements) qui est compté
2. Combien de factures ont été établies?

SELECT Count(*) AS Nb_Factures


FROM Facture;
3. Combien de factures ont été établies en janvier 2014?

SELECT Count(*) AS Nb_Factures


FROM Facture;
WHERE datefacture BETWEEN #01/01/2014# AND #30/01/2014;

Ou bien

SELECT Count(*) AS Nb_Factures


FROM Facture;
WHERE MONTH(datefacture)=01AND YEAR(datefacture)=2014;
4. Combien d’articles ont été vendus?

SELECT SUM([LIGNE FACTURE].Qte) AS [Nombre totat d’article vendu]


FROM [LIGNE FACTURE] ;
Attention : ici il faut faire la somme des quantités vendues
5. Quel est le chiffre d’affaire TTC?

SELECT SUM([Article].[PVTTC]*[LIGNE FACTURE].[Qte]) AS [chiffre d’affaire TTC]


FROM Article, [LIGNE FACTURE]
WHERE Article.N°Article=[LIGNE FACTURE].#N°Article ;
6. Quel est le chiffre d’affaire en janvier 2014?

SELECT SUM([Article].[PVTTC]*[LIGNE FACTURE].[Qte]) AS [chiffre d’affaire TTC en janvier 2014]


FROM Article, [LIGNE FACTURE], Facture
WHERE Article.N°Article=[LIGNE FACTURE].#N°Article
AND Facture.N°Facture=[LIGNE FACTURE].#N°Facture
AND MONTH(datefacture)=01
AND YEAR(datefacture)=2014 ;
Ici la restriction sur la date a été rajoutée ce qui nécessite l’ajout de la table facture et donc une jointure
7. Combien d’articles ont été vendus (hors main-d’œuvre)

SELECT SUM([LIGNE FACTURE].Qte) AS [Nombre total d’articles vendus hors MO)


FROM [LIGNE FACTURE]
WHERE N°Article NOT LIKE « MO »;
Il faut sélectionner les articles dont le numéro ne commence pas par MO
Ou bien

SELECT SUM([LIGNE FACTURE].Qte) AS [Nombre total d’articles vendus hors MO)


FROM [LIGNE FACTURE], Article
WHERE Article.N°Article=[LIGNE FACTURE].#N°Article
AND Article.codefamille <> « MO » ;
Cette autre solution se base sur le code famille et nécessite de rajouter la table article et donc une jointure
8. Quel est le prix du produit le moins cher?

SELECT MIN(Article.PVTTC) AS [ PV le plus bas]


FROM Article;
9. Quelle est la fourchette de prix des articles?

SELECT MIN(Article.PVTTC) AS [ PV le plus bas], MAX(Article.PVTTC) AS [ PV le plus haut]


FROM Article;
10. Quel est le montant moyen des lignes de factures?

SELECT AVG([Article].[PVTTC]*[LIGNE FACTURE].[Qte]) AS [Montant moyen des LF]


FROM Article, [LIGNE FACTURE]
WHERE Article.N°Article=[LIGNE FACTURE].#N°Article ;
11. Quel est le montant moyen de prix de vente des articles?

SELECT AVG(Article.PVTTC) AS [PV moyen des articles]


FROM Article;
B. Avec la clause GROUP BY
On peut repérer la nécessité de cette clause dès l’instant où il y a un calcul (présence d’un agrégat) à faire par type
d’enregistrement (regroupement)
1. Quel est le nombre de facture par client?

SELECT Client.N°Client, Client.nom, Client.prenom, count(*) AS [Nombre de factures par client]


FROM Client, Facture
WHERE Client.N°Client=Facture.#N°Client
GROUP BY Client.N°Client, Client.nom, Client.prenom ;
Tous les champs projetés à côté de l’agrégat (ici le count) doivent figurer dans le GROUP BY
2. Quel est le montant total par facture?

SELECT [LIGNE FACTURE].N°Facture, SUM([Article].[PVTTC]*[LIGNE FACTURE].[Qte]) AS [Total TTC]


FROM Article, [LIGNE FACTURE]
WHERE Article.N°Article=[LIGNE FACTURE].#N°Article
GROUP BY [LIGNE FACTURE].N°Facture ;
3. Quel est le chiffre d’affaire par client?

SELECT Client.N°Client, Client.nom, Client.prenom, SUM([Article].[PVTTC]*[LIGNE FACTURE].[Qte]) AS [CA par client]


FROM Client, Facture, [LIGNE FACTURE], Article
WHERE Client.N°Client=Facture.#N°Client
AND Facture.N°Facture=[LIGNE FACTURE].#N°Facture
AND Article.N°Article =[LIGNE FACTURE].#N°Article
GROUP BY Client.N°Client, Client.nom, Client.prenom;
C. Avec la clause HAVING
1. Liste des factures ayant un total TTC supérieur à 1500 €

SELECT [LIGNE FACTURE].N°Facture, SUM([Article].[PVTTC]*[LIGNE FACTURE].[Qte]) AS [Total TTC]


FROM Article, [LIGNE FACTURE]
WHERE Article.N°Article=[LIGNE FACTURE].#N°Article
GROUP BY [LIGNE FACTURE].N°Facture
HAVING SUM([Article].[PVTTC]*[LIGNE FACTURE].[Qte]) > 1500 ;

Il est possible d’utiliser l’alias du champ calculé :


SELECT [LIGNE FACTURE].N°Facture, SUM([Article].[PVTTC]*[LIGNE FACTURE].[Qte]) AS [Total TTC]
FROM Article, [LIGNE FACTURE]
WHERE Article.N°Article=[LIGNE FACTURE].#N°Article
GROUP BY [LIGNE FACTURE].N°Facture
HAVING [Total TTC] > 1500 ;
2. Liste des clients (Numéro , nom, prenom) ayant acheté plusieurs fois au cours de l’année 2014

Un client qui a acheté plusieurs fois est un client dont le numéro figure plusieurs fois dans la table facture

SELECT Client.N°Client, Client.nom, Client.prenom, Cout(*) AS [Nombre de facture par client]


FROM Client, Facture
WHERE Client.N°Client=Facture.#N°Client
AND YEAR (Facture.datefacture)=2014
GROUP BY SELECT Client.N°Client, Client.nom, Client.prenom
HAVING Count(*) > 1;
IX. Requêtes imbriquées
1. Liste des articles (N°Article, libellé, PVTTC) non vendus en 2014

SELECT Article.N°Article, Article.libellé, Article.PVTTC


FROM Article
WHERE Article.N°Article NOT IN ( SELECT [LIGNE FACTURE].N°Article
FROM Facture, [LIGNE FACTURE]
WHERE Facture.N°Facture=[LIGNE FACTURE].#N°Facture
AND YEAR (Facture.datefacture)=2014) ;
Ici, on projette tous les articles qui n’ont pas fait l’objet d’une facturation en 2014
Il s’agit donc de tous les articles dont le numéro ne figure pas dans la sous-requête. Cette dernière renvoyant tous les numéros
d’articles qui ont fait l’objet d’une facturation en 2014. cela revient à enlever de l’ensemble des articles (table article) , les
articles qui sont dans la sous-requête :

Tous les articles qui ont fait


l’objet d’une facturation en
2014
=
Sous-requête

Tous les articles de la table article


2. Liste des clients (N°Client, nom, prenom) qui n’ont rien acheté depuis 3 ans

SELECT N°Client, nom, prenom


FROM Client
WHERE N°Client NOT IN ( SELECT Facture.N°Client
FROM Facture
WHERE YEAR (datefacture) > YEAR(NOW()) – 3) ;
On enlève de la table client, les clients qui ont acheté au cours des 3 dernières années (résultat de la sous-requête)
3. Liste des articles (N°Article, libellé et PVTTC) les plus chers

SELECT N°Article, libellé, PVTTC


FROM Article
WHERE PVTTC = (SELECT MAX(PVTTC)
FROM Article) ;
Il faut ici comparer le prix de tous les articles avec le prix le plus grand (résultat de la sous-requête)
Plusieurs articles peuvent être projetés (plusieurs articles au prix maximum)
4. Liste des articles (N°Article, libellé et PVTTC) les moins chers

SELECT N°Article, libellé, PVTTC


FROM Article
WHERE PVTTC = (SELECT MIN(PVTTC)
FROM Article) ;
X. Requêtes actions
A. Suppression

1. Supprimer l’article 2756 (code article) dans la table article

DELETE FROM Article


WHERE N°Article = 2756 ;
2. Supprimer tous les clients qui n’ont rien acheté depuis 10 ans

DELETE FROM Client


WHERE N°Client NOT IN ( SELECT Facture.N°Client
FROM Facture
WHERE YEAR (datefacture) > YEAR(NOW()) – 10 ) ;
B. Ajout

1. Ajouter l’article OV-35, HOHNER PIA NOIR dont le prix de vente TTC est 1500 € de marque Hohner et dont le code famille
est OV

INSERT INTO Article(*)


VALUES (OV-35, HOHNER PIA NOIR, 1500, Hohner, OV) ;
2. Chaque année, les factures de plus de 3 ans sont archivées dans une table ARCHIVE avant d’être supprimées de la table
Facture. Archiver toutes les factures de plus de 3 ans dans la table Archive_factures_2011 (N°Facture, N°Client, datefacture)
Il faut décomposer en deux requêtes successives : l’une pour archiver et l’autre pour supprimer les enregistrements
- Première requête d’archivage :
INSERT INTO Archive_factures_2011 (N°Facture, N°Client, datefacture)
(SELECT Facture.* FROM Facture WHERE YEAR(datefacture) < YEAR(NOW()) -3);
- Seconde requête qui supprime les enregistrements précédemment archivés :
DELETE FROM Facture
WHERE YEAR(datefacture) < YEAR(NOW()) -3 ;

C. Mise à jour

1. Ecrire la requête SQL permettant d’augmenter de 5% le prix TTC des articles qui valent moins de 7 €

UPDATE Article
SET PVTTC = PVTTC*1,05
WHERE PVTTC < 7;
2. Ecrire la requête SQL permettant d’augmenter de 2% le prix TTC des articles qui valent plus de 7 € et qui ont été vendus
l’an passé (2013)

UPDATE Article
SET PVTTC = PVTTC*1,02
WHERE PVTTC >7
AND N°Article IN ( SELECT N°Article FROM [LIGNE Facture], Facture
WHERE Facture.N°Facture=[LIGNE Facture].#N°Facture
AND YEAR(datefacture)= 2013 ) ;
Il est nécessaire de recourir à une sous-requête pour connaître les articles vendus l’an passé
3. Ecrire la requête SQL permettant de diminuer de 30 € le prix TTC des articles qui coûtent plus de 3000 €

UPDATE Article
SET PVTTC=PVTTC*0,80
WHERE PVTTC > 3000 ;

Vous aimerez peut-être aussi