![]() |
ATTENTION
: le contenu des ces pages web est soumis aux dispositions
légales françaises et internationales en matière de
droits d'auteurs et de copyright.

LE SQL de A à Z
EXERCICES ET TRAVAUX PRATIQUES (4eme partie) ...
Problèmes et exercices corrigés sur le langage SQL.
Voici une série de travaux pratiques sur le langage SQL appelant des réponses devant être écrites uniquement à partir de requêtes, en utilisant le plus souvent possible le jeu de commande du SQL 2 normalisé (1992). Les données de départ, comme la structure des tables en jeu et la réponse attendue sous la forme d'un jeu de résultat (table) sont donné dans chacun des énoncés
Pour
répondre à ces, questions, rien de plus simple :
envoyez-moi vos solutions en utilisant le lien hypertexte ouvrant votre
messagerie. Bien entendu, je vous répond personnellement et vous
propose une correction didactique et pédagogique afin que vous
compreniez le mécanisme de construction de la requête.
Voici donc une première série d'exercices numérotés de 31 à 40
dernière mise à jour :
LES RÈGLES DU JEU
Pour
répondre à la question posée il vous faut
écrire une seule requête SQL. Vous avez le droit d'utiliser
toutes les techniques disponibles dans SQL:2003 :
Vous pouvez
utiliser toutes les opérations disponibles dans SQL, y compris
les sous requêtes dans les clauses SELECT, FROM, WHERE et HAVING,
et bien entendu les sous requêtes corrélées.
Vous pouvez
ajoutez dans la base une ou plusieurs nouvelles tables et leurs
données ou encore définir autant de vues que vous le voulez,pour concourrir
à la solution. En revanche vous n'avez pas le droit d'utiliser
une UDF (fonction utilisateur), ni une procédure stockée,
ni un trigger, ni bien entendu modifier la ou les tables et les
données à l'origine du problème.
Pour vous aider à répondre, nous
vous donnons :
Pour
savoir si votre solution est bonne, comme pour obtenir la solution,
envoyez votre réponse ou votre demande par mail en
précisant le titre ou le n° du problème.
Problème
n° 31 - plus proche valeur

Il s'agit de
rechercher la plus proche valeur dans une table.
Par exemple une table propose des jours de rendez-vous. Le client
souhaiterais un rendez-vous aux alentours du 12 janvier 2008. Comment
obtenir la date libre la plus proche de cette date ?
Voici la table des rendez-vous :
| CREATE
TABLE T_RENDEZ_VOUS_RDV (RDV_DATE TIMESTAMP); |
INSERT
INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-07'); INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-11'); INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-14'); INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-16'); INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-18'); INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-21'); INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-22'); INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-24'); INSERT INTO T_RENDEZ_VOUS_RDV VALUES ('2008-01-25'); |
C'est plus facile que cela en à
l'air, si l'on se souvient qu'un nombre premier est un nombre qui n'est
divisible que par lui même et 1. Ou plutôt qu'un nombre qui
n'est pas premier est divisible par un nombre compris entre 2 et
lui-même moins un...
En l'occurrence, le résultat doit être le suivant :
|
RDV_DATE ------------- 2008-01-11 |
Testez donc votre solution avec une demande de rendez-vous le 23 janvier 2008...
cliquez sur le mail
pour répondre et titrez votre mail "Problème
n°31 - plus proche valeur"
Problème
n° 32 - primes de salaires



| CREATE
TABLE T_PRIME_PRM (PRM_EMPLOYE VARCHAR(16), PRM_MONTANT DECIMAL(16,2), PRN_NB_ECHEANCES INT); |
INSERT
INTO T_PRIME_PRM VALUES ('JAK', 1000, 1); INSERT INTO T_PRIME_PRM VALUES ('POL', 1000, 3); INSERT INTO T_PRIME_PRM VALUES ('LUC', 1000, 12); |
| PRM_EMPLOYE ECHEANCE MONTANT ------------ --------- ------------ JAN 1 1000.00 JOE 1 333.33 JOE 2 333.33 JOE 3 333.34 LUC 1 83.33 LUC 2 83.33 LUC 3 83.33 LUC 4 83.33 LUC 5 83.33 LUC 6 83.33 LUC 7 83.33 LUC 8 83.33 LUC 9 83.33 LUC 10 83.33 LUC 11 83.33 LUC 12 83.37 |
A vos claviers !
cliquez sur le mail
pour répondre et titrez votre mail "Problème
n°32 - primes de salairesr"Problème
n° 33 - affectations comptables





