Title: Rappel
1Rappel
- Règles de passage de l'algèbre relationnelle vers
SQL. - Fonctions dagrégation (min, max, avg, count)
- Nommage des objets
- Dictionnaire
2Rappel syntaxe générale de recherche
- select ltliste d'attributs projetésgt
- from ltliste de relationsgt
- where ltliste de critères de restriction et de
jointuregt - La partie from décrit les relations qui sont
utilisables dans la requête (c'est à dire
l'ensemble des attributs que l'on peut utiliser).
C'est par là que l'on doit commencer par écrire
une requête. - La partie where exprime la (les conditions) que
doivent respecter les attributs d'un tuple pour
pouvoir être dans la réponse. Cette partie est
optionnelle. - La partie select indique le sous-ensemble des
attributs qui doivent apparaître dans la réponse
(c'est le schéma de la relation résultat). Bien
entendu ces attributs doivent appartenir aux
relations indiquées dans la partie from.
3Partitionnement dune relation (ou
groupement)Clause group by
- Syntaxe
- group by ltliste dattributsgt
- Principe
- partitionnement horizontal d'une relation, selon
les valeurs d'un attribut ou d'un groupe
d'attributs qui est spécifié dans la clause group
by - la relation est (logiquement) fragmentée en
groupes de tuples, où tous les tuples de chaque
groupe ont la même valeur pour l'attribut (ou le
groupe d'attributs) de partitionnement
4Exemple
- Produit(prod,nom,pu)
- Depot(dep, adr,volume)
- Stock(prod,dep,qte)
Depot
Produit
dep adr volume 1 Nancy
100 2 Laxou 200 3
Vandoeuvre 115 5
Nancy 220 6 Nancy
1000
prod nom pu p1 vis
10.0 p2 vis 9 p3 mat
15
5Exemple (suite)
- Q sommes des quantités en stock de chaque
produit? - Select prod, sum(qte)
- from Stock
- group by prod
- 1. La relation Stock est partitionée en
groupes déléments ayant le même prod. - 2. La somme est faite sur les qte de chaque
groupe - Attention en SQL strandard chaque expression du
select doit être monvaluée par groupe - soit lattribut de groupement
- soit une fonction sur cet attribut
- soit une fonction qui réduit les valeurs dun
groupe à une valeur unique..
6Exemple (suite)
- Attention en SQL standard
- les attributs après le groupe by doivent
apparaître dans la clause select - et les attributs dans select doivent apparaître
dans group by ou bien ils doivent être un
argument dune fonction dagrégation - Ce nest pas le cas de Transact-SQL de Sybase
7Exemple de requête erronée en SQL standard
Select prod, dep, avg(qte) from Stock group
by prod Résultat "attendu" prod dep
Avg(qte) p1 1,3,5,2 10.0 p2
5,6 11.0 p3 2,6,3
13.0 Requête non valide en SQL standard !!!
L'attribut dep est multivalué par rapport à
l'attribut de partitionnement prod La relation
résultat n'est pas en première forme normale (à
voir lannée prochaine)
8Exemple (suite)
Select prod, dep, avg(qte) from Stock group
by prod Résultat prod dep
Avg(qte) p1 1 10.0 p1
3 10.0 p1
5 10.0 p1 2
10.0 p2 5
11.0 p2 6 11.0 p3
2 13.0 p3 6
13.0 p3 3
13.0 Requête valide en Transact-SQL de
sybase !!!
9Exemple (suite)
- Q la somme des quantités en stock de chaque
produit dans tous les dépôts sauf le dépôt numéro
5? - R select prod, sum(qte)
- from Stock
- where dep ltgt 5
- group by prod
- donc, si la requête comporte une clause where
les tuples ne vérifiant pas la condition sont
exclus AVANT dopérer le groupement..
10Exemple (suite)
- Q la somme des quantités en stock de chaque
produit dans tous les dépôts de Nancy? Trier le
résultat sur prod? - R select s.prod, sum(s.qte)
- from Stock s, Depot d
- where d.dep s.dep and d.dep like Nancy
- group by s.prod
- order by s.prod
-
- Donc, si le résultat doit être trié, la clause
order by doit apparaître APRES le group by.
11Partitionnement dune relation (ou
groupement)Clause group by
- Restriction sur les groupes
- application possible d'un critère de restriction
sur les groupes obtenus - clause having
- lexpression suivant le having doit être
monovaluée pour chaque groupe
12Exemple
- Q Quels sont les produits stockés dans plus de 2
dépôts ? - R select prod
- from Stock
- group by prod
- having count() gt 2
13Exemple (suite)
- Q quels sont les dépôts ayant plus de trois
produits en rupture de stock ? - R select dep, adr
- from Depot
- where dep in ( select dep
- from Stock
- where qte lt 0
- group by dep
- having count() gt3)
- éliminer des dépôts ayant qte gt0
- groupement sur dep
- comptage des membres de chaque groupe
- éliminer des groupes ayant moins de 4 membres
14Restriction
- Clause where restriction sur les tuples dune
relation (pas de fonction d'agrégation) - Clause having restriction sur les groupes dune
relation obtenus par la clause group by (on peut
utiliser une fonction d'agrégation) - Q Donner les produits et les sommes des
quantités associés, si aucun produit considéré
n'a pas de quantité supérieur ou égal à 12" - SELECT prod, sum(qte)
- FROM Stock
- GROUP BY prod
- HAVING Max(qte) lt 12
15Exemple (suite)
- On peut comparer à la requête suivante
- SELECT prod, sum(qte)
- FROM Stock
- WHERE qte lt12
- GROUP BY prod
- qui donne pour chaque produit la somme des
quantités si la quantité est inférieur à 12
(elle correspond à la requête initiale mais
travaillant non pas sur la relation Stock toute
entière, mais seulement les tuples de quantité
inférieur à 12).
16Questions quantifies (prédicat all, exists)
- Prédicat all
- teste si la valeur d'un attribut satisfait un
critère de comparaison avec tous les résultats
d'une sous-question - Q numéro et nom du (ou des) produit ayant la
plus grande quantité ? - SELECT p.prod, p.nom
- FROM Produit p, Stock s
- WHERE p.prod s.prod
- AND s.qte gt ALL ( SELECT qte FROM Stock )
- Cette requête peut s'écrire sans utiliser de
quantificateurs - SELECT p.prod, p.nom
- FROM Produit p, Stock s
- WHERE p.prod s.prod
- AND s.qte gt ( SELECT MAX(qte) FROM Stock )
17Prédicat dexistence " exists "
- Syntaxe exists ltsous-questiongt
- Tester si la réponse à une sous-question est true
ou false - false si la réponse est lensemble vide, et true
sinon - Q donner ladresse des depots où est stocké le
produit p1 ? - SELECT d. dep, d.adr
- FROM Depot d
- WHERE EXISTS (SELECT
- FROM Stock s
- WHERE s.dep d.dep and s.prod p1 )
- Cette requête peut également s'écrire sans
utiliser de quantificateur - SELECT d. dep, d.adr
- FROM Depot d, Stock s
- WHERE s.dep d.dep and s.prod p1
-
18Prédicat dexistence "exists "
- Q adresse des dépôts où nest pas est stocké le
produit p1 ? - SELECT d. dep, d.adr
- FROM Depot d
- WHERE not EXISTS (SELECT
- FROM Stock s
- WHERE s.dep d.dep and s.prod p1 )
19Traduction de la division
- "Quels sont les numéros et les adresses des
depots où sont entreposés tous les produits (ceux
connus de la base de données)?" - PARAPHRASE EN FRANCAIS
- "Un dépôt est sélectionné s'il n'existe aucun
produit qui n'ait pas été stocké par ce dépôt" - gt DOUBLE NEGATION
20Exemple
- SELECT d. dep, d.adr
- FROM Depot d
- WHERE NOT EXISTS
- ( SELECT
- FROM produit p
- WHERE NOT EXISTS
- (SELECT
- FROM Stock s
-
WHERE p.prod s.prod - AND s.dep d.dep
- )
- )
21Exemple (suite)
- Pour ceux n'ayant aucun attrait particulier pour
la logique, voici une solution - SELECT d. dep, d.adr
- FROM Depot d
- WHERE d.depot IN
- (SELECT dep FROM Stock
- GROUP BY dep
- HAVING COUNT()
- (SELECT COUNT() FROM Produit)
- )
- Attention, cette écriture n'est correcte que
parce que l'on est sûr (par définition) que
l'ensemble des produits dun entrepôt est inclus
(ou égal) dans l'ensemble des produits de la base
de données.
22Synthèse
- (6) select ltliste attributs Aj et/ou
expressions sur attributs Apgt - (1) from ltliste relations Rigt
- (2) where ltcondition sur tuples C1gt
- (3) group by ltliste attributs Akgt
- (4) having ltcondition sur groupes C2gt
- (5) order by ltliste attributs Algt
- 1) Produit cartésien des relations Ri
- (2) Sélection des tuples de (1) vérifiant C1
- (3) Partitionnement de l'ensemble obtenu en (2)
suivant les valeurs des Ak - (4) Sélection des groupes de (3) vérifiant C2
- (5) Tri des groupes obtenus en (4) suivant les
valeurs des Al - (6) Projection de l'ensemble obtenu en (5) sur
les attributs Aj, avec calcul des fonctions
appliquées aux groupes (s'il y en a)
23Un exemple complet
- "Donnez par ordre croissant le nom et la somme
des quantités des produits, uniquement si chaque
quantité stockée est strictement supérieure à
20?" - Requête SQL
- SELECT p.prod, p.nom, Sum(s.qte)
- FROM Produit p, Stock s
- WHERE p.prod s.prod
- GROUP BY p.prod,p.nom
- HAVING min(s.qte) gt 20
- ORDER BY p.nom
- Attention, ici on groupe par numéro puis par nom
du produit, parce que la clé de Produit est le
numéro (et non pas le nom) et donc que l'on peut
rajouter n'importe quel attribut dans la
partition après la clé sans changer les
partitions construites. Si on ne groupe que par
le nom, le résultat peut être erroné (rien ne
garantit qu'il n'y a pas deux produits de même
nom) et si on groupe par numéro seulement, on ne
pourra sélectionner le nom qui ne sera pas dans
les attributs de partitionnement !!!!!
24La manipulation de schémas de relations en SQL
- create table création de schéma de relation
- alter table modification de schémas de relation
- drop table suppression de schéma de relation
- Rappel
- schéma de relation R(U,P)
- U ltattribut, domainegt
- domaine type de données
- P contraintes dintégrité
- ce quon peut exprimer dépend du SGBD
25Création d'un schéma de relation
- create table nom-table (nom-attr1 type-attr1
, nom-attr2 type-attr1 ) - Le type dun attribut
- Chaque SGBD possède des domaines qui lui sont
propres - En sybase 11.0.x, (voir sybooks, pour plus de
détail..) - Type de base
- int (entier signé sur 4 bytes), smallint
(entier signé sur 2bytes), tinyint entier non
signé sur 1bytes) - float(précision) (sur 8 bytes, la précision
dépendant de la machine sur laquelle est installé
le système) - real (sur 8 bytes..)
- char(longueur) (chaine de caractères de
longueur fixe, au plus 255 caractères) - varchar(longueur) (chaine de caractères de
longueur variable, au plus 255 caractères) - datetime (la date de base est 1er janvier
1990.) - money.
- Types définis par lutilisateur (user defined
types, sp_addtype )
26Contraintes dintégrité
- Une contrainte d'intégrité est une règle qui
définit la cohérence d'une donnée ou d'un
ensemble de données de la BD -
- - non nullité des valeurs d'un attribut
- - unicité de la valeur d'un attribut ou d'un
groupe d'attributs - - check ou validité restreint les valeurs à
insérer dans une table - - clé primaire (un attribut ou un groupe)
- - intégrité référentielle "minimale"
27Exemple de création de schémas de relation
- create table Produit ( prod int primary key,
- nom char(20),
- pu float not null)
- create table Depot (dep int primay key,
- adr varchar (20),
- volume int)
- create table Stock (prod int references
Produit(prod) , - dep int references Depot(dep),
- qte int
- constraint stock-cons forign key(prod,dep))
- primary key unique et not null
28Modification de schémas de relations
- Commande alter table
- ajouter de nouveaux attributs, contraintes
- modifier de définition d attributs
- Sybase 11.0.x
- Possibilté de
- ajouter d attributs, de contraintes (add)
- supprimer de contraintes (drop constraint)
- modifier de valeurs par défaut dattributs
(replace) - Restriction
- on ne peut pas supprimer un attribut..
- Un attribut ajouté à l aide d alter table
n est pas visible dans les procédures qui font
(select ) - drop procedure, puis recréer la procédure
29Exemples
- alter table Produit
- add coleur varchar(20) NULL
- ajout dune colonne à la relation Produit
- Pour les lignes existantes, on affecte la valeur
NULL - alter table Stock
- add st_id numeric(5,0) identity
- ajout dune colonne identité à la relation Stock
- Pour les lignes existantes déjà dans la table, le
serveur affecte des valeurs en séquence. - alter table Stock
- drop constraint stock-cons
- suppression dune contrainte de la relation Stock
- alter table Stock
- replace qte defaut null
- modification de la valeur par défaut de
l attribut qte
30Suppression d'un schéma de relation
- drop table nom-relation ,nom-relation,
- Exemple
- drop table Stock
- drop table Produit, Depot
- suppression du schéma de la relation
- suppression des tuples de la relation
- suppression des index de la relation
31Mise à jour dune relation
- Insertion d'un ensemble de tuples
- un seul tuple
- plusieurs tuples
- Suppression d'un ensemble de tuples
- Modification d'un ensemble de tuples
32Insertion de tuples dans unerelation
- Insertion d'un seul tuple
- insert into Produit values (100, vis', 23)
- insert into Produit (prod, nom) VALUES (100,
vis') - Insertion d'un ensemble de tuples
- Ex create table Vis
- (prod int, pu float)
- insert into Vis
- select prod, pu
- from produit
- where nom vis
- on peut insérer dans une table le résultat dune
clause select
33Modification de tuples dans une relation
- update Produit
- set pu 88
- where prod 150
- update Produit
- set pu pu 1.1
- where prod 150
- update Stock
- set qte qte 10
- where prod in
- (select prod
- from Produit
- where nom vis )
34Suppression de tuples dans une relation
- Delete from nom-relation ,nom-relation,..
- where qualification
- Supprimer tous les tuples de Produit?
- delete Produit
- on supprime tous les tuples mais le schéma de la
relation existe toujours.. - Supprimer le produit de numéro 150?
- delete from Produit
- where prod 150
- Supprimer les produits de numéro lt9 ou gt12?
- delete from Produit
- where prod lt 9 or prod gt 12
- Supprimer les produits stockés au dépôt numéro 5
?
35Synthèse
- SQL est un langage standard de définition de
données (create table,..) - SQL est un langage standard de manipulation de
données (select) - Chaque SGBD implante sa propore version de SQL
- à suivre !!!