SQL PDF
SQL PDF
Alexandre Mesl
31 mars 2015
2 Contraintes dclaratives
4 Jointures
4.1
4.2
4.3
4.4
Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Produit cartsien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Jointure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Jointures rexives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1
1
1
2
2
3
3
3
3
4
4
4
4
5
6
6
6
6
7
7
7
8
8
8
8
8
10
10
11
11
12
5 Agrgation de donnes
14
6 Vues
18
7 Requtes imbriques
20
28
28
C Modules et prerequis
28
D Gomtrie
30
E Livraisons
30
F Arbre gnalogique
32
G Comptes bancaires
32
34
I Secrtariat pdagogique
36
J Mariages
37
Dnition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Suppression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
14
14
14
15
16
16
16
18
18
18
19
20
20
20
21
21
22
23
25
26
26
27
27
Introduction
Un SGBD (Systme de Gestion de Bases de Donnes) est un logiciel qui stocke des donnes de faon organises
et cohrentes. Un SGBDR (Systme de Gestion de Bases de Donnes Relationnelles) est le type particulier de SGBD
2
qui fera l'objet de ce cours. Il vous sera dcrit plus tard ce qui fait qu'une bases de donnes est relationnelle.
Les bases de donnes les plus rpandues sont :
Oracle, qui est considr comme un des SGBDR les plus performants.
Microsoft SQL Server, la mouture de microsoft, qui est intgr au framework .NET.
mySQL, un logiciel libre fonctionnant souvent de pair avec Apache et Php, et de ce fait trs rpandu dans la
programmation web.
Access, incorpor Microsoft Oce. Il prsente l'norme avantage de mettre disposition de l'utilisateur une
interface graphique. En contrepartie il est mono-utilisateur et de faible capacit.
Les SGBDRs sont gnralement des serveurs auxquels des clients se connectent, il doivent supporter plusieurs
connections simultanes. Les clients dialoguent alors avec le serveur pour lire ou crire des donns dans la base.
1.2 SQL
Le SQL, Structured Query Language, est un langage Standard permettant un client de communiquer des instructions la base de donnes. Il se dcline en quatre parties :
le DDL (Data denition language) comporte les instructions qui permettent de dnir la faon dont les donnes
sont reprsentes.
le DML (Data manipulation language) permet d'crire dans la base et donc de modier les donnes.
le DQL (Data query language) est la partie la plus complexe du SQL, elle permet de lire les donnes dans la
base l'aide de requtes.
le DCL (Data control language), qui ne sera pas vu dans ce cours permet de grer les droits d'accs aux donnes.
A cela s'ajoute des extensions procdurales du SQL (appel PL/SQL en Oracle). Celui-ci permet d'crire des scripts
excuts par le serveur de base de donnes.
1.3 Connexion une base de donnes
Dans une base de donnes relationnelle, les donnes sont stockes dans des tables. Une table est un tableau deux
entres. Nous allons nous connecter une base de donnes pour observer les tables.
1.3.1 Oracle
Sous oracle, le client s'appelle SQL+, le compte utilisateur par dfaut a pour login scott et password tiger.
La liste des tables s'ache en utilisant l'instruction
1.3.2 mySQL
La mthode la plus simple pour s'initier mysql est d'utiliser un kit de easyphp, wamp, etc. Vous disposez dans
ce cas d'une option vous permettant d'ouvrir une console mysql.
La liste des bases de donnes stockes dans le serveur s'obtient avec l'instruction
sql> show databases
Database
|
++
| information_schema |
| arbreGenealogique
|
| banque
|
| geometrie
|
| livraisons
|
| playlist
|
| repertoire
|
| secretariat
|
| test
|
++
|
Une fois dans la base, on obtient la liste des tables avec l'instruction
Tables_in_livraisons |
++
| DETAILLIVRAISON
|
| FOURNISSEUR
|
| LIVRAISON
|
| PRODUIT
|
| PROPOSER
|
++
|
++++++
Field
| Type
| Null | Key | Default | Extra |
+++++++
| numprod | int ( 1 1 )
| NO
| PRI | 0
|
|
| nomprod | varchar ( 3 0 ) | YES
|
| NULL
|
|
+++++++
+
|
sql> SELECT
sql> FROM PRODUIT
++
numprod | nomprod
|
+++
|
1 | Roue de secours |
|
2 | Poupee Batman
|
|
3 | Cotons tiges
|
|
4 | Cornichons
|
+++
+
|
Contraintes dclaratives
2.3 Cl primaire
La colonne numcli est cl primaire, toute insertion ne respectant pas la contrainte de cl primaire sera refuse par
le SGBD.
2.4 Cl trangre
Dans le cas o l'on souhaite garder en mmoire des factures mises par des clients, la faon de faire est de crer
une deuxime table contenant la liste des factures :
sql> create table facture
sql>
(
sql>
numfact int PRIMARY KEY,
sql>
montantFacture int
sql>
numcli int REFERENCES CLIENT ( numCli )
sql>
);
Le champ numCli dans cette table est cl trangre, ce qui signie qu'une ligne ne pourra tre insre dans la table
facture que si le numcli de cette ligne existe dans la colonne numcli de la table client.
La syntaxe est
REFERENCES
... ,
colonnen )
... ,
colonnen )
( colonne1 ,
REFERENCES tablereferencee
... ,
colonnen )
Il est aussi possible de placer une descriptioncontrainte dans le CREATE TABLE. Par exemple,
On remarque qu'il est possible de nommer une contrainte. C'est utile si on souhaite la supprimer :
Sous mySQL :
Il est possible d'utiliser SELECT pour n'acher que certaines colonnes d'une table. Syntaxe :
<colonne_2 >,
. . . , <colonne_n >
Cette instruction s'appelle une requte, elle achera pour chaque ligne de la table les valeurs des colonnes colonne
colonne . Il est possible de supprimer les lignes en double l'aide du mot-cl DISTINCT. Par exemple :
SELECT DISTINCT
FROM <table >
. . . , <colonne_n >
Cette instruction trie les donnes par colonne croissants. En cas d'galit, le tri est fait par colonne croissants,
etc. Pour trier par ordre dcroissant, on ajoute DESC aprs le nom de la colonne choisie comme critre dcroissant. Par
exemple :
1bis
2bis
<colonne_nbis >
Cette instruction permet de ne slectionner que certaines lignes de la table. Par exemple la requte va acher le
nom du produit numro 1 :
sql> SELECT nomprod
sql> FROM produit
sql> WHERE numprod =
<colonne_2 >,
. . . , <colonne_n >
condition sera value pour chaque ligne de la table, et seules celles qui veront cette condition feront partie du
rsultat de la requte.
3.3 Conditions
3.3.1 Comparaison
Les conditions peuvent tre des relations d'galit (=), de dirence (<>), d'ingalit (<, >, >= ou <=) sur des
colonnes :
numero_client = 2
nom_client = ' Marcel '
prenom_client <> ' Ginette '
salary < 230
taxes >= 2 3 0 0 0
3.3.2 Ngation
La ngation d'une condition s'obtient l'aide de NOT. Par exemple, il est possible de r-ecrire les conditions ci-avant :
NOT
NOT
NOT
NOT
NOT
( numero_client <> 2 )
( nom_client <>
( prenom_client =
( salary >= 2 3 0 )
( taxes < 2 3 0 0 0 )
De mme, vous avez votre disposition tous les connecteurs logiques binaires : AND, OR. Ainsi, les deux conditions
suivantes sont les mmes :
NOT( ( nom
( nom <>
3.3.4 NULLit
Un champ non renseign a la valeur NULL, dans une comparaison, NULL n'est jamais gal quelque valeur qu'il
soit! La condition suivante est toujours fausse :
NULL
NULL;
(3) ;
sql> SELECT
sql> FROM MP3
sql> WHERE nomMp3 IS NULL;
++
numMp3 | nomMp3 |
+++
+
|
|
NULL
++
ou encore
sql> SELECT
sql> FROM MP3
sql> WHERE nomMp3 IS NOT NULL;
++
numMp3 | nomMp3
|
+++
|
1 | Get Lucky
|
|
2 | Locked Down |
+++
+
|
3.3.5 Encadrement
Une valeur numrique peut tre encadre l'aide de l'oprateur BETWEEN, par exemple les deux conditions suivantes
sont quivalentes :
SALAIRE BETWEEN 1 0 0 0 AND 5 0 0 0
( SALAIRE >= 1 0 0 0 ) AND ( SALAIRE
<= 5 0 0 0 )
3.3.6 Inclusion
L'oprateur IN permet de tester l'appartenance une liste de valeurs. Les deux propositions suivantes sont quivalentes
NAME IN ( 'Gg ' , ' Ginette ' , ' Marcel ' )
( NAME = 'Gg ' ) OR ( NAME = ' Ginette ' ) OR
( NAME =
3.3.7 LIKE
LIKE
sert comparer le contenu d'une variable un littral gnrique. Par exemple, la condition
sera vrie si NAME commence par un 'M'. Ca fonctionne aussi sur les valeurs de type numrique, la condition
SALARY LIKE ' %000000000 '
sera vrie si SALARY se termine par 000000000. Le caractre % peut remplacer dans le littral n'importe que suite,
vide ou non, de caractres; il a le mme rle que * en DOS et en SHELL. Le caractre _ remplace un et un seul
caractre dans le littral. Par exemple, la condition
NAME LIKE 'K_r % '
ne sera vrie que si NAME commence par un 'K' et contient un 'r' en troisime position.
3.4 Suppression
L'expression
eace de la table NOMTABLE toutes les lignes vriant condition. Attention! La commande
L'expression
<valeur_1 >,
modie les lignes de la table NOMTABLE vriant condition. Elle aecte au champ colonne la valeur valeur . Par
exemple,
i
10
aecte la valeur 'Dark' aux champs prenomcli de toutes les lignes dont la valeur nomcli est gale 'Vador'. Il
est possible, dans une modication, d'utiliser les valeurs des autres champs de la ligne, voire mme l'ancienne valeur
de ce champ. Par exemple,
sql> UPDATE OPERATION
sql> SET montantoper = montantoper
+ 5000
augmente les montants de toutes les oprations bancaires de 5000 (choisissez l'unit!).
11
Jointures
4.1 Principe
numMod |
++
|
|
Ensuite, cherchons les numros des modules prrequis pour s'inscrire dans le module numro 6,
numModPrereq |
++
|
|
|
|
(1 ,
5) ;
nomMod |
++
| Oracle |
| Merise |
++
|
Vous tes probablement tous en train de vous demander s'il n'existe pas une mthode plus simple et plus rapide,
et surtout une faon d'automatiser ce que nous venons de faire. Il existe un moyen de slectionner des donnes dans
plusieurs tables simultanment. Pour traiter la question ci-dessus il susait de saisir :
sql> SELECT m2 . nomMod
sql> FROM MODULE m1 , MODULE m2 , PREREQUIS p
sql> WHERE m1 . numMod = p . numMod
sql> AND m2 . numMod = p . numModprereq
sql> AND m1 . nomMod = 'PL / SQL Oracle ' ;
nomMod |
++
| Oracle |
| Merise |
++
|
sql> SELECT
sql> FROM PROPOSER , PRODUIT ;
+++++
numfou | numprod | prix | numprod | nomprod
|
++++++
|
1 |
1 |
200 |
1 | Roue de secours |
|
1 |
2 |
15 |
1 | Roue de secours |
|
2 |
2 |
1 |
1 | Roue de secours |
|
3 |
3 |
2 |
1 | Roue de secours |
|
1 |
1 |
200 |
2 | Poupee Batman
|
|
1 |
2 |
15 |
2 | Poupee Batman
|
|
2 |
2 |
1 |
2 | Poupee Batman
|
|
3 |
3 |
2 |
2 | Poupee Batman
|
|
1 |
1 |
200 |
3 | Cotons tiges
|
|
1 |
2 |
15 |
3 | Cotons tiges
|
|
2 |
2 |
1 |
3 | Cotons tiges
|
|
3 |
3 |
2 |
3 | Cotons tiges
|
|
1 |
1 |
200 |
4 | Cornichons
|
|
1 |
2 |
15 |
4 | Cornichons
|
|
2 |
2 |
1 |
4 | Cornichons
|
|
3 |
3 |
2 |
4 | Cornichons
|
++++++
+
|
Placer une liste de tables dans le FROM revient former toutes les combinaisons de lignes possibles. Cependant, cela
a relativement peu de sens.
4.3 Jointure
Il serait plus intressant, dans le cas prsent, de ne voir s'acher que des lignes dont les numros de produits
concordent. Pour ce faire, il sut d'utiliser WHERE. Par exemple,
sql> SELECT
sql> FROM PROPOSER , PRODUIT
sql> WHERE PROPOSER . numprod
PRODUIT . numprod ;
+++++
numfou | numprod | prix | numprod | nomprod
|
++++++
|
1 |
1 |
200 |
1 | Roue de secours |
|
1 |
2 |
15 |
2 | Poupee Batman
|
|
2 |
2 |
1 |
2 | Poupee Batman
|
|
3 |
3 |
2 |
3 | Cotons tiges
|
++++++
+
|
Nous avons mis en correspondance des lignes de la table proposer avec des lignes de la table produit en utilisant le
fait que numprod est une cl trangre dans proposer. Comme la colonne numprod apparait deux fois dans la requte,
il est ncessaire de la prxer par le nom de la table de sorte que chaque colonne puisse tre dsigne de faon non
ambigu. Si on veut mettre face face les noms des produits et les noms des fournisseurs, il sut de saisir la requte
sql> SELECT nomfou , nomprod
sql> FROM PRODUIT , FOURNISSEUR
PROPOSER
13
++
nomfou | nomprod
|
+++
| f1
| Roue de secours |
| f1
| Poupee Batman
|
| f2
| Poupee Batman
|
| f3
| Cotons tiges
|
+++
+
|
<table_1_renommee >,
++
nomfou | nomprod
|
+++
| f1
| Roue de secours |
| f1
| Poupee Batman
|
| f2
| Poupee Batman
|
| f3
| Cotons tiges
|
+++
+
|
Le renommage permet entre autres de faire des jointures rexives, c'est dire entre une table et elle mme. Par
exemple, en reprenant la table intervalle,
sql> SELECT FROM INTERVALLE ;
++
borneInf | borneSup |
+++
+
|
|
30
56
10
32
27
12
12
30
21
34
26
++
La commande ci-dessous ache tous les couples d'intervalles ayant une borne en commun,
14
++++
borneInf | borneSup | borneInf | borneSup |
+++++
+
|
|
56
12
30
12
30
12
12
30
++++
15
Agrgation de donnes
Nous voulons connatre le nombre de lignes de table produit. Deux faons de procder :
1. Solution moche
sql> SELECT FROM PRODUIT ;
++
numprod | nomprod
|
+++
|
1 | Roue de secours |
|
2 | Poupee Batman
|
|
3 | Cotons tiges
|
|
4 | Cornichons
|
+++
+
|
2. Solution belle
+
|
count ( )
+
|
Une fonction d'agrgation retourne une valeur calcule sur toutes les lignes de la requte (nombre, moyenne...).
Nous allons utiliser les suivantes :
COUNT(col) : retourne le nombre de lignes dont le champ col est non NULL.
AVG(col) : retourne la moyenne des valeurs col sur toutes les lignes dont le champ col est non NULL.
MAX(col) : retourne la plus grande des valeurs col sur toutes les lignes dont le champ col est non NULL.
MIN(col) : retourne la plus petite des valeurs col sur toutes les lignes dont le champ col est non NULL.
SUM(col) : retourne la somme des valeurs col sur toutes les lignes dont le champ col est non NULL.
5.1.3 Exemples d'utilisation
+
|
MAX( prix )
+
|
200
PRIX_MAXIMAL |
++
|
|
200
Les requtes suivantes rcuprent le nom du fournisseur proposant l'article 'Poupe Batman' au prix le moins lev :
PRIX_MINIMUM |
++
|
|
nomfou |
++
| f2
|
++
|
Il est possible de faire cela avec une seule requte en rcuprant le prix minimum dans une requte imbrique. Mais
cela sera pour un cours ultrieur.
5.1.4 Complments sur COUNT
On rcupre le nombre de ligne retournes par une requte en utilisant COUNT(*). Par exemple, si on souhaite
connatre le nombre de produits proposs par le fournisseur 'f1' :
sql> SELECT COUNT( ) AS NB_PROD
sql> FROM FOURNISSEUR F , PROPOSER P
sql> WHERE F . numfou = P . numfou
sql> AND nomfou = 'f1 ' ;
NB_PROD |
++
|
|
17
NB_PROD |
++
|
|
Pour connatre le nombre de produits proposs, c'est dire dont le numprod a une occurence dans la table PROPOSER,
on procde de la faon suivante :
sql> SELECT COUNT(DISTINCT numprod ) AS NB_PRODUITS_PROPOSES
sql> FROM PROPOSER ;
NB_PRODUITS_PROPOSES |
++
|
|
Le DISTINCT nous sert viter qu'un mme produit propos par des fournisseurs dirents soit comptabilis
plusieurs fois.
5.2 Groupage
5.2.1 L'instruction GROUP BY
Les oprations d'agrgation considres jusqu' maintenant portent sur la totalit des lignes retournes par les
requtes, l'instruction GROUP BY permet de former des paquets l'intrieur desquels les donnes seront agrges. Cette
instruction s'utilise de la manire suivante
sql> SELECT . . .
sql> FROM . . .
sql> WHERE. . .
sql> GROUP BY <liste_colonnes >
sql> ORDER BY . . .
La liste des colonnes sert de critre pour rpartir les lignes dans des paquets de lignes. Si par exemple nous
souhaitons acher la liste des nombres de produits proposs par chaque fournisseur :
sql> SELECT nomfou , COUNT( numprod ) AS NB_PRODUITS_PROPOSES
sql> FROM FOURNISSEUR F , PROPOSER P
sql> WHERE F . numfou = P . numfou
sql> GROUP BY nomfou ;
++
nomfou | NB_PRODUITS_PROPOSES |
+++
| f1
|
2 |
| f2
|
1 |
| f3
|
1 |
+++
+
|
Supposons que de la requte prcdente, nous ne souhaitions garder que les lignes pour lesquelles la valeur
est gale 1. Ajouter une condition dans WHERE serait inutile, le ltrage occasionn par
est eectu avant l'agrgation. Il nous faudrait une instruction pour n'inclure que des groupes de donnes
rpondant certains critres. L'instruction utilise pour ce faire est HAVING. Son utilisation est la suivante :
NB_PRODUITS_PROPOSES
WHERE
18
sql> SELECT . . .
sql> FROM . . .
sql> WHERE . . .
sql> GROUP BY . . .
sql> HAVING <condition >
sql> ORDER BY . . .
Par exemple,
++
nomfou | NB_PRODUITS_PROPOSES |
+++
| f3
|
1 |
| f2
|
1 |
+++
+
|
Achons les noms des fournisseurs qui ont livr strictement plus d'un produit dirent (toutes livraisons confondues),
sql> SELECT nomfou
sql> FROM FOURNISSEUR F , DETAILLIVRAISON D
sql> WHERE F . numfou = D . numfou
sql> GROUP BY nomfou
sql> HAVING count (DISTINCT D . numprod ) > 1 ;
nomfou |
++
| f1
|
++
|
19
Vues
6.1 Dnition
Une vue est une table contenant des donnes calcules sur celle d'une autre table. Les donnes d'une vue sont tout
le temps jour. Si vous modiez les donnes d'une des tables sur lesquelles est calcule la vue, alors les modications
sont automatiquement rpercutes sur la vue.
6.2 Syntaxe
<requete >
6.3 Application
Par exemple, la requte suivante met en correpondance les noms des produits avec le nombre de fournisseurs qui
le proposent :
SQL> SELECT nomprod , COUNT( numfou ) AS NB_FOURNISSEURS
2
FROM PRODUIT P
3
LEFT OUTER JOIN PROPOSER PR
4
ON P . numprod = PR . numprod
5
GROUP BY nomprod
6
ORDER BY COUNT( numfou ) ;
NOMPROD
NB_FOURNISSEURS
Cornichons
0
Cotons tiges
1
Roue de secours
1
Poup e Batman
2
4
ligne ( s ) selectionn e ( s ) .
Ce type de requte sera explit dans un cours ultrieur. Pour le moment, notez juste que les outils dont vous
disposez pour le moment ne vous permettront pas de formuler une requte achant les noms des produits n'ayant
aucun fournisseur. Crons une vue pour ne pas avoir se farcir la requte chaque fois que nous aurons besoin de ces
informations :
SQL> CREATE VIEW NB_FOURNISSEURS_PAR_PRODUIT AS
2
SELECT nomprod , COUNT( numfou ) AS NB_FOURNISSEURS
3
FROM PRODUIT P
4
LEFT OUTER JOIN PROPOSER PR
5
ON P . numprod = PR . numprod
6
GROUP BY nomprod
7
ORDER BY COUNT( numfou ) ;
Vue cr e .
Une fois cre, on peut interroger une vue de la mme faon qu'on interroge une table :
SQL> SELECT
2 FROM NB_FOURNISSEURS_PAR_PRODUIT ;
NOMPROD
NB_FOURNISSEURS
Cornichons
0
Cotons tiges
1
Roue de secours
1
20
Poup e Batman
4
ligne ( s ) selectionn e ( s ) .
Notez que toute modication dans la table PROPOSER ou PRODUIT sera immdiatement rpercute sur la vue.
(3 ,
4,
9) ;
ligne creee .
SQL> SELECT
2 FROM NB_FOURNISSEURS_PAR_PRODUIT ;
NOMPROD
NB_FOURNISSEURS
Cornichons
1
Cotons tiges
1
Roue de secours
1
Poup e Batman
2
4
ligne ( s ) selectionn e ( s ) .
Maintenant, nous souhaitons voir s'acher, pour tout i, le nombre de produits proposs par exactement i fournisseurs.
SQL> SET head off
SQL> SELECT 'Il y a ' | | COUNT( NOMPROD ) | | ' produit (s) qui est / sont '
2
' propose (s) par ' | | NB_FOURNISSEURS | | ' fournisseur (s). '
3 FROM NB_FOURNISSEURS_PAR_PRODUIT
4 GROUP BY NB_FOURNISSEURS
5 ORDER BY NB_FOURNISSEURS ;
Il y a
Il y a
2
3
1
ligne ( s ) selectionn e ( s ) .
6.4 Suppression
21
1
2
fournisseur ( s ) .
fournisseur ( s ) .
||
Requtes imbriques
Oracle permet d'imbriquer les requtes, c'est--dire de placer des requtes dans les requtes. Une requte imbrique
peut renvoyer trois types de rsultats :
une valeur scalaire
une colonne
une table
7.1 Sous requtes renvoyant une valeur scalaire
Le rsultat d'une requte est dit scalaire s'il comporte une seule ligne et une seule colonne. Par exemple :
COUNT( )
21
On peut placer dans une requte une sous-requte calculant un rsultat scalaire. Un tel type de sous-requte se place
soit comme une colonne supplmentaire, soit comme une valeur servant valuer des conditions (WHERE ou HAVING).
7.1.1 Colonne ctive
On peut ajouter une colonne dans une requte, et choisir comme valeurs pour cette colonne le rsultat d'une
requte. Ce type de requte est souvent une alternative GROUP BY. Par exemple, la requte suivante nous renvoie,
pour tout produit, le nombre de fournisseurs proposant ce produit :
SQL> SELECT nomprod , (SELECT COUNT( )
2
FROM PROPOSER PR
3
WHERE PR . numprod = P . numprod )
4
AS NB_FOURNISSEURS
5 FROM PRODUIT P ;
NOMPROD
NB_FOURNISSEURS
Roue de secours
1
Poupee Batman
2
Cotons tiges
1
Cornichons
0
On peut construire une condition en utilisant le rsultat d'une requte. Pour notre exemple, dclarons d'abord une
vue contenant le nombre d'articles proposs par chaque fournisseur,
SQL> CREATE VIEW NB_PROD_PAR_FOU AS
2 SELECT numfou , (SELECT COUNT( )
3
FROM PROPOSER P
4
WHERE P . numfou = F . numfou )
5
AS NB_PROD
6 FROM FOURNISSEUR F ;
Vue creee .
22
4
5
NOMFOU
f1
La requte SELECT MAX(NB_PROD) FROM NB_PROD_PAR_FOU est value avant, et son rsultat lui est substitu dans
l'expression de la requte. Comme on a
SQL> SELECT MAX( NB_PROD ) FROM NB_PROD_PAR_FOU ;
MAX( NB_PROD )
f1
On peut placer dans des instructions de mises jour ou d'insertions des requtes imbriques. Par exemple,
VALUES
( numpers ,
nom , prenom )
FROM PERSONNE )
On considre une colonne comme une liste de valeurs, on peut tester l'appartance d'un lment cette liste l'aide
de l'oprateur IN. On peut s'en servir comme une alternative aux jointures, par exemple, rcrivons la requte de la
section prcdente. La requte suivante nous renvoie le nombre de produits proposs par les fournisseurs proposant le
plus de produits :
SQL> SELECT MAX( NB_PROD ) FROM NB_PROD_PAR_FOU ;
MAX( NB_PROD )
Maintenant, recherchons les numros des fournisseurs proposant un tel nombre de produits :
SQL> SELECT N . numfou
2 FROM NB_PROD_PAR_FOU N
3 WHERE NB_PROD = (SELECT MAX( NB_PROD )
4
FROM NB_PROD_PAR_FOU ) ;
NUMFOU
23
Notons que s'il existe plusieurs fournisseurs proposant 2 produits, cette requte renverra plusieurs lignes. C'est
donc par hasard qu'elle ne retourne qu'une ligne. Le numro du fournisseur proposant le plus de produits est donc le
1. Cherchons ce fournisseur :
SQL> SELECT nomfou
2 FROM FOURNISSEUR F
3 WHERE F . numfou IN ( 1 ) ;
NOMFOU
f1
Il sut donc dans la requte ci-dessous de remplacer le 1 par la requte qui a retourn 1. On a nalement :
f1
On peut remplacer le nom d'une table dans la clause FROM par une sous-requte. Par exemple, la requte suivante
renvoie une table.
SQL> SELECT
2
3
4
5
6
(SELECT
COUNT( )
FROM PROPOSER PR
WHERE PR . numfou = F . numfou
) AS NB_PROD
FROM FOURNISSEUR F ;
NB_PROD
2
1
1
0
Cette table contient, pour chaque fournisseur, le nombre de produits proposs. Si l'on souhaite connatre le plus
grand nombre de produits proposs, on se sert du rsultat de la requte ci-dessus comme d'une table :
SQL> SELECT MAX( NB_PROD ) AS MAX_NB_PROD
2
3
4
5
6
7
8
9
FROM
(SELECT
(SELECT COUNT( )
FROM PROPOSER PR
WHERE PR . numfou = F . numfou
) AS NB_PROD
FROM FOURNISSEUR F
);
MAX_NB_PROD
24
Ce type de requte est une alternative aux vues. Rcuprons maintenant les noms des fournisseurs proposant le
plus de produits (sans jointure et sans vue!) :
SQL> SELECT nomfou
2 FROM FOURNISSEUR
3 WHERE numfou IN
4
(SELECT numfou
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FROM
(SELECT numfou ,
(SELECT COUNT( )
FROM PROPOSER PR
WHERE PR . numfou = F . numfou
) AS NB_PROD
FROM FOURNISSEUR F
N
WHERE NB_PROD =
(SELECT MAX( NB_PROD )
FROM
(SELECT numfou ,
(SELECT COUNT( )
FROM PROPOSER PR
WHERE PR . numfou = F . numfou
) AS NB_PROD
FROM FOURNISSEUR F
22
23
24
)
);
NOMFOU
f1
Vous constatez que la solution utilisant les vues est nettement plus simple.
(SELECT
SUM( qte )
FROM DETAILLIVRAISON D
WHERE D . numfou = F . numfou
)
NB_PROD_L
FROM FOURNISSEUR F ;
NUMFOU NB_PROD_L
1
45
2
3
10
Cette mme requte, une fois value, peut server de requte non correle si on souhaite connatre les noms de ces
fournisseurs :
SQL> SELECT nomfou , NB_PROD_L
25
2
3
4
5
6
FROM FOURNISSEUR F ,
(SELECT numfou ,
(SELECT SUM( qte )
FROM DETAILLIVRAISON D
WHERE D . numfou = F . numfou
7
9
10
NB_PROD_L
FROM FOURNISSEUR F
WHERE F . numfou
L . numfou ;
NOMFOU
NB_PROD_L
f1
45
f2
f3
10
f4
Amusons-nous : quel sont, pour chaque fournisseur, les produits qui ont t les plus livrs?
WHERE
(SELECT SUM( qte )
FROM DETAILLIVRAISON L
WHERE L . numfou = FF . numfou
AND L . numprod = PP . numprod
5
6
7
8
9
10
11
12
FROM
(SELECT numfou , SUM( qte ) AS NB_PROD_L
FROM DETAILLIVRAISON L
GROUP BY numprod , numfou
13
14
15
16
17
19
20
21
22
23
WHERE Q . numfou
18
FF . numfou
NOMFOU
f1
f3
NOMPROD
Roue de secours
Cotons tiges
Dans la requte prcdente, quelles sous-requtes sont correles et lesquelles ne le sont pas?
26
virgule.
dnit un type numrique de au plus (p s) chires avant la virgule et au plus s chires aprs la
);
Table creee .
SQL> INSERT INTO TOTO VALUES( 1 0 . 2 )
1
ligne creee .
ligne creee .
ligne creee .
ligne creee .
ligne creee .
ligne creee .
ERREUR a la ligne 1 :
ORA 0 1 4 3 8 : valeur incoherente avec la precision indiquee pour cette colonne
ERREUR a la ligne 1 :
ORA 0 1 4 3 8 : valeur incoherente avec la precision indiquee pour cette colonne
SQL> SELECT
2 FROM TOTO ;
TUTU
10 ,2
10
,01
21 ,01
21
21 ,01
27
ligne ( s ) selectionnee ( s ) .
Une date en SQL est considr comme un point dans le temps. On le convertit en chaine de caratres avec la
fonction to_char(date, format), o format est une chane de caractres optionnelle. Par exemple,
SQL> SELECT to_char ( dateli ) AS DT
2 FROM LIVRAISON ;
DT
30/10/06
30/10/06
2006
2006
2006/10/30
2006/10/30
20061030
20061030
On convertit une chaine de caractres en date avec la fonction to_date(date, format). Par exemple :
SQL> SELECT
2 FROM LIVRAISON ;
28
NUMFOU
NUMLI DATELI
1
1 30/10/34
1 30/10/34
1 30/10/06
1 30/10/06
renvoie valeur1 si valeur1 est non NULL, valeur2 sinon. Par exemple,
ligne ( s ) supprimee ( s ) .
SUM( TUTU )
0)
La contrainte dclarative de type permet de tester une condition portant les lignes de la table prises une par une.
La syntaxe est :
ALTER TABLE nomtable ADD CONSTRAINT nomcontrainte CHECK( condition ) ;
Par exemple,
> 0) ;
Table modifiee .
SQL> INSERT INTO EMP ( EMPNO , SAL ) VALUES ( 1 5 , 1) ;
INSERT INTO EMP ( EMPNO , SAL ) VALUES ( 1 5 , 1)
ERREUR a la ligne 1 :
ORA 0 2 2 9 0 : violation de contraintes
( SCOTT .
CK_SALARY ) de verification
Une contrainte de type CHECK ne peut pas contenir de requtes ni de valeurs non constantes (sysdate par exemple).
29
Attention : Le numro de livraison est une cl secondaire, c'est--dire un numro unique tant donn un fournisseur.
drop
drop
drop
drop
drop
table
table
table
table
table
PRODUIT ;
FOURNISSEUR ;
PROPOSER ;
LIVRAISON ;
DETAILLIVRAISON ;
Modules et prerequis
les modules sont rpertoris dans une table, et les modules pr-requis pour s'y inscrire (avec la note minimale) se
trouvent dans la table prerequis. Une ligne de la table PREREQUIS nous indique que pour s'inscrire dans le module
numro numMod, il faut avoir eu au moins noteMin au module numModPrereq.
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
IF
IF
IF
IF
IF
IF
EXISTS
EXISTS
EXISTS
EXISTS
EXISTS
EXISTS
RESULTAT ;
EXAMEN ;
PREREQUIS ;
INSCRIPTION ;
MODULE ;
ETUDIANT ;
30
);
( numMod ,
5) ,
(2 ,
3) ,
(6 ,
5) ,
(8 ,
5) ,
(7 ,
5) ;
nomMod ) VALUES
( numMod ,
numModPrereq ) VALUES
(6 ,
1,
12) ;
31
Gomtrie
La table INTERVALLE contient des intervalles spcis par leurs bornes infrieure et suprieure. Supprimer de la
table intervalle tous les intervalles qui n'en sont pas avec une seule instruction.
drop table if exists RECTANGLE ;
drop table if exists INTERVALLE ;
CREATE TABLE INTERVALLE
( borneInf int ,
borneSup int ,
PRIMARY KEY ( borneInf , borneSup ) ) ;
CREATE TABLE RECTANGLE
( xHautGauche int ,
yHautGauche int ,
xBasDroit int ,
yBasDroit int ,
PRIMARY KEY ( xHautGauche , yHautGauche , xBasDroit , yBasDroit ) ) ;
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTERVALLE
INTERVALLE
INTERVALLE
INTERVALLE
INTERVALLE
INTERVALLE
INTERVALLE
INTERVALLE
INTERVALLE
INTERVALLE
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
RECTANGLE
RECTANGLE
RECTANGLE
RECTANGLE
RECTANGLE
RECTANGLE
RECTANGLE
RECTANGLE
RECTANGLE
RECTANGLE
RECTANGLE
RECTANGLE
Livraisons
drop
drop
drop
drop
drop
table
table
table
table
table
if
if
if
if
if
exists
exists
exists
exists
exists
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
(2 ,
56) ;
(12 ,
(2 ,
30) ;
3) ;
(12 ,
(8 ,
3) ;
27) ;
(34 ,
26) ;
(5 ,
10) ;
(7 ,
32) ;
(0 ,
30) ;
(21 ,
8) ;
(2 ,
12 ,
5,
7) ;
(2 ,
12 ,
1,
13) ;
(10 ,
13 ,
1,
(10 ,
13 ,
10 ,
(2 ,
(21 ,
7,
5,
73 ,
11) ;
11) ;
13) ;
15 ,
(1 ,
2,
3,
4) ;
(1 ,
5,
3,
2) ;
(1 ,
6,
3,
6) ;
(4 ,
2,
1,
4) ;
(2 ,
3,
4,
0) ;
(5 ,
4,
2,
1) ;
22) ;
DETAILLIVRAISON ;
LIVRAISON ;
PROPOSER ;
FOURNISSEUR ;
PRODUIT ;
32
nomfou varchar ( 3 0 ) ) ;
(1 ,
'f2 ' ) ,
'f3 ' ) ,
'f4 ' ) ;
2,
15) ,
(2 ,
2,
1) ,
(3 ,
3,
2) ;
2,
(3 ,
1,
now ( ) ) ,
now ( ) ) ;
(1 ,
'f1 ' )
1,
200) ,
(1 ,
(1 ,
1,
now ( ) )
33
1,
1,
25) ,
(1 ,
1,
2,
20) ,
(1 ,
2,
1,
15) ,
(1 ,
2,
2,
17) ;
(3 ,
1,
3,
10) ,
Arbre gnalogique
La table PERSONNE, le champ pere contient le numro du pre de la personne, le champ mere contient le numro
de la mre de la personne.
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
into
personne
personne
personne
personne
personne
personne
personne
personne
personne
personne
personne
personne
personne
personne
personne
personne
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
values
Comptes bancaires
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
IF
IF
IF
IF
IF
IF
EXISTS
EXISTS
EXISTS
EXISTS
EXISTS
EXISTS
OPERATION ;
TYPEOPERATION ;
COMPTECLIENT ;
TYPECCL ;
PERSONNEL ;
CLIENT ;
34
);
( numtypeccl ) ,
CONSTRAINT fk_ccl_client
FOREIGN KEY ( numcli )
REFERENCES CLIENT
( numcli ) ,
CONSTRAINT fk_ccl_personnel
FOREIGN KEY ( numpers )
REFERENCES PERSONNEL
( numpers )
);
( numcli ,
CONSTRAINT fk_oper_codeoper
FOREIGN KEY ( numtypeoper )
REFERENCES TYPEOPERATION
CONSTRAINT montant_operation
CHECK( montantoper
numccl )
( numtypeoper ) ,
<> 0 )
);
35
(1
(1 ,
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
IF
IF
IF
IF
IF
IF
EXISTS
EXISTS
EXISTS
EXISTS
EXISTS
EXISTS
OPERATION ;
COMPTECLIENT ;
TYPECCL ;
TYPEOPERATION ;
PERSONNEL ;
CLIENT ;
36
numtypeoper int ,
dateoper date ,
montantoper int not null
libeloper varchar ( 3 0 )
);
CONSTRAINT pk_compteclient
PRIMARY KEY ( numcli , numccl ) ,
CONSTRAINT fk_ccl_typeccl
FOREIGN KEY ( numtypeccl )
REFERENCES TYPECCL
( numtypeccl ) ,
CONSTRAINT fk_ccl_client
FOREIGN KEY ( numcli )
REFERENCES CLIENT
( numcli ) ,
CONSTRAINT fk_ccl_personnel
FOREIGN KEY ( numpers )
REFERENCES PERSONNEL
( numpers )
);
CONSTRAINT pk_operation
PRIMARY KEY ( numcli , numccl , numoper ) ,
CONSTRAINT fk_oper_ccl
FOREIGN KEY ( numcli , numoper )
REFERENCES COMPTECLIENT
( numcli ,
CONSTRAINT fk_oper_codeoper
FOREIGN KEY ( numtypeoper )
REFERENCES typeoperation
CONSTRAINT montant_operation
CHECK( montantoper <>
( numtypeoper ) ,
AND montantoper
);
numccl )
0) + 1
) ,
37
>=
<= 1 0 0 0 )
0) + 1
) ,
0) + 1
) ,
0) + 1
) ,
0) + 1
) ,
0) + 1
) ,
0) + 1
) ,
Secrtariat pdagogique
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
IF
IF
IF
IF
IF
IF
EXISTS
EXISTS
EXISTS
EXISTS
EXISTS
EXISTS
RESULTAT ;
EXAMEN ;
PREREQUIS ;
INSCRIPTION ;
MODULE ;
ETUDIANT ;
38
nomMod varchar ( 1 5 ) ,
effecMax int DEFAULT
30
);
( numMod ,
5) ,
(2 ,
3) ,
(6 ,
5) ,
(8 ,
5) ,
(7 ,
5) ;
nomMod ) VALUES
( numMod ,
numModPrereq ) VALUES
(6 ,
1,
12) ;
Mariages
39
);
);
40