| Exemple des données
comptables : compte ana montant -------- -------- ------------ 612000 26045 260.50 612000 12345 130.40 612101 33556 330.50 654000 26346 33.55 654102 28333 180.10 |
Règles d'affectation : compte ana nouvelle affectation ---------- -------- -------------------- 6????? ????? T124 6????? ??5?? T028 6????? 26??? T033 612??? ????? T125 612??? ??5?? T126 |
Résultat que l'on doit
obtenir : compte montant affectation --------- ---------- ----------- 612000 260.50 T125 -->(Regle 612??? ?????) 612000 130.40 T125 -->(Règle 612??? ?????) 612101 330.50 T126 -->(Règle 612??? ??5??) 654000 33.55 T033 -->(Règle 6????? 26???) 654102 180.10 T124 -->(Règle 6????? ?????) |
| CREATE
TABLE T_COMPTE_CPT (CPT_COMPTE CHAR(6), CPT_ANA CHAR(5), CPT_MONTANT DECIMAL(16,2)); |
INSERT
INTO T_COMPTE_CPT VALUES ('612000', '26045', 260.50); INSERT INTO T_COMPTE_CPT VALUES ('612000', '12345', 130.40); INSERT INTO T_COMPTE_CPT VALUES ('612101', '33556', 330.50); INSERT INTO T_COMPTE_CPT VALUES ('654000', '26346', 33.55); INSERT INTO T_COMPTE_CPT VALUES ('654102', '28333', 180.10); |
| CREATE
TABLE T_AFFECTATION_AFC (AFC_COMPTE CHAR(6), AFC_ANA CHAR(5), AFC_AFFECT CHAR(4)); |
INSERT
INTO T_AFFECTATION_AFC VALUES ('6_____', '_____', 'T124');
INSERT INTO T_AFFECTATION_AFC VALUES ('6_____', '__5__', 'T028'); INSERT INTO T_AFFECTATION_AFC VALUES ('6_____', '26___', 'T033'); INSERT INTO T_AFFECTATION_AFC VALUES ('612___', '_____', 'T125'); INSERT INTO T_AFFECTATION_AFC VALUES ('612___', '__5__', 'T126'); |
cliquez sur le mail
pour répondre et titrez votre mail "Problème
n°33 - affectations comptables"Problème
n° 34 - précédents (ou suivants)

| CREATE TABLE T_LIGNE_PRECEDENTE (COL VARCHAR(3)); |
INSERT INTO T_LIGNE_PRECEDENTE
VALUES ('AAA'); INSERT INTO T_LIGNE_PRECEDENTE VALUES ('BBB'); INSERT INTO T_LIGNE_PRECEDENTE VALUES ('CCC'); INSERT INTO T_LIGNE_PRECEDENTE VALUES ('DDD'); |
| COL
LIGNE_PRECEDENTE ---- ---------------- AAA NULL BBB AAA CCC BBB DDD CCC |
cliquez sur le mail
pour répondre et titrez votre mail "Problème
n°34 - précédente et suivants"Problème
n° 35 - matchs et victoires


| TABLE T_JOUEUR_JOR | JOR_ID
JOR_NOM ------------- ----------- 1 Dupont 2 Camus 3 Mercier |
| TABLE
T_MATCH_MCH |
MCH_ID
JOR_ID1 JOR_ID2
MCH_SCORE_JOUEUR1 MCH_SCORE_JOUEUR2 ------------ ------------ ------------ ------------------ ------------------ 1 1 3 21 15 2 3 2 17 21 3 2 1 21 13 4 3 1 21 10 |
| --
Résultat attendu : |
JOR_ID
JOR_NOM
NB_MATCHS NB_VICTOIRES ------------- -------------- ------------- --------------- 1 Dupont 2 1 2 Camus 3 2 3 Mercier 3 1 |
| CREATE TABLE T_JOUEUR_JOR (JOR_ID INT, JOR_NOM VARCHAR(32)); |
INSERT INTO T_JOUEUR_JOR VALUES
(1, 'Dupont'); INSERT INTO T_JOUEUR_JOR VALUES (2, 'Camus'); INSERT INTO T_JOUEUR_JOR VALUES (3, 'Mercier'); |
| CREATE TABLE T_MATCH_MCH (MCH_ID INT, JOR_ID1 INT, JOR_ID2 INT, MCH_SCORE_JOUEUR1 INT, MCH_SCORE_JOUEUR2 INT); |
INSERT INTO T_MATCH_MCH VALUES
(1, 1, 3, 21, 15); INSERT INTO T_MATCH_MCH VALUES (2, 3, 2, 17, 21); INSERT INTO T_MATCH_MCH VALUES (3, 2, 1, 21, 13); INSERT INTO T_MATCH_MCH VALUES (4, 3, 1, 21, 10); |
cliquez sur le mail
pour répondre et titrez votre mail "Problème
n°35 - matchs et victoires"Problème
n° 36 - tri bâtard

