La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

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.

Présentations similaires


Présentation au sujet: "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."— Transcription de la présentation:

1

2 1 SQL : Un Langage Relationnel

3 1 Langage de base de données (Database Language) Un sous-langage de programmation Un sous-langage de programmation Consiste traditionnellement de deux parties: Consiste traditionnellement de deux parties: –langage de définition de données –langage de manipulation de données »langage interactif (de requêtes) »langage imbriqué (embedded) En pratique, les deux parties sont imbriquées En pratique, les deux parties sont imbriquées –définition de vues et des attributs hérités en général

4 1 SQLSQL Inventé à IBM San Jose, 1974 (Astrahan & Chamberlin) pour System R Inventé à IBM San Jose, 1974 (Astrahan & Chamberlin) pour System R Basé sur le calcul de tuple & algèbre relationnelle Basé sur le calcul de tuple & algèbre relationnelle relationnellement complet (et plus) relationnellement complet (et plus) Le langage de SGBD relationnels Le langage 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 dialectes Il existe aussi plusieurs dialectes Les possibilités basiques sont simples Les possibilités basiques sont simples Celles avancées peuvent être fort complexes Celles avancées peuvent être fort complexes –Signalées dans ce qui suit par

5 1 SQL: Définition de Données CREATE TABLECREATE VIEW CREATE INDEX CREATE TABLECREATE VIEW CREATE INDEX ALTER TABLE ALTER TABLE DROP TABLEDROP VIEWDROP INDEX DROP TABLEDROP VIEWDROP INDEX

6 1 SQL-2 et dialectes SGBD-Serveurs : DB2, SQL-Server, Sybase.. CREATE (ALTER, DROP) DOMAIN CREATE (ALTER, DROP) DOMAIN CREATE (ALTER, DROP) SCHEMA CREATE (ALTER, DROP) SCHEMA –une partie nommée dune base –donne une autonomie de nommage »une table T dans le schéma S1 et une table T dans le schéma S2 sont deux tables différentes –nommées S1.T et S2.T dans la base –peut être considérée une base logique CREATE (DROP) DATABASE CREATE (DROP) DATABASE –clause hors standard SQL-2 CREATE (DROP) ALIAS, TRIGGER, FUNCTION, PROCEDURE... CREATE (DROP) ALIAS, TRIGGER, FUNCTION, PROCEDURE...

