167
1 SQL : Un Langage SQL : Un Langage Relationnel Relationnel

1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

Embed Size (px)

Citation preview

Page 1: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

SQL : Un Langage RelationnelSQL : Un Langage Relationnel

Page 2: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 3: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 4: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 5: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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...

Page 6: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 7: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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#) ) ;

Page 8: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 9: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 10: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 11: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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#

Page 12: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 !

Page 13: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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.

Page 14: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 15: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 ;

Page 16: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 17: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 18: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 ?

Page 19: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 20: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 21: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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)

Page 22: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 23: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 24: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 25: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 » »))

Page 26: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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;

Page 27: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 28: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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.

Page 29: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

La table nommée P_1est en fait la table P

Les clauses CASCADE n ’existent qu’en QBE de MsAccess

Page 30: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Exercice : que veulent dire ces contraintes ?

Les clauses «is Null> dans les Validation Rules

sont-elles utiles ?

Page 31: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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))

Page 32: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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)

Page 33: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

ExamplesExamplesExamplesExamples

En pratique sur MsAccessEn pratique sur MsAccess Sauf ceux spécifiques àSauf ceux spécifiques à

– SQL-ServerSQL-Server– DB2DB2

Page 34: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 35: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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.

Page 36: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 ;

Page 37: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 38: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 39: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 40: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Selection avec duplicataSelection avec duplicataSelection avec duplicataSelection avec duplicata

SELECT CITY FROM S;SELECT CITY FROM S;

Page 41: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 42: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Elimination de duplicataElimination de duplicataElimination de duplicataElimination de duplicata

SELECT SELECT DISTINCTDISTINCT CITY FROM S; CITY FROM S;

Page 43: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Elimination de duplicataElimination de duplicataElimination de duplicataElimination de duplicata

SELECT SELECT DISTINCTDISTINCT CITY FROM S; CITY FROM S;

citycityAthensAthensLondonLondonParisParis

Page 44: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 ?

Page 45: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 46: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 ?

Page 47: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

ORDER BYORDER BYORDER BYORDER BY

SELECT * FROM SPSELECT * FROM SP

ORDER BY QTY DESC, [S#];ORDER BY QTY DESC, [S#];

Page 48: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 49: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 ?

Page 50: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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ù ?

Page 51: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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#] ;

Page 52: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 53: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 ?

Page 54: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Restrictions simplesRestrictions simplesRestrictions simplesRestrictions simples

SELECT [P#], PNAME FROM P WHERE COLOR = SELECT [P#], PNAME FROM P WHERE COLOR = 'RED';'RED';

Page 55: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 56: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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';

Page 57: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 58: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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;

Page 59: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 60: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 ?

Page 61: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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;

Page 62: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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;

Page 63: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 64: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 65: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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';

Page 66: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 67: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 68: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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#

Page 69: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 70: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 71: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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;

Page 72: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 73: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 ?

Page 74: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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';

Page 75: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 76: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 77: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 78: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 79: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 80: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 81: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 82: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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.

Page 83: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 (+)+)

Page 84: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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#];

Page 85: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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#];

Page 86: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 87: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 88: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

On a cliquéd'abord ici

On a cliquéensuite ici

Declaration de jointures implicites

Page 89: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Puis, clique et...

Tires avec la souris,

Ecris la restriction

Formulation de la requête avec les jointures implicites en QBE

Page 90: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 91: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 92: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Page 93: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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.

Page 94: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Page 95: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Page 96: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Page 97: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Page 98: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Page 99: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

Page 100: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 101: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 102: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 ?

Page 103: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 104: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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)

Page 105: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 106: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 107: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 108: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 109: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 110: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 111: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 112: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 113: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 114: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 115: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 116: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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).

Page 117: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 118: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 119: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 120: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 121: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 122: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 123: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

ROLLUP

Remarquez le « null as city»

Page 124: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

ROLLUP

Page 125: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

ROLLUP

Et le CUBE ?

Une solution pour l ambiguïté

de certains nuls ?

Page 126: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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)

Page 127: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 128: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 129: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 130: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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'.

Page 131: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 132: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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';

Page 133: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 ?

Page 134: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 135: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 136: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 137: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 138: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 139: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 140: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 141: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 142: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 143: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 144: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 145: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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)

Page 146: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 ?] & "*"

Page 147: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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;

; ;

Page 148: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 149: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 150: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 151: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 152: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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.

Page 153: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 154: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 155: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 156: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 157: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 158: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 159: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 160: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 161: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 162: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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)

Page 163: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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

Page 164: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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)

Page 165: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

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 !

Page 166: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1

FIN

Page 167: 1 SQL : Un Langage Relationnel 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste

1