| CREATE TABLE T_PARCELLE_PCL (PCL_NUM VARCHAR(16)); | INSERT INTO T_PARCELLE_PCL
VALUES ('1'); INSERT INTO T_PARCELLE_PCL VALUES ('11'); INSERT INTO T_PARCELLE_PCL VALUES ('111'); INSERT INTO T_PARCELLE_PCL VALUES ('2'); INSERT INTO T_PARCELLE_PCL VALUES ('21'); INSERT INTO T_PARCELLE_PCL VALUES ('22'); INSERT INTO T_PARCELLE_PCL VALUES ('221'); INSERT INTO T_PARCELLE_PCL VALUES ('28A'); INSERT INTO T_PARCELLE_PCL VALUES ('28B'); INSERT INTO T_PARCELLE_PCL VALUES ('3'); |
| PCL_NUM
---------------- 1 2 3 11 21 22 111 221 28A 28B |
cliquez sur le mail
pour répondre et titrez votre mail "Problème
n°36 - tri bâtard"


| CREATE TABLE T_SCHNORKELZIG_SKZ (SKZ_JURY VARCHAR(16) NOT NULL PRIMARY KEY, SKZ_MARC INT, SKZ_PAUL INT, SKZ_JEAN INT, SKZ_LEON INT) |
| SKZ_JURY
SKZ_MARC SKZ_PAUL SKZ_JEAN
SKZ_LEON ----------- ----------- ----------- ----------- ----------- MOULIN 1 3 5 11 --> restreindre le vote à 1,2,3,4 DUVAL 1 NULL 3 4 --> séquence incorrecte, aurait dû être 1, NULL, 2, 3 SCHMIDT 1 1 2 3 --> doublon (présence du 1 deux fois) |
| --
podiums corrects INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY001', 1, 2, 3, 4) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY002', 1, 2, 4, 3) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY003', 1, 3, 2, 4) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY004', 1, 3, 4, 2) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY005', 2, 1, 3, 4) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY006', 2, 1, 4, 3) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY007', 3, 1, 2, 4) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY008', 4, 3, 1, 2) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY009', 1, NULL, 3, 2) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY010', NULL, 2, 1, 3) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY011', 1, 3, NULL, 2) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY012', 1, 3, 2, NULL) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY013', NULL, 2, 1, NULL) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY014', 1, NULL, NULL, 2) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY015', 1, NULL, NULL, NULL) |
| -- podiums incorrects INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY999', 1, 2, 3, 3) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY998', 1, 2, 3, 5) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY997', 1, 1, 2, 2) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY996', 1, 3, 3, 3) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY995', 1, 2, 2, 6) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY994', NULL, 2, 3, 4) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY993', NULL, 3, 3, 4) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY992', 2, 2, 3, 4) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY991', 1, 1, 1, 1) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY990', NULL, NULL, 6, 4) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY989', NULL, 6, 4, NULL) INSERT INTO T_SCHNORKELZIG_SKZ VALUES ('JRY988', NULL, NULL, 2, NULL) |
cliquez sur le mail
pour répondre et titrez votre mail "Problème
n°37 - vote contraint"