7 1 CREATE TABLE (clauses essentielles) Définit la table réelle (de base) Définit la table réelle (de base) CREATE TABLE table (column [,column]... [, primary key] ; column := name type [NOT NULL] type := INTEGER, CHAR (n), GRAPHIC, ICON, DATE, TIME, TIMESTAMP

8 1 EXAMPLEEXAMPLE CREATE TABLE S (S# CHAR (5)NOT NULL, SNAME CHAR (20), STATUSINT, CITYCHAR (15), PRIMARY KEY (S#) ) ;

9 1 Clauses CONSTRAINT sont nouvelles dans SQL Clauses CONSTRAINT sont nouvelles dans SQL Permettent de définir Permettent de définir –les clés étrangères FOREIGN KEY –les contraintes d'intégrité CHECK »sur un attribut »inter-attribut dune table –Autres La puissance expressive varie entre les dialectes La puissance expressive varie entre les dialectes –le standard est le plus puissant »notamment permet tout SELECT dans CHECK –les dialectes ne permettent que »aucun CHECK (MsAccess) »contrainte sur les valeurs dun même tuple (DB-2) »une par attribut (SQL-Server, DB2) »pas de sous-requêtes (SQL-Server) CREATE TABLE Clause CONSTRAINT

10 1 On peut créer une table dans une autre base que celle courante (ouverte) On peut créer une table dans une autre base que celle courante (ouverte) –SQL Server, SQL (seulement) de MsAccess, SQL-2 CREATE TABLE AUTRE-BASE.S (S# CHAR (5)NOT NULL, SNAME CHAR (20), STATUSINT, CITYCHAR (15), PRIMARY KEY (S#) ) ; CREATE TABLE (multibase) Base courante Autre-Base

11 1 SQL-2 Domaines Une version limitée du concept du domaine relationnel. Une version limitée du concept du domaine relationnel. –surtout au niveau de types de données Une source commune pour la définition d'attributs Une 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 a déjà 15 ans

12 1 Les domaines SQL-2 CREATE DOMAIN nom [AS] type CONSTRAINT def DEFAULT VALUE value Exemple : Exemple : CREATE DOMAIN S#_DOM AS CHAR (4) ; 1. On peut alors déclarer: CREATE TABLE S (S# S#_DOM...) ; CREATE TABLE SP (S# S#_DOM...) ; Les deux attributs S# ont la définition: Les deux attributs S# ont la définition: S# CHAR (4) ; S# S.S# SP.S#

13 1 Domaines avec contraintes CREATE DOMAIN CITY AS CHAR (15) CONSTRAINT VALID_CITIES CHECK (VALUE IN ('???', 'Athens', 'Paris', London')) ; Les valeurs légales sont les quatre et NULL ! Les valeurs légales sont les quatre et NULL ! –à moins d'ajouter la clause: AND VALUE IS NOT NULL Travail bâclé au niveau du standard ! Travail bâclé au niveau du standard !

14 1 Domaines avec contraintes Clause VALUE peut être aussi complexe qu'une expression SELECT de SQL Clause VALUE peut être aussi complexe qu'une expression SELECT de SQL Notamment, on peut référencer les valeurs qui changent dans le temps Notamment, on peut référencer les valeurs qui changent dans le temps –cette possibilité fait hurler certains (C.J. DATE) On peut ajouter la clause définissant une valeur par défaut dans le domaine On peut ajouter la clause définissant une valeur par défaut dans le domaine DEFAULT VALUE ('???') ; DEFAULT VALUE CURRENT-TIME ; DEFAULT VALUE CURRENT-DATE ; Cette valeur devient celle par défaut de tout attribut basé sur ce domaine. Cette valeur devient celle par défaut de tout attribut basé sur ce domaine.

15 1 Domaines avec contraintes Illegal dans SQL2 (pas de sous-types) CREATE DOMAIN INT2 AS INTEGER CONSTRAINT TWO_BYTES CHECK (VALUE >= -32768 AND VALUE = -32768 AND VALUE <= 32767) ; CREATE TABLE T... ; CREATE DOMAIN D CHECK (VALUE IN (SELECT C FROM T)) ; CREATE DOMAIN INT1 AS INT2 CONSTRAINT ONE_BYTE CHECK (VALUE >= -128 AND VALUE = -128 AND VALUE <= 127) ; Légal dans SQL2 Peut être mise à jour Pour + sur les domaines voir un livre sur SQL-2

16 1 ALTER & DROP TABLE ALTER TABLE S ADD DISCOUNT SMALLINT ; certains systèmes: certains systèmes: ALTER TABLE S DROP DISCOUNT SMALLINT ; ALTER TABLE S RENAME SNAME NAME ;..... DROP TABLE P ;

17 1 IndexesIndexes CREATE [UNIQUE] INDEX index ON table ( column [order] [, column...) [CLUSTER] ; CREATE UNIQUE INDEX XS ON S (S#) ; CREATE UNIQUE INDEX XSP ON SP (S# ASC, P# DESC) ; UNIQUE = pas de duplicata de valeurs indexées UNIQUE = pas de duplicata de valeurs indexées indexes uniques obligatoires pour les clés dans le DB2 indexes uniques obligatoires pour les clés dans le DB2

18 1 Option CLUSTER CREATE INDEX C ON S (CITY) CLUSTER; Même ordre physique: Même ordre physique: –des entrées de l'indexe CITY –des tuples de S dans leurs pages 2 Aberdeen 3, Athens 3 London 3, Milan 4, Moscou 4, Paris 5, Rome 8.... 3 1 Smith Aberdeen 100... 1 McLeod Aberdeen 100... 2 Selis Athens 150 3 Thacher London 3... Page 2 de C Page 3 de S

19 1 IndexesIndexes Définition des indexes ne devait pas être à ce niveau de SQL (c'est le schéma interne) Définition des indexes ne devait pas être à ce niveau de SQL (c'est le schéma interne) En principe, une table peut avoir un nombre quelconque d'indexes En principe, une table peut avoir un nombre quelconque d'indexes Les indexes accélèrent les recherches Les indexes accélèrent les recherches Mais, les indexes pénalisent les mises à jour ! Mais, les indexes pénalisent les mises à jour ! 1.Pourquoi ?

20 1 Un dialecte de SQL SQL-MsAccess Le dialecte le plus répandu aujourd'hui Le dialecte le plus répandu aujourd'hui Définition de données est considérablement plus élaborée que dans le SQL Standard Définition de données est considérablement plus élaborée que dans le SQL Standard Certaines options du standard sont toutefois Certaines options du standard sont toutefois – sous restriction –s'expriment sous mots-clés différents »voir MsAccess Aide –pas toujours nécessaires »; sous Access97

21 1 Example: Table P de S-P Attention: Type Counter -> Autonumber in MsAccess-97

22 1 MsAccess: Types de Données Text Text –limité par défaut à 50 caractères »clause FIELD SIZE permet 256 caractères –supporte les prédicats SQL & QBE Memo Memo –taille < 64K caractères –supporte seulement la sélection SQL & QBE Date/Time Date/Time –supporte l arithmétique de dates/temps »21/3 - 21/2 = 28 »21/4 - 21/3 = 31 ? –prévu pour 21-ème siècle (Access97) »1/1/00 à 31/12/29 signifie 1/1/2000 à 31/12/2029 »1/1/30 à 31/12/99 signifie 1/1/1930 à 31/12/1999 Autonumber Autonumber –compteur automatique ou OID (option random dans NewValues)

23 1 MsAccess: Types de Données Hyperlink Hyperlink –comme son l indique »nom symbolique < 2048 octets »URL ou UNC< 2048 octets »sous-adresse (dans le fichier ou la page) Cajun Delights#http://www.cajundelights.com#Price »supporte seulement la sélection SQL & QBE OLE objet OLE objet –tout objet Windows »multimédia ou programme –peut être copié ou référencé –il faut double-cliquer sur sa description textuelle dans le tuple pour le voir

24 1 MsAccess: Champ Number & Currency clause Field size Byte 0 à 255 Byte 0 à 255 Integer -32,768 à 32,767, 2 octets. Integer -32,768 à 32,767, 2 octets. Long Integer -2,147,483,648 à 2,147,483,647. 4 octets. Long Integer -2,147,483,648 à 2,147,483,647. 4 octets. Single Six digits de precision -3.402823E38 à 3.402823E38. 4 octets. Single Six digits de precision -3.402823E38 à 3.402823E38. 4 octets. Double (Default) 10 digits de precision 1.79769313486232E308 à 1.79769313486232E308. 8 octets. Double (Default) 10 digits de precision 1.79769313486232E308 à 1.79769313486232E308. 8 octets. Replication ID Replication ID –Pour les bases dupliquées - 16 octets –un OID –peut être aussi dans le type Autonumber

25 1 MsAccess: Champ Yes/No A utiliser comme son nom l indique A utiliser comme son nom l indique – Yes/No ou On/Off ou True/False »fixé par le champ Format »visualisé par défaut par Check-box »mais, il y a d autres possibilités taille: 1 octet taille: 1 octet

26 1 MsAccess : domaines On peut les simuler (en QBE) par : On peut les simuler (en QBE) par : –une table D source de valeurs »table de la base ou une liste de valeurs –une zone de texte modifiable (combo-box) sur lattribut A à valeurs dans D »déclaré dans la définition de A (partie Liste de choix /Lookup) –une requête déclarée dans la définition de A (dans « contenu / row source » )

27 1 MsAccess : surprises Seules les valeurs apparaissant dans la 1-ère colonne du box et donc dans D peuvent être dans A Seules les valeurs apparaissant dans la 1-ère colonne du box et donc dans D peuvent être dans A –Même si lon indique une autre « colonne liée » Type de données Assistant Liste de choix / Lookup Wizard réalise cette manipulation Type de données Assistant Liste de choix / Lookup Wizard réalise cette manipulation –Drôle de type de données –Attention aux bugs de cet assistant –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) Quarrive til aux tuples existants si lon sélectionne une autre colonne liée Quarrive til aux tuples existants si lon sélectionne une autre colonne liée –Par ex. on utilise dabord pour saisir les valeurs de P.CITY la requête »SELECT S.City, S.SName FROM S; –Puis, on la remplace par: »SELECT S.Sname, S.City FROM S;

28 1 MsAccess : CREATE TABLE CONSTRAINT = INDEX CREATE TABLE [Friends] ([First Name] TEXT, [Last Name] TEXT); CREATE TABLE Friends1 ([First Name] TEXT, [Last Name] TEXT, [Date of Birth] DATETIME, CONSTRAINT MyTableConstraint UNIQUE ([First Name], [Last Name], [Date of Birth])); CREATE TABLE Friends2 ([First Name] TEXT, [Last Name] TEXT, SSN INTEGER CONSTRAINT MyFieldConstraint PRIMARY KEY); SSN est la clé primaire. SSN est la clé primaire. On peut créer une table sans clé primaire On peut créer une table sans clé primaire –alors elle accepte des duplicata »contrairement à la théorie du relationnel Pas d'indexes CLUSTER sous MsAccess Pas d'indexes CLUSTER sous MsAccess

29 1 MsAccess : CREATE TABLE CONSTRAINT = Contraintes d'intégrité Contrainte sur attribut unique: Contrainte sur attribut unique: CONSTRAINT nom {PRIMARY KEY | UNIQUE | NOT NULL | REFERENCES foreigntable [(foreignfield1, foreignfield2)]} Contrainte sur plusieurs attributs: Contrainte sur plusieurs attributs: CONSTRAINT name {PRIMARY KEY (primary1[, primary2 [,...]]) | UNIQUE (unique1[, unique2 [,...]]) | NOT NULL (notnull1[, notnull2 [,...]]) | FOREIGN KEY (ref1[, ref2 [,...]]) REFERENCES foreigntable [(foreignfield1 [, 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.

30 1 La table nommée P_1 est en fait la table P Les clauses CASCADE n existent quen QBE de MsAccess

31 1 Exercice : que veulent dire ces contraintes ? Les clauses «is Null> dans les Validation Rules sont-elles utiles ?

32 1 Contraintes référentielles mutuelles en SQL-2 On utilise CREATE SCHEMA ou combinaison de CREATE TABLE et ALTER TABLE On utilise CREATE SCHEMA ou combinaison de CREATE TABLE et ALTER TABLE CREATE SCHEMA AUTHORIZATION Witold CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT REFERENCES t2(c1)) CREATE TABLE t2 (c1 INT PRIMARY KEY, c2 INT REFERENCES t1(c1))

33 1 SQL: manipulation de données expression générale de sélection: expression générale de sélection: SELECT [DISTINCT] attribut(s) FROM table(s) [WHERE condition] [GROUP BY field(s) ] [HAVING condition ] [ORDER BY attribute(s)] basée sur le calcul de tuple basée sur le calcul de tuple produit une table temporaire (en général avec des duplicata) produit une table temporaire (en général avec des duplicata)

34 1 ExamplesExamples En pratique sur MsAccess En pratique sur MsAccess Sauf ceux spécifiques à Sauf ceux spécifiques à –SQL-Server –DB2

35 1 Exemple canon S P SP

36 1 MsAccess SELECT SELECT [predicate] { * | table.* | [table.]field1 [, table.]field2.[,...]]} [AS alias1 [, alias2 [,...]]] FROM tableexpression [,...] [IN externaldatabase] [WHERE... ] [GROUP BY... ] [HAVING... ] [ORDER BY... ] [WITH OWNERACCESS OPTION] Predicate: ALL, DISTINCT, DISTINCTROW, TOP.

37 1 Interrogations simples Projections d'une table sur certains attributs: Projections d'une table sur certains attributs: SELECT S# FROM S ;

38 1 Interrogations simples Projections d'une table sur certains attributs: Projections d'une table sur certains attributs: SELECT S# FROM S ; S#s1s2s3s4s5

39 1 Interrogations simples Projections d'une table sur certains attributs: Projections d'une table sur certains attributs: SELECT S# FROM S ; S#s1s2s3s4s5 L'ordre de présentation est fixé par le SGBD et peut changer dans le temps L'ordre de présentation est fixé par le SGBD et peut changer dans le temps

40 1 Interrogations (vraiement) simples Projections d'une table sur certains attributs: Projections d'une table sur certains attributs: SELECT [S#] FROM S ; S#s1s2s3s4s5 L'ordre de présentation est fixé par le SGBD et peut changer dans le temps L'ordre de présentation est fixé par le SGBD et peut changer dans le temps Combien de lignes de programmation faudrait-il pour cette requête en Cobol ? 20 ? 50 ? 100 ? MsAccess

41 1 Selection avec duplicata SELECT CITY FROM S;

42 1 Selection avec duplicata SELECT CITY FROM S; –Le resultat peut avoir les duplicata – alors, il n'est pas une relation, mais un bag

43 1 Elimination de duplicata SELECT DISTINCT CITY FROM S;

44 1 Elimination de duplicata SELECT DISTINCT CITY FROM S; cityAthensLondonParis

45 1 Elimination de duplicata SELECT DISTINCT CITY FROM S; cityAthensLondonParis DISTINCT est optionnel pour deux raisons: DISTINCT est optionnel pour deux raisons: –eliminer les duplicata coute en temps de réponse –les fonctions aggregats en ont besoin. Combien de lignes de programmation faudrait-il pour cette requête en C ? 20 ? 50 ? 100 ?

46 1 Selections multiples Les attributs apparaissent dans lordre de leur énumération dans la clause SELECT Les attributs apparaissent dans lordre de leur énumération dans la clause SELECT SELECT [S#], CITY, SNAME FROM S; S#CitySName s1ParisSmith s2ParisJones s3ParisBlake s4LondonClark s5AthensAdam

47 1 SELECT * Tout sur toutes les fournitures : Tout sur toutes les fournitures : SELECT S#, P#, QTY FROM SP; Formulation plus courante : Formulation plus courante : SELECT * FROM SP; Ordre d'attributs est celui de CREATE TABLE Ordre d'attributs est celui de CREATE TABLE Cette formulation est plus simple, mais deconseillée pour les programmes d'application Cette formulation est plus simple, mais deconseillée pour les programmes d'application pourquoi ?

48 1 ORDER BY SELECT * FROM SP ORDER BY QTY DESC, [S#];

49 1 ORDER BY SELECT * FROM SP ORDER BY QTY DESC, [S#]; S#p#Qty s1p3400 s2p2400 s4p5400 s1p1300 s2p1300 s4p4300 s1p4200 s1p2200 s3p2200 s4p2200 s1p6100 s1p5100

50 1 ORDER BY SELECT * FROM SP ORDER BY QTY DESC, [S#]; S#p#Qty s1p3400 s2p2400 s4p5400 s1p1300 s2p1300 s4p4300 s1p4200 s1p2200 s3p2200 s4p2200 s1p6100 s1p5100 Combien de lignes de programmation faudrait-il pour cette requête en PL1 ? 20 ? 50 ? 100 ?

51 1 ORDER BY SELECT * FROM SP ORDER BY QTY DESC, [S#]; S#p#Qty s1p3400 s2p2400 s4p5400 s1p1300 s2p1300 s4p4300 s1p4200 s1p2200 s3p2200 s4p2200 s1p6100 s1p5100 Et la quantité nulle serait où ?

52 1 TOPTOP SELECT top 3 [S#] AS [Les petits], [P#], QTY FROM SP ORDER BY QTY ASC, [S#] ;

53 1 TOPTOP SELECT top 3 [S#] AS [Les petits], [P#], QTY FROM SP ORDER BY QTY ASC, [S#] ; Les petitsProduct IDQTY s1p6100 s1p5100 s1p4200 s1p2200

54 1 TOPTOP SELECT top 3 [S#] AS [Les petits], [P#], QTY FROM SP ORDER BY QTY ASC, [S#] ; Les petitsProduct IDQTY s1p6100 s1p5100 s1p4200 s1p2200 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 d'ordre QTY, S# (les 3 tops sont devenus 4 tuples) Pas de distinction entre les duplicata par rapport au critère d'ordre QTY, S# (les 3 tops sont devenus 4 tuples) Product ID ?

55 1 Restrictions simples SELECT [P#], PNAME FROM P WHERE COLOR = 'RED';

56 1 Restrictions simples SELECT [P#], PNAME FROM P WHERE COLOR = 'RED'; Product IDProduct Name p1nuts p4screw p6cog Les noms d'attributs sont les labels fixés à la création de P Les 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 changer d'une execution à l'autre L'ordre de tuples délivrés est définit par le SGBD et peut changer d'une execution à l'autre

57 1 Restrictions composées SELECT [P#], PNAME, CITY FROM P WHERE COLOR = 'RED' AND NOT CITY = 'PARIS'; SELECT [P#], PNAME, CITY FROM P WHERE COLOR = 'RED' AND NOT CITY = 'PARIS';

58 1 Restrictions composées SELECT [P#], PNAME, CITY FROM P WHERE COLOR = 'RED' AND NOT CITY = 'PARIS'; SELECT [P#], PNAME, CITY FROM P WHERE COLOR = 'RED' AND NOT CITY = 'PARIS'; Product IDProduct Namecity p1nutslondon p4screwlondon p6coglondon

59 1 Restrictions sur nuls Un nul n est pas une valeur Un nul n est pas une valeur Donc on a une clause spéciale Donc on a une clause spéciale –IS [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? SELECT S.City FROM S where city is null;

60 1 Restrictions sur nuls Un nul n est pas une valeur Un nul n est pas une valeur Donc on a une clause spéciale Donc on a une clause spéciale –IS [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? SELECT S.City FROM S where city is null; CITY

61 1 Restrictions sur nuls Un nul nest pas une valeur Un nul nest pas une valeur Donc on a une clause spéciale Donc on a une clause spéciale –IS [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? SELECT S.City 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 ?

62 1 SELECT [s#], city FROM S where city IN ('paris', 'london'); Restrictions par clause IN S#SNameStatusCity s1John2Paris s2smith10Paris s3Blake30 s4Clark20London s5Adam30Athens s6Bull20Paris s7Ibm100Paris s#city s1Paris s2Paris s4London s6Paris s7Paris ? SELECT [s#], city FROM S where city NOT IN ('paris', 'london'); ? SELECT [s#], city FROM S where city IN ('paris', 'london', null); ? SELECT [s#], city FROM S where city IN ('paris', 'london') or city is null;

63 1 Expressions de valeur SELECT [P#], PNAME, 2.1*weight as [Poids en KG] FROM P order by 2.1*weight desc;

64 1 Expressions de valeur SELECT [P#], PNAME, 2.1*weight as [Poids en KG] FROM P order by 2.1*weight desc; Product IDProduct NamePoids en KG p6cog39.9 p3screw35.7 p2bolt35.7 p4screw29.4 p5cam25.2 p1nuts25.2

65 1 Expressions de valeur On peut utiliser + - * / ^ et ( ) On peut utiliser + - * / ^ et ( ) On peut sélectionner tous les attributs et une expression de valeur On peut sélectionner tous les attributs et une expression de valeur SELECT *, 2.1*weight as [Poids en KG], weight + weight/5 - (weight^2 - weight*2.1) as [un jeu] FROM P order by 2.1*weight desc; ? Vrai / Faux que les résultats des expressions de valeur suivantes sont toujours comme suit : 0 * QTY = 0 QTY – QTY = 0 QTY / QTY = 1 si QTY <> 0

66 1 JointuresJointures SELECT distinct S.[S#], SNAME, [P#], Qty, City FROM S, SP where s.[s#]=sp.[s#] and city <> 'London';

67 1 Equi-jointuresEqui-jointures SELECT distinct S.[S#], SNAME, [P#], Qty, City FROM S, SP where s.[s#]=sp.[s#] and city <> 'London'; S#SNAMEProduct IDQtyCity s2Jonesp1300Paris s2Jonesp2400Paris s3Blakep2200Paris

68 1 Sémantique de la requête Forme le produit cartésien C de tables dans la clause FROM Forme le produit cartésien C de tables dans la clause FROM Sélectionne tout tuple t de C vérifiant le prédicat dans la clause WHERE (et seulement de tels tuples) Sélectionne tout tuple t de C vérifiant le prédicat dans la clause WHERE (et seulement de tels tuples) Projette tout t sur les attributs dans SELECT Projette tout t sur les attributs dans SELECT Applique le mot-clé de SELECT Applique le mot-clé de SELECT La clause S.s# = SP.s# s'appelle equi-jointure ou jointure naturelle La clause S.s# = SP.s# s'appelle equi-jointure ou jointure naturelle Opération de jointure était inconnue, même conceptuellement, de SGF et de SGBD navigationels Opération de jointure était inconnue, même conceptuellement, de SGF et de SGBD navigationels

69 1 Sémantique de jointures naturelles L'intention est de suivre les arcs du graphe de référence L'intention est de suivre les arcs du graphe de référence C'est cette opération qui permet la décomposition du modèle d'un object en plusieurs relations : C'est cette opération qui permet la décomposition du modèle d'un object en plusieurs relations : –selon les propriétés : »fonctionnelles »non-fonctionnelles SSPP S# P#

70 1 Sémantique de jointures naturelles Le prix a payer: Le prix a payer: – redondance de certaines valeurs –données plates de forme peu naturelle S#SNAMEProduct IDQtyCity s2Jonesp1300Paris s2Jonesp2400Paris s3Blakep2200Paris forme plus naturelle: forme plus naturelle: S#SNAMEProduct IDQtyCity s2Jonesp1300Paris p2400Paris p2400Paris s3Blakep2200Paris

71 1 Equi-jointuresEqui-jointures L'évaluation de requêtes à partir de C serait en général inefficace L'évaluation de requêtes à partir de C serait en général inefficace –Pour la matérialisation en mémoire –En utilisation de CPU 1. Si card (R1) = card (R2) = 1000, alors card(R1 x R2) = 1 000 000 tuples ! 2. En 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) »Sort-merge (tri-interclassement) »Index-joins & Hash-Joins in particular –Linear Hash-Joins

72 1 Equi-jointures m-aires SELECT s.[s#], p.[P#], Qty, Pname FROM S, SP, P where s.[s#]=sp.[s#] and sp.[p#]=p.[p#] and s.[s#] between 's1' and 's3' order by s.[S#], qty desc;

73 1 Equi-jointures m-aires SELECT s.[s#], p.[P#], Qty, Pname FROM S, SP, P where s.[s#]=sp.[s#] and sp.[p#]=p.[p#] and s.[s#] between 's1' and 's3' order by s.[S#], qty desc; s#Product IDQtyProduct Name s1p3400screw s1p1300nuts s1p4200screw s1p2200bolt s1p6100cog s1p5100cam s2p2400bolt s2p1300nuts s3p2200bolt

74 1 Clause BETWEEN Le type d attribut détermine l évaluation de la clause: Le type d attribut détermine l évaluation de la clause: –20 n est pas BETWEEN 1 and 3 pour Number –20 est BETWEEN 1 and 3 pour Text ? Date/Time ou Currency ? ? Et les nuls ? sont ils sélectionnes par les clauses ci-dessous –SELECT * FROM P where weight between 0 and 19; –SELECT * FROM P where weight between null and 19; –SELECT * FROM P where weight between 0 and null; –peut-on faire encore autrement pour trouver les poids entre 10 et 19 ou inconnus ?

75 1 Equi-jointures m-aires (avec *) Tous les attributs de toutes les tables dans la clause FROM Tous les attributs de toutes les tables dans la clause FROM SELECT * FROM S, SP, P 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ûr On 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 dEurostar' as [D'ou viennent t'ils ?] FROM S, SP, P where s.[s#]=sp.[s#] and p.[p#]=sp.[p#] and s.city <> 'London';

76 1 Equi-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 = compatibles Mais, les types de données à joindre doivent être = compatibles SELECT s.[s#], p.[P#], Qty, Pname, s.city, p.city FROM S, SP, P where s.[s#]=sp.[s#] and sp.[p#]=p.[p#] and s.city=p.city order by s.city, s.[s#]; s#Product IDQtyProduct NameS.cityP.city s1p6100cogLondonlondon s1p4200screwLondonlondon s1p1300nutsLondonlondon s4p4300screwLondonlondon s2p2400boltParisparis s3p2200boltParisparis

77 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 INNER JOIN (P INNER JOIN SP ON P.[P#] = SP.[p#]) ON (S.City = P.City) AND (S.[S#] = SP.[S#]) ORDER BY S.City, S.[S#]; Equi-jointures dans la clause FROM s# Product IDQtyProduct NameS.cityP.city s1p6100cogLondonlondon s1p4200screwLondonlondon s1p1300nutsLondonlondon s4p4300screwLondonlondon s2p2400boltParisparis s3p2200boltParisparis

78 1 Theta-jointures & Self-jointures L'opérateur T de comparaison dans une clause de jointure peut-être en fait : L'opérateur T de comparaison dans une clause de jointure peut-être en fait : –T =,, >= <>} Une table peut-être jointe avec elle-même Une table peut-être jointe avec elle-même SELECT s1.[s#], s1.sname, s2.[s#], s2.sname, s1.city FROM s s1, s s2 /* s1, s2 sont des aliases WHERE s1.city = s2.city and s1.sname < s2.sname; s1.s#s1.snames2.s#s2.snamecity s4Clarks1SmithLondon s3Blakes2JonesParis

79 1 Jointures externes Conserve les tuples sans corresp. sur les attributs de jointure Conserve les tuples sans corresp. sur les attributs de jointure - jointure gauche (LEFT) conserve les tuples à gauche - jointure droite (RIGHT) conserve les tuples à droite SELECT S.[S#], city, SP.Qty FROM S LEFT JOIN SP ON S.[S#] = SP.[S#] where (qty > 200 or qty is null) and not city = 'london'; S#cityQty s2Paris300 s2Paris400 s5Athens s5 s7 p6 100

80 1 Jointures externes (propriétés algébriques) Les jointures classiques dites internes sont associatives Les jointures classiques dites internes sont associatives Celle externes ne sont pas Celle externes ne sont pas A démontrer A démontrer 1. La notation dans la clause WHERE pourrait être ambiguë Pourquoi ? Pourquoi ? 2. Doù la notation algébrique dans la clause FROM 1. Introduite par SQL-2 3. Elles sappliquent aussi aux jointures classiques dites dès lors internes

81 1 Jointure externe complète SELECT pname, S.SName, S.City, P.City FROM P RIGHT JOIN S on P.City = S.City union SELECT pname, S.SName, S.City, P.City FROM P left JOIN S ON P.City = S.City ; pnameSNameS.CityP.City AdamsAthens boltBlakeParisparis boltJonesParisparis boltsmithParisparis camBlakeParisparis camJonesParisparis camsmithParisparis cogClarkLondonlondon nutsClarkLondonlondon screwrome screwClarkLondonlondon

82 1 SELECT pname, S.SName, S.City, P.City FROM P RIGHT JOIN S ON P.City = S.City where p.city <> 'london' or p.city is null UNION SELECT pname, S.SName, S.City, P.City FROM P left JOIN S ON P.City = S.City where s.city <> 'london' or s.city is null; Jointure externe complète avec une sélection pnameSNameS.CityP.City AdamsAthens boltBlakeParisparis boltJonesParisparis boltsmithParisparis camBlakeParisparis camJonesParisparis camsmithParisparis screwrome

83 1 Jointure externe self ou avec theta-comparaison Self-jointure externe est possible Self-jointure externe est possible –p.e. SP left joint SP… Les opérateurs T sappliquent aussi aux jointures externes Les opérateurs T sappliquent aussi aux jointures externes T =,, >= <>} Exemple (discuté en cours): Exemple (discuté en cours): –N°s de fournisseurs qui fournissent une pièce en quantité moindre quun autre fournisseur dune même pièce ou en quantité inconnue.

84 1 Jointures externes DB2 & SQL-Server & SQL-2… On utilise les déclarations On utilise les déclarations –LEFT, RIGHT & FULL OUTER JOIN »note OUTER SELECT pname, S.SName, S.City, P.City FROM P FULL OUTER JOIN S ON P.City = S.City where p.city <> 'london' or p.city is null FULL OUTER JOIN S ON P.City = S.City where p.city <> 'london' or p.city is null pnameSNameS.CityP.City AdamsAthens boltBlakeParisparis boltJonesParisparis boltsmithParisparis camBlakeParisparis camJonesParisparis camsmithParisparis screwrome 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 (+)

85 1 Mélange de jointures externes et internes Explosif (sous MsAccess surtout): Explosif (sous MsAccess surtout): 1. OK: SELECT sP.Qty, s.[S#], s.City, sP.[p#] FROM s RIGHT JOIN (p INNER JOIN sP ON p.[P#] = sP.[p#]) ON sP.[S#] = s.[S#]; 1. interdit : SELECT sP.Qty, s.[S#], s.City, sP.[p#] FROM s LEFT JOIN (p INNER JOIN sP ON p.[P#] = sP.[p#]) ON sP.[S#] = s.[S#];

86 1 Mé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 * FROM p INNER JOIN sp ON p.[P#] = sp.[p#]; : SELECT s.[s#], qty, [Query-scratch1].color FROM s left JOIN [Query-scratch1] ON [Query scratch1].[S#] = S.[S#];

87 1 RésultatRésultat s#qtycolor s1100red s1100blue s1200red s1400blue s1200green s1300red s2400green s2300red s3200green s4400blue s4300red s4200green s5

88 1 Jointures implicites Simplifient la formulation de la requête Simplifient la formulation de la requête Générées par MsAccess à partir de contraintes d'intégrité référentielles Générées par MsAccess à partir de contraintes d'intégrité référentielles –jointures naturelles (internes) –jointures externes Générées dans SQL, mais uniquement quand la requête est formulée en QBE Générées dans SQL, mais uniquement quand la requête est formulée en QBE

89 1 On a cliqué d'abord ici On a cliqué ensuite ici Declaration de jointures implicites

90 1 Puis, clique et... Tires avec la souris, Ecris la restriction Formulation de la requête avec les jointures implicites en QBE

91 1 Résultat SQL SELECT DISTINCTROW S.SName, P.City FROM P INNER JOIN (S INNER JOIN SP ON S.[S#] = SP.[S#]) ON P.[P#] = SP.[p#] WHERE ((P.City="paris")); Jointure impl. générée automatiquement

92 1LimitationsLimitations Une correspondance déclarée entre les attributs d'une même relation ne génère pas de jointure implicite Une correspondance déclarée entre les attributs d'une même relation ne génère pas de jointure implicite –sous MsAccess 2 Pourquoi cette limitation ? Pourquoi cette limitation ? –une bonne question –sans bonne réponse de ma part –à adresser à Microsoft

93 1

94 1 LimitationsLimitations Une correspondance multiple entre deux tables Une correspondance multiple entre deux tables –donne lieu à AND entre les clauses correspondantes »c'est bien –mais, peut donner lieu à une génération erronée »une jointure implicite invisible sur l'image QBE C'est un "bug" C'est un "bug" –MsAccess 2 Pourquoi ? Pourquoi ? –bonne question à Microsoft Pour en savoir + sur les jointures implicites en général Pour en savoir + sur les jointures implicites en général –Implicit Joins in the Structural Data Model. IEEE-COMPSAC, Kyoto, (Sep. 1991). With Suk Lee, B., Wiederhold, G.

95 1

96 1

97 1

98 1

99 1

100 1

101 1 Auto-jointuresAuto-jointures une jointure implicite entre deux attributs de deux tables différentes sélectionnées pour une requête : une jointure implicite entre deux attributs de deux tables différentes sélectionnées pour une requête : –sans lien sémantique dans le schéma –de type compatible –d un même nom –avec au moins étant la clé primaire A ne pas confondre avec une self-jointure A ne pas confondre avec une self-jointure Existent dans MsAccess2000 Existent dans MsAccess2000 –en option

102 1 Auto-jointures: DB2 Seulement en V 7 DB 2 Data Warehouse Center Seulement en V 7 DB 2 Data Warehouse Center Le terme recouvre Le terme recouvre –Les jointures implicites –Les jointures prédéfinies entre tous attributs compatibles »Pas plus quun par table par auto-jointure

103 1 Clauses de jointures dans le Standard SQL-2 Il y a plusieurs clauses non-implementées explicitement dans aucun SGBD Il y a plusieurs clauses non-implementées explicitement dans aucun SGBD –T1 NATURAL JOIN T2 »remplace T1 INNER JOIN T2 ON T1.J1 = T2.J1 AND … T1.Jn = T2.Jn –S NATURAL FULL OUTER JOIN SP »Crée une seul attribut S# »Comment simuler sous MsAccess ? –S CROSS JOIN SP »Produit cartésien –… –Voir le standard Jointures implicites et auto-jointure sont une forme implicite de ces clauses Jointures implicites et auto-jointure sont une forme implicite de ces clauses –pas toujours, pourquoi ?

104 1 Fonctions agrégats Un nombre très limité: Un nombre très limité: –COUNT, SUM, AVG, MAX, MIN, » MIN, MAX sapplique aux Nuls ( à tort) »MsAccess: StDev, Var, First, Last »MsAccess97: VarP, StDevP –calcul sur la population, pendant que Var, StDev utilisent un échantillon A mettre dans SELECT A mettre dans SELECT SELECT sum(P.Weight) AS PoidsCumule FROM P; PoidsCumule 91

105 1 Fonctions agrégats SELECT Count (*) FROM S WHERE… compte tous les tuples SELECT Count (*) FROM S WHERE… compte tous les tuples SELECT Count (CITY) FROM S ne compte pas de nulls SELECT Count (CITY) FROM S ne compte pas de nulls –mais compte les doubles SELECT COUNT (DISTINCT (CITY)) FROM S; SELECT COUNT (DISTINCT (CITY)) FROM S; –Possible avec SQL ANSI, mais pas MsAccess »Pourquoi ? - 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 soient pas tous nuls dans le tuple (MsAccess) On peut compter sur plusieurs champs, pourvus qu'ils ne soient pas tous nuls dans le tuple (MsAccess) SELECT Count ("City & Status") FROM S; Compte les fournisseurs sans ville connue Compte les fournisseurs sans ville connue Compte le nombre de villes avec un fournisseur (MsAccess) Compte le nombre de villes avec un fournisseur (MsAccess)

106 1 Fonctions agrégats SELECT Varp(SP.Qty) AS Varp, Var(SP.Qty) AS Var, StDev(SP.Qty) AS StDev, StDevp(SP.Qty) AS StDevp FROM SP; VarpVarStDevStDevp 15644.628099173617209.0909090909131.183424673588125.078487755383

107 1 Fonctions Agrégat pour OLAP DB2 CountBig CountBig –Pour le nombre de tuples > 2**31 Covariance Covariance –entre des attributs ou des expressions de valeur Correlation Correlation –entre des attributs ou des expressions de valeur Regression functions Regression functions –10 fonctions –Les paramètres de la droite de régression entre des attributs ou des expressions de valeur Rank, Dense_Rank Rank, Dense_Rank

108 1 Fonctions Agrégat pour OLAP DB2 Fonctions spécifiques à DB2 Data Warehouse Center: Fonctions spécifiques à DB2 Data Warehouse Center: –Analyse de la variance (ANOVA) »Distributions de Fisher-F »Valeur P –Sous-totaux par période de temps –Test de Chi-carré –Statistique T pour n paires de valeurs et à partir du coeff. de corrélation r T = r * ((n – 2 ) / (1 - r 2 )) 0.5 –T 0 indique une corrélation entre les attributs

109 1 Fonctions Agrégat pour OLAP Teradata RANK RANK CSUM (Cumulative (Running) Sums) CSUM (Cumulative (Running) Sums) MAVG and MSUM MAVG and MSUM MDIFF (Moving Difference) MDIFF (Moving Difference) QUANTILE QUANTILE QUALIFY QUALIFY SAMPLE SAMPLE

110 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 OMalley 10248 1 Norma Powers 9409 4

111 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

112 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

113 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

114 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

115 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

116 1 SELECT customer_id, age, income, marital_status, …, SAMPLEID FROM customer_table SAMPLE 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

117 1 GROUP BY Permet d'appliquer les fonctions agrégats aux sous-tables, dites groupes, définies par l'égalité de certains attributs Permet d'appliquer les fonctions agrégats aux sous-tables, dites groupes, définies par l'égalité de certains attributs Inexistant dans SQL originel (et le modèle relationnel) Inexistant dans SQL originel (et le modèle relationnel) Est populaire mais redondante Est populaire mais redondante –ce qui est peu connu (voir le cours sur les Subtilités de SQL) A été introduite par Peter Grey d'Univ. d'Aberdeen (je crois). A été introduite par Peter Grey d'Univ. d'Aberdeen (je crois).

118 1 GROUP BY SELECT top 50 percent [p#], sum (qty) as [tot-qty] from sp GROUP BY [p#] Order by sum (qty) desc; p#tot-qty p21000 p1600 p5500 p4500

119 1HAVINGHAVING Permet de spécifier les prédicats sur les groupes de GROUP BY Permet de spécifier les prédicats sur les groupes de GROUP BY SELECT [p#], sum (qty) as [tot-qty] from sp GROUP BY [p#] HAVING SUM (QTY) > 200 ORDER BY SUM (QTY) DESC; p#tot-qty p21000 p1600 p5500 p4500 p3400

120 1 ROLLUP (DB2 & SQL-Server) Groupements multiples (super-groupes) selon une dimension Groupements multiples (super-groupes) selon une dimension –l ordre des attributs dans la clause a l importance –les attributs sont progressivement « oublies » de droite à gauche Remplace plusieurs requêtes GROUP BY Remplace plusieurs requêtes GROUP BY SELECT p#, sum (qty) as tot-qty from S,SP, P WHERE SP. P# = P.P# AND SP. S# = S.S# GROUP BY ROLLUP (P#, S.CITY, COLOR) HAVING tot-qty > 100 ; Problèmes avec des nulls que lon verra plus tard

121 1 CUBE (DB2 & SQL-Server) Groupements multiples selon toutes les dimensions Groupements multiples selon toutes les dimensions –l ordre des attributs dans la clause n a pas d importance –les attributs sont progressivement « oublies » de droite à gauche Remplace plusieurs requêtes GROUP BY Remplace plusieurs requêtes GROUP BY SELECT p#, sum (qty) as tot-qty from S,SP, P WHERE SP. P# = P.P# AND SP. S# = S.S# GROUP BY CUBE (P#, S.CITY, COLOR) HAVING tot-qty > 100 ; Problèmes avec des nuls que lon verra plus tard Opération bien plus chère que Rollup – –2 N requêtes générées au lieu de N, pour N attributs

122 1 GROUPING SETS On indique explicitement les groupes On indique explicitement les groupes –entre (..) »le groupe () est constitué de toute la table SELECT p#, sum (qty) as tot-qty from S,SP, P WHERE SP. P# = P.P# AND SP. S# = S.S# GROUP BY GROUPING SETS ((P#, S.CITY, COLOR), (P#, COLOR), ()) HAVING tot-qty > 100 ; Problèmes avec des nuls que lon verra plus tard

123 1 Rollup, Cube, Grouping Sets sous MsAccess Il y en a pas Il y en a pas On peut simuler ces manipulations en utilisant On peut simuler ces manipulations en utilisant –GROUP BY –UNION ALL –ORDER BY Peut être laborieux pour le CUBE Peut être laborieux pour le CUBE

124 1 ROLLUP Remarquez le « null as city»

125 1 ROLLUP

126 1 Et le CUBE ? Une solution pour l ambiguïté de certains nuls ?

127 1 Sous-requêtesSous-requêtes Une expression alternative de jointures Une expression alternative de jointures Permet une optimisation manuelle Permet une optimisation manuelle –la sous-requête est exécutée d'abord Permet d'appliquer les fonctions agrégats dans la clause WHERE Permet d'appliquer les fonctions agrégats dans la clause WHERE Permet d'appliquer le quantificateur EXISTS Permet d'appliquer le quantificateur EXISTS –et donc, indirectement, le quantificateur FORALL (universel)

128 1 Sous-requêtesSous-requêtes SELECT [s#], sname from S where s.[s#] in (select [s#] from sp where qty > 200); SELECT [s#], sname, status from S where s.status = (select max (status) from s as S1); s#snamestatus s1Smith30 s3Blake30 s5Adams30

129 1 EXISTSEXISTS SELECT [s#], sname, status from S where exists (select * from sp where [s#]=sp.[s#] and sp.[p#]='p2'); s#snamestatus s1Smith30 s2Jones10 s3Blake30 s4Clark20 s5Adams30

130 1 FORALL NOT (NOT EXISTS) SELECT [s#], sname from S where not exists (select * from p where not exists ( select * from sp where [s#]=s.[s#] and [p#]=p.[p#] )); s#sname s1Smith

131 1 NOT...NOT EXISTS SELECT distinct [s#] from SP X where not exists (select * from sp y where [s#]='s2' and not exists (select * from sp z where z.[s#]=x.[s#] and z.[p#]=y.[p#] )); s#s1s2 C'est quoi ? C'est quoi ? Tous les fournisseurs qui fournissent au moins les pièces du fournisseur 'S2'. Tous les fournisseurs qui fournissent au moins les pièces du fournisseur 'S2'.

132 1 NOT...NOT EXISTS SELECT distinct [s#] from SP X where not exists (select * from sp y where [s#]='s2' and not exists (select * from sp z where z.[s#]=x.[s#] and z.[p#]=y.[p#] )); s#s1s2 C'est quoi ? C'est quoi ? Tous les fournisseurs qui fournissent au moins les pièces du fournisseur 'S2'. Tous les fournisseurs qui fournissent au moins les pièces du fournisseur 'S2'. SQL c'est simple car non-procedural: une intention = une requête

133 1 UNIONUNION SELECT [P#], CITY FROM P WHERE CITY LIKE '[L-S]' UNION SELECT [P#], CITY FROM SP, S WHERE SP.[S#]=S.[S#] AND CITY >= 'B'; SELECT [P#], CITY FROM P WHERE CITY LIKE '[L-S]' UNION SELECT [P#], CITY FROM SP, S WHERE SP.[S#]=S.[S#] AND CITY >= 'B';

134 1 UNIONUNION P#city p1London p1Paris p2London p2Paris p3London p4London p5London p6London Tous les duplicata sont éliminés Comment faire alors pour les agrégats ?

135 1 UNION MsAccess Les tables ou vues entières union-compatibles peuvent être référencées explicitement Les tables ou vues entières union-compatibles peuvent être référencées explicitement TABLE Customers UNION TABLE Suppliers On ne peut pas sélectionner dattributs de type MEMO ou OLE On ne peut pas sélectionner dattributs de type MEMO ou OLE –Y compris par * »Déjà déconseillé pour les programmes dapplication Pas d opérateurs INTERSECT, EXCEPT Pas d opérateurs INTERSECT, EXCEPT

136 1 UNION ALL Préserve les duplicata Préserve les duplicata Nécessaire pour appliquer des agrégations Nécessaire pour appliquer des agrégations Mais, souvent il faut néanmoins dans ce but au moins 2 requêtes SQL Mais, souvent il faut néanmoins dans ce but au moins 2 requêtes SQL –défaut de conception SQL Dans l exemple qui suit, sous MsAccess, on veut des agrégations sur WEIGHT Dans l exemple qui suit, sous MsAccess, on veut des agrégations sur WEIGHT –la 1ere requête définie une vue appelée UNION-ALL –la 2eme requête calcule les agrégations voulues Sous DB2 on peut faire en une requête Sous DB2 on peut faire en une requête »voir le cours SQL-2

137 1 UNION ALL SELECT weight, p.city FROM P WHERE City like 'l*' UNION ALL SELECT weight, s.city FROM p, SP, S WHERE p.[p#]=sp.[p#] and sp.[s#]=s.[s#] and s.City like 'p*'; SELECT weight, p.city FROM P WHERE City like 'l*' UNION ALL SELECT weight, s.city FROM p, SP, S WHERE p.[p#]=sp.[p#] and sp.[s#]=s.[s#] and s.City like 'p*'; weightcity 12london 14london 19london 12Paris 17Paris

138 1 UNION ALL SELECT weight, p.city FROM P WHERE City like 'l*' UNION ALL SELECT weight, s.city FROM p, SP, S WHERE p.[p#]=sp.[p#] and sp.[s#]=s.[s#] and s.City like 'p*'; SELECT weight, p.city FROM P WHERE City like 'l*' UNION ALL SELECT weight, s.city FROM p, SP, S WHERE p.[p#]=sp.[p#] and sp.[s#]=s.[s#] and s.City like 'p*'; weightcity 12london 14london 19london 12Paris 17Paris SELECT AVG(WEIGHT) AS [AVG POIDS], VAR(WEIGHT) AS [VAR-POIDS], MAX(WEIGHT) AS [POIDS-MAX] FROM [UNION-ALL]; SELECT AVG(WEIGHT) AS [AVG POIDS], VAR(WEIGHT) AS [VAR-POIDS], MAX(WEIGHT) AS [POIDS-MAX] FROM [UNION-ALL]; avg poidsvar poidspoids-max 15.16666666666678.5666666666666719

139 1 Fonctions scalaires S appliquent aux valeurs individuelles S appliquent aux valeurs individuelles –d attributs –d agrégations SQL Il y a plusieurs catégories Il y a plusieurs catégories –mathématiques –financières –chaînes de caractères –…. Varient entre les dialectes Varient entre les dialectes –MsAccess possède UCASE, pas DB2 –DB2 possède LOG10, pas MsAccess

140 1 Fonctions scalaires Peuvent simbriquer Peuvent simbriquer –contrairement aux agrégats SQL SELECT log((sum([qty]^2)^(1/2))) as exemple FROM SP group by [p#] having int(log(sum([qty]))) = 5 exemple 5.70875764008279 5.99146454710798

141 1 Tabulations Croisées (Crosstab queries) Présentent les résultat sous forme habituelle de feuilles de calculs Présentent les résultat sous forme habituelle de feuilles de calculs –Les agrégats SUM, AVG.. de GROUP BY et les valeurs individuelles en même temps –Impossible avec SQL standard Transforment les valeurs d'attributs en attributs Transforment les valeurs d'attributs en attributs –Par exemple »les valeurs de P# trouvés pour un même S# deviennent les attributs P1, P2,... »les valeurs de P1, P2.. sont les QTY (par ex.) correspondants

142 1 TRANSFORM Sum(SP.Qty) SELECT SP.[S#], Sum(SP.Qty) AS [Row Summary] FROM SP GROUP BY SP.[S#] PIVOT SP.[p#]; Tabulations Croisées Nouvelles colonnes

143 1 S# Total Qty p1p2p3p4p5p6 s11300300200400200100100 s2700300400 s3200200 s4900200300400 L'intitulé Total Qty est mis par défaut par MsAccess Tabulations Croisées

144 1 La fonction agrégat dans la clause TRANSFORM est obligatoire La fonction agrégat dans la clause TRANSFORM est obligatoire –bien que SUM(QTY) = AVG(QTY) = QTY –mais, 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] SELECT Sum(SP.[Q2]) AS [Qte tot. dans 1 mois], Avg(P.[Q2]) AS [Qte moy. dans 1 mois] FROM SP GROUP BY SP.[S#] PIVOT SP.[p#]; Tabulations Croisées

145 1 On peut utiliser la clause WHERE WHERE P# IN ('P1', 'P2') Alors les fonctions ne calculent les agrégats que sur P1 et P2. Alors les fonctions ne calculent les agrégats que sur P1 et P2. On peut aussi restreindre la tabulation seulement On peut aussi restreindre la tabulation seulement PIVOT SP.[p#] IN ('P1', P2') 1. Mais, cette clause n'affecte pas les calculs des agrégats Peut-on appliquer la clause ORDER BY ? Peut-on appliquer la clause ORDER BY ? 1. Si oui, quel serait leffet sur les valeurs pivotées ? 2. 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

146 1 Requêtes à paramètres un paramètre : un [texte visualisé] dans la clause WHERE pour que l'usager indique une valeur un paramètre : un [texte visualisé] dans la clause WHERE pour que l'usager indique une valeur –le texte peut être sans [], sil ne désigne pas dattribut et n a pas de blancs, # etc. »Possibilité à éviter à cause de conflit de noms possible –"Paris" est une constante Paris serait un paramètre Le type de données d'un paramètre par défault est texte. Le type de données d'un paramètre par défault est texte. On peut-être déclarer un type différent par la clause PARAMETER On peut-être déclarer un type différent par la clause PARAMETER »recommandée pour un paramètre dans une expression de valeur (et obligatoire dans la requête qui suit)

147 1 Requêtes à paramètres On peut utiliser plusieurs paramètres On peut utiliser plusieurs paramètres –pour une clause BETWEEN [Qty Min ?] AND [Max ?] On peut utiliser la clause LIKE [City ?] On peut utiliser la clause LIKE [City ?] Alors la réponse doit être selon la sémantique de la clause LIKE, Alors la réponse doit être selon la sémantique de la clause LIKE, –P. e., [L-P]* signifiera « toutes les villes qui commencent par une lettre entre L et P, inclus Alternativement on peut ajouter les caractères génériques à la réponse d'usager Alternativement on peut ajouter les caractères génériques à la réponse d'usager –P.e. LIKE [City ?] & "*"

148 1 Requêtes à paramètres Le nom dans le paramètre a la priorité sur le nom de l'attribut, si on génère un conflit de noms Le nom dans le paramètre a la priorité sur le nom de l'attribut, si on génère un conflit de noms PARAMETERS [weight] Long; SELECT P.Weight, p.Weight+3/2, P.Color FROM P WHERE p.Weight+3/2 > weight and weight + 6 > p.weight; On évite le conflit par lemploi de P.Weight On évite le conflit par lemploi de P.Weight Note: il n y a ci-dessus quun seul param. weight Note: il n y a ci-dessus quun seul param. weight Est-ce que cest la même requête Est-ce que cest la même requête PARAMETERS [weight] Long; SELECT Weight, Weight+3/2, P.Color FROM P WHERE Weight+3/2 > [weight] and [weight] + 6 > weight; ;

149 1 Clauses COMPUTE & FOR BROWSE (SQL Server 6.5 et 7) expression générale de sélection: expression générale de sélection: SELECT [DISTINCT] attribut(s) FROM table(s) [WHERE condition] [GROUP BY [ROLLUP | CUBE] field(s) ] [HAVING condition ] [ORDER BY attribute(s)] [COMPUTE row-agg (colonne), [row-agg (colonne)]... BY (colonne), [(colonne)]...] [FOR BROWSE] Clause FOR BROWSE permet une MAJ de données dynamiquement visualisées

150 1ComputeCompute select title, type, price, advance from titles where ytd_sales is not null order by type desc compute AVG(price), SUM(advance) by type compute SUM(price), SUM(advance) go select title, type, price, advance from titles where ytd_sales is not null order by type desc compute AVG(price), SUM(advance) by type compute SUM(price), SUM(advance) go title typepriceadvance fifty years...trad_cook11.954000 Onions..trad_cook 20.957000 Sushi...trad_cook 14.998000 avg 15.96sum 19000 title typepriceadvance Computer...psychology21.957000... psychology........ avg 15.96sum 19000 sum sum 236.0088400 title typepriceadvance fifty years...trad_cook11.954000 Onions..trad_cook 20.957000 Sushi...trad_cook 14.998000 avg 15.96sum 19000 title typepriceadvance Computer...psychology21.957000... psychology........ avg 15.96sum 19000 sum sum 236.0088400 select title, type, price, advance from titles where ytd_sales is not null order by type desc compute AVG(price), SUM(advance) by type compute SUM(price), SUM(advance) go select title, type, price, advance from titles where ytd_sales is not null order by type desc compute AVG(price), SUM(advance) by type compute SUM(price), SUM(advance) go title typepriceadvance fifty years...trad_cook11.954000 Onions..trad_cook 20.957000 Sushi...trad_cook 14.998000 avg 15.96sum 19000 title typepriceadvance Computer...psychology21.957000... psychology........ avg 15.96sum 19000 sum sum 236.0088400 title typepriceadvance fifty years...trad_cook11.954000 Onions..trad_cook 20.957000 Sushi...trad_cook 14.998000 avg 15.96sum 19000 title typepriceadvance Computer...psychology21.957000... psychology........ avg 15.96sum 19000 sum sum 236.0088400

151 1 Fermeture transitive (DB2) Considère la table COURS (CNOM, PNOM, NMIN) contenant les cours et leur pré-requis avec les notes minimales pour l admission en cours Considère la table COURS (CNOM, PNOM, NMIN) contenant les cours et leur pré-requis avec les notes minimales pour l admission en cours –ex. (BDs, Str-Ph, 15) Tout PNOM est une clé étrangère avec CNOM comme clé primaire ailleurs dans COURS Tout PNOM est une clé étrangère avec CNOM comme clé primaire ailleurs dans COURS Un cours peut avoir plusieurs pré-requis Un cours peut avoir plusieurs pré-requis Trouver les noms de tous les pré-requis de cours CNAME = BDs Trouver les noms de tous les pré-requis de cours CNAME = BDs –y compris les pré-requis de pré-requis etc. C est le calcul de la fermeture transitive C est le calcul de la fermeture transitive Impossible encore sous MsAccess, SQL Server =< 6.5, Oracle, Informix… Impossible encore sous MsAccess, SQL Server =< 6.5, Oracle, Informix… Possible sous DB2, à partir de V 5.0 Possible sous DB2, à partir de V 5.0

152 1 Fermeture transitive (DB2) WITH PRQ (CNOM, PNOM) AS ((SELECT CNOM, PNOM FROM COURS WHERE CNOM = BDs ) UNION ALL (SELECT C.CNOM, C.PNOM FROM PRQ AS P, COURS AS C WHERE C.CNOM = P.PNOM)) SELECT DISTINCT PNOM FROM PRQ La requête récursive s exécute tant que la sélection dans PRQ avec PRQ courant nest pas vide. La requête récursive s exécute tant que la sélection dans PRQ avec PRQ courant nest pas vide. Requête initiale Requête récursive Requête finale

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

154 1 Fermeture transitive (DB2) CNOMPNOM BDsStPh BdsLprg CNOMPNOMNMIN BDsStPh15 BDsLPrg12 StPhInfG13 InfGMath11 LprgInfG12

155 1 Fermeture transitive (DB2) CNOMPNOM BDsStPh BdsLprg CNOMPNOMNMIN BDsStPh15 BDsLPrg12 StPhInfG13 InfGMath11 LprgInfG12 StPhInfG LprgInfG

156 1 Fermeture transitive (DB2) CNOMPNOM BDsStPh BdsLprg CNOMPNOMNMIN BDsStPh15 BDsLPrg12 StPhInfG13 InfGMath11 LprgInfG12 StPhInfG LprgInfG InfGMath

157 1 Fermeture transitive (DB2) CNOMPNOM BDsStPh BdsLprg CNOMPNOMNMIN BDsStPh15 BDsLPrg12 StPhInfG13 InfGMath11 LprgInfG12 StPhInfG LprgInfG InfGMath PNOM StPh InfG Math

158 1 Fermeture transitive Trouver aussi les notes minimales nécessaires Trouver aussi les notes minimales nécessaires 1. Autres applications Tous les subordonnées d un chef Tous les subordonnées d un chef EMPL (E#, ENOM, CHEF) 1. Toutes les composantes PMIN de pièces composées COMP (PMAJ#, PMIN#) Tous les descendants / ascendants d une personne Tous les descendants / ascendants d une personne Toutes les participations d une entreprise Toutes les participations d une entreprise 2. Limite dapplication 1. Pas de cycles entre les attributs sélectionnes 1. pour que l on a la fermeture transitive (point fixe) 2. ex. pas de participations réciproques

159 1 Fermeture transitive MsAccess Il faut simuler Il faut simuler –par CREATE TABLE PRQ »avec la création de clé primaire –Insert into PRQ.. select … from COURS... –Insert into PRQ.. select … from PRQ, COURS… »exécuté interactivement ou par programme jusqu'à ce que le point fixe est atteint –Select … FROM PRQ… A compléter par vos soins A compléter par vos soins

160 1 Mise à jour update P set color = 'green', weight = weight+10, city = null where [p#] < 'p3'; inconsistance / à la sémantique de nuls pour les l'interrogations

161 1 Mise à jour update P set color = 'green', weight = weight+10, city = null where [p#] < 'p3'; update SP set qty = '10' where 20 = (select status from S where s.[s#]=sp.[s#]) ; inconsistance / à la sémantique de nuls pour les l'interrogations une sous-requête est nécessaire

162 1 Mise à jour Transfert de fonds Transfert de fonds update Account1 set balance = balance - 100 where [c#] = '123'; update Account2 set balance = balance + 100 where [c#] = '123'; - et si une de requêtes se casse ? - et si une de requêtes se casse ? –il faut des transactions

163 1 DELETEDELETE Comme pour UPDATE: Comme pour UPDATE: DELETE [*] FROM table [ WHERE condition ] ; On retrouve aussi le besoin de transactions On retrouve aussi le besoin de transactions Notamment pour l'intégrité référentielle + et + souvent gérée par SGBD à partir de la déclaration dans LDD (ex. MsAccess)

164 1INSERTINSERT INSERT INTO P VALUES ('P8', 'nut', 'pink', 15, 'Nice') ; pas bonne idée d'utiliser cette forme d'INSERT pas bonne idée d'utiliser cette forme d'INSERT INSERT INTO P (weight, [P#] ) VALUES ( 100, 'P8') ; les valeurs non-sélectionnées ne doivent pas être non-nulles les valeurs non-sélectionnées ne doivent pas être non-nulles INSERT INTO TEMP ([P#], TQTY) SELECT (P#, SUM (QTY) FROM SP GROUP BY [P#] TEMP doit être préalablement crée TEMP doit être préalablement crée Avec ou sans clé primaire Avec ou sans clé primaire Quelle différence pour INSERT Quelle différence pour INSERT

165 1 INSERTINSERT SELECT...INTO de MsAccess est équivalent à simple INSERT précédé de CREATE TABLE SELECT field1[, field2[,...]] INTO newtable [IN externaldatabase] FROM source SELECT...INTO de MsAccess est équivalent à simple INSERT précédé de CREATE TABLE SELECT field1[, field2[,...]] INTO newtable [IN externaldatabase] FROM source SELECT S.[S#], S.SName INTO [db2.mdb].s1 FROM S WHERE ((S.SName<>'paris')); + en + souvent le SGBD peut vérifier pour INSERT l'intégrité référentielle (MsAccess) + en + souvent le SGBD peut vérifier pour INSERT l'intégrité référentielle (MsAccess)

166 1 ConclusionConclusion SQL est un langage assertionnel SQL est un langage assertionnel – relationnellement complet – + expressions de valeur et agrégats – + mises à jour Mais ce n'est pas un langage de programmation complet Mais ce n'est pas un langage de programmation complet Il y a des défauts de conception et inconsistances Il y a des défauts de conception et inconsistances Néanmoins c'est un MUST pour un informaticien aujourd'hui Néanmoins c'est un MUST pour un informaticien aujourd'hui On voit, néanmoins aussi que SQL n'est pas le langage pour les usagers ad-hoc ! On voit, néanmoins aussi que SQL n'est pas le langage pour 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 !

167 1 FIN

168 1


Télécharger ppt "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."

Présentations similaires


Annonces Google