Académique Documents
Professionnel Documents
Culture Documents
TD Sur Les Requetes SQL PDF
TD Sur Les Requetes SQL PDF
correction
SQL 0
TD 1 - Requêtes SQL
La direction des études des Mines de Nancy a décidé d‟informatiser la gestion des emplois du temps. Chaque
étudiant est caractérisé par son numéro d‟étudiant, son nom, son prénom et son âge. Chaque cours est identifié
de façon unique par un sigle (SI033, MD021, . . . ) et possède un intitulé (bases de données, mathématiques
discrètes, . . . ) ainsi qu‟un enseignant responsable. On connaît également le nombre de séances de chaque
cours. Les enseignants sont caractérisés par un identifiant alphanumérique, leur nom et leur prénom. Enfin,
chaque séance est identifiée par le cours ainsi que le numéro de la séance (séance 3 du cours SI033, séance 1
du cours de MD021, . . . ), le type d‟intervention (CM, TD, TP), la date, l‟heure de début et l‟heure de fin
auxquelles la séance a lieu ainsi que la salle et l‟enseignant qui dispense la séance. Les étudiants
s‟inscrivent aux cours auxquels ils souhaitent assister.
Les clés primaires sont soulignées et les clés étrangères sont en italique.
--------------------------------------------------------------------------------------
etudiant ( numero , nom , prenom , age )
enseignant ( id , nom , prenom )
cours ( sigle , intitule , responsable, nombreSeances )
seance ( cours , numero , type , date , salle , heureDebut , heureFin , enseignant )
inscription ( etudiant , cours )
--------------------------------------------------------------------------------------
Requêtes simples
Requêtes imbriquées
i) Ajoutez un cours magistral de Logique le 14 décembre avec Jacques Herbrand en salle S250 de 14h à 18h.
Exemple :
SELECT SUM(p.gain)
FROM Participe p, Jockey j
WHERE p.Numero_jockey = j.Numero_jockey
AND j.nom like ’Jean-Claude Dusse’;
Création de tables
CREATE TABLE nom_de_la_table (
nom_de_l‟attribut type [ liste_de_contraintes_d‟attribut ]
nom_de_l‟attribut type [ liste_de_contraintes_d‟attribut ]
...
liste_de_contraintes_de_table
);
Exemple :
CREATE TABLE cours (
sigle VARCHAR(20) NOT NULL,
intitule VARCHAR(128) NOT NULL,
responsable VARCHAR(50) NOT NULL,
nombreSeances INT NOT NULL DEFAULT ’0’,
PRIMARY KEY (sigle),
FOREIGN KEY (responsable) REFERENCES enseignant(id)
);
Suppression de table
DROP TABLE nom_de_la_table ;
Insertion
INSERT INTO nom_de_la_table ( attribut_1, attribut_2, : : : )
VALUES( valeur_1, valeur_2, : : : ) ;
On dit que la sous-requête est imbriquée dans la requête externe. Il est possible d‟imbriquer des requêtes dans
des sous-requêtes. Une sous-requête doit toujours être entre parenthèses.
Voici un exemple de commande qui montre les principaux avantages des sous-requêtes et de leur syntaxe :
SELECT r1
FROM t1
WHERE s11 = (
SELECT COUNT(*) FROM t2
WHERE NOT EXISTS (
SELECT * FROM t3
WHERE r3 =
(SELECT 50,11*s1 FROM t4 WHERE r5 in (SELECT * FROM t5) AS t5)
)
);
EXISTS teste simplement si la requête interne retourne une ligne. NOT EXISTS teste si la requête interne ne
retourne aucun résultat.
--------------------------------------------------------------------------------------------
CORRECTION
--------------------------------------------------------------------------------------------
Requêtes simples
i) Écrire les requêtes de création des tables « Etudiant » et « Séance ».
Réponse :
Réponse :
Réponse :
Réponse :
Réponse :
Réponse :
Réponse :
ix) Pour chaque enseignant, indiquez le nombre de cours dans lesquels il intervient (restreignez les
réponses à l’ensemble des enseignants qui interviennent dans au moins deux cours).
Réponse :
Requêtes imbriquées
i) Ajoutez un cours magistral de Logique le 14 décembre avec Jacques Herbrand en salle S250 de 14h à
18h.
Réponse :
Réponse :
iii) Combien d’étudiants (différents) ont assistés à au moins une séance animée par Leonhard Euler ?
Réponse :
un ensemble de résultats pour chaque instruction SELECT contenue dans la procédure stockée ou toute
autre procédure stockée appelée par cette dernière ;
Les procédures stockées évitent aussi aux utilisateurs d'avoir à connaître les détails des tables de la base de
données. Si un ensemble de procédures stockées prend en charge toutes les fonctions de gestion nécessaires
aux utilisateurs, ceux-ci n'ont pas besoin d'accéder directement aux tables ; il leur suffit d'exécuter les procédures
stockées qui modélisent les processus avec lesquels ils ont l'habitude de travailler.
Les procédures stockées du système SQL Server évitant aux utilisateurs d'accéder aux tables système en sont
un exemple. SQL Server comprend un ensemble de procédures stockées système dont les noms commencent
en général par sp_. Ces procédures prennent en charge toutes les tâches administratives nécessaires à
l'exécution d'un système SQL Server. Vous pouvez administrer un système SQL Server à l'aide des instructions
Transact-SQL associées à l'administration (telles que CREATE TABLE) ou des procédures stockées du système,
sans jamais avoir à mettre à jour directement les tables système.
Ensemble de procédures stockées fournies par SQL Server pour la réalisation d'opérations telles que l'extraction
d'informations du catalogue système ou l'exécution de tâches d'administration.
Nombre d'activités administratives dans Microsoft® SQL Server™ 2000 s'exécutent à l'aide d'un type spécial de
procédure connu sous le nom de procédure stockée système. Les procédures stockées système sont créées et
enregistrées dans la base de données master et ont le préfixe sp_. Les procédures stockées du système
peuvent s'exécuter depuis n'importe quelle base de données, sans avoir à qualifier complètement le nom de la
procédure stockée, en utilisant le nom de base de données master.
Il est fortement recommandé de ne pas créer de procédures stockées avec le préfixe sp_. SQL Server recherche
toujours une procédure stockée en commençant par sp_ dans l'ordre suivant :
1. elle existe dans la base de données master ;
2. ensuite, en fonction des éventuels identificateurs fournis (nom de base de données ou propriétaire) ;
Pour obtenir une liste des objets référencés par une procédure, utilisez sp_depends.
Pour renommer une procédure, utilisez sp_rename
Important Si une procédure stockée créée par un utilisateur porte le même nom qu'une procédure stockée
système, celle de l'utilisateur ne s'exécutera jamais.
Les procédures stockées temporaires privées et globales, comme les tables temporaires, peuvent être créées en
ajoutant les préfixes # et # # à leur nom. # désigne une procédure stockée temporaire locale, et # #, une
procédure stockée temporaire globale. Ces procédures n'existent plus après l'arrêt de SQL Server.
Les procédures stockées temporaires locales sont disponibles au sein d‟une seule session d‟utilisateur. Tandis
que les procédures stockées temporaires globales sur l‟ensemble des sessions d‟utilisateur.
Les procédures stockées temporaires sont utiles lorsque vous vous connectez à des versions antérieures de SQL
Server qui ne prennent pas en charge la réutilisation des plans d'exécution des instructions ou lots d'instructions
Transact-SQL.
Les procédures stockées distantes sont une ancienne fonctionnalité de Microsoft® SQL Server™ 2000. Leur
fonctionnalité dans Transact-SQL est limitée à l'exécution d'une procédure stockée sur une installation SQL
Server distante. Les requêtes distribuées introduites dans la version 7.0 de SQL Server prennent en charge cette
possibilité ainsi que l'accès à des tables dans des sources de données OLE DB hétérogènes directement à partir
d'instructions Transact-SQL locales. Au lieu d'utiliser un appel de procédure stockée distante sur SQL Server
2000, utilisez des requêtes distribuées et une instruction EXECUTE pour exécuter une procédure stockée sur un
serveur distant.
Une instance SQL Server 2000 peut envoyer et recevoir des appels de procédures stockées distantes à d'autres
instances de SQL Server 2000 et SQL Server version 7.0. Une instance SQL Server 2000 peut également
envoyer des appels de procédures stockées distantes vers des instances SQL Server 6.0 ou 6.5 et en recevoir.
Un serveur exécutant SQL Server 2000 peut recevoir des appels de procédures stockées distantes d'une
instance SQL Server 4.21a, mais l'instance SQL Server 2000 ne peut pas faire des appels de procédures
stockées distantes à l'instance SQL Server 4.21a. L'instance SQL Server 4.21a ne peut pas reconnaître la
version du flux de données tabulaires (TDS, Tabular Data Stream) utilisée par SQL Server 2000.
Les procédures stockées étendues vous permettent de créer vos propres routines externes dans un langage de
programmation comme le langage C. Les procédures stockées étendues apparaissent aux utilisateurs comme
des procédures stockées normales et s'exécutent de la même façon. Des paramètres peuvent être passés à une
procédure stockée étendue pour renvoyer des résultats et un état. Les procédures stockées étendues permettent
d'étendre les fonctionnalités de Microsoft® SQL Server™ 2000.
Les procédures stockées étendues sont des bibliothèques de liaison dynamique (DLL, dynamic-link library) que
SQL Server peut charger et exécuter dynamiquement. Elles s'exécutent directement dans l'espace d'adresse de
SQL Server et sont programmées au moyen de l'API Open Data Services de SQL Server.
Une fois que la procédure stockée étendue est écrite, les membres du rôle de serveur fixe sysadminpeuvent
l'inscrire dans SQL Server, puis donner l'autorisation de l'exécuter à d'autres utilisateurs. Les procédures
stockées étendues ne peuvent être ajoutées qu'à la base de données master.
Les procédures stockées étendues sont généralement identifiées par le préfixe xp_
Vous pouvez créer une procédure stockée en utilisant l'instruction Transact-SQL CREATE PROCEDURE. Lisez
les informations ci-dessous avant de créer une procédure stockée.
L'instruction CREATE PROCEDURE ne peut pas s'utiliser conjointement avec d'autres instructions SQL
dans un même lot d'instructions.
L'autorisation de créer des procédures stockées revient par défaut au propriétaire de la base de
données, qui peut la transmettre à d'autres utilisateurs.
Les procédures stockées sont des objets de base de données et leur nom doit respecter les règles
gouvernant les identificateurs.
Vous ne pouvez créer une procédure stockée que dans la base de données en cours.
les instructions de programmation qui exécutent les opérations dans la base de données, y compris
l'appel à d'autres procédures ;
la valeur d'état renvoyée à la procédure ou au lot appelant pour indiquer la réussite ou l'échec et, dans
ce cas, la raison de l'échec.
Syntaxe
CREATE PROC [ EDURE ] procedure_name [ ; number ]
{ @parameter data_type }
AS sql_statement [ ...n ]
Arguments
procedure_name
Nom de la nouvelle procédure stockée. Les noms des procédures doivent respecter les règles applicables aux
identificateurs et doivent être uniques dans la base de données et pour son propriétaire.
;number
Nombre entier facultatif utilisé pour regrouper les procédures de même nom afin qu'elles puissent être
supprimées ensemble à l'aide d'une seule instruction DROP PROCEDURE. Par exemple, les procédures
utilisées avec une application appelée order peuvent être nommées orderproc;1,orderproc;2, etc. L'instruction
DROP PROCEDURE orderproc abandonne le groupe tout entier.
@parameter
Un paramètre de la procédure. Vous pouvez déclarer un ou plusieurs paramètres dans une instruction CREATE
PROCEDURE. La valeur de chaque paramètre déclaré doit être fournie par l'utilisateur lors de l'exécution de la
procédure (sauf si vous définissez une valeur par défaut pour le paramètre). Une procédure stockée peut
comprendre au maximum 2100 paramètres.
Spécifiez un nom de paramètre en plaçant le signe @ comme premier caractère. Ce nom doit respecter les
règles gouvernant les identificateurs. Un paramètre est local à une procédure, vous pouvez donc utiliser le même
nom dans d'autres procédures.
data_type
Type de données du paramètre. Tous les types de données y compris les types text, ntext et image, peuvent
être utilisés comme paramètre dans une procédure stockée.
AS
sql_statement
Tout numéro et type d'instructions Transact-SQL à inclure dans la procédure. Certaines limitations s'appliquent.
Espace réservé qui indique que plusieurs instructions Transact-SQL peuvent être incluses dans cette procédure.
Utilisez l'instruction EXECUTE de Transact-SQL pour exécuter une procédure stockée. L'utilisation du mot clé
EXECUTE n'est pas nécessaire à cette exécution si la procédure est la première instruction du lot.
Exec [ute] procedure_name @parameter 1= value1,@parameter2 = value2,@parameter3 = value3…
Des valeurs de paramètres peuvent être fournies si une procédure stockée a été écrite pour les accepter.
Remarque Si vous entrez des paramètres sous la forme @Parameter = value, leur ordre n'a pas d'importance.
Vous pouvez aussi omettre les paramètres pour lesquels une valeur par défaut a été définie. Si vous spécifiez un
paramètre donné sous la forme @Parameter = value, vous devez tous les spécifier de cette façon. Sinon, ils
doivent apparaître dans l'ordre indiqué par l'instruction CREATE PROCEDURE.
Lorsque le serveur exécute une procédure stockée, il refuse tous les paramètres qui n'étaient
pas insérés dans la liste des paramètres au moment de la création de la procédure.
Tout paramètre qui est passé par référence (en fournissant explicitement son nom) ne sera pas accepté si son
nom ne concorde pas.
Bien que vous puissiez omettre des paramètres ayant des valeurs par défaut, seule la liste des paramètres peut
être tronquée. Par exemple, si une procédure stockée a cinq paramètres, vous pouvez omettre les deux derniers
paramètres, mais pas omettre le quatrième et inclure le cinquième, à moins d'utiliser le format @parameter =
value.
La valeur par défaut d'un paramètre, si elle a été définie dans la procédure stockée, est utilisée dans les cas
suivants :
si aucune valeur n'est spécifiée pour le paramètre au moment de l'exécution de la procédure ;
{call procedure_name(@parameter….)}
{call "DataBase"."Owner"."Procedure_name" }
les procédures ne seraient pas intéressantes si on ne pouvait pas spécifier de paramètres. Heureusement, il est
très facile d‟écrire une procédure stockée paramétrable.
Pour déclarer un paramètre, il suffit donc de le spécifier dans l‟entête de la procédure en lui indiquant :
son nom : @Parameter (n‟oubliez pas le @), qui sera utilisable comme une variable dans la procédure stockée.
Un type de donnée, choisi parmi les types SQL ou les types utilisateurs.
Une valeur par défaut optionnelle.
Une direction, en mettant OUTPUT derrière le nom d‟un paramètre.
Vous pouvez spécifier pour chaque paramètre une valeur par défaut.
Vous pouvez également définir des paramètres de sortie. Ces paramètres sont modifiés dans la procédure
stockée puis retournés à l‟appelant.
NOCOUNT :
Empêche le message indiquant le nombre de lignes affectées par une instruction Transact-SQL d'être renvoyé en
tant que résultat.
Syntaxe
SET NOCOUNT {ON | OFF}
Notes
Si SET NOCOUNT est activée (ON), le chiffre indiquant le nombre de lignes affectées par une instruction
Transact-SQL n'est pas renvoyé. Si la valeur de SET NOCOUNT est définie sur OFF, ce chiffre est renvoyé.
EXISTS :
**************
Dans les exemples et les exercices qui suivent, on travaille sur la base de
données «GestionCommande »:
1. Exemples
----On crée une procédure stockée porte le même nom d'une procédure stockée système "sp_depends"
create procedure sp_depends
@n int
as
select * from Commande where NumCommande=@n
exec sp_depends 'Client'
---------------------------------
1. Exercices
Exercice 1 :
Créer une procédure stockée qui affiche les clients dont la quantité commande est supérieur à 75 et les factures
sont réalisées entre 2003 et 2004
Corrigé :
Exercice 2 :
Créer une procédure stockée qui retourne la somme des prix à payer par tous les clients en utilisant un
paramètre de sortie.
Corrigé :
Exercice3 :
Créer une procédure qui affiche les noms et les prénoms des clients dont le nom commence par „Al‟ en utilisant
un cursor qui permet d‟extraire les lignes ligne par ligne
Corrigé :
Exercice 4 :
Corrigé :
Exercice 5 :
Créer la procédure stockée qui compte le nombre de commandes d‟un client et affiche le résultat
Corrigé :
------------------------------------------------------------------------------------------------------
2) Vous réalisez que la taille de l'attribut "description" de la table DIAGNOSTIC n'est pas adéquate. Donnez le
code SQL pour la modifier pour une chaîne de longueur variable de 255 caractères maximum.
3) Donnez le code SQL pour ajouter les attributs "NoTelephone" et "DateNaissance" dans la table PATIENT.
4) Donnez le code SQL pour entrer les données suivantes dans la base de données
Table PATIENT
Table MEDECIN
Table DIAGNOSTIC
Table TRAITEMENT
Table ENTREE_DOSSIER
5) Vous avez entré le mauvais traitement dans l'entrée de dossier no. 3. Modifiez l'enregistrement pour
donner le traitement no. 2 au lieu du no. 1.
● Afficher le nom et le prénom des patients dont le nom de famille est 'Delisle';
● Afficher les entrées de dossier où la patient traité est de no. 111111 et le médecin traitant est de no. 67899
● Afficher toutes les entrées de dossier et les informations de leurs patients respectifs;
● Afficher, du plus jeune au plus vieux, le nom et le prénom des patients traités par René Lajoie le 26 avril 2008.
Exercice 2 – Bibliothèque
--------------------------------------------------------------------------------------------
● Afficher le nom et le prénom des abonnés qui se sont abonnés ou ont renouvelé leur carte en 2012;
● Afficher le code et le titre des livres qui ont été empruntés le 28 avril 2012, triés par ordre alphabétique de titre;
● Afficher le nom et le prénom des abonnés qui ont déjà emprunté le livre intitulé 'Nos amis les français';
● Prolonger tous les abonnements échus le 25 avril 2012 au 25 mai 2012;
● Afficher le titre des livres de science-fiction empruntés durant le mois d'avril 2012.
aime
+----------+----------+
| personne | boisson |
+----------+----------+
| ali | coca |
| ali | 7up |
| ali | oulmes |
| said | coca |
| said | orangina |
| aziz | oulmes |
| aziz | 7up |
| amine | coca |
| amine | oulmes |
+----------+----------+
frequente
+----------+----------+
| personne | cafe |
+----------+----------+
| ali | rif |
| ali | atlas |
| amine | commerce |
| aziz | rif |
| aziz | commerce |
| aziz | atlas |
| said | atlas |
+----------+----------+
sert
+----------+----------+
| cafe | boisson |
+----------+----------+
| commerce | coca |
| commerce | 7up |
| atlas | 7up |
| rif | coca |
| commerce | oulmes |
| commerce | orangina |
| atlas | oulmes |
+----------+----------+
2. Quelles sont les personnes qui fréquentent des cafés qui servent
4. Quelles sont les personnes qui ne fréquentent que les cafés qui
5. Quelles sont les personnes qui ne fréquentent que les cafés qui
Soit la base de donnée SPDB, contenant les relations Fournisseurs (S), Produits (P) et Fournit (SP).
S
+------+-------+--------+--------+
+------+-------+--------+--------+
| S1 | Smith | 20 | London |
| S2 | Jones | 10 | Paris |
| S3 | Blake | 30 | Paris |
| S4 | Clark | 20 | London |
| S5 | Adams | 30 | Athens |
+------+-------+--------+--------+
+------+-------+-------+--------+--------+
+------+-------+-------+--------+--------+
+------+-------+-------+--------+--------+
SP
+------+------+------+
+------+------+------+
| S1 | P1 | 300 |
| S1 | P2 | 200 |
| S1 | P3 | 400 |
| S1 | P4 | 200 |
| S1 | P5 | 100 |
| S1 | P6 | 100 |
| S2 | P1 | 300 |
| S2 | P2 | 400 |
| S3 | P2 | 200 |
| S4 | P2 | 200 |
| S4 | P4 | 300 |
| S4 | P5 | 400 |
+------+------+------+
7. les numéros de fournisseurs et numéros de produits fournis et situé dans la même ville.
10. Ecrire de deux façon différentes la requête: "Nom des fournisseurs du produit de numéro 'P2'
11."Nom des fournisseurs qui fournissent au moins un produit de couleur rouge ('Red')
Travaux Dirigés 7
Introduction aux bases de données
Le langage SQL
Exercice 1 – Clinique de médecine:
Soit la base de données suivante :
4) Donnez le code SQL pour entrer les données suivantes dans la base de données
5) Vous avez entré le mauvais traitement dans l'entrée de dossier no. 3. Modifiez
l'enregistrement pour donner le traitement no. 2 au lieu du no. 1.
● Afficher le nom et le prénom des patients dont le nom de famille est 'Delisle';
● Afficher le nom et le prénom des patients nés après 1976;
● Afficher les noms de famille différents des patients;
● Afficher les patients en ordre croissant de date de naissance;
● Afficher les entrées de dossier où la patient traité est de no. 111111 et le médecin
traitant est de no. 67899
Exercice 2 – Bibliothèque
Soit la base de données suivante :
Travail à faire
1. Traduire le modèle conceptuel de données en modèle relationnel.
2.1. Nom et prénom des clients possédant un compte titre de la catégorie «risque
modéré».
3.2. Supprimer de la table ARCH-OPÉ les enregistrements archivés dont l’année est
inférieure ou égale à 2000. On peut utiliser la fonction YEAR.
------------------------------------------------------------------------------------------------
CORRECTION
------------------------------------------------------------------------------------------------
DELETE
FROM ARCH_OPE
OU
Solution
Nous utilisons bien sûr phpMyAdmin pour créer la base puis les tables.
Exercice 2:
Solution
Nous obtenons les fichiers suivants :
• Le fichier proprietaire.sql :
-- version 2.6.0-rc3
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
--
--
-- --------------------------------------------------------
--
--
) TYPE=MyISAM AUTO_INCREMENT=1 ;
• Le fichier cartegrise.sql :
-- version 2.6.0-rc3
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
--
--
-- --------------------------------------------------------
--
--
) TYPE=MyISAM;
• Le fichier voiture.sql
-- version 2.6.0-rc3
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
--
--
-- --------------------------------------------------------
--
--
'claire',
) TYPE=MyISAM;
• Le fichier modele.sql
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
--
--
-- --------------------------------------------------------
--
--
) TYPE=MyISAM;
Exercice 3:
Solution
Exercice 4:
Recréer les tables de la base voitures en utilisant les fichiers SQL précédents.
Solution
-- phpMyAdmin SQL Dump
-- version 2.6.0-rc3
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
--
-- --------------------------------------------------------
--
-- Structure de la table `cartegrise`
--
CREATE TABLE `cartegrise` (
`id_pers` mediumint(8) unsigned NOT NULL default '0',
`immat` varchar(6) NOT NULL default '',
`datecarte` date NOT NULL default '0000-00-00',
) TYPE=MyISAM;
-- --------------------------------------------------------
--
-- Structure de la table `modele`
--
CREATE TABLE `modele` (
`id_modele` varchar(10) NOT NULL default '',
`modele` varchar(30) NOT NULL default '',
`carburant` enum('essence','diesel','gpl','électrique') NOT NULL
default 'essence',
PRIMARY KEY (`id_modele`)
) TYPE=MyISAM;
-- --------------------------------------------------------
--
-- Structure de la table `proprietaire`
--
CREATE TABLE `proprietaire` (
--
Insérer des données dans la table proprietaire de la base voitures puis en vérifier la
bonne insertion.
Solution
);
Exercice 6:
Créer un fichier texte contenant une liste de modèles de voitures avec autant de
données par ligne que de colonnes dans la table modèle de la base voitures. Insérer
ces données dans la base.
Solution
modele.txt
"17C92853AZ";"Citroën C5";"diesel"
"178524ER45";"Citroën Picasso";"essence"
"7499RF5679";"Renault Mégane Scénic";"diesel"
"33356677PO";"Peugeot 206";"électrique"
"563339GH56";"Citroën C3";"essence"
"83321TY455";"Renault Espace";"diesel"
Pour revoir la méthode d’insertion à partir d’un fichier texte avec phpMyAdmin,
voir la page 382 et suivantes.
Exercice 7:
Solution
L’insertion des données se fait selon la même procédure que celle utilisée pour un
fichier texte. Après l’insertion la table modèle a le contenu suivant :
Exercice 8:
Insérer des données dans les autres tables de la base voitures. Effectuer des mises à
jour en modifiant certaines valeurs.
Solution
Exercice 9:
Dans la base magasin, sélectionner les articles dont le prix est inférieur à 1 500 €.
Solution
Requête SQL :
Exercice 10:
Dans la base magasin, sélectionner les articles dont le prix est compris entre 100 et
500 €.
Solution
Requête SQL :
Exercice 11:
Dans la base magasin, sélectionner tous les articles de marque Nikon (dont la
désignation contient ce mot).
Solution
Requête SQL :
Exercice 12:
Dans la base magasin, sélectionner tous les caméscopes, leur prix et leur référence.
Solution
Requête SQL :
Exercice 13:
Solution
Requête SQL :
Exercice 14:
Dans la base magasin, sélectionner tous les clients de moins de 40 ans et ordonner
les résultats par ville en ordre alphabétique.
Solution
Requête SQL :
Exercice 15:
Dans la base magasin, calculer le prix moyen de tous les articles.
Solution
Requête SQL :
FROM article
Exercice 16:
Dans la base magasin, calculer le nombre d’e-mails non NULL et distincts l’un de
l’autre.
Solution
Requête SQL :
Exercice 17:
Dans la base magasin, afficher les coordonnées des clients ayant la même adresse
(même adresse et même ville).
Solution
Requête SQL :
Exercice 18:
Dans la base magasin, sélectionner tous les articles commandés par chaque client.
Solution
Requête SQL :
SELECT nom,prenom,article.id_article,designation
ORDER BY nom
Exercice 19:
Dans la base magasin, sélectionner tous les clients dont le montant d’une
commande dépasse 1 500 €.
Solution
Requête SQL :
WHERE ligne.id_comm=commande.id_comm
AND commande.id_client=client.id_client
GROUP BY ligne.id_comm
HAVING sum(prixunit*quantite)>1500
Exercice 20:
Dans la base magasin, sélectionner tous les clients dont le montant total de toutes
les commandes dépasse 5 000 €.
Solution
Requête SQL :
FROM client,ligne,commande
WHERE ligne.id_comm=commande.id_comm
AND commande.id_client=client.id_client
GROUP BY client.id_client
HAVING sum(prixunit*quantite)>5000
Exercice 21:
Dans la base voitures, sélectionner tous les véhicules d’une personne donnée.
Solution
Requête SQL : Nous cherchons par exemple tous les véhicules de M. Algout.
SELECT cartegrise.immat,modele,proprietaire.id_pers
FROM voiture,modele,proprietaire,cartegrise
WHERE proprietaire.nom='Algout'
AND proprietaire.id_pers=cartegrise.id_pers
AND cartegrise.immat=voiture.immat
AND voiture.id_modele=modele.id_modele
Exercice 22:
Dans la base voitures, sélectionner toutes les personnes ayant le même modèle de
voiture.
Solution
Requête SQL : Nous cherchons par exemple tous les propriétaires de véhicules de
type « Picasso ».
SELECT
proprietaire.nom, proprietaire.prenom,modele.modele,modele.carburant
FROM voiture,modele,proprietaire,cartegrise
WHERE modele LIKE '%Picasso'
AND voiture.id_modele=modele.id_modele
AND cartegrise.immat=voiture.immat
AND proprietaire.id_pers=cartegrise.id_pers
Exercice 23:
Solution
Requête SQL :
SELECT cartegrise.immat FROM cartegrise
GROUP BY immat
HAVING count(*) >1
4/Affichez les formations dont le coût est supérieur au cout moyen des formations
(1.5pts)
5/Affichez les Personnes qui ont faits des formations en Fiscalité et dont le nombre
d’heures des formations est supérieur au minimum du nombre
d’heures (1.5pts)
a. Un Trigger
b. Une contrainte d’intégrité
Partie II :
Soit les tables suivantes :
Insérer dans la table « candidats » un nouveau candidat ayant le matricule 3200, nommé « Albert », né
le 12/05/1980, et qui a obtenu son diplôme le 15/08/2000 délivré par l‟école ayant le code 03.
Avoir la liste des candidats triés par ordre croissant des Ecoles.
Avoir la liste des candidats lauréats de l‟école « XXXXX ».
Calculer l‟age moyen des candidats.
Partie III :
La société IMPTON est spécialisée dans le recyclage des toners d‟imprimantes. Pour gérer une partie de leur
métier le directeur accède à la base de données dont le schéma est le suiavant :
Un attribut (ou un ensemble d‟attributs) souligné est une clé primaire. Les clés étrangères sont
précédées par #.
La table CARTOUCHE renseigne sur tous les modèles de cartouches vendues par la société IMPTON.
La table IMPRIMANTE renseigne sur tous les modèles d‟imprimantes existantes.
La table TYPE contient trois lignes (Imprimantes Matricielle, Imprimante Laser, Imprimante Jet d‟encre).
La table COMPATIBILITE permet de connaître toute imprimante acceptant un modèle de cartouche, et
réciproquement, toutes les cartouches compatibles avec un modèle d‟imprimante.
Questions :
Présenter le schéma du modèle conceptuel des données (MCD) du modèle logique indiqué ci-dessus.
Qu‟est ce qu‟une clé étrangère ?
Exprimer la requête pour créer la table CARTOUCHE.
Exprimer en langage SQL la requête permettant d‟obtenir le Nombre et prix de vente moyen des
cartouches compatibles avec les imprimantes à jet d‟encre.
Note :
Pour utiliser les dates dans un format uniforme, lancer la commande suivante au début de votre session dans
l'Analyseur de requêtes :
Par la suite, les valeurs "date" sont présentées et saisies dans le format international année-mois-jour (ex: 2004-
10-23).
3. Produisez la liste contenant le numéro, la description et la quantité, des produits en inventaire qui valent au
moins $50.00 l'unité.
4. Produisez la liste des sorties d'inventaire où la quantité sortie est supérieure à un (1) mais inférieure à dix (10).
6. Présentez la liste des sorties d'inventaire qui ont été effectuées entre le 10 mai 1989 et le 25 février 1990,
exclusivement.
7. La liste (code_produit, description et quantité) des produits qui ont au moins 15 unités en inventaire.
8. La liste des sorties d'inventaire du projet 'P1206' oú la quantité sortie est supérieure à un (1).
10. Ajoutez un nouveau projet, dont le code est P1384. Il est dirigé par le chef de projet dont le matricule est 106,
et il doit débuter le 20 octobre 1994.
11. La liste des produits, code et description seulement, que l'on retrouve dans une étagère débutant par '21' ou
'11'.
12. La liste des produits (classe, code_produit, description et étagère) que l'on retrouve dans la section d'étagère
'S' (ex: '99S99') et qui n'ont pas de quantité en inventaire.
13. La liste des sorties d'inventaire (no_sortie, code_produit, code_projet et quantité) qui ont été effectuées avec
le produit 'BXM100', ou qui ont été effectuées pour le projet 'P1259'.
14 Modifiez l'unité de mesure des produits appartenant à la classe 'C10' et entreposées à la rangée 'L' pour la
valeur 'UN'.
15. Fournissez la liste des numéros des projets ayant débuté entre le 24 mai 1987 et le 4 mars 1990
inclusivement.
16. Le produit dont le code est 128R a été mal saisi ; sa classe doit être C10, son étagère doit être 03T33 et son
coût unitaire est 4 588.23$. Faites les modifications nécessaires.
17. Présentez les sorties d'inventaire affectées au projet P1208, en autant qu'elles n'ont pas eu lieu entre le 5
avril 1991 et le 26 mars 1992, inclusivement.
18. Quel est le code des projets dont la date de fin est inconnue ?
Au départ, vous avez accès au schéma et à la base de données « Films », vue et revue en cours, qui est
partagée (en lecture) par tout le monde. Voici le script de création de ce schéma (disponible sur le site). Ces
commandes doivent maintenant vous être familières (sinon relisez les chapitres correspondant).
Exemple 1 SchemaFilms.sql : Le script de création du schéma
/*
Commandes de création de la base Films, testé avec MySQL et PostgreSQL.
Pour Oracle, il suffit de remplacer le type TEXT par le type LONG dans la table Film.
*/
Vous pouvez remarquer que l‟ordre de création des tables respecte le référencement entre PRIMARY KEY et
FOREIGN KEY. Les tables qui sont référencées par cette dernière clause doivent être créées avant celles qui les
référencent. Par exemple la table Artiste est créée avant la table Film à cause de la clé étrangère idMES. C‟est
en revanche l‟ordre inverse qui est suivi pour les commandes DROP : on ne peut pas détruire une table qui est
référencée par une commande FOREIGN KEY. Notez qu‟en principe on ne place pas les commandes DROP
dans un script de création puisqu‟on ne souhaite pas prendre le risque de détruire des données existantes.
Comme il s‟agit ici d‟une base de test, la situation est différente.
La base est disponible sur le site et contient un échantillon de films avec leur metteur en scène, leurs acteurs et
les notations de quelques internautes. À vous de jouer : il faut concevoir, saisir et exécuter les ordres SQL
correspondant aux requêtes qui suivent.
1.2 Jointures
Les requêtes suivantes peuvent s’exprimer avec une imbrication des clauses SELECT, mais on peut
également utiliser des jointures « à plat ». Si le cœur vous en dit, essayez les deux versions.
1. Donnez les nom et prénom des artistes qui on mis en scène un film.
2. Donnez le titre et année des films qui ont le même genre que Matrix.
3. Donnez le nom des internautes qui ont noté le film Alien. Donnez également la note.
1.4 Négation
1. Quelle est le nombre de films notés par l‟internaute rigaux@cnam.fr, quelle est la moyenne des notes données,
la note minimale et la note maximale ?
2. Combien de fois Bruce Willis a-t-il joué le role de McClane ?
3. Année du film le plus ancien et du film le plus récent.
4. id, Nom et prénom des réalisateurs, et nombre de films qu‟ils ont tournés.
Il s‟agit de définir un schéma de base de données, d‟y intégrer des contraintes, des vues et d‟y insérer quelques
informations. Vérifiez le comportement des contraintes et des vues en essayant de les mettre en défaut.
Créez les tables du schéma ’Agence de voyages’, vues en cours, et rappelées ci-dessous.
– Station (nomStation, capacité, lieu, région, tarif)
– Activite (nomStation, libellé, prix)
– Client (id, nom, prénom, ville, région, solde)
– Sejour (id, station, début1, nbPlaces)
Attention à bien définir les clés primaires et étrangères. Voici les autres contraintes portant sur ces
tables.
1. Les données capacité, lieu, nom, ville, solde et nbPlaces doivent toujours être connues.
2. Les montants (prix, tarif et solde) ont une valeur par défaut à 0.
3. Il ne peut pas y avoir deux stations dans le même lieu et la même région.
4. Les régions autorisées sont : ‟Ocean Indien‟, ‟Antilles‟, ‟Europe‟, ‟Ameriques‟ et ‟Extreme Orient‟.
5. La destruction d‟une station doit entraîner la destruction de ses activités et de ses séjours.
6. Le prix d‟une activité doit être inférieur au tarif de la station et supérieur à 0.
7. Pour une date de début donnée, le nombre total de places réservées dans une station doit être inférieur à la
capacité de la station.
Conseil : donnez des noms à vos contraintes PRIMARY KEY, FOREIGN KEY et CHECK avec la clause
CONSTRAINT.
FIG. 1 – La base ’Agence’
Insérez dans la base les données de la figure 1 avec des ordres INSERT. Attention, l‟ordre des INSERT est
important (pourquoi ?).
Vous pouvez ensuite tester les contraintes avec quelques ordres SQL. Par exemple : détruisez la station et
vérifiez que les activités ont disparu ; insérez une autre station en (Guadeloupe, Antilles) ; insérez une station
dans une région ‟Nullepart‟, etc.
2.3 Vues
Maintenant il faut créer des vues et tester l’interrogation et la mise à jour à travers ces vues.
(a) Une vue ActivitesModiques (Station, Activite) donnant le nom des stations et des activités dont le prix est
inférieur à 140 FF. Toute ligne insérée dans cette vue doit apparaître dans la vue ensuite.
(b) Une vue ActivitesCheres, de même schéma, avec prix supérieur à 140 FF, et la même contrainte d‟insertion.
(c) Une vue StationDollars (Nom, Capacite, Lieu, TarifDollar) donnant le nom d‟une station, sa capacité, le lieu et
le tarif en dollars (metez le taux de conversion « en dur », ou bien – mieux – créez une table stockant le taux de
conversion).
(d) Une vue Tarifs (Station, Tarif, OptionMin, OptionMax) donnant, pour chaque station, le tarif et les prix min et
max des activités.
(e) Une vue Reservation (nomStation, PlacesReservees) donnant, par station et date de début de séjour, le
nombre de places réservées.
2. Consultez ensuite le contenu de ces vues. Vous pouvez insérez quelques lignes supplémentaires dans
les tables et constater qu’elles sont prises en compte dans les vues.
3. Dans quelles vues peut-on insérer, détruire et mettre à jour ? Essayez les opérations suivantes :
(a) Insérez une activité ‟Kayac‟ pour la station ‟Venusa‟ dans ActivitesCheres et ActivitesModiques. Le contrôle
sur l‟insertion est-il utile dans ce cas ?
(b) Peut-on insérer dans StationEuro ? Sous quelle condition ? Faites l‟essai.
3 - Programmation
Les exercices qui suivent permettent de se familiariser avec les langages de programmation interne (PL/SQL) et
externe (Java/JDBC, PHP) permettant de manipuler une base de données de manière procédurale. Des
exemples sont fournis sur le site, qui doivent vous permettre de créer vos propres procédures, fonctions et
programmes.
Le langage utilisé est le PL/SQL version PostgreSQL. Quelques modifications mineures suffisent à transcrire pour
le PL/SQL d‟Oracle.
1. Créer une fonction NomClient qui prend en entrée l‟id d‟un client et qui renvoie une chaîne contenant le
prénom et le nom du client (voir l‟exemple réalisateur .plsql).
2. Créer une fonction Activités qui prend en entrée le nom du station et produit une chaîne de caractères
contenant l‟énumération des activités de la station (par exemple, “Ski, Yoga, Massage”).
3. Créer ensuite une vue qui affiche les stations, avec un attribut supplémentaire donnant la liste des activités
(par appel à la fonction bien sûr).
4. Créer une fonction Actualiser qui prend en entrée un pourcentage et le nom d‟une station, et augmente le tarif
de la station et le prix de chacune de ses activités du pourcentage indiqué.
3.2 Triggers
1. Implantez par un trigger la règle suivante : si le prix d’une activité baisse, alors le tarif de la station doit
augmenter de la différence.
Indication : le trigger doit se déclencher sur une modification, et tester pour chaque ligne que la nouvelle valeur
est plus grande que l‟ancienne. Si ce n‟est pas le cas, faire un UPDATE de la station pour ajouter la différence
entre l‟ancienne et la nouvelle valeur.
2. Faites l’expérience : diminuez le prix d’une activité, et regardez ce qui se passe pour la station.
3. On veut disposer de l’information nbActivites dans la table Station. Pour cela :
4. Interdisez par un trigger l’insertion d’une ligne dans la table Séjour si le solde du client est inférieur au
nombre de places multiplié par le tarif de la station.
Il n‟y a aucune limite (enfin, presque), à ce que l‟on peut faire avec une programmationHTML/PHP/PostgreSQL
(ou n‟importe quelle autre SGBD). Pour commencer vous devez installer les trois scripts vus en cours qui
montrent les principales techniques (connexion, exécution d‟une requête, interrogation par formulaire).
Récupérez les fichiers sur le site (ils sont dans une archive pgphp.tar disponible dans la page des exemples).
1. Créer les tables FilmComplet et FilmSimple avec les deux scripts FilmSimple.sql et FilmCOmplet.sql
2. Insérer quelques lignes dans la table FilmSimple avec le script InsFilmSimple.sql
3. Modifier les paramètres de connexion dans Connect.php
Voici quelques suggestions pour des scripts PHP sur la base Station.
1. Récupérez les scripts PHP donnés en exemple, et travaillant sur la table FilmSimple, et adaptez-les
pour saisir et modifier les informations de la table Client.
2. Faites un formulaire de saisie d’un séjour, en proposant la liste des stations et la liste des clients dans
un menu déroulant.
4 - Concurrence d’accès
On va maintenant étudier le comportement concret d‟un SGBD en cas d‟accès concurrents à la même ressource.
Pour celà on va simuler l‟exécution concurrente de programmes à l‟aide du petit ensemble de lectures/écritures
sur la base “Agence de voyage” créé dans le premier exercice : modification du solde de certains clients et
sélection des clients. Créez 4 fichiers, nommés SEL.sql, MAJpas.sql, MAJfog.sql et MAJker.sql et entrez-y les
commandes suivantes :
1. SEL.sql
PROMPT ‟Affichage des clients =>‟;
SELECT * FROM client;
2. MAJpas.sql
3. MAJfog.sql
4. MAJker.sql
PROMPT ‟Augmentation du client Kerouac =>‟;
UPDATE client SET solde = solde + 1000
WHERE client = ‟Kerouac‟;
Ensuite, ouvrez deux fenêtres et lancez SQLPLUS dans chacune : chaque session est considérée par ORACLE
comme un utilisateur, et on a donc 2 utilisateurs, nommés 1 et 2, en situation de concurrence.
Dans tout ce qui suit, on note INSTRi l‟exécution de l‟instruction INSTR par l‟utilisateur i. Par exemple MAJker1
corespond à l‟exécution du fichier MAJker dans la première fenêtre par la commande @MAJker. On note de
même ROLi et COMi l‟exécution des commandes rollback; et commit ;dans la fenêtre i.
Questions Executez les séquences d‟instruction décrites ci-dessous. Dans chacun des cas, expliquez ce qui se
passe.
1. Première expérience : l’utilisateur 1 effectue des mises-à-jour, tandis que l’utilisateur 2 ne fait que des
sélections. Que constate-t-on ?
4. Idem, avec un ordre des opérations qui diffère d’un utilisateur à l’autre.
Que constate-t-on ?
5.En fait, ORACLE pratique une verrouilage à deux phases assez libéral, qui ne garantit pas la
sérialisabilité : aucun verrrou n’est placé sur une ligne lors d’une lecture. L’utilisateur peut verrouiller
explicitement en ajoutant la clause FOR UPDATE. Exemple :
Chaque ligne sélectionnée est alors verrouillée. Refaites les expériences précédentes avec un verrouillage
explicite des lignes que vous voulez modifier.
Objectif de l'exercice:
Employés:
Departements:
– en Algèbre relationnelle
– en SQL
Requête 1:
Requête 2:
Donnez les noms, emplois et salaires des employés par emploi croissant, et pour chaque emploi, par
salaire décroissant
Requête 3:
Requête 4:
Requête 5:
Donnez les noms des employés ayant le salaire maximum dans chaque département
Requête 7:
Requête 8:
Requête 9:
Donnez le ou les emplois ayant le salaire moyen le plus bas, ainsi que ce salaire moyen
B. Exercice B
Création de tables
Donnez les requêtes SQL qui permettent de créer les tables suivantes. Indiquer les contraintes sur les
champs, ainsi que les clés primaires et étrangères.
– nom du magasin
– nom du gérant
– prénom du gérant
– date de création
– nombre de clients
– chiffre d'affaire.
– prénom
– nom
– fonction (gérant, employé, client)
– telephone
– date de naissance.