| CREATE TABLE T_GARDIENNAGE_GDN (GDN_NOM VARCHAR(16), GDN_DATEHEURE_DEBUT TIMESTAMP, GDN_DATEHEURE_FIN TIMESTAMP) |
INSERT INTO T_GARDIENNAGE_GDN
VALUES ('LEON', '2008-09-01 22:30:00', '2008-09-02 08:00:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('LEON', '2008-09-03 18:00:00', '2008-09-04 04:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('LEON', '2008-09-07 06:00:00', '2008-09-07 12:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('MARC', '2008-09-01 07:30:00', '2008-09-01 14:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('MARC', '2008-09-03 08:30:00', '2008-09-03 16:00:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('MARC', '2008-09-05 09:30:00', '2008-09-05 12:00:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('MARC', '2008-09-06 08:30:00', '2008-09-06 13:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('PAUL', '2008-09-02 06:00:00', '2008-09-02 17:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('PAUL', '2008-09-03 06:00:00', '2008-09-03 17:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('PAUL', '2008-09-04 06:00:00', '2008-09-04 17:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('PAUL', '2008-09-06 12:00:00', '2008-09-06 22:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('JACK', '2008-09-02 08:30:00', '2008-09-02 16:00:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('JACK', '2008-09-05 08:30:00', '2008-09-05 21:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('JACK', '2008-09-06 21:00:00', '2008-09-07 10:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('DICK', '2008-09-01 12:30:00', '2008-09-02 00:00:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('DICK', '2008-09-03 22:30:00', '2008-09-04 10:00:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('DICK', '2008-09-06 16:30:00', '2008-09-07 10:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('DICK', '2008-09-07 18:30:00', '2008-09-08 06:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('CHAD', '2008-09-01 23:30:00', '2008-09-02 11:00:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('CHAD', '2008-09-04 14:30:00', '2008-09-05 08:30:00') INSERT INTO T_GARDIENNAGE_GDN VALUES ('CHAD', '2008-09-06 10:30:00', '2008-09-06 21:00:00') |
| GDN_DATEHEURE_DEBUT
GDN_DATEHEURE_FIN ------------------------ ------------------------ 2008-09-01 00:00 2008-09-01 07:30 2008-09-02 17:30 2008-09-03 06:00 2008-09-03 17:30 2008-09-03 18:00 2008-09-05 21:30 2008-09-06 08:30 2008-09-07 12:30 2008-09-07 18:30 |
cliquez sur le mail
pour répondre et titrez votre mail "Problème
n°38 - propriété bien gardée"



| CREATE TABLE T_PAPIER_PPR (PPR_TITRE VARCHAR(36), PPR_ABSTRACT VARCHAR(120)) |
INSERT INTO T_PAPIER_PPR VALUES
('Les derniers roi de France', 'Histoire#Politique') INSERT INTO T_PAPIER_PPR VALUES ('De Gaulle, un héro de l''histoire', 'Histoire#Politique#Guerre') INSERT INTO T_PAPIER_PPR VALUES ('Les deux guerres mondiales', 'Histoire#Guerre') INSERT INTO T_PAPIER_PPR VALUES ('Les années 50 en Europe', 'Histoire#Union européenne') INSERT INTO T_PAPIER_PPR VALUES ('Les présidents de la république', 'Histoire#Politique') INSERT INTO T_PAPIER_PPR VALUES ('Histoire de France', 'Histoire') |
| MOT_CLEF
NOMBRE ------------------- ---------- Histoire 5 Politique 3 Guerre 2 Union européenne 1 |
cliquez sur le mail
pour répondre et titrez votre mail "Problème
n°39 - abstract et mots clefs"


| CREATE TABLE T_RECEPTION_RCP (PRD_ID INT, RCP_DATE DATE, RCP_QUANTITE FLOAT) |
INSERT INTO T_RECEPTION_RCP
VALUES (1, '2008-01-01', 10) INSERT INTO T_RECEPTION_RCP VALUES (1, '2008-02-01', 20) INSERT INTO T_RECEPTION_RCP VALUES (1, '2008-03-15', 5) INSERT INTO T_RECEPTION_RCP VALUES (2, '2008-02-10', 20) INSERT INTO T_RECEPTION_RCP VALUES (2, '2008-03-20', 25) INSERT INTO T_RECEPTION_RCP VALUES (3, '2008-01-12', 20) INSERT INTO T_RECEPTION_RCP VALUES (4, '2008-01-01', 10) INSERT INTO T_RECEPTION_RCP VALUES (4, '2008-01-15', 20) INSERT INTO T_RECEPTION_RCP VALUES (4, '2008-02-01', 30) |
| CREATE TABLE T_COMMANDE_CMD (PRD_ID INT, CMD_DATE DATE, CMD_QUANTITE INT) |
INSERT INTO T_COMMANDE_CMD
VALUES (1, '2008-02-11', 45) INSERT INTO T_COMMANDE_CMD VALUES (2, '2008-02-15', 35) INSERT INTO T_COMMANDE_CMD VALUES (3, '2008-02-01' 20) INSERT INTO T_COMMANDE_CMD VALUES (4, '2008-01-05' 75) |
| PRD_ID
DATE_STOCK QTE_PRISE
QTE_RECUE QTE_DISPO
RESTE_A_COMPLETER ---------- -------------- ------------- ------------- ------------- ----------------- 1 2008-01-01 NULL 10 10 0 1 2008-02-01 NULL 20 20 0 1 2008-02-11 45 NULL 0 15 1 2008-03-15 NULL 5 0 10 2 2008-02-10 NULL 20 20 0 2 2008-02-15 35 NULL 0 15 2 2008-03-20 NULL 25 10 0 3 2008-01-12 NULL 20 20 0 3 2008-02-01 20 NULL 0 0 4 2008-01-01 NULL 10 10 0 4 2008-01-05 75 NULL 0 65 4 2008-01-15 NULL 20 0 45 4 2008-02-01 NULL 30 0 15 |
cliquez sur le mail
pour répondre et titrez votre mail "Problème
n°40 - gestion des stocks"