Post on 03-Apr-2015
1
SQL : Un Langage RelationnelSQL : Un Langage Relationnel
1
Langage de base de donnéesLangage de base de données(Database Language)(Database Language)
Langage de base de donnéesLangage de base de données(Database Language)(Database Language)
Un sous-langage de programmationUn sous-langage de programmation Consiste traditionnellement de deux parties:Consiste traditionnellement de deux parties:
– langage de définition de donnéeslangage de définition de données– langage de manipulation de donnéeslangage de manipulation de données
» langage interactif (de requêtes)langage interactif (de requêtes)» langage imbriqué (langage imbriqué (embeddedembedded))
En pratique, les deux parties sont imbriquéesEn pratique, les deux parties sont imbriquées– définition de vues et des attributs hérités en généraldéfinition de vues et des attributs hérités en général
1
SQLSQLSQLSQL Inventé à IBM San Jose, 1974 (Astrahan & Inventé à IBM San Jose, 1974 (Astrahan &
Chamberlin) pour System RChamberlin) pour System R Basé sur le calcul de tuple & algèbre relationnelleBasé sur le calcul de tuple & algèbre relationnelle relationnellement complet (et plus)relationnellement complet (et plus) Le langageLe langage de SGBD relationnels de SGBD relationnels En évolution contrôlée par ANSI (SQL1, 2, 3...)En évolution contrôlée par ANSI (SQL1, 2, 3...) Il existe aussi plusieurs dialectesIl existe aussi plusieurs dialectes Les possibilités basiques sont simples Les possibilités basiques sont simples Celles avancées peuvent être fort complexesCelles avancées peuvent être fort complexes
– Signalées dans ce qui suit par Signalées dans ce qui suit par
1
SQL: Définition de DonnéesSQL: Définition de DonnéesSQL: Définition de DonnéesSQL: Définition de Données
CREATE TABLECREATE TABLE CREATE VIEW CREATE VIEW CREATE CREATE INDEXINDEX
ALTER TABLEALTER TABLE
DROP TABLEDROP TABLE DROP VIEWDROP VIEW DROP INDEXDROP INDEX
1
SQL-2 et dialectes SQL-2 et dialectes SGBD-Serveurs :SGBD-Serveurs : DB2, SQL-Server, Sybase..DB2, SQL-Server, Sybase..
CREATE (ALTER, DROP) DOMAINCREATE (ALTER, DROP) DOMAIN
CREATE (ALTER, DROP) SCHEMACREATE (ALTER, DROP) SCHEMA
– une partie nommée d’une baseune partie nommée d’une base
– donne une autonomie de nommagedonne une autonomie de nommage
» une table T dans le schéma S1 et une table T dans le schéma S2 sont une table T dans le schéma S1 et une table T dans le schéma S2 sont
deux tables différentesdeux tables différentes
– nommées S1.T et S2.T dans la basenommées S1.T et S2.T dans la base
– peut être considérée une base logiquepeut être considérée une base logique
CREATE (DROP) DATABASECREATE (DROP) DATABASE
– clause hors standard SQL-2clause hors standard SQL-2
CREATE (DROP) ALIAS, TRIGGER, FUNCTION, PROCEDURE...CREATE (DROP) ALIAS, TRIGGER, FUNCTION, PROCEDURE...
1
CREATE TABLECREATE TABLE(clauses essentielles)(clauses essentielles)
CREATE TABLECREATE TABLE(clauses essentielles)(clauses essentielles)
Définit la table réelle (de base)Définit la table réelle (de base)
CREATE TABLE tableCREATE TABLE table
(column [,column]...(column [,column]...
[, primary key] ;[, primary key] ;
column := name type [NOT NULL]column := name type [NOT NULL]
type :=type := INTEGER, CHAR (n), GRAPHIC, ICON, DATE, INTEGER, CHAR (n), GRAPHIC, ICON, DATE, TIME, TIMESTAMPTIME, TIMESTAMP
1
EXAMPLEEXAMPLEEXAMPLEEXAMPLE
CREATE TABLE SCREATE TABLE S(S# (S# CHAR (5)CHAR (5) NOT NULL,NOT NULL,SNAME SNAME CHAR (20),CHAR (20),STATUSSTATUS INT,INT,CITYCITY CHAR (15),CHAR (15),
PRIMARY KEY (S#) ) ;PRIMARY KEY (S#) ) ;
1
Clauses CONSTRAINT sont nouvelles dans SQLClauses CONSTRAINT sont nouvelles dans SQL Permettent de définir Permettent de définir
– les clés étrangères FOREIGN KEYles clés étrangères FOREIGN KEY– les contraintes d'intégrité CHECKles contraintes d'intégrité CHECK
» sur un attributsur un attribut» inter-attribut d’une tableinter-attribut d’une table
– AutresAutres
La puissance expressive varie entre les dialectesLa puissance expressive varie entre les dialectes– le standard est le plus puissantle standard est le plus puissant
» notamment permet tout SELECT dans CHECKnotamment permet tout SELECT dans CHECK
– les dialectes ne permettent queles dialectes ne permettent que» aucun CHECK (MsAccess)aucun CHECK (MsAccess)» contrainte sur les valeurs d’un même tuple (DB-2)contrainte sur les valeurs d’un même tuple (DB-2)» une par attribut (SQL-Server, DB2)une par attribut (SQL-Server, DB2)» pas de sous-requêtes (SQL-Server)pas de sous-requêtes (SQL-Server)
CREATE TABLECREATE TABLEClause CONSTRAINTClause CONSTRAINT
1
On peut créer une table dans une autre base que celle On peut créer une table dans une autre base que celle courante (ouverte)courante (ouverte)– SQL Server, SQL (seulement) de MsAccess, SQL-2SQL Server, SQL (seulement) de MsAccess, SQL-2
CREATE TABLE CREATE TABLE AUTRE-BASEAUTRE-BASE.S.S(S# (S# CHAR (5)CHAR (5) NOT NULL,NOT NULL,SNAME SNAME CHAR (20),CHAR (20),STATUSSTATUS INT,INT,CITYCITY CHAR (15),CHAR (15),
PRIMARY KEY (S#) ) ;PRIMARY KEY (S#) ) ;
CREATE TABLECREATE TABLE(multibase)(multibase)
CREATE TABLECREATE TABLE(multibase)(multibase)
Basecourante
Autre-Base
1
SQL-2 DomainesSQL-2 DomainesSQL-2 DomainesSQL-2 Domaines
Une version limitée du concept du domaine Une version limitée du concept du domaine relationnel.relationnel.– surtout au niveau de types de donnéessurtout au niveau de types de données
Une source commune pour la définition d'attributsUne source commune pour la définition d'attributs Supporte les contraintes d'intégritéSupporte les contraintes d'intégrité Pas une découverte: Pas une découverte:
– le SGBD MRDS (Multics) supportait les domaines il y le SGBD MRDS (Multics) supportait les domaines il y a déjà 15 ansa déjà 15 ans
1
Les domaines SQL-2Les domaines SQL-2Les domaines SQL-2Les domaines SQL-2 CREATE DOMAIN nom [AS] type
CONSTRAINT def DEFAULT VALUE value
Exemple :Exemple :
CREATE DOMAIN CREATE DOMAIN S#_DOMS#_DOM AS CHAR (4) ; AS CHAR (4) ;
1.1. On peut alors déclarer:On peut alors déclarer:
CREATE TABLE S CREATE TABLE S (S# (S# S#_DOMS#_DOM...) ;...) ;
CREATE TABLE SP CREATE TABLE SP (S# (S# S#_DOMS#_DOM...) ;...) ;
Les deux attributs S# ont la définition:Les deux attributs S# ont la définition:
S# CHAR (4) ;S# CHAR (4) ;
S#
S.S#
SP.S#
1
Domaines avec contraintesDomaines avec contraintesDomaines avec contraintesDomaines avec contraintes
CREATE DOMAIN CITY AS CHAR (15)CREATE DOMAIN CITY AS CHAR (15)
CONSTRAINT VALID_CITIESCONSTRAINT VALID_CITIES
CHECK (VALUE IN ('???', 'Athens', 'Paris', CHECK (VALUE IN ('???', 'Athens', 'Paris', London')) ;London')) ;
Les valeurs légales sont les quatre Les valeurs légales sont les quatre et et NULLNULL ! !– à moins d'ajouter la clause:à moins d'ajouter la clause:
AND VALUE IS NOT NULLAND VALUE IS NOT NULL Travail bâclé au niveau du standard ! Travail bâclé au niveau du standard !
1
Domaines avec contraintesDomaines avec contraintesDomaines avec contraintesDomaines avec contraintes Clause VALUE peut être aussi complexe qu'une Clause VALUE peut être aussi complexe qu'une
expression SELECT de SQLexpression SELECT de SQL Notamment, on peut référencer les valeurs qui changent Notamment, on peut référencer les valeurs qui changent
dans le tempsdans le temps– cette possibilité fait hurler certains (C.J. DATE)cette possibilité fait hurler certains (C.J. DATE)
On peut ajouter la clause définissant une valeur par défaut On peut ajouter la clause définissant une valeur par défaut dans le domainedans le domaineDEFAULT VALUE ('???') ;DEFAULT VALUE ('???') ;
DEFAULT VALUE DEFAULT VALUE CURRENT-TIME ;CURRENT-TIME ;
DEFAULT VALUE DEFAULT VALUE CURRENT-DATE ;CURRENT-DATE ;
Cette valeur devient celle par défaut de tout attribut basé Cette valeur devient celle par défaut de tout attribut basé sur ce domaine.sur ce domaine.
1
Domaines avec contraintesDomaines avec contraintesDomaines avec contraintesDomaines avec contraintes
Illegal dans SQL2(pas de sous-types)
CREATE DOMAIN INT2 AS INTEGERCREATE DOMAIN INT2 AS INTEGERCONSTRAINT TWO_BYTES CONSTRAINT TWO_BYTES CHECK (VALUE >= -32768 CHECK (VALUE >= -32768 AND VALUE <= 32767) ;AND VALUE <= 32767) ;
CREATE TABLE T ... ;CREATE TABLE T ... ;CREATE DOMAIN D CREATE DOMAIN D CHECK (VALUE IN (SELECT C FROM T)) ;CHECK (VALUE IN (SELECT C FROM T)) ;
CREATE DOMAIN INT1 AS INT2CREATE DOMAIN INT1 AS INT2CONSTRAINT ONE_BYTE CONSTRAINT ONE_BYTE CHECK (VALUE >= -128CHECK (VALUE >= -128AND VALUE <= 127) ;AND VALUE <= 127) ;
Légal dans SQL2Peut être mise à jour
Pour + sur les domainesvoir un livre sur SQL-2
1
ALTER & DROP TABLEALTER & DROP TABLEALTER & DROP TABLEALTER & DROP TABLE
ALTER TABLE S ADD DISCOUNT SMALLINT ;ALTER TABLE S ADD DISCOUNT SMALLINT ;
certains systèmes:certains systèmes:ALTER TABLE S DROP DISCOUNT SMALLINT ;ALTER TABLE S DROP DISCOUNT SMALLINT ;
ALTER TABLE S RENAME SNAME NAME ;ALTER TABLE S RENAME SNAME NAME ;
..........
DROP TABLE P ;DROP TABLE P ;
1
IndexesIndexesIndexesIndexes
CREATE [UNIQUE] INDEX indexCREATE [UNIQUE] INDEX index
ON table ( column [order] [, column...)ON table ( column [order] [, column...)
[CLUSTER] ;[CLUSTER] ;
CREATE UNIQUE INDEX XS ON S (S#) ; CREATE UNIQUE INDEX XS ON S (S#) ;
CREATE UNIQUE INDEX XSP ON SP (S# ASC, P# DESC) ;CREATE UNIQUE INDEX XSP ON SP (S# ASC, P# DESC) ;
UNIQUE = pas de duplicata de valeurs indexéesUNIQUE = pas de duplicata de valeurs indexées indexes uniques obligatoires pour les clés dans le DB2indexes uniques obligatoires pour les clés dans le DB2
1
Option CLUSTEROption CLUSTEROption CLUSTEROption CLUSTER
CREATE INDEX C ON S (CITY) CLUSTER;CREATE INDEX C ON S (CITY) CLUSTER;
Même ordre physique:Même ordre physique:– des entrées de l'indexe des entrées de l'indexe CITYCITY– des tuples de des tuples de S S dans leurs dans leurs
pagespages
2Aberdeen 3, Athens 3London 3, Milan 4, Moscou 4, Paris 5, Rome8....
31 Smith Aberdeen 100 ...1 McLeod Aberdeen 100 ...2 Selis Athens 1503 Thacher London 3...
Page 2 de C
Page 3 de S
1
IndexesIndexesIndexesIndexes
Définition des indexes ne devait pas être à ce Définition des indexes ne devait pas être à ce niveau de SQL (c'est le schéma interne)niveau de SQL (c'est le schéma interne)
En principe, une table peut avoir un nombre En principe, une table peut avoir un nombre quelconque d'indexesquelconque d'indexes
Les indexes accélèrent les recherchesLes indexes accélèrent les recherches Mais, les indexes pénalisent les mises à jour !Mais, les indexes pénalisent les mises à jour !
1.1.Pourquoi ?Pourquoi ?
1
Un dialecte de SQLUn dialecte de SQLSQL-MsAccessSQL-MsAccess
Un dialecte de SQLUn dialecte de SQLSQL-MsAccessSQL-MsAccess
Le dialecte le plus répandu aujourd'huiLe dialecte le plus répandu aujourd'hui Définition de données est considérablement plus Définition de données est considérablement plus
élaborée que dans le SQL Standardélaborée que dans le SQL Standard Certaines options du standard sont toutefoisCertaines options du standard sont toutefois
– sous restrictionsous restriction– s'expriment sous mots-clés différentss'expriment sous mots-clés différents
» voir MsAccess Aidevoir MsAccess Aide
– pas toujours nécessairespas toujours nécessaires» ‘‘;’ sous Access97;’ sous Access97
1
Example: Table P de S-PExample: Table P de S-PExample: Table P de S-PExample: Table P de S-P
• Attention: Type Counter -> Autonumber in MsAccess-97
1
MsAccess: Types de Données MsAccess: Types de Données MsAccess: Types de Données MsAccess: Types de Données TextText
– limité par défaut à 50 caractèreslimité par défaut à 50 caractères» clause FIELD SIZE permet 256 caractèresclause FIELD SIZE permet 256 caractères
– supporte les prédicats SQL & QBEsupporte les prédicats SQL & QBE MemoMemo
– taille < 64K caractèrestaille < 64K caractères– supporte seulement la sélection SQL & QBEsupporte seulement la sélection SQL & QBE
Date/TimeDate/Time– supporte l ’arithmétique de dates/tempssupporte l ’arithmétique de dates/temps
» 21/3 - 21/2 = 2821/3 - 21/2 = 28» 21/4 - 21/3 = 31 ?21/4 - 21/3 = 31 ?
– prévu pour 21-ème siècle (Access97)prévu pour 21-ème siècle (Access97)» 1/1/00 à 31/12/29 signifie 1/1/2000 à 31/12/20291/1/00 à 31/12/29 signifie 1/1/2000 à 31/12/2029» 1/1/30 à 31/12/99 signifie 1/1/1930 à 31/12/19991/1/30 à 31/12/99 signifie 1/1/1930 à 31/12/1999
AutonumberAutonumber– compteur automatique ou OID (option random dans NewValues)compteur automatique ou OID (option random dans NewValues)
1
MsAccess: Types de DonnéesMsAccess: Types de Données
HyperlinkHyperlink– comme son l ’indiquecomme son l ’indique
» nom symbolique < 2048 octetsnom symbolique < 2048 octets» URL ou UNC< 2048 octetsURL ou UNC< 2048 octets» sous-adresse (dans le fichier ou la page)sous-adresse (dans le fichier ou la page)
Cajun Delights#http://www.cajundelights.com#PriceCajun Delights#http://www.cajundelights.com#Price
» supporte seulement la sélection SQL & QBEsupporte seulement la sélection SQL & QBE
OLE objetOLE objet– tout objet Windowstout objet Windows
» multimédia ou programmemultimédia ou programme
– peut être copié ou référencépeut être copié ou référencé– il faut double-cliquer sur sa description textuelle dans il faut double-cliquer sur sa description textuelle dans
le tuple pour le voirle tuple pour le voir
1
MsAccess: Champ MsAccess: Champ Number & CurrencyNumber & Currency clause Field sizeclause Field size
MsAccess: Champ MsAccess: Champ Number & CurrencyNumber & Currency clause Field sizeclause Field size
Byte Byte 0 à 255 0 à 255 Integer Integer -32,768 à 32,767, 2 octets.-32,768 à 32,767, 2 octets. Long Integer Long Integer
-2,147,483,648 à 2,147,483,647. 4 octets.-2,147,483,648 à 2,147,483,647. 4 octets. Single Six digits de precision Single Six digits de precision
-3.402823E38 à 3.402823E38. 4 octets.-3.402823E38 à 3.402823E38. 4 octets. Double (Default) 10 digits de precision Double (Default) 10 digits de precision
1.79769313486232E308 à 1.79769313486232E308. 8 octets1.79769313486232E308 à 1.79769313486232E308. 8 octets..
Replication IDReplication ID– Pour les bases dupliquées - 16 octetsPour les bases dupliquées - 16 octets– un OIDun OID– peut être aussi dans le type Autonumberpeut être aussi dans le type Autonumber
1
MsAccess: Champ MsAccess: Champ Yes/NoYes/No
A utiliser comme son nom l ’indiqueA utiliser comme son nom l ’indique– Yes/No ou On/Off ou True/FalseYes/No ou On/Off ou True/False
» fixé par le champ Formatfixé par le champ Format» visualisé par défaut par Check-boxvisualisé par défaut par Check-box» mais, il y a d ’autres possibilitésmais, il y a d ’autres possibilités
taille: 1 octettaille: 1 octet
1
MsAccess : domainesMsAccess : domainesMsAccess : domainesMsAccess : domaines On peut les simuler (en QBE) par :On peut les simuler (en QBE) par :
– une table D source de valeursune table D source de valeurs» table de la base ou une liste de valeurstable de la base ou une liste de valeurs
– une zone de texte modifiable (une zone de texte modifiable (combo-boxcombo-box) sur ) sur l’attribut A à valeurs dans Dl’attribut A à valeurs dans D
» déclaré dans la définition de A (partie Liste de choix déclaré dans la définition de A (partie Liste de choix //LookupLookup))
– une requête déclarée dans la définition de A une requête déclarée dans la définition de A (dans « (dans « contenu /contenu / rowrow sourcesource » »))
1
MsAccess : surprisesMsAccess : surprisesMsAccess : surprisesMsAccess : surprises Seules les valeurs apparaissant dans la Seules les valeurs apparaissant dans la 1-ère1-ère colonne du colonne du
box et donc dans D peuvent être dans Abox et donc dans D peuvent être dans A– Même si l’on indique une autre « colonne liée »Même si l’on indique une autre « colonne liée »
Type de données Assistant Liste de choix / Type de données Assistant Liste de choix / Lookup Wizard Lookup Wizard réalise cette manipulationréalise cette manipulation– Drôle de type de donnéesDrôle de type de données– Attention aux bugs de cet assistant Attention aux bugs de cet assistant – Aussi à l ’option « Limit to List »Aussi à l ’option « Limit to List »
On peut la faire aussi sans cet assistant (et mieux) On peut la faire aussi sans cet assistant (et mieux) Qu’arrive t’il aux tuples existants si l’on sélectionne une Qu’arrive t’il aux tuples existants si l’on sélectionne une
autre colonne liéeautre colonne liée– Par ex. on utilise d’abord pour saisir les valeurs de P.CITY la Par ex. on utilise d’abord pour saisir les valeurs de P.CITY la
requêterequête» SELECT S.City, S.SName FROM S;SELECT S.City, S.SName FROM S;
– Puis, on la remplace par:Puis, on la remplace par:» SELECT S.Sname, S.City FROM S;SELECT S.Sname, S.City FROM S;
1
MsAccess : CREATE TABLEMsAccess : CREATE TABLECONSTRAINT = INDEXCONSTRAINT = INDEX
MsAccess : CREATE TABLEMsAccess : CREATE TABLECONSTRAINT = INDEXCONSTRAINT = INDEX
CREATE TABLE CREATE TABLE [[FriendsFriends]] ([First Name] TEXT, [Last Name] ([First Name] TEXT, [Last Name] TEXT);TEXT);
CREATE TABLE Friends1 ([First Name] TEXT, [Last Name] CREATE TABLE Friends1 ([First Name] TEXT, [Last Name] TEXT, [Date of Birth] DATETIME, TEXT, [Date of Birth] DATETIME, CONSTRAINTCONSTRAINT MyTableConstraint UNIQUE ([First Name], MyTableConstraint UNIQUE ([First Name], [Last Name], [Date of Birth]));[Last Name], [Date of Birth]));
CREATE TABLE Friends2 ([First Name] TEXT, [Last Name] CREATE TABLE Friends2 ([First Name] TEXT, [Last Name] TEXT, SSN INTEGER TEXT, SSN INTEGER CONSTRAINTCONSTRAINT MyFieldConstraint PRIMARY KEY); MyFieldConstraint PRIMARY KEY);
SSN est la clé primaire. SSN est la clé primaire. On peut créer une table sans clé primaireOn peut créer une table sans clé primaire
– alors elle accepte des duplicataalors elle accepte des duplicata» contrairement à la théorie du relationnelcontrairement à la théorie du relationnel
Pas d'indexes CLUSTER sous MsAccessPas d'indexes CLUSTER sous MsAccess
1
MsAccess : CREATE TABLEMsAccess : CREATE TABLECONSTRAINT = Contraintes d'intégritéCONSTRAINT = Contraintes d'intégrité
Contrainte sur attribut unique:Contrainte sur attribut unique:
CONSTRAINT nom {PRIMARY KEY | UNIQUE | NOT NULL | CONSTRAINT nom {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES foreigntable [(foreignfield1, foreignfield2)]}REFERENCES foreigntable [(foreignfield1, foreignfield2)]} Contrainte sur plusieurs attributs: Contrainte sur plusieurs attributs:
CONSTRAINT nameCONSTRAINT name
{PRIMARY KEY (primary1[, primary2 [, ...]]) |{PRIMARY KEY (primary1[, primary2 [, ...]]) |
UNIQUE (unique1[, unique2 [, ...]]) |UNIQUE (unique1[, unique2 [, ...]]) |
NOT NULL (notnull1[, notnull2 [, ...]]) |NOT NULL (notnull1[, notnull2 [, ...]]) |
FOREIGN KEY (ref1[, ref2 [, ...]]) REFERENCES foreigntable [(foreignfield1 [, FOREIGN KEY (ref1[, ref2 [, ...]]) REFERENCES foreigntable [(foreignfield1 [, foreignfield2 [, ...]])]}foreignfield2 [, ...]])]}
foreigntable = la table avec la clé primaire référencée foreigntable = la table avec la clé primaire référencée le langage de définition de QBE d ’MsAccess permet de définir
davantage de contraintes (comme on a vu en partie)– surtout les contraintes prédicatives d intégrité
» mono ou multi-attribut, mais mono-table.
1
La table nommée P_1est en fait la table P
Les clauses CASCADE n ’existent qu’en QBE de MsAccess
1
Exercice : que veulent dire ces contraintes ?
Les clauses «is Null> dans les Validation Rules
sont-elles utiles ?
1
Contraintes référentielles mutuelles Contraintes référentielles mutuelles en SQL-2en SQL-2
On utilise CREATE SCHEMA ou combinaison de On utilise CREATE SCHEMA ou combinaison de CREATE TABLE et ALTER TABLECREATE TABLE et ALTER TABLE
CREATE SCHEMA AUTHORIZATION WitoldCREATE SCHEMA AUTHORIZATION Witold
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT REFERENCES t2(c1))CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT REFERENCES t2(c1))
CREATE TABLE t2 (c1 INT PRIMARY KEY, c2 INT REFERENCES t1(c1))CREATE TABLE t2 (c1 INT PRIMARY KEY, c2 INT REFERENCES t1(c1))
1
SQL: manipulation de donnéesSQL: manipulation de donnéesSQL: manipulation de donnéesSQL: manipulation de données
expression générale de sélection:expression générale de sélection:SELECT [DISTINCT] attribut(s)SELECT [DISTINCT] attribut(s)
FROM table(s)FROM table(s)[WHERE condition][WHERE condition][GROUP BY field(s) ][GROUP BY field(s) ][HAVING condition ][HAVING condition ][ORDER BY attribute(s)][ORDER BY attribute(s)]
basée sur le calcul de tuplebasée sur le calcul de tuple produit produit uneune table table temporaire temporaire (en général avec des (en général avec des
duplicata)duplicata)
1
ExamplesExamplesExamplesExamples
En pratique sur MsAccessEn pratique sur MsAccess Sauf ceux spécifiques àSauf ceux spécifiques à
– SQL-ServerSQL-Server– DB2DB2
1
S# SNAME STATUS CITYS1 Smith 20 LondonS2 Jones 10 Paris
S3 Blake 30 ParisS4 Clark 20 LondonS5 Adams 30 Athens
P# PNAME COLOR WEIGHT CITYP1 Nut Red 12 LondonP2 Bolt Green 17 Paris
P3 Screw Blue 14 RomeP4 Screw Red 12 LondonP5 Cam Blue 19 Paris
P6 Cog Red 19 London
S# P# QTYS1 P1 300S1 P2 200
S1 P3 400S1 P4 200S1 P5 100
S1 P6 100S2 P1 300S2 P2 400
S3 P2 200S4 P2 200S4 P4 300
S4 P5 400
Exemple canon
S
P
SP
1
MsAccess MsAccess SELECTSELECTMsAccess MsAccess SELECTSELECT
SELECTSELECT [predicate] { * | table.* | [table.]field1 [, table.]field2.[, ...]]} [predicate] { * | table.* | [table.]field1 [, table.]field2.[, ...]]}
[AS alias1 [, alias2 [, ...]]][AS alias1 [, alias2 [, ...]]]
FROM tableexpression [, ...]FROM tableexpression [, ...]
[IN externaldatabase][IN externaldatabase]
[WHERE... ][WHERE... ]
[GROUP BY... ][GROUP BY... ]
[HAVING... ][HAVING... ]
[ORDER BY... ][ORDER BY... ]
[WITH OWNERACCESS OPTION][WITH OWNERACCESS OPTION]
Predicate: ALL, DISTINCT, Predicate: ALL, DISTINCT, DISTINCTROW, TOP.DISTINCTROW, TOP.
1
Interrogations simplesInterrogations simplesInterrogations simplesInterrogations simples
Projections d'une table sur certains attributs:Projections d'une table sur certains attributs:
SELECT S# FROM S ;SELECT S# FROM S ;
1
Interrogations simplesInterrogations simplesInterrogations simplesInterrogations simples
Projections d'une table sur certains attributs:Projections d'une table sur certains attributs:
SELECT S# FROM S ;SELECT S# FROM S ;
S#S#s1s1s2s2s3s3s4 s4 s5s5
1
Interrogations simplesInterrogations simplesInterrogations simplesInterrogations simples
Projections d'une table sur certains attributs:Projections d'une table sur certains attributs:
SELECT S# FROM S ;SELECT S# FROM S ;
S#S#s1s1s2s2s3s3s4 s4 s5s5
L'ordre de présentation est fixé par le SGBD et peut L'ordre de présentation est fixé par le SGBD et peut changer dans le tempschanger dans le temps
1
Interrogations (vraiement) simplesInterrogations (vraiement) simplesInterrogations (vraiement) simplesInterrogations (vraiement) simples
Projections d'une table sur certains attributs:Projections d'une table sur certains attributs:
SELECT SELECT [[S#S#]] FROM S ; FROM S ;
S#S#s1s1s2s2s3s3s4 s4 s5s5
L'ordre de présentation est fixé par le SGBD et peut L'ordre de présentation est fixé par le SGBD et peut changer dans le tempschanger dans le temps
Combien de lignes de programmationfaudrait-il pour cette requête en Cobol ? 20 ? 50 ? 100 ?
MsAccess
1
Selection avec duplicataSelection avec duplicataSelection avec duplicataSelection avec duplicata
SELECT CITY FROM S;SELECT CITY FROM S;
1
Selection avec duplicataSelection avec duplicataSelection avec duplicataSelection avec duplicata
SELECT CITY FROM S;SELECT CITY FROM S;
– Le resultat peut avoir les duplicata Le resultat peut avoir les duplicata – alors, il n'est pas une relation, mais un alors, il n'est pas une relation, mais un bagbag
cityLondonParisParisLondonAthens
1
Elimination de duplicataElimination de duplicataElimination de duplicataElimination de duplicata
SELECT SELECT DISTINCTDISTINCT CITY FROM S; CITY FROM S;
1
Elimination de duplicataElimination de duplicataElimination de duplicataElimination de duplicata
SELECT SELECT DISTINCTDISTINCT CITY FROM S; CITY FROM S;
citycityAthensAthensLondonLondonParisParis
1
Elimination de duplicataElimination de duplicataElimination de duplicataElimination de duplicata
SELECT SELECT DISTINCTDISTINCT CITY FROM S; CITY FROM S;
citycityAthensAthensLondonLondonParisParis
DISTINCTDISTINCT est optionnel pour deux raisons: est optionnel pour deux raisons:– eliminer les duplicata coute en temps de réponseeliminer les duplicata coute en temps de réponse– les fonctions aggregats en ont besoin.les fonctions aggregats en ont besoin.
Combien de lignes de programmationfaudrait-il pour cette requête en C ? 20 ? 50 ? 100 ?
1
Selections multiplesSelections multiplesSelections multiplesSelections multiples
Les attributs apparaissent dans l’ordre de leur Les attributs apparaissent dans l’ordre de leur énumération dans la clause SELECTénumération dans la clause SELECT
SELECT [S#], CITY, SNAME FROM S;SELECT [S#], CITY, SNAME FROM S;
S# City SNames1 Paris Smiths2 Paris Joness3 Paris Blakes4 London Clarks5 Athens Adam
1
SELECT * SELECT * SELECT * SELECT *
Tout sur toutes les fournitures :Tout sur toutes les fournitures :SELECT S#, P#, QTY FROM SP;SELECT S#, P#, QTY FROM SP;
Formulation plus courante :Formulation plus courante :SELECT * FROM SP;SELECT * FROM SP;
Ordre d'attributs est celui de CREATE TABLEOrdre d'attributs est celui de CREATE TABLE Cette formulation est plus simple, mais deconseillée Cette formulation est plus simple, mais deconseillée
pour les programmes d'applicationpour les programmes d'application
pourquoi ? pourquoi ?
1
ORDER BYORDER BYORDER BYORDER BY
SELECT * FROM SPSELECT * FROM SP
ORDER BY QTY DESC, [S#];ORDER BY QTY DESC, [S#];
1
ORDER BYORDER BYORDER BYORDER BY
SELECT * FROM SPSELECT * FROM SP
ORDER BY QTY DESC, [S#];ORDER BY QTY DESC, [S#];
S#S# p#p# QtyQtys1s1 p3p3 400400s2s2 p2p2 400400s4s4 p5p5 400400s1s1 p1p1 300300s2s2 p1p1 300300s4s4 p4p4 300300s1s1 p4p4 200200s1s1 p2p2 200200s3s3 p2p2 200200s4s4 p2p2 200200s1s1 p6p6 100100s1s1 p5p5 100100
1
ORDER BYORDER BYORDER BYORDER BY
SELECT * FROM SPSELECT * FROM SP
ORDER BY QTY DESC, [S#];ORDER BY QTY DESC, [S#];
S#S# p#p# QtyQtys1s1 p3p3 400400s2s2 p2p2 400400s4s4 p5p5 400400s1s1 p1p1 300300s2s2 p1p1 300300s4s4 p4p4 300300s1s1 p4p4 200200s1s1 p2p2 200200s3s3 p2p2 200200s4s4 p2p2 200200s1s1 p6p6 100100s1s1 p5p5 100100
Combien de lignes de programmationfaudrait-il pour cette requête en PL1 ? 20 ? 50 ? 100 ?
1
ORDER BYORDER BYORDER BYORDER BY
SELECT * FROM SPSELECT * FROM SP
ORDER BY QTY DESC, [S#];ORDER BY QTY DESC, [S#];
S#S# p#p# QtyQtys1s1 p3p3 400400s2s2 p2p2 400400s4s4 p5p5 400400s1s1 p1p1 300300s2s2 p1p1 300300s4s4 p4p4 300300s1s1 p4p4 200200s1s1 p2p2 200200s3s3 p2p2 200200s4s4 p2p2 200200s1s1 p6p6 100100s1s1 p5p5 100100
Et la quantité nulle serait où ?
1
TOPTOPTOPTOP
SELECT top 3 [S#] AS [Les petits], [P#], QTY SELECT top 3 [S#] AS [Les petits], [P#], QTY
FROM SPFROM SP
ORDER BY QTY ASC, [S#] ;ORDER BY QTY ASC, [S#] ;
1
TOPTOPTOPTOP
SELECT top 3 [S#] AS [Les petits], [P#], QTY SELECT top 3 [S#] AS [Les petits], [P#], QTY
FROM SPFROM SP
ORDER BY QTY ASC, [S#] ;ORDER BY QTY ASC, [S#] ;
Les petitsLes petits Product IDProduct ID QTYQTYs1s1 p6p6 100100s1s1 p5p5 100100s1s1 p4p4 200200s1s1 p2p2 200200
1
TOPTOPTOPTOP
SELECT top 3 [S#] AS [Les petits], [P#], QTY SELECT top 3 [S#] AS [Les petits], [P#], QTY
FROM SPFROM SP
ORDER BY QTY ASC, [S#] ;ORDER BY QTY ASC, [S#] ;
Les petitsLes petits Product IDProduct ID QTYQTYs1s1 p6p6 100100s1s1 p5p5 100100s1s1 p4p4 200200s1s1 p2p2 200200
Mot-clé utile, mais pas dans SQL standard (MsAccess)Mot-clé utile, mais pas dans SQL standard (MsAccess) - essaye de formuler cette requête en SQL standard- essaye de formuler cette requête en SQL standard
Pas de distinction entre les duplicata par rapport au critère Pas de distinction entre les duplicata par rapport au critère d'ordre QTY, S# (les 3 tops sont devenus 4 tuples)d'ordre QTY, S# (les 3 tops sont devenus 4 tuples)
Product ID ?
1
Restrictions simplesRestrictions simplesRestrictions simplesRestrictions simples
SELECT [P#], PNAME FROM P WHERE COLOR = SELECT [P#], PNAME FROM P WHERE COLOR = 'RED';'RED';
1
Restrictions simplesRestrictions simplesRestrictions simplesRestrictions simples
SELECT [P#], PNAME FROM P WHERE COLOR = SELECT [P#], PNAME FROM P WHERE COLOR = 'RED';'RED';
Product IDProduct ID Product NameProduct Namep1p1 nutsnutsp4p4 screwscrewp6p6 cogcog
Les noms d'attributs sont les labels fixés à la création de PLes noms d'attributs sont les labels fixés à la création de P L'ordre de tuples délivrés est définit par le SGBD et peut L'ordre de tuples délivrés est définit par le SGBD et peut
changer d'une execution à l'autre changer d'une execution à l'autre
1
Restrictions composéesRestrictions composéesRestrictions composéesRestrictions composées
SELECT [P#], PNAME, CITY SELECT [P#], PNAME, CITY FROM P FROM P WHERE COLOR = 'RED' AND NOT CITY = 'PARIS';WHERE COLOR = 'RED' AND NOT CITY = 'PARIS';
1
Restrictions composéesRestrictions composéesRestrictions composéesRestrictions composées
SELECT [P#], PNAME, CITY SELECT [P#], PNAME, CITY FROM P FROM P WHERE COLOR = 'RED' AND NOT CITY = 'PARIS';WHERE COLOR = 'RED' AND NOT CITY = 'PARIS';
Product IDProduct ID Product NameProduct Name citycityp1p1 nutsnuts londonlondonp4p4 screwscrew londonlondonp6p6 cogcog londonlondon
1
Restrictions sur nulsRestrictions sur nulsRestrictions sur nulsRestrictions sur nuls
Un nul n ’est pas une valeurUn nul n ’est pas une valeur Donc on a une clause spécialeDonc on a une clause spéciale
– IS [NOT] NULLIS [NOT] NULL Ex. Deux fournisseurs n ’ont pas de ville connue:Ex. Deux fournisseurs n ’ont pas de ville connue:
– Requête : est-ce que il y a dans S des villes inconnues?Requête : est-ce que il y a dans S des villes inconnues?
SELECT S.CitySELECT S.CityFROM S where city is null;FROM S where city is null;
1
Restrictions sur nulsRestrictions sur nulsRestrictions sur nulsRestrictions sur nuls
Un nul n ’est pas une valeurUn nul n ’est pas une valeur Donc on a une clause spécialeDonc on a une clause spéciale
– IS [NOT] NULLIS [NOT] NULL Ex. Deux fournisseurs n ’ont pas de ville connue:Ex. Deux fournisseurs n ’ont pas de ville connue:
– Requête : est-ce que il y a dans S des villes inconnues?Requête : est-ce que il y a dans S des villes inconnues?
SELECT S.CitySELECT S.CityFROM S where city is null;FROM S where city is null;
CITY
1
Restrictions sur nulsRestrictions sur nulsRestrictions sur nulsRestrictions sur nuls
Un nul n’est pas une valeurUn nul n’est pas une valeur Donc on a une clause spécialeDonc on a une clause spéciale
– IS [NOT] NULLIS [NOT] NULL Ex. Deux fournisseurs n ’ont pas de ville connue:Ex. Deux fournisseurs n ’ont pas de ville connue:
– Requête : est-ce que il y a dans S des villes inconnues?Requête : est-ce que il y a dans S des villes inconnues?
SELECT S.CitySELECT S.CityFROM S where city is null;FROM S where city is null;
CITY
A noter:
DISTINCT s ’applique aux nuls (à tort, pourquoi ?)
Vous avez dit bizarre pour la table de nuls ?
1
SELECT [s#], city FROM S where SELECT [s#], city FROM S where city IN ('paris', 'london'); city IN ('paris', 'london');
Restrictions par clause INRestrictions par clause INRestrictions par clause INRestrictions par clause IN
S# SName Status Citys1 John 2 Pariss2 smith 10 Pariss3 Blake 30s4 Clark 20 Londons5 Adam 30 Athenss6 Bull 20 Pariss7 Ibm 100 Paris
s# citys1 Pariss2 Pariss4 Londons6 Pariss7 Paris
? SELECT [s#], city FROM S where city ? SELECT [s#], city FROM S where city NOT IN ('paris', 'london'); NOT IN ('paris', 'london');
? SELECT [s#], city FROM S where city ? SELECT [s#], city FROM S where city IN ('paris', 'london', null); IN ('paris', 'london', null);
? SELECT [s#], city FROM S where city ? SELECT [s#], city FROM S where city IN ('paris', 'london') or city is null; IN ('paris', 'london') or city is null;
1
Expressions de valeurExpressions de valeurExpressions de valeurExpressions de valeur
SELECT [P#], PNAME, 2.1*weight as [Poids en KG]SELECT [P#], PNAME, 2.1*weight as [Poids en KG]FROM P FROM P order by 2.1*weight desc;order by 2.1*weight desc;
1
Expressions de valeurExpressions de valeurExpressions de valeurExpressions de valeur
SELECT [P#], PNAME, 2.1*weight as [Poids en KG]SELECT [P#], PNAME, 2.1*weight as [Poids en KG]FROM P FROM P order by 2.1*weight desc;order by 2.1*weight desc;
Product IDProduct ID Product NameProduct Name Poids en KGPoids en KGp6p6 cogcog 39.939.9p3p3 screwscrew 35.735.7p2p2 boltbolt 35.735.7p4p4 screwscrew 29.429.4p5p5 camcam 25.225.2p1p1 nutsnuts 25.225.2
1
Expressions de valeurExpressions de valeurExpressions de valeurExpressions de valeur
On peut utiliser + - * / ^ et ( )On peut utiliser + - * / ^ et ( ) On peut sélectionner tous les attributs et une On peut sélectionner tous les attributs et une
expression de valeurexpression de valeur
SELECT *, 2.1*weight as [Poids en KG], weight + weight/5 - SELECT *, 2.1*weight as [Poids en KG], weight + weight/5 - (weight^2 - weight*2.1) as [un jeu](weight^2 - weight*2.1) as [un jeu]FROM P FROM P order by 2.1*weight desc;order by 2.1*weight desc;
? ? Vrai / Faux que les résultats des expressions de valeur suivantes Vrai / Faux que les résultats des expressions de valeur suivantes sont toujours comme suit :sont toujours comme suit :0 * QTY = 0 0 * QTY = 0 QTY – QTY = 0QTY – QTY = 0QTY / QTY = 1 si QTY <> 0QTY / QTY = 1 si QTY <> 0
1
JointuresJointuresJointuresJointures
SELECT distinct S.[S#], SNAME, [P#], Qty, CitySELECT distinct S.[S#], SNAME, [P#], Qty, CityFROM S, SP FROM S, SP where s.[s#]=sp.[s#] and city <> 'London';where s.[s#]=sp.[s#] and city <> 'London';
1
Equi-jointuresEqui-jointuresEqui-jointuresEqui-jointures
SELECT distinct S.[S#], SNAME, [P#], Qty, CitySELECT distinct S.[S#], SNAME, [P#], Qty, CityFROM S, SP FROM S, SP where s.[s#]=sp.[s#] and city <> 'London';where s.[s#]=sp.[s#] and city <> 'London';
S#S# SNAMESNAME Product IDProduct ID QtyQty CityCitys2s2 JonesJones p1p1 300300 ParisPariss2s2 JonesJones p2p2 400400 ParisPariss3s3 BlakeBlake p2p2 200200 ParisParis
1
Sémantique de la requêteSémantique de la requêteSémantique de la requêteSémantique de la requête
Forme le produit cartésien Forme le produit cartésien CC de tables dans la clause FROM de tables dans la clause FROM Sélectionne tout tuple Sélectionne tout tuple t t de de CC vérifiant le prédicat dans la vérifiant le prédicat dans la
clause WHERE (et seulement de tels tuples)clause WHERE (et seulement de tels tuples) Projette tout Projette tout t t sur les attributs dans SELECTsur les attributs dans SELECT Applique le mot-clé de SELECTApplique le mot-clé de SELECT La clause S.s# = SP.s# s'appelle La clause S.s# = SP.s# s'appelle equi-jointureequi-jointure ou ou
jointure naturellejointure naturelle Opération de jointure était inconnue, même Opération de jointure était inconnue, même
conceptuellement, de SGF et de SGBD navigationelsconceptuellement, de SGF et de SGBD navigationels
1
Sémantique de jointures naturellesSémantique de jointures naturellesSémantique de jointures naturellesSémantique de jointures naturelles
L'intention est de suivre les arcs du graphe de L'intention est de suivre les arcs du graphe de référenceréférence
C'est cette opération qui permet la C'est cette opération qui permet la décompositiondécomposition du modèle d'un object en du modèle d'un object en plusieursplusieurs relations : relations :– selon les propriétés :selon les propriétés :
» fonctionnellesfonctionnelles» non-fonctionnellesnon-fonctionnelles
S SP PS# S# P# P#
1
Sémantique de jointures naturellesSémantique de jointures naturellesSémantique de jointures naturellesSémantique de jointures naturelles Le prix a payer: Le prix a payer:
– redondance de certaines valeursredondance de certaines valeurs– données plates de forme peu naturelle données plates de forme peu naturelle
S#S# SNAMESNAME Product IDProduct ID QtyQty CityCitys2s2 JonesJones p1p1 300300 ParisPariss2s2 JonesJones p2p2 400400 ParisPariss3s3 BlakeBlake p2p2 200200 ParisParis
forme plus naturelle:forme plus naturelle:
S#S# SNAMESNAME Product IDProduct ID QtyQty CityCitys2s2 JonesJones p1p1 300300 ParisParis p2p2 400400 ParisPariss3s3 BlakeBlake p2p2 200200 ParisParis
1
Equi-jointuresEqui-jointuresEqui-jointuresEqui-jointures
L'évaluation de requêtes à partir de L'évaluation de requêtes à partir de C C serait en serait en général inefficacegénéral inefficace– Pour la matérialisation en mémoirePour la matérialisation en mémoire– En utilisation de CPUEn utilisation de CPU
1.1. Si card (R1) = card (R2) = 1000, alors Si card (R1) = card (R2) = 1000, alors card(R1 x R2) = 1 000 000 tuples !card(R1 x R2) = 1 000 000 tuples !
2.2. En pratique, on ne crée que les tuples de la jointureEn pratique, on ne crée que les tuples de la jointure plusieurs méthodes de calcul existent plusieurs méthodes de calcul existent
» Nested loop (boucles imbriquées)Nested loop (boucles imbriquées)» Sort-merge (tri-interclassement)Sort-merge (tri-interclassement)» Index-joins & Hash-Joins in particularIndex-joins & Hash-Joins in particular
– Linear Hash-JoinsLinear Hash-Joins
1
Equi-jointures m-airesEqui-jointures m-airesEqui-jointures m-airesEqui-jointures m-aires
SELECT s.[s#], p.[P#], Qty, PnameSELECT s.[s#], p.[P#], Qty, PnameFROM S, SP, P where FROM S, SP, P where s.[s#]=sp.[s#] and sp.[p#]=p.[p#] s.[s#]=sp.[s#] and sp.[p#]=p.[p#] and s.[s#] and s.[s#] betweenbetween 's1' and 's3' 's1' and 's3' order by s.[S#], qty desc;order by s.[S#], qty desc;
1
Equi-jointures m-airesEqui-jointures m-airesEqui-jointures m-airesEqui-jointures m-aires
SELECT s.[s#], p.[P#], Qty, PnameSELECT s.[s#], p.[P#], Qty, PnameFROM S, SP, P where FROM S, SP, P where s.[s#]=sp.[s#] and sp.[p#]=p.[p#] s.[s#]=sp.[s#] and sp.[p#]=p.[p#] and s.[s#] and s.[s#] betweenbetween 's1' and 's3' 's1' and 's3' order by s.[S#], qty desc;order by s.[S#], qty desc;
s#s# Product IDProduct ID QtyQty Product NameProduct Name
s1s1 p3p3 400400 screwscrews1s1 p1p1 300300 nutsnutss1s1 p4p4 200200 screwscrews1s1 p2p2 200200 boltbolts1s1 p6p6 100100 cogcogs1s1 p5p5 100100 camcams2s2 p2p2 400400 boltbolts2s2 p1p1 300300 nutsnutss3s3 p2p2 200200 boltbolt
1
Clause BETWEENClause BETWEEN Le type d ’attribut détermine l évaluation de la Le type d ’attribut détermine l évaluation de la
clause:clause:– 20 n ’est pas BETWEEN 1 and 3 pour Number20 n ’est pas BETWEEN 1 and 3 pour Number– 20 est BETWEEN 1 and 3 pour Text20 est BETWEEN 1 and 3 pour Text? Date/Time ou Currency ?Date/Time ou Currency ?
? Et les nulsEt les nuls? sont ils sélectionnes par les clauses ci-dessoussont ils sélectionnes par les clauses ci-dessous– SELECT * FROM P where weight between 0 and 19;SELECT * FROM P where weight between 0 and 19;– SELECT * FROM P where weight between null and 19;SELECT * FROM P where weight between null and 19;– SELECT * FROM P where weight between 0 and null;SELECT * FROM P where weight between 0 and null;
– peut-on faire encore autrement pour trouver les poids peut-on faire encore autrement pour trouver les poids entre 10 et 19 ou inconnus ?entre 10 et 19 ou inconnus ?
1
Equi-jointures m-airesEqui-jointures m-aires(avec *)(avec *)
Tous les attributs de toutes les tables dans la clause FROMTous les attributs de toutes les tables dans la clause FROM
SELECT *SELECT *FROM S, SP, P FROM S, SP, P where s.[s#]=sp.[s#] and p.[p#]=sp.[p#] and city <> 'London';where s.[s#]=sp.[s#] and p.[p#]=sp.[p#] and city <> 'London';
On peut aussi SELECT S.*, SP.*, P.* FROM S,SP, P bien-sûrOn peut aussi SELECT S.*, SP.*, P.* FROM S,SP, P bien-sûr
On peut ajouter des attributs additionnels On peut ajouter des attributs additionnels
SELECT *, 'Mecs d’Eurostar' as [D'ou viennent t'ils ?]SELECT *, 'Mecs d’Eurostar' as [D'ou viennent t'ils ?]FROM S, SP, P FROM S, SP, P where s.[s#]=sp.[s#] and p.[p#]=sp.[p#] and s.city <> 'London';where s.[s#]=sp.[s#] and p.[p#]=sp.[p#] and s.city <> 'London';
1
Equi-jointuresEqui-jointuresEqui-jointuresEqui-jointures Equi-jointures peuvent être formulées pour tout attribut:Equi-jointures peuvent être formulées pour tout attribut: Mais, les types de données à joindre doivent être = compatiblesMais, les types de données à joindre doivent être = compatibles
SELECT s.[s#], p.[P#], Qty, Pname, s.city, p.citySELECT s.[s#], p.[P#], Qty, Pname, s.city, p.cityFROM S, SP, PFROM S, SP, Pwhere s.[s#]=sp.[s#] and sp.[p#]=p.[p#] and where s.[s#]=sp.[s#] and sp.[p#]=p.[p#] and s.city=p.citys.city=p.cityorder by s.city, s.[s#];order by s.city, s.[s#];
s#s# Product IDProduct ID QtyQty Product NameProduct Name S.cityS.city P.cityP.citys1s1 p6p6 100100 cogcog LondonLondon londonlondons1s1 p4p4 200200 screwscrew LondonLondon londonlondons1s1 p1p1 300300 nutsnuts LondonLondon londonlondons4s4 p4p4 300300 screwscrew LondonLondon londonlondons2s2 p2p2 400400 boltbolt ParisParis parispariss3s3 p2p2 200200 boltbolt ParisParis parisparis
1
Possibilité nouvelle dans SQL2 (et MsAccess)Possibilité nouvelle dans SQL2 (et MsAccess)
SELECT S.[S#], P.[p#], SP.Qty, PName, S.City, P.City FROM S SELECT S.[S#], P.[p#], SP.Qty, PName, S.City, P.City FROM S INNER JOININNER JOIN (P (P INNER JOININNER JOIN SP SP ONON P.[P#] = SP.[p#]) P.[P#] = SP.[p#]) ONON (S.City = P.City) AND (S.[S#] = SP.[S#])(S.City = P.City) AND (S.[S#] = SP.[S#])ORDER BY S.City, S.[S#];ORDER BY S.City, S.[S#];
Equi-jointures dans la clause FROMEqui-jointures dans la clause FROM
s# Product IDs# Product ID QtyQty Product NameProduct Name S.cityS.city P.cityP.city
s1s1 p6p6 100100 cogcog LondonLondon londonlondons1s1 p4p4 200200 screwscrew LondonLondon londonlondons1s1 p1p1 300300 nutsnuts LondonLondon londonlondons4s4 p4p4 300300 screwscrew LondonLondon londonlondons2s2 p2p2 400400 boltbolt ParisParis parispariss3s3 p2p2 200200 boltbolt ParisParis parisparis
1
Theta-jointures & Self-jointuresTheta-jointures & Self-jointuresTheta-jointures & Self-jointuresTheta-jointures & Self-jointures
L'opérateur L'opérateur TT de comparaison dans une clause de jointure de comparaison dans une clause de jointure peut-être en fait : peut-être en fait :
– TT=, <, <==, <, <=>, >=>, >=<>}<>} Une table peut-être jointe avec elle-mêmeUne table peut-être jointe avec elle-même
SELECT s1.[s#], s1.sname, s2.[s#], s2.sname, s1.citySELECT s1.[s#], s1.sname, s2.[s#], s2.sname, s1.cityFROM FROM s s1, s s2 s s1, s s2 /* /* s1, s2 sont dess1, s2 sont des aliases aliases
WHERE s1.city = s2.city and WHERE s1.city = s2.city and s1.sname < s2.snames1.sname < s2.sname;;
s1.s#s1.s# s1.snames1.sname s2.s#s2.s# s2.snames2.sname citycity
s4s4 ClarkClark s1s1 SmithSmith LondonLondons3s3 BlakeBlake s2s2 JonesJones ParisParis
1
Jointures externesJointures externesJointures externesJointures externes
Conserve les tuples sans corresp. sur les attributs de jointureConserve les tuples sans corresp. sur les attributs de jointure- jointure gauche (LEFT) conserve - jointure gauche (LEFT) conserve
les tuples à gaucheles tuples à gauche- jointure droite (RIGHT) conserve - jointure droite (RIGHT) conserve
les tuples à droiteles tuples à droite
SELECT S.[S#], city, SP.QtySELECT S.[S#], city, SP.QtyFROM FROM S LEFT JOIN SP S LEFT JOIN SP ON S.[S#] = SP.[S#]ON S.[S#] = SP.[S#]where (qty > 200 or where (qty > 200 or qty is nullqty is null) and not city = 'london';) and not city = 'london';
S#S# citycity QtyQty
s2s2 ParisParis 300300s2s2 ParisParis 400400s5s5 AthensAthens
s5
s7 p6 100
1
Jointures externesJointures externes(propriétés algébriques)(propriétés algébriques)
Les jointures classiques dites Les jointures classiques dites internesinternes sont associatives sont associatives
Celle externes ne sont pasCelle externes ne sont pas
A démontrerA démontrer
1.1. La notation dans la clause WHERE pourrait être La notation dans la clause WHERE pourrait être ambiguëambiguë Pourquoi ?Pourquoi ?
2.2. D’où la notation algébrique dans la clause FROMD’où la notation algébrique dans la clause FROM
1.1. Introduite par SQL-2Introduite par SQL-2
3.3. Elles s’appliquent aussi aux jointures classiques dites dès Elles s’appliquent aussi aux jointures classiques dites dès lors lors internesinternes
1
Jointure externe complèteJointure externe complèteJointure externe complèteJointure externe complèteSELECT pname, S.SName, S.City, P.CitySELECT pname, S.SName, S.City, P.City
FROM P RIGHT JOIN S on P.City = S.CityFROM P RIGHT JOIN S on P.City = S.CityunionunionSELECT pname, S.SName, S.City, P.CitySELECT pname, S.SName, S.City, P.CityFROM P left JOIN S ON P.City = S.City ;FROM P left JOIN S ON P.City = S.City ;
pname SName S.City P.CityAdams Athens
bolt Blake Paris parisbolt Jones Paris parisbolt smith Paris pariscam Blake Paris pariscam Jones Paris pariscam smith Paris pariscog Clark London londonnuts Clark London londonscrew romescrew Clark London london
1
SELECT pname, S.SName, S.City, P.CitySELECT pname, S.SName, S.City, P.CityFROM P RIGHT JOIN S ON P.City = S.CityFROM P RIGHT JOIN S ON P.City = S.Citywhere where p.city <> 'london'p.city <> 'london' or or p.city is nullp.city is nullUNION UNION SELECT pname, S.SName,SELECT pname, S.SName,S.City, P.CityS.City, P.CityFROM P left JOIN S ON P.City = S.CityFROM P left JOIN S ON P.City = S.Citywhere where s.city <> 'london's.city <> 'london' or or s.city is nulls.city is null;;
Jointure externe complèteJointure externe complèteavec une sélectionavec une sélection
pname SName S.City P.CityAdams Athens
bolt Blake Paris parisbolt Jones Paris parisbolt smith Paris pariscam Blake Paris pariscam Jones Paris pariscam smith Paris parisscrew rome
1
Jointure externe Jointure externe self ou avec theta-comparaisonself ou avec theta-comparaison
Jointure externe Jointure externe self ou avec theta-comparaisonself ou avec theta-comparaison
Self-jointure externe est possibleSelf-jointure externe est possible– p.e. SP left joint SP…p.e. SP left joint SP…
Les opérateurs Les opérateurs T T s’appliquent aussi aux s’appliquent aussi aux jointures externes jointures externes TT=, <, <==, <, <=>, >=>, >=<>}<>}
Exemple (discuté en cours):Exemple (discuté en cours):– N°s de fournisseurs qui fournissent une pièce en N°s de fournisseurs qui fournissent une pièce en
quantité moindre qu’un autre fournisseur d’une même quantité moindre qu’un autre fournisseur d’une même pièce ou en quantité inconnue.pièce ou en quantité inconnue.
1
Jointures externes Jointures externes DB2 & SQL-Server & SQL-2… DB2 & SQL-Server & SQL-2…
Jointures externes Jointures externes DB2 & SQL-Server & SQL-2… DB2 & SQL-Server & SQL-2…
On utilise les déclarationsOn utilise les déclarations– LEFT, RIGHT & FULL OUTER JOINLEFT, RIGHT & FULL OUTER JOIN
» note OUTERnote OUTER
SELECT pname, S.SName, S.City, P.City FROM P SELECT pname, S.SName, S.City, P.City FROM P
FULL OUTER JOINFULL OUTER JOIN S ON P.City = S.City S ON P.City = S.Citywhere where p.city <> 'london'p.city <> 'london' or or p.city is nullp.city is null
pname SName S.City P.CityAdams Athens
bolt Blake Paris parisbolt Jones Paris parisbolt smith Paris pariscam Blake Paris pariscam Jones Paris pariscam smith Paris parisscrew rome
SQL-2 a le verbe USING pour les attr. de jointure d ’un même nom (USING (CITY). Les mots FULL ou INNER sont optionnels
-certains dialectes remplacent, LEFT, RIGHT, FULL par :
P.City *= S.City P.City = S.City (+)+)
1
Mélange de jointures externes et internesMélange de jointures externes et internesMélange de jointures externes et internesMélange de jointures externes et internes
Explosif (sous MsAccess surtout):Explosif (sous MsAccess surtout):1.1. OK: OK:
SELECT sP.Qty, s.[S#], s.City, sP.[p#]SELECT sP.Qty, s.[S#], s.City, sP.[p#]FROM s FROM s RIGHT RIGHT JOIN (p INNER JOIN sP ON p.[P#] = sP.[p#]) ON JOIN (p INNER JOIN sP ON p.[P#] = sP.[p#]) ON sP.[S#] = s.[S#];sP.[S#] = s.[S#];
1.1. interdit :interdit :
SELECT sP.Qty, s.[S#], s.City, sP.[p#]SELECT sP.Qty, s.[S#], s.City, sP.[p#]FROM s FROM s LEFTLEFT JOIN (p INNER JOIN sP ON p.[P#] = sP.[p#]) ON JOIN (p INNER JOIN sP ON p.[P#] = sP.[p#]) ON sP.[S#] = s.[S#];sP.[S#] = s.[S#];
1
Mélange de jointures externes et internesMélange de jointures externes et internesMélange de jointures externes et internesMélange de jointures externes et internes
En deux requêtes c'est OK par contre:En deux requêtes c'est OK par contre: Query-scratch1:Query-scratch1:
SELECT *SELECT *
FROM p INNER JOIN sp ON p.[P#] = sp.[p#];FROM p INNER JOIN sp ON p.[P#] = sp.[p#]; ::
SELECT s.[s#], qty, [Query-scratch1].color SELECT s.[s#], qty, [Query-scratch1].color FROM s left JOIN [Query-scratch1] ON [QueryFROM s left JOIN [Query-scratch1] ON [Queryscratch1].[S#] = S.[S#];scratch1].[S#] = S.[S#];
1
RésultatRésultatRésultatRésultat
s#s# qtyqty colorcolors1s1 100100 redreds1s1 100100 blueblues1s1 200200 redreds1s1 400400 blueblues1s1 200200 greengreens1s1 300300 redreds2s2 400400 greengreens2s2 300300 redreds3s3 200200 greengreens4s4 400400 blueblues4s4 300300 redreds4s4 200200 greengreens5s5
1
Jointures implicitesJointures implicitesJointures implicitesJointures implicites
Simplifient la formulation de la requêteSimplifient la formulation de la requête Générées par MsAccess à partir de Générées par MsAccess à partir de
contraintes d'intégrité référentiellescontraintes d'intégrité référentielles– jointures naturelles (internes)jointures naturelles (internes)– jointures externesjointures externes
Générées dans SQL, mais uniquement Générées dans SQL, mais uniquement quand la requête est formulée en QBEquand la requête est formulée en QBE
1
On a cliquéd'abord ici
On a cliquéensuite ici
Declaration de jointures implicites
1
Puis, clique et...
Tires avec la souris,
Ecris la restriction
Formulation de la requête avec les jointures implicites en QBE
1
Résultat SQLRésultat SQLRésultat SQLRésultat SQL
SELECT DISTINCTROW S.SName, P.CitySELECT DISTINCTROW S.SName, P.City
FROM PFROM P INNER JOIN (S INNER JOIN SP ON S.[S#] = INNER JOIN (S INNER JOIN SP ON S.[S#] = SP.[S#]) ON P.[P#] = SP.[p#]SP.[S#]) ON P.[P#] = SP.[p#]
WHERE ((P.City="paris"));WHERE ((P.City="paris")); Jointure impl.générée
automatiquement
1
LimitationsLimitationsLimitationsLimitations
Une correspondance déclarée entre les Une correspondance déclarée entre les attributs d'une même relation ne génère pas attributs d'une même relation ne génère pas de jointure implicitede jointure implicite– sous MsAccess 2sous MsAccess 2
Pourquoi cette limitation ?Pourquoi cette limitation ?– une bonne questionune bonne question– sans bonne réponse de ma partsans bonne réponse de ma part– à adresser à Microsoftà adresser à Microsoft
1
1
LimitationsLimitationsLimitationsLimitations
Une correspondance multiple entre deux tablesUne correspondance multiple entre deux tables– donne lieu à AND entre les clauses correspondantesdonne lieu à AND entre les clauses correspondantes
» c'est bienc'est bien
– mais, peut donner lieu à une génération erronéemais, peut donner lieu à une génération erronée» une jointure implicite invisible sur l'image QBEune jointure implicite invisible sur l'image QBE
C'est un "C'est un "bugbug""– MsAccess 2MsAccess 2
Pourquoi ?Pourquoi ?– bonne question à Microsoftbonne question à Microsoft
Pour en savoir + sur les jointures implicites en généralPour en savoir + sur les jointures implicites en général– Implicit Joins in the Structural Data Model. IEEE-COMPSAC, Implicit Joins in the Structural Data Model. IEEE-COMPSAC,
Kyoto, (Sep. 1991). With Suk Lee, B., Wiederhold, G.Kyoto, (Sep. 1991). With Suk Lee, B., Wiederhold, G.
1
1
1
1
1
1
1
Auto-jointuresAuto-jointuresAuto-jointuresAuto-jointures
une jointure implicite entre deux attributs de deux une jointure implicite entre deux attributs de deux tables différentes sélectionnées pour une requête : tables différentes sélectionnées pour une requête : – sans lien sémantique dans le schéma sans lien sémantique dans le schéma – de type compatiblede type compatible– d ’un même nomd ’un même nom– avec au moins étant la clé primaireavec au moins étant la clé primaire
A ne pas confondre avec une self-jointureA ne pas confondre avec une self-jointure Existent dans MsAccess2000Existent dans MsAccess2000
– en optionen option
1
Auto-jointures: DB2Auto-jointures: DB2Auto-jointures: DB2Auto-jointures: DB2
Seulement en V 7 DB 2 Data Warehouse Seulement en V 7 DB 2 Data Warehouse CenterCenter
Le terme recouvre Le terme recouvre – Les jointures implicitesLes jointures implicites– Les jointures prédéfinies entre tous attributs Les jointures prédéfinies entre tous attributs
compatiblescompatibles» Pas plus qu’un par table par auto-jointurePas plus qu’un par table par auto-jointure
1
Clauses de jointures dans le Clauses de jointures dans le
Standard SQL-2Standard SQL-2 Il y a plusieurs clauses non-implementées Il y a plusieurs clauses non-implementées
explicitement dans aucun SGBDexplicitement dans aucun SGBD– T1 NATURAL JOIN T2T1 NATURAL JOIN T2
» remplace T1 INNER JOIN T2 ON T1.J1 = T2.J1 AND … T1.Jn = T2.Jnremplace T1 INNER JOIN T2 ON T1.J1 = T2.J1 AND … T1.Jn = T2.Jn
– S NATURAL FULL OUTER JOIN SPS NATURAL FULL OUTER JOIN SP» Crée une seul attribut S#Crée une seul attribut S#» Comment simuler sous MsAccess ?Comment simuler sous MsAccess ?
– S CROSS JOIN SPS CROSS JOIN SP» Produit cartésienProduit cartésien
– ……– Voir le standardVoir le standard
Jointures implicites et auto-jointure sont une forme Jointures implicites et auto-jointure sont une forme implicite de ces clausesimplicite de ces clauses– pas toujours, pourquoi ?pas toujours, pourquoi ?
1
Fonctions agrégatsFonctions agrégatsFonctions agrégatsFonctions agrégats
Un nombre Un nombre trèstrès limité: limité:– COUNT, SUM, AVG, MAX, MIN,COUNT, SUM, AVG, MAX, MIN,
» MIN, MAX s’applique aux Nuls ( à tort)MIN, MAX s’applique aux Nuls ( à tort)
» MsAccess: StDev, Var, First, Last MsAccess: StDev, Var, First, Last » MsAccess97: VarP, StDevPMsAccess97: VarP, StDevP
– calcul sur la population, pendant que Var, StDev utilisent calcul sur la population, pendant que Var, StDev utilisent un échantillon un échantillon
A mettre dans SELECT A mettre dans SELECT
SELECT sum(P.Weight) AS PoidsCumuleSELECT sum(P.Weight) AS PoidsCumuleFROM P;FROM P;
PoidsCumule
91
1
Fonctions agrégatsFonctions agrégatsFonctions agrégatsFonctions agrégats SELECT Count (*) FROM S WHERE… compte tous les SELECT Count (*) FROM S WHERE… compte tous les
tuplestuples
SELECT Count (CITY) FROM S ne compte pas de nullsSELECT Count (CITY) FROM S ne compte pas de nulls– mais compte les doubles mais compte les doubles
SELECT COUNT (DISTINCT (CITY)) FROM S;SELECT COUNT (DISTINCT (CITY)) FROM S;
– Possible avec SQL ANSI, mais pas MsAccessPossible avec SQL ANSI, mais pas MsAccess» Pourquoi ? Pourquoi ?
- Très bonne question à Microsoft- Très bonne question à Microsoft– Possible dans SQL-Server ou DB2 ?– Formulable autrement avec MsAccess ?
On peut compter sur plusieurs champs, pourvus qu'ils ne On peut compter sur plusieurs champs, pourvus qu'ils ne soient pas tous nuls dans le tuple (MsAccess)soient pas tous nuls dans le tuple (MsAccess)
SELECT Count ("City & Status") FROM S;SELECT Count ("City & Status") FROM S; Compte les fournisseurs sans ville connueCompte les fournisseurs sans ville connue Compte le nombre de villes avec un fournisseur (MsAccess)Compte le nombre de villes avec un fournisseur (MsAccess)
1
Fonctions agrégatsFonctions agrégatsFonctions agrégatsFonctions agrégats
SELECT Varp(SP.Qty) AS Varp, Var(SP.Qty) AS Var, SELECT Varp(SP.Qty) AS Varp, Var(SP.Qty) AS Var, StDev(SP.Qty) AS StDev, StDevp(SP.Qty) AS StDevpStDev(SP.Qty) AS StDev, StDevp(SP.Qty) AS StDevpFROM SP;FROM SP;
Varp Var StDev StDevp
15644.6280991736 17209.0909090909131.183424673588 125.078487755383
1
Fonctions Agrégat pour OLAPFonctions Agrégat pour OLAPDB2DB2
Fonctions Agrégat pour OLAPFonctions Agrégat pour OLAPDB2DB2
CountBig CountBig – Pour le nombre de tuples > 2**31Pour le nombre de tuples > 2**31
Covariance Covariance – entre des attributs ou des expressions de valeurentre des attributs ou des expressions de valeur
CorrelationCorrelation– entre des attributs ou des expressions de valeurentre des attributs ou des expressions de valeur
Regression functionsRegression functions– 10 fonctions10 fonctions– Les paramètres de la droite de régression entre des Les paramètres de la droite de régression entre des
attributs ou des expressions de valeurattributs ou des expressions de valeur Rank, Dense_RankRank, Dense_Rank
1
Fonctions Agrégat pour OLAPFonctions Agrégat pour OLAPDB2DB2
Fonctions Agrégat pour OLAPFonctions Agrégat pour OLAPDB2DB2
Fonctions spécifiques à DB2 Data Warehouse Fonctions spécifiques à DB2 Data Warehouse Center:Center:– Analyse de la variance (ANOVA)Analyse de la variance (ANOVA)
» Distributions de Fisher-F Distributions de Fisher-F » Valeur PValeur P
– Sous-totaux par période de tempsSous-totaux par période de temps– Test de Chi-carréTest de Chi-carré– Statistique T pour Statistique T pour n n paires de valeurs et à partir du paires de valeurs et à partir du
coeff. de corrélation coeff. de corrélation rrT = r T = r * ((* ((nn – 2 ) / (1 - – 2 ) / (1 - rr 2 2 ))))0.5 0.5
– T T 0 indique une corrélation entre les attributs0 indique une corrélation entre les attributs
1
Fonctions Agrégat pour OLAPFonctions Agrégat pour OLAPTeradataTeradata
Fonctions Agrégat pour OLAPFonctions Agrégat pour OLAPTeradataTeradata
RANKRANK CSUM (Cumulative (Running) Sums) CSUM (Cumulative (Running) Sums) MAVG and MSUMMAVG and MSUM MDIFF (Moving Difference)MDIFF (Moving Difference) QUANTILEQUANTILE QUALIFYQUALIFY SAMPLESAMPLE
1
SELECT EmployeeName, (HireDate - DATE) AS ServiceDays,
RANK ( ServiceDays ) as Seniority FROM Employee
ORDER BY EmployeeName;
EmployeeName Service Days Seniority
Robyn Baker 9931 2
Nick Garrison 9931 2
Kyle McVicker 9408 5
Eva O’Malley 10248 1
Norma Powers 9409 4
1
SELECT Item, SalesDate, CSUM(Revenue,Item,SalesDate) as CumulativeSales FROM
(SELECT Item, SalesDate, Sum( Sales ) as Revenue FROM DailySales
WHERE StoreId=5 AND SalesDate Between ‘1/1/1999’ and ‘1/31/1999’
GROUP BY Item, SalesDate) AS ItemSales
ORDER BY SalesDate ;
Item SalesDate CumulativeSales
InstantCOW 01/01/1999 972.99
InstantCOW 01/02/1999 2361.99
InstantCOW 01/03/1999 5110.97
InstantCOW 01/04/1999 7793.91
1
SELECT MarketDay,ClosingPrice, MAVG(ClosingPrice,50,MarketDay) as XYZAverage
FROM MarketDailyClosing
WHERE Ticker = ‘XYZ’
ORDERBY MarketDay;
MarketDay ClosingPrice XYZAverage
12/27/1999 89 1/16 85 1/2
12/28/1999 91 1/8 86 1/16
12/29/1999 92 3/4 86 1/2
12/30/1999 94 1/2 87
1
SELECT MarketWeek, WeekVolume, MDIFF (WeekVolume,1,MarketWeek)asXYZVolumeDiff
FROM (SELECT MarketWeek, SUM(Volume) as WeekVolume
FROM MarketDailyClosing WHERE Ticker = ‘XYZ’
GROUP BY MarketWeek)
ORDERBY MarketWeek;
MarketWeek WeekVolume XYZVolumeDiff
11/29/1999 9817671 ?
12/06/1999 9945671 128000
12/13/1999 10099459 153788
12/20/1999 10490732 391273
12/27/1999 11045331 554599
1
SELECT Item, Profit, QUANTILE( 10, Profit ) as Decile
FROM (SELECTItem,Sum(Sales)—(Count(Sales)*ItemCost) asProfit
FROM DailySales, Items WHERE DailySales.Item = Items.Item
GROUP BY Item) AS ItemProfit;
Item Profit Decile
High Tops 97112 9
Low Tops 74699 7
Running 69712 6
Casual 28912 3
Xtrain 100129 9
1
SELECT Item, Profit, QUANTILE( 100, Profit ) AS Percentile
FROM (SELECT Item,Sum(Sales) — (Count(Sales)* Items.ItemCost) as Profit FROM DailySales, Items
WHERE DailySales.Item = Items.Item
GROUP BY Item) AS ItemProfit
QUALIFY Percentile = 99;
Item Profit Percentile
Fat Free Ice Cream 10.79 99
Sugar Free Ice Cream -100.55 99
Fake Chocolate Ice Cream -1110.67 99
Fat/Sugar Free Ice Cream -2913.88 99
Fake Ice Cream -4492.12 99
1
SELECT customer_id, age, income, marital_status, …, SAMPLEID FROM customer_tableSAMPLE 0.6, 0.25, 0.15
customer_id age income marital_status ... SAMPLEID
1362549 17 0 1 1
1362650 21 17804 2 1
1362605 34 16957 2 1
1362672 50 16319 2 3
1362486 76 10701 3 1
1362500 40 56708 1 3
1362489 35 55888 3 2
1362498 60 9849 2 1
1362551 27 23085 1 1
1362503 18 5787 1 .. 2
1
GROUP BYGROUP BYGROUP BYGROUP BY
Permet d'appliquer les fonctions agrégats aux Permet d'appliquer les fonctions agrégats aux sous-tables, dites sous-tables, dites groupesgroupes, définies par l'égalité de , définies par l'égalité de certains attributscertains attributs
Inexistant dans SQL originel (et le modèle Inexistant dans SQL originel (et le modèle relationnel)relationnel)
Est populaire mais redondanteEst populaire mais redondante– ce qui est peu connu (voir le cours sur les Subtilités de ce qui est peu connu (voir le cours sur les Subtilités de
SQL)SQL)
A été introduite par Peter Grey d'Univ. d'Aberdeen A été introduite par Peter Grey d'Univ. d'Aberdeen (je crois).(je crois).
1
GROUP BYGROUP BYGROUP BYGROUP BY
SELECT SELECT top 50 percenttop 50 percent [p#], sum (qty) as [tot-qty] from sp [p#], sum (qty) as [tot-qty] from sp GROUP BY [p#]GROUP BY [p#]Order by Order by sum (qty)sum (qty) desc; desc;
p#p# tot-qtytot-qtyp2p2 10001000p1p1 600600p5p5 500500p4p4 500500
1
HAVINGHAVINGHAVINGHAVING
Permet de spécifier les prédicats sur les groupes de Permet de spécifier les prédicats sur les groupes de GROUP BYGROUP BY
SELECT [p#], sum (qty) as [tot-qty] from sp SELECT [p#], sum (qty) as [tot-qty] from sp GROUP BY [p#]GROUP BY [p#]HAVING SUM (QTY) > 200HAVING SUM (QTY) > 200ORDER BY ORDER BY SUM (QTY)SUM (QTY) DESC; DESC;
p#p# tot-qtytot-qty
p2p2 10001000p1p1 600600p5p5 500500p4p4 500500p3p3 400400
1
ROLLUPROLLUP(DB2 & SQL-Server)(DB2 & SQL-Server)
ROLLUPROLLUP(DB2 & SQL-Server)(DB2 & SQL-Server)
Groupements multiples (super-groupes) selon une Groupements multiples (super-groupes) selon une dimensiondimension– l ’ordre des attributs dans la clause a l ’importancel ’ordre des attributs dans la clause a l ’importance– les attributs sont progressivement « oublies » de droite les attributs sont progressivement « oublies » de droite
à gaucheà gauche
Remplace plusieurs requêtes GROUP BYRemplace plusieurs requêtes GROUP BYSELECT p#, sum (qty) as tot-qty from S,SP, P SELECT p#, sum (qty) as tot-qty from S,SP, P
WHERE SP. P# = P.P# AND SP. S# = S.S#WHERE SP. P# = P.P# AND SP. S# = S.S#
GROUP BY GROUP BY ROLLUP (P#, S.CITY, COLOR)ROLLUP (P#, S.CITY, COLOR)
HAVING tot-qty > 100 ;HAVING tot-qty > 100 ;
Problèmes avec des nulls que l’on verra plus tard
1
CUBECUBE(DB2 & SQL-Server)(DB2 & SQL-Server)
CUBECUBE(DB2 & SQL-Server)(DB2 & SQL-Server)
Groupements multiples selon toutes les dimensionsGroupements multiples selon toutes les dimensions– l ’ordre des attributs dans la clause n ’a pas d ’importancel ’ordre des attributs dans la clause n ’a pas d ’importance– les attributs sont progressivement « oublies » de droite à les attributs sont progressivement « oublies » de droite à
gauchegauche Remplace plusieurs requêtes GROUP BYRemplace plusieurs requêtes GROUP BYSELECT p#, sum (qty) as tot-qty from S,SP, P SELECT p#, sum (qty) as tot-qty from S,SP, P WHERE SP. P# = P.P# AND SP. S# = S.S#WHERE SP. P# = P.P# AND SP. S# = S.S#GROUP BY GROUP BY CUBE (P#, S.CITY, COLOR)CUBE (P#, S.CITY, COLOR)HAVING tot-qty > 100 ;HAVING tot-qty > 100 ; Problèmes avec des nuls que l’on verra plus tard Opération bien plus chère que Rollup
– 2N requêtes générées au lieu de N, pour N attributs
1
GROUPING SETSGROUPING SETSGROUPING SETSGROUPING SETS
On indique explicitement les groupesOn indique explicitement les groupes– entre (..)entre (..)
» le groupe () est constitué de toute la tablele groupe () est constitué de toute la table
SELECT p#, sum (qty) as tot-qty from S,SP, P SELECT p#, sum (qty) as tot-qty from S,SP, P
WHERE SP. P# = P.P# AND SP. S# = S.S#WHERE SP. P# = P.P# AND SP. S# = S.S#
GROUP BY GROUP BY GROUPING SETS ((P#, S.CITY, COLOR), (P#, COLOR), GROUPING SETS ((P#, S.CITY, COLOR), (P#, COLOR), ())())
HAVING tot-qty > 100 ;HAVING tot-qty > 100 ;
Problèmes avec des nuls que l’on verra plus tard
1
Rollup, Cube, Grouping SetsRollup, Cube, Grouping Setssous MsAccesssous MsAccess
Rollup, Cube, Grouping SetsRollup, Cube, Grouping Setssous MsAccesssous MsAccess
Il y en a pasIl y en a pas On peut simuler ces manipulations en On peut simuler ces manipulations en
utilisant utilisant – GROUP BYGROUP BY– UNION ALLUNION ALL– ORDER BYORDER BY
Peut être laborieux pour le CUBE Peut être laborieux pour le CUBE
1
ROLLUP
Remarquez le « null as city»
1
ROLLUP
1
ROLLUP
Et le CUBE ?
Une solution pour l ambiguïté
de certains nuls ?
1
Sous-requêtesSous-requêtesSous-requêtesSous-requêtes
Une expression alternative de jointuresUne expression alternative de jointures Permet une optimisation manuellePermet une optimisation manuelle
– la sous-requête est exécutée d'abordla sous-requête est exécutée d'abord
Permet d'appliquer les fonctions agrégats dans Permet d'appliquer les fonctions agrégats dans la clause WHEREla clause WHERE
Permet d'appliquer le quantificateur EXISTSPermet d'appliquer le quantificateur EXISTS– et donc, indirectement, le quantificateur et donc, indirectement, le quantificateur
FORALL (universel)FORALL (universel)
1
Sous-requêtesSous-requêtesSous-requêtesSous-requêtes
SELECT [s#], snameSELECT [s#], sname from S where s.[s#] in (select [s#] from sp where qty > 200); from S where s.[s#] in (select [s#] from sp where qty > 200);
SELECT [s#], sname, statusSELECT [s#], sname, statusfrom S where s.status = (select max (status) from s as S1);from S where s.status = (select max (status) from s as S1);
s#s# snamesname statusstatuss1s1 SmithSmith 3030s3s3 BlakeBlake 3030s5s5 AdamsAdams 3030
1
EXISTSEXISTSEXISTSEXISTS
SELECT [s#], sname, statusSELECT [s#], sname, status from S where exists from S where exists (select * from sp where [s#]=sp.[s#](select * from sp where [s#]=sp.[s#]and sp.[p#]='p2');and sp.[p#]='p2');
s#s# snamesname statusstatuss1s1 SmithSmith 3030s2s2 JonesJones 1010s3s3 BlakeBlake 3030s4s4 ClarkClark 2020s5s5 AdamsAdams 3030
1
FORALL <-> NOT (NOT EXISTS)FORALL <-> NOT (NOT EXISTS)FORALL <-> NOT (NOT EXISTS)FORALL <-> NOT (NOT EXISTS)
SELECT [s#], snameSELECT [s#], snamefrom S where from S where not exists not exists (select * from p where (select * from p where not exists not exists ( select * from sp ( select * from sp where [s#]=s.[s#] and [p#]=p.[p#] ));where [s#]=s.[s#] and [p#]=p.[p#] ));
s#s# snamesname
s1s1 SmithSmith
1
NOT...NOT EXISTSNOT...NOT EXISTSNOT...NOT EXISTSNOT...NOT EXISTS
SELECT distinct [s#] SELECT distinct [s#] from SP X where not exists from SP X where not exists (select * from sp y (select * from sp y where [s#]='s2' and not exists where [s#]='s2' and not exists (select * from sp z (select * from sp z where z.[s#]=x.[s#] and z.[p#]=y.[p#] )); where z.[s#]=x.[s#] and z.[p#]=y.[p#] ));
s#s#s1s1s2s2
C'est quoi ?C'est quoi ? Tous les fournisseurs qui fournissent au moins les Tous les fournisseurs qui fournissent au moins les
pièces du fournisseur 'S2'.pièces du fournisseur 'S2'.
1
NOT...NOT EXISTSNOT...NOT EXISTSNOT...NOT EXISTSNOT...NOT EXISTS
SELECT distinct [s#] SELECT distinct [s#] from SP X where not exists from SP X where not exists (select * from sp y (select * from sp y where [s#]='s2' and not exists where [s#]='s2' and not exists (select * from sp z (select * from sp z where z.[s#]=x.[s#] and z.[p#]=y.[p#] )); where z.[s#]=x.[s#] and z.[p#]=y.[p#] ));
s#s#s1s1s2s2
C'est quoi ?C'est quoi ? Tous les fournisseurs qui fournissent au moins les Tous les fournisseurs qui fournissent au moins les
pièces du fournisseur 'S2'.pièces du fournisseur 'S2'.
SQL c'est simplecar non-procedural:une intention = une requête
1
UNIONUNIONUNIONUNION
SELECT [P#], CITY FROM P WHERE CITY LIKE '[L-S]'SELECT [P#], CITY FROM P WHERE CITY LIKE '[L-S]'UNION UNION SELECT [P#], CITY FROM SP, S WHERE SP.[S#]=S.[S#] AND SELECT [P#], CITY FROM SP, S WHERE SP.[S#]=S.[S#] AND CITY >= 'B';CITY >= 'B';
1
UNIONUNIONUNIONUNION
SELECT [P#], CITY FROM P WHERE CITY LIKE '[L-S]'SELECT [P#], CITY FROM P WHERE CITY LIKE '[L-S]'UNION UNION SELECT [P#], CITY FROM SP, S WHERE SP.[S#]=S.[S#] AND SELECT [P#], CITY FROM SP, S WHERE SP.[S#]=S.[S#] AND CITY >= 'B';CITY >= 'B';
P#P# citycityp1p1 LondonLondonp1p1 ParisParisp2p2 LondonLondonp2p2 ParisParisp3p3 LondonLondonp4p4 LondonLondonp5p5 LondonLondonp6p6 LondonLondon
Tous les duplicata sont éliminés
Comment fairealors pour lesagrégats ?
1
UNIONUNION MsAccessMsAccess
Les tables ou vues entières union-compatibles peuvent Les tables ou vues entières union-compatibles peuvent être référencées explicitementêtre référencées explicitement
TABLE Customers UNION TABLE Suppliers
On ne peut pas sélectionner d’attributs de type MEMO ou On ne peut pas sélectionner d’attributs de type MEMO ou OLEOLE– Y compris par * Y compris par *
» Déjà déconseillé pour les programmes d’applicationDéjà déconseillé pour les programmes d’application
Pas d opérateurs INTERSECT, EXCEPTPas d opérateurs INTERSECT, EXCEPT
1
UNION ALLUNION ALLUNION ALLUNION ALL Préserve les duplicataPréserve les duplicata Nécessaire pour appliquer des agrégationsNécessaire pour appliquer des agrégations Mais, souvent il faut néanmoins dans ce but Mais, souvent il faut néanmoins dans ce but
au moins 2 requêtes SQLau moins 2 requêtes SQL– défaut de conception SQLdéfaut de conception SQL
Dans l exemple qui suit, sous MsAccess, on veut Dans l exemple qui suit, sous MsAccess, on veut des agrégations sur WEIGHTdes agrégations sur WEIGHT– la 1ere requête définie une vue appelée UNION-ALLla 1ere requête définie une vue appelée UNION-ALL– la 2eme requête calcule les agrégations voulues la 2eme requête calcule les agrégations voulues
Sous DB2 on peut faire en une requêteSous DB2 on peut faire en une requête» voir le cours SQL-2voir le cours SQL-2
1
UNION ALLUNION ALLUNION ALLUNION ALL
SELECT weight, p.city FROM P WHERE City like 'l*'SELECT weight, p.city FROM P WHERE City like 'l*'UNION ALL SELECT weight, s.city FROM p, SP, S WHEREUNION ALL SELECT weight, s.city FROM p, SP, S WHEREp.[p#]=sp.[p#] and sp.[s#]=s.[s#] and s.City like 'p*';p.[p#]=sp.[p#] and sp.[s#]=s.[s#] and s.City like 'p*';
weightweight citycity1212 londonlondon1414 londonlondon1919 londonlondon1212 ParisParis1717 ParisParis1717 ParisParis
1
UNION ALLUNION ALLUNION ALLUNION ALL
SELECT weight, p.city FROM P WHERE City like 'l*'SELECT weight, p.city FROM P WHERE City like 'l*'UNION ALL SELECT weight, s.city FROM p, SP, S WHEREUNION ALL SELECT weight, s.city FROM p, SP, S WHEREp.[p#]=sp.[p#] and sp.[s#]=s.[s#] and s.City like 'p*';p.[p#]=sp.[p#] and sp.[s#]=s.[s#] and s.City like 'p*';
weightweight citycity1212 londonlondon1414 londonlondon1919 londonlondon1212 ParisParis1717 ParisParis1717 ParisParis
• SELECT SELECT AVG(WEIGHT) AVG(WEIGHT) AS [AVG POIDS], AS [AVG POIDS], VAR(WEIGHT) VAR(WEIGHT) AS AS [VAR-POIDS],[VAR-POIDS], MAX(WEIGHT) MAX(WEIGHT) AS [POIDS-MAX] AS [POIDS-MAX]FROM [UNION-ALL];FROM [UNION-ALL];
avg poidsavg poids var poidsvar poids poids-maxpoids-max
15.166666666666715.1666666666667 8.566666666666678.56666666666667 1919
1
Fonctions scalairesFonctions scalairesFonctions scalairesFonctions scalaires
S ’appliquent aux valeurs individuellesS ’appliquent aux valeurs individuelles– d ’attributsd ’attributs– d agrégations SQLd agrégations SQL
Il y a plusieurs catégoriesIl y a plusieurs catégories– mathématiquesmathématiques– financièresfinancières– chaînes de caractèreschaînes de caractères– ……..
Varient entre les dialectesVarient entre les dialectes– MsAccess possède UCASE, pas DB2MsAccess possède UCASE, pas DB2– DB2 possède LOG10, pas MsAccessDB2 possède LOG10, pas MsAccess
1
Fonctions scalairesFonctions scalairesFonctions scalairesFonctions scalaires
Peuvent s’imbriquerPeuvent s’imbriquer– contrairement aux agrégats SQLcontrairement aux agrégats SQL
SELECT log((sum([qty]^2)^(1/2))) as exempleSELECT log((sum([qty]^2)^(1/2))) as exempleFROM SP group by [p#]FROM SP group by [p#]having int(log(sum([qty]))) = 5having int(log(sum([qty]))) = 5
exemple5.708757640082795.99146454710798
1
Tabulations CroiséesTabulations Croisées(Crosstab queries)(Crosstab queries)
Tabulations CroiséesTabulations Croisées(Crosstab queries)(Crosstab queries)
Présentent les résultat sous forme habituelle de Présentent les résultat sous forme habituelle de feuilles de calculsfeuilles de calculs– Les agrégats SUM, AVG.. de GROUP BY et les Les agrégats SUM, AVG.. de GROUP BY et les
valeurs individuelles en même tempsvaleurs individuelles en même temps– Impossible avec SQL standardImpossible avec SQL standard
Transforment les valeurs d'attributs en attributsTransforment les valeurs d'attributs en attributs– Par exemplePar exemple
» les valeurs de P# trouvés pour un même S# les valeurs de P# trouvés pour un même S# deviennent les attributs P1, P2,...deviennent les attributs P1, P2,...
» les valeurs de P1, P2.. sont les QTY (par ex.) les valeurs de P1, P2.. sont les QTY (par ex.) correspondants correspondants
1
TRANSFORM Sum(SP.Qty) TRANSFORM Sum(SP.Qty)
SELECT SP.[S#], Sum(SP.Qty) AS [Row SELECT SP.[S#], Sum(SP.Qty) AS [Row Summary]Summary]
FROM SPFROM SP
GROUP BY SP.[S#]GROUP BY SP.[S#]
PIVOT SP.[p#];PIVOT SP.[p#];
Tabulations Croisées Tabulations Croisées Tabulations Croisées Tabulations Croisées
Nouvellescolonnes
1
S# Total Qty p1 p2 p3 p4 p5 p6
s1s1 13001300 300300 200200 400400 200200 100100 100100
s2s2 700700 300300 400400
s3s3 200200 200200
s4s4 900900 200200 300300 400400
L'intitulé Total Qty est mis par défaut par MsAccess
Tabulations Croisées Tabulations Croisées Tabulations Croisées Tabulations Croisées
1
La fonction agrégat dans la clause La fonction agrégat dans la clause TRANSFORM est obligatoireTRANSFORM est obligatoire– bien que bien que SUM(QTY) = AVG(QTY) = QTYSUM(QTY) = AVG(QTY) = QTY– mais, COUNT(QTY) = 1mais, COUNT(QTY) = 1
On peut générer une expression de valeur On peut générer une expression de valeur TRANSFORM SUM(0.5*QTY) AS [Q2]TRANSFORM SUM(0.5*QTY) AS [Q2]SELECT Sum(SP.[Q2]) AS [Qte tot. dans 1 mois], Avg(P.SELECT Sum(SP.[Q2]) AS [Qte tot. dans 1 mois], Avg(P.[Q2]) AS [Qte moy. dans 1 mois][Q2]) AS [Qte moy. dans 1 mois]FROM SPFROM SPGROUP BY SP.[S#]GROUP BY SP.[S#]PIVOT SP.[p#];PIVOT SP.[p#];
Tabulations Croisées Tabulations Croisées Tabulations Croisées Tabulations Croisées
1
On peut utiliser la clause WHEREOn peut utiliser la clause WHEREWHERE P# IN ('P1', 'P2')WHERE P# IN ('P1', 'P2')
Alors les fonctions ne calculent les agrégats que Alors les fonctions ne calculent les agrégats que sur P1 et P2.sur P1 et P2.
On peut aussi restreindre la tabulation seulement On peut aussi restreindre la tabulation seulement PIVOT SP.[p#] IN ('P1', P2')PIVOT SP.[p#] IN ('P1', P2')
1.1. Mais, cette clause n'affecte pas les calculs des Mais, cette clause n'affecte pas les calculs des agrégatsagrégats
Peut-on appliquer la clause ORDER BY ?Peut-on appliquer la clause ORDER BY ?1.1. Si oui, quel serait l’effet sur les valeurs pivotées ?Si oui, quel serait l’effet sur les valeurs pivotées ?2.2. Peut-on ordonner par rapport à une fonction agrégat ?Peut-on ordonner par rapport à une fonction agrégat ?
Comme on a fait pour les requêtes à GROUP BY ?Comme on a fait pour les requêtes à GROUP BY ? Peut-on appliquer la clause HAVING ?Peut-on appliquer la clause HAVING ?
Tabulations Croisées Tabulations Croisées Tabulations Croisées Tabulations Croisées
1
Requêtes à paramètresRequêtes à paramètresRequêtes à paramètresRequêtes à paramètres un paramètre : un un paramètre : un [texte visualisé][texte visualisé] dans la clause dans la clause
WHERE pour que l'usager indique une valeurWHERE pour que l'usager indique une valeur– le texte peut être sans [], s’il ne désigne pas d’attribut et le texte peut être sans [], s’il ne désigne pas d’attribut et
n ’a pas de blancs, # etc.n ’a pas de blancs, # etc.» Possibilité à éviter à cause de conflit de noms possiblePossibilité à éviter à cause de conflit de noms possible
– "Paris" est une constante Paris serait un paramètre"Paris" est une constante Paris serait un paramètre
Le type de données d'un paramètre par défault est Le type de données d'un paramètre par défault est texte. texte.
On peut-être déclarer un type différent par la On peut-être déclarer un type différent par la clause PARAMETERclause PARAMETER
» recommandée pour un paramètre dans une recommandée pour un paramètre dans une expression de valeur (et expression de valeur (et obligatoireobligatoire dans la requête dans la requête qui suit)qui suit)
1
Requêtes à paramètresRequêtes à paramètresRequêtes à paramètresRequêtes à paramètres On peut utiliser plusieurs paramètresOn peut utiliser plusieurs paramètres
– pour une clause BETWEEN [Qty Min ?] AND pour une clause BETWEEN [Qty Min ?] AND [Max ?] [Max ?]
On peut utiliser la clause LIKE On peut utiliser la clause LIKE [City ?][City ?] Alors la réponse doit être selon la Alors la réponse doit être selon la
sémantique de la clause LIKE, sémantique de la clause LIKE, – P. e., [L-P]* signifiera « toutes les villes qui P. e., [L-P]* signifiera « toutes les villes qui
commencent par une lettre entre L et P, incluscommencent par une lettre entre L et P, inclus Alternativement on peut ajouter les Alternativement on peut ajouter les
caractères génériques à la réponse d'usagercaractères génériques à la réponse d'usager– P.e. LIKE P.e. LIKE [City ?] & "*"[City ?] & "*"
1
Requêtes à paramètresRequêtes à paramètresRequêtes à paramètresRequêtes à paramètres Le nom dans le paramètre a la priorité sur le nom de Le nom dans le paramètre a la priorité sur le nom de
l'attribut, si on génère un l'attribut, si on génère un conflitconflit de noms de noms
PARAMETERS [weight] Long;PARAMETERS [weight] Long;SELECT P.Weight, p.Weight+3/2, P.ColorSELECT P.Weight, p.Weight+3/2, P.ColorFROM PFROM PWHERE p.Weight+3/2 > WHERE p.Weight+3/2 > weightweight and and weightweight + 6 > p.weight; + 6 > p.weight;
On évite le conflit par l’emploi de P.WeightOn évite le conflit par l’emploi de P.Weight Note: il n ’y a ci-dessus qu’un seul param. Note: il n ’y a ci-dessus qu’un seul param. weightweight Est-ce que c’est la même requêteEst-ce que c’est la même requête
PARAMETERS [weight] Long;PARAMETERS [weight] Long;SELECT Weight, Weight+3/2, P.ColorSELECT Weight, Weight+3/2, P.ColorFROM PFROM PWHERE Weight+3/2 > [WHERE Weight+3/2 > [weightweight] and [] and [weight]weight] + 6 > weight; + 6 > weight;
; ;
1
Clauses COMPUTE & FOR BROWSEClauses COMPUTE & FOR BROWSE(SQL Server (SQL Server 6.5 et 7)6.5 et 7)
expression générale de sélection:expression générale de sélection:SELECT [DISTINCT] attribut(s)SELECT [DISTINCT] attribut(s)
FROM table(s)FROM table(s)[WHERE condition][WHERE condition][GROUP BY [ROLLUP | CUBE] field(s) ][GROUP BY [ROLLUP | CUBE] field(s) ][HAVING condition ][HAVING condition ][ORDER BY attribute(s)][ORDER BY attribute(s)][COMPUTE row-agg (colonne), [row-agg (colonne)]... [COMPUTE row-agg (colonne), [row-agg (colonne)]... BY (colonne), [(colonne)]...]BY (colonne), [(colonne)]...][FOR BROWSE][FOR BROWSE]
Clause FOR BROWSE permet une MAJ de données Clause FOR BROWSE permet une MAJ de données dynamiquement visualiséesdynamiquement visualisées
1
ComputeComputeComputeCompute select title, type, price, advanceselect title, type, price, advance
from titles where ytd_sales is not nullfrom titles where ytd_sales is not nullorder by type descorder by type desc
compute AVG(price), SUM(advance) by typecompute AVG(price), SUM(advance) by typecompute SUM(price), SUM(advance)compute SUM(price), SUM(advance)
gogo title title typetype priceprice advanceadvance
fifty years...fifty years... trad_cooktrad_cook 11.9511.95 40004000Onions..Onions.. trad_cook trad_cook 20.9520.95 70007000Sushi...Sushi... trad_cook trad_cook 14.9914.99 80008000
avgavg15.9615.96 sumsum
1900019000 title title typetype priceprice advanceadvanceComputer...Computer... psychologypsychology 21.9521.95 70007000...... psychology psychology ........ ........
avgavg15.9615.96 sumsum
1900019000 sumsum sum sum236.00236.00 8840088400
select title, type, price, advanceselect title, type, price, advancefrom titles where ytd_sales is not nullfrom titles where ytd_sales is not nullorder by type descorder by type desc
compute AVG(price), SUM(advance) by typecompute AVG(price), SUM(advance) by typecompute SUM(price), SUM(advance)compute SUM(price), SUM(advance)
gogo title title typetype priceprice advanceadvance
fifty years...fifty years... trad_cooktrad_cook 11.9511.95 40004000Onions..Onions.. trad_cook trad_cook 20.9520.95 70007000Sushi...Sushi... trad_cook trad_cook 14.9914.99 80008000
avgavg15.9615.96 sumsum
1900019000 title title typetype priceprice advanceadvanceComputer...Computer... psychologypsychology 21.9521.95 70007000...... psychology psychology ........ ........
avgavg15.9615.96 sumsum
1900019000 sumsum sum sum236.00236.00 8840088400
1
Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2) Considère la table Considère la table COURSCOURS ((CNOMCNOM, , PNOMPNOM, NMIN), NMIN)
contenant les cours et leur pré-requis avec les notes contenant les cours et leur pré-requis avec les notes minimales pour l ’admission en coursminimales pour l ’admission en cours– ex. (BDs, Str-Ph, 15)ex. (BDs, Str-Ph, 15)
Tout PNOM est une clé étrangère avec CNOM comme clé Tout PNOM est une clé étrangère avec CNOM comme clé primaire ailleurs dans COURSprimaire ailleurs dans COURS
Un cours peut avoir plusieurs pré-requisUn cours peut avoir plusieurs pré-requis Trouver les noms de tous les pré-requis de cours CNAME = Trouver les noms de tous les pré-requis de cours CNAME =
‘ BDs ’‘ BDs ’– y compris les pré-requis de pré-requis etc.y compris les pré-requis de pré-requis etc.
C ’est le calcul de la C ’est le calcul de la fermeture transitivefermeture transitive Impossible encore sous MsAccess, SQL Server =< 6.5, Impossible encore sous MsAccess, SQL Server =< 6.5,
Oracle, Informix…Oracle, Informix… Possible sous DB2, à partir de V 5.0Possible sous DB2, à partir de V 5.0
1
Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)WITH PRQ (CNOM, PNOM) ASWITH PRQ (CNOM, PNOM) AS((((SELECT CNOM, PNOM SELECT CNOM, PNOM
FROM COURS FROM COURS WHERE CNOM = ‘ BDs ’WHERE CNOM = ‘ BDs ’) ) UNION ALLUNION ALL
(SELECT C.CNOM, C.PNOM (SELECT C.CNOM, C.PNOM FROM PRQ AS P, COURS AS CFROM PRQ AS P, COURS AS CWHERE C.CNOM = P.PNOM))WHERE C.CNOM = P.PNOM))
SELECT DISTINCT PNOM FROM PRQSELECT DISTINCT PNOM FROM PRQ
La requête récursive s exécute tant que la sélection La requête récursive s exécute tant que la sélection dans PRQ avec PRQ courant n’est pas vide. dans PRQ avec PRQ courant n’est pas vide.
Requête initiale
Requête récursive
Requête finale
1
Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)
Requête initiale (préreq. de BDs
1ere exécution de la Requête récursive (préreq. de BDs)
COURS
2eme exécution de la Requête récursive (préreq. de préreq. de BDs)
3eme exéc. de la RR (préreq. de préreq. de préreq. de BDs) etc.
1
Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)
CNOM PNOM
BDs StPh
Bds Lprg
CNOM PNOM NMIN
BDs StPh 15BDs LPrg 12StPh InfG 13InfG Math 11Lprg InfG 12
1
Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)
CNOM PNOM
BDs StPh
Bds Lprg
CNOM PNOM NMIN
BDs StPh 15BDs LPrg 12StPh InfG 13InfG Math 11Lprg InfG 12
StPh InfG
Lprg InfG
1
Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)
CNOM PNOM
BDs StPh
Bds Lprg
CNOM PNOM NMIN
BDs StPh 15BDs LPrg 12StPh InfG 13InfG Math 11Lprg InfG 12
StPh InfG
Lprg InfG
InfG Math
InfG Math
1
Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)Fermeture transitive (DB2)
CNOM PNOM
BDs StPh
Bds Lprg
CNOM PNOM NMIN
BDs StPh 15BDs LPrg 12StPh InfG 13InfG Math 11Lprg InfG 12
StPh InfG
Lprg InfG
InfG Math
InfG Math
PNOM
StPh
InfG
Math
1
Fermeture transitiveFermeture transitiveFermeture transitiveFermeture transitive
Trouver aussi les notes minimales nécessairesTrouver aussi les notes minimales nécessaires
1.1. Autres applicationsAutres applications Tous les subordonnées d ’un chefTous les subordonnées d ’un chef
EMPL (E#, ENOM, CHEF)EMPL (E#, ENOM, CHEF)
1.1. Toutes les composantes PMIN de pièces composéesToutes les composantes PMIN de pièces composéesCOMP (PMAJ#, PMIN#)COMP (PMAJ#, PMIN#)
Tous les descendants / ascendants d ’une personneTous les descendants / ascendants d ’une personne Toutes les participations d ’une entrepriseToutes les participations d ’une entreprise
2.2. Limite d’applicationLimite d’application1.1. Pas de cycles entre les attributs sélectionnesPas de cycles entre les attributs sélectionnes
1.1. pour que l ’on a la fermeture transitive (point fixe)pour que l ’on a la fermeture transitive (point fixe)
2.2. ex. pas de participations réciproquesex. pas de participations réciproques
1
Fermeture transitiveFermeture transitiveMsAccessMsAccess
Il faut simulerIl faut simuler– par CREATE TABLE PRQpar CREATE TABLE PRQ
» avec la création de clé primaireavec la création de clé primaire
– Insert into PRQ .. select … from COURS...Insert into PRQ .. select … from COURS...– Insert into PRQ .. select … from PRQ, COURS…Insert into PRQ .. select … from PRQ, COURS…
» exécuté interactivement ou par programme jusqu'à ce exécuté interactivement ou par programme jusqu'à ce que le point fixe est atteintque le point fixe est atteint
– Select … FROM PRQ…Select … FROM PRQ… A compléter par vos soinsA compléter par vos soins
1
Mise à jourMise à jourMise à jourMise à jour
update P update P set color = 'green', set color = 'green', weight = weight+10, weight = weight+10, city = null city = null where [p#] < 'p3';where [p#] < 'p3';
inconsistance/ à la sémantique de nuls pour les l'interrogations
1
Mise à jourMise à jourMise à jourMise à jour
update P update P set color = 'green', set color = 'green', weight = weight+10, weight = weight+10, city = null city = null where [p#] < 'p3';where [p#] < 'p3';
update SP update SP set qty = '10' set qty = '10' where 20 = where 20 = (select status from S where s.[s#]=sp.[s#]) ;(select status from S where s.[s#]=sp.[s#]) ;
inconsistance/ à la sémantique de nuls pour les l'interrogations
une sous-requêteest nécessaire
1
Mise à jourMise à jourMise à jourMise à jour
Transfert de fondsTransfert de fonds
update Account1update Account1set balance = balance - 100set balance = balance - 100where [c#] = '123';where [c#] = '123';
update Account2update Account2set balance = balance + 100set balance = balance + 100where [c#] = '123';where [c#] = '123';
- et si une de requêtes se casse ?- et si une de requêtes se casse ?– il faut des transactionsil faut des transactions
1
DELETEDELETEDELETEDELETE
Comme pour UPDATE:Comme pour UPDATE:
DELETE [*]DELETE [*]FROM tableFROM table[ WHERE condition ] ;[ WHERE condition ] ;
On retrouve aussi le besoin de transactionsOn retrouve aussi le besoin de transactions
Notamment pour l'intégrité référentielleNotamment pour l'intégrité référentielle
+ et + souvent gérée par SGBD à partir de la + et + souvent gérée par SGBD à partir de la déclaration dans LDD (ex. MsAccess)déclaration dans LDD (ex. MsAccess)
1
INSERTINSERTINSERTINSERT
INSERT INTO P INSERT INTO P VALUES ('P8', 'nut', 'pink', 15, 'Nice') ;VALUES ('P8', 'nut', 'pink', 15, 'Nice') ;
pas bonne idée d'utiliser cette forme d'INSERTpas bonne idée d'utiliser cette forme d'INSERT
INSERT INTO P (weight, [P#] )INSERT INTO P (weight, [P#] )VALUES ( 100, 'P8') ;VALUES ( 100, 'P8') ;
les valeurs non-sélectionnées ne doivent pas être non-nullesles valeurs non-sélectionnées ne doivent pas être non-nulles
INSERT INTO TEMP ([P#], TQTY)INSERT INTO TEMP ([P#], TQTY)
SELECT (P#, SUM (QTY)SELECT (P#, SUM (QTY)FROM SPFROM SPGROUP BY [P#]GROUP BY [P#]
TEMP doit être préalablement créeTEMP doit être préalablement crée Avec ou sans clé primaireAvec ou sans clé primaire Quelle différence pour INSERTQuelle différence pour INSERT
1
INSERTINSERTINSERTINSERT
SELECT...INTO de MsAccess est équivalent à SELECT...INTO de MsAccess est équivalent à simple INSERT précédé de CREATE TABLEsimple INSERT précédé de CREATE TABLE
SELECT field1[, field2[, ...]] INTO newtableSELECT field1[, field2[, ...]] INTO newtable[IN externaldatabase] [IN externaldatabase] FROM sourceFROM source
SELECT S.[S#], S.SName INTO [db2.mdb].s1SELECT S.[S#], S.SName INTO [db2.mdb].s1FROM SFROM SWHERE ((S.SName<>'paris'));WHERE ((S.SName<>'paris'));
+ en + souvent le SGBD peut vérifier pour + en + souvent le SGBD peut vérifier pour INSERT l'intégrité référentielle (MsAccess)INSERT l'intégrité référentielle (MsAccess)
1
ConclusionConclusionConclusionConclusion
SQL est un langage assertionnelSQL est un langage assertionnel– relationnellement completrelationnellement complet– + expressions de valeur et agrégats+ expressions de valeur et agrégats– + mises à jour+ mises à jour
Mais ce n'est pas un langage de programmation completMais ce n'est pas un langage de programmation completIl y a des défauts de conception et inconsistancesIl y a des défauts de conception et inconsistancesNéanmoins c'est un MUST pour un informaticien aujourd'huiNéanmoins c'est un MUST pour un informaticien aujourd'huiOn voit, néanmoins aussi que SQL n'est pas le langage pour On voit, néanmoins aussi que SQL n'est pas le langage pour les usagers ad-hoc !les usagers ad-hoc !C'est n'est pas tout pour SQL, il y en a encore !C'est n'est pas tout pour SQL, il y en a encore !
1
FIN
1