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 (08-09) Witold LITWIN.

Présentations similaires


Présentation au sujet: "1 SQL : Un Langage Relationnel (08-09) Witold LITWIN."— Transcription de la présentation:

1

2 1 SQL : Un Langage Relationnel (08-09) Witold LITWIN

3 2 SQLSQL n Inventé à IBM San Jose, 1974 (Boyce & Chamberlin) pour System R n Basé sur le calcul de tuple & algèbre relationnelle n Relationnellement complet (et plus) n Le langage de SGBD relationnels n En évolution contrôlée par ANSI (SQL1, 2, 3...)

4 3 SQLSQL n Offre linterface de commande –Interactive et pour les lanagages de programmation »Voir le cours « SQL Imbriqué » n Il existe aussi plusieurs dialectes n Les possibilités basiques sont simples n Celles avancées peuvent être fort complexes –Signalées dans ce qui suit par

5 4 Langage de base de données (Database Language) n Un sous-langage de programmation n 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) –SQL pas QBE n En pratique, les deux parties sont imbriquées –définition de vues, de contraintes dintégrité…

6 5 Définition de Données Relationnelles SQL et QBE Witold LITWIN 08-09

7 6 SQL: Définition de Données n CREATE TABLECREATE VIEW CREATE INDEX n ALTER TABLE n DROP TABLEDROP VIEWDROP INDEX

8 7 CREATE TABLE (clauses essentielles) n 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

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

10 9 n Clauses CONSTRAINT 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 CREATE TABLE Clause CONSTRAINT

11 10 n 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

12 11 n 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

13 12 ALTER & DROP TABLE ALTER TABLE S ADD DISCOUNT SMALLINT ; n certains systèmes: ALTER TABLE S DROP DISCOUNT SMALLINT ; ALTER TABLE S RENAME SNAME NAME ;..... DROP TABLE P ;

14 13 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) ; n UNIQUE = pas de duplicata de valeurs indexées n Lindexe peut accélérer laccès 100 – fois n Indexes uniques obligatoires pour les clés dans le DB2

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

16 15 IndexesIndexes Les indexes (Linear) Hash de Postgres & de MySql résultent de recherche à lINRIA du soussigné Les indexes (Linear) Hash de Postgres & de MySql résultent de recherche à lINRIA du soussigné Les manuels au CRIO Les manuels au CRIO Wikipedia Wikipedia Idem pour « Analysis Services » de SQL Server Idem pour « Analysis Services » de SQL Server

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

18 17 Un dialecte de SQL SQL-MsAccess n Définition de données par les commandes nest utile en pratique que pour SQL- MsAccess Imbriqué n On verra ces commandes plus loin n Autrement on utilise linterface graphique n Remarquable par sa puissance –On verra celle de MsAccess 2007

19 18 Interface Graphique de Définition de Donnés de MsAccess n Création de la base –Nom et type –Pas dinstruction Create Database en SQL standard »Incroyable, mais vrai n Mot de passe de la base –Optionnel –Se défini en ouverture de la base en mode exclusive

20 19 Interface Graphique de MsAccess Création de Tables n Approche QBE –Query By Example n Mode Création –Le plus expressif –On verra lécran plus loin

21 20 Interface Graphique de MsAccess Création de Tables n Mode Feuille de Données –On introduit les valeurs et (re)nomme les colonnes –Par défaut : N°, Champ1, Champ2… –MsAccess devine le type de données »100 serait Numérique Entier Long »10,23 serait Numérique Réel Double »Paris serait Texte »…»…»…»…

22 21 Interface Graphique de MsAccess Création de Tables n Mode Modèle de Table –Schémas Prédéfinis »Table Contacts »Table Tâches »Table Problèmes »…»…»…»… n On peut ajuster en Mode Création

23 22 Table P de la base S-P Mode Création Table P de S-P Mode Création Table P de S-P

24 23 MsAccess: Contraintes dIntégrité n Voir le générateur dexpression n On dispose de: –Constantes »Chaîne vide, faux, null, vrai –Opérateurs –Comparaison, >=, <>, Imp, Entre –Arithmétiques +,-, /, *, ^, \, Mod –Logiques Et, Ou, Pas, Ou_X, Eqv, Imp –Fonctions nombreuses (voir) –Parenthèses

25 24 MsAccess: Types de Données n Text –limité par défaut à 50 caractères »clause FIELD SIZE permet 256 caractères –supporte les prédicats SQL & QBE »Par ex. WHERE Contrat LIKE (*Voiture de tourisme*) n Mémo –taille < 64K caractères –supporte les prédicats SQL & QBE »Sous MsAccess 2007

26 25 MsAccess: Types de Données n Date/Heure –supporte larithmétique de dates/temps »21/3 - 21/2 = 28 »21/4 - 21/3 = 31 ? –prévu pour 21-ème siècle »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 n Monétaire : –Dévises

27 26 MsAccess: Types de Données n NuméroAuto –compteur automatique (+1 à chaque tuple crée) »option incrément dans Nouvelles Valeur –OID pour chaque tuple crée »option aléatoire dans Nouvelles Valeur n Dans Create Table: CREATE TABLE table1(id1 AUTOINCREMENT,…

28 27 MsAccess: Types de Données n Hyperlien –comme son l indique »nom symbolique < 2048 octets »URL ou UNC< 2048 octets »sous-adresse (dans le fichier ou la page) CajunDelights#http://www.cajundelights.com#Price

29 28 MsAccess: Types de Données n Objet OLE –tout objet Windows »multimédia ou programme –peut être copié dans la table »les MAJ de loriginal ne sont pas visibles dans la BD –peut être seulement référencé »gain de place »les MAJ de loriginal sont visibles dans la BD –il faut double-cliquer sur sa description textuelle dans le tuple pour voir lobjet

30 29 MsAccess: Types de Données n Pièce Jointe (2007) –Tout objet Windows sécurisé »multimédia ou programme –Peut être copié ou seulement référencé –On peut attacher dans une même valeur plusieurs PJs.

31 30 MsAccess: Champ Numérique clause Field size n Octet 0 à 255 n Entier-32,768 à 32,767, 2 octets. n Entier Long -2,147,483,648 à 2,147,483, octets. n Précision Simple : Six digits E38 à E38. 4 octets. n Double (Default) 10 digits de précision E308 à E octets. n Replication ID –Pour les bases dupliquées - 16 octets –un OID –peut être aussi dans le type Autonumber

32 31 MsAccess: Champ Yes/No A utiliser comme son nom l indique A utiliser comme son nom l indique – Vrai/Faux Oui/Non Actif/Inactif »fixé par le champ Format et Liste de Choix »visualisé par défaut comme Faux ou Non ou Inactif –Valeur 0 = Faux, -1 = Vrai »mais, il y a d autres possibilités - taille: 1 octet - taille: 1 octet

33 32 Intégrité référentielle

34 33 MsAccess : domaines n 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 ou zone de texte modifiable sur lattribut A à valeurs dans D »déclaré dans la définition de A (partie Liste de choix) –une requête déclarée dans la définition de A (dans « contenu » )

35 34 MsAccess : surprises n 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 » n Type de données Assistant Liste de choix réalise cette manipulation –Drôle de type de données –Attention aux bugs de cet assistant »Access 03 –Aussi à l option « Limiter à la liste » n On peut la faire aussi sans cet assistant (et mieux)

36 35 MsAccess : surprises n La table peut hériter lattribut A si lon déclare: –Lattribut héritant à le même nom que le 1èr attribut de D déclaré dans SELECT –Lattribut A est le 2-ème dans SELECT –La 1-ère longueur de colonne = 0cm Dans notre exemple DB, SP peut ainsi hériter SNAME Dans notre exemple DB, SP peut ainsi hériter SNAME Question: et si lon sélectionne une autre colonne liée ? Question: et 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;

37 36 CREATE INDEX (MSAccess) n Interface graphique (QBE) ou Commande –Onglet Index dans le Menu Affichage ou bouton droit »Quand la table est ouverte

38 37 MsAccess : CREATE INDEX n Pas d'indexe CLUSTER sous MsAccess n Commande SQL –Syntaxe habituelle create index xs on S (sname asc, status desc);

39 38 CREATE INDEX (SQL MSAccess) n Création dun index qui na pas été fait par la clause de contrainte n Création dun index qui ne peut pas être fait par la clause de contrainte –Options dordre…

40 39 CREATE INDEX (SQL MSAccess) n Création alternative de la clé primaire n Création dun pseudo-index sur la table liée n Pas d'indexe CLUSTER sous MsAccess

41 40 CREATE INDEX (SQL MSAccess) n Syntaxe: CREATE [ UNIQUE ] INDEX index ON table (champ [ASC|DESC][, champ [ASC|DESC],...]) [WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }] n Exemple create index xp on P (city desc, pname asc)

42 41 SQL 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); n SSN est la clé primaire. n On peut créer une table sans clé primaire –alors elle accepte des duplicata »contrairement à la théorie du relationnel

43 42 SQL MsAccess : CREATE TABLE CONSTRAINT = Contraintes d'intégrité n Contrainte sur attribut unique: CONSTRAINT nom {PRIMARY KEY | UNIQUE | NOT NULL | REFERENCES foreigntable [(foreignfield1, foreignfield2)]} n 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 [,...]])]} n foreigntable = la table avec la clé primaire référencée

44 43 SQL MsAccess : CREATE TABLE CONSTRAINT = Contraintes d'intégrité n n Linterface QBE de MsAccess permet de définir + de contraintes – –Comme on a vu en partie – –Surtout les contraintes prédicatives dintégrité » »Mono ou multi-attribut, » »Mais, mono-table.

45 44 SQL MsAccess : CREATE TABLE Types de Données n n Sont différents de ceux de QBE n BINARY : 1 octet par caractère n BIT : 1 octet Valeurs Yes et No n TINYINT : 1 octet n MONEY : 8 octets Entier n DATETIME : 8 octets n UNIQUEIDENTIFIER : 128 bits

46 45 SQL MsAccess : CREATE TABLE Types de Données n REAL : 4 octets n FLOAT : 8 octets n SMALLINT : 2 octets n INTEGER : 4 octets n DECIMAL : 17 octets n TEXT : 2 octets par caractère –Zéro à 2,14 giga-octets au maximum. –Unicode

47 46 SQL MsAccess : CREATE TABLE Types de Données n IMAGE : –Zéro à 2,14 giga-octets. –Pour les objets OLE. n CHARACTER : 2 octets par caractère –Zéro à 255 caractères. –Unicode n COUNTER ou AUTOINCREMENT –Pour NuméroAuto

48 47 ALTER TABLE (MSAccess) n La syntaxe ALTER TABLE table {ADD {COLUMN type champ[(taille)] [NOT NULL] [CONSTRAINT index] | ALTER COLUMN type champ[(size)] | CONSTRAINT indexmultichamp} | DROP {COLUMN champ I CONSTRAINT nomindex} } n Permet dajouter / supprimer les attributs et les contraintes –les indexes notamment

49 48 DROP (MSAccess) n La syntaxe DROP {TABLE table | INDEX index ON table | PROCEDURE procédure | VIEW vue} n Permet de supprimer : –une table –un index –une vue –une procédure n Un choix hors standard SQL de MS

50 49 Contraintes référentielles mutuelles en SQL-2 n 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))

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

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

53 52 Sous-Tables en MsAccess n Une table peut avoir une sous-table –dite sous-feuille n La sous-table « auto » contient la clé étrangère de sa table (feuille) n Alternativement, la sous-table est choisie à travers un lien sémantique défini manuellement –Table ou requête

54 53 Sous-Tables en MsAccess n Les sous-tables sont utiles pour –Réification dattributs dérivés »Tout particulièrement de valeurs agrégées »Par la création de sous-tables requêtes (vues) »Comparaison détail versus lagrégation –Navigation hiérarchique »Table -> Sous-table -> Sous-table -> Sous-table…

55 54 Sous-Tables en MsAccess n Dans la base SP –Table SP est automatiquement la sous-table de S –Table S peut être choisie manuellement comme sous-table de SP »Avec le champs père SP.S# et champs fils S.S# –Suggérés par MsAccess –Les liens S -> SP -> S sont alors transitifs

56 55 Sous-Tables en MsAccess n Dans la base SP –Soit la requête « Quantité / fournisseur » : »Select Sum (Qty) From SP Group by [S#] ; –Cette requête peut être rendue sous-feuille de SP –Elle matérialise alors le concept de lattribut dérivé dUML pour SP –Le formulaire résultant apparaît comme entité structurée

57 56 Sous-Tables en MsAccess n On crée une sous-table –Sur le menu Propriétés dune table »Auto / Aucune / Nom de la table / requête »On peut fixer la hauteur de la sous-fenêtre ou la laisser auto (option 0 cm) »La sous-feuille peut apparaître in extenso (ligne « étendue » oui) ou par « + » seulement –à cliquer pour la voir étendue –Sur le menu Insertion de la vue de la table ouverte »La sous-feuille est signalée par « + » seulement

58 57 Sous-Tables en MsAccess Réalisation limitée dune table à attributs hérités. Litwin, W. Ketabchi M. Risch, T. « Relations with Inherited Attributes » HPL Tech Rep. HPL-DTD-92-45, April. 1992), 30.

59 58 Sous-Table Requête

60 59 Sous-Table Requête Attribut dérivé - Risque relatif pour s1 sil perde la commande de p1 - Part de la production représenté par p1 - ….

61 60 Sous-Tables Imbriquées

62 61 FIN

63 62

64 63 Manipulation de Données Relationnelles Witold LITWIN 08-09

65 64 Manipulation de Données Relationnelles Deux langages dominants Deux langages dominants SQL SQL Interface de commande Interface de commande Calcul de tuple Calcul de tuple QBE QBE Interface interactive graphique Interface interactive graphique Calcul de domaine Calcul de domaine

66 65 SQLSQL n Inventé à IBM San Jose, 1974 (Boyce & Chamberlin) pour System R n Basé sur le calcul de tuple & algèbre relationnelle n relationnellement complet (et plus) n Le langage de SGBD relationnels n En évolution contrôlée par ANSI (SQL1, 2, 3...) n Il existe aussi plusieurs dialectes n Les possibilités basiques sont simples n Celles avancées peuvent être fort complexes –Signalées dans ce qui suit par « Maillot Jaune »

67 66 SQL: Manipulation de Données n 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)] n basée sur le calcul de tuple n produit une table temporaire (en général avec des duplicata)

68 67 ExamplesExamples n En pratique sur MsAccess n Sauf ceux spécifiques à –SQL-Server –DB2

69 68 Exemple canon S P SP

70 69 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] Predicat: ALL, DISTINCT, DISTINCTROW, TOP.

71 70 MsAccess Select n Pour formuler la requête Select de SQL en mode interactif on passe par QBE : n On clique sur longlet « Créer » du ruban Accueil n Puis, sur le bouton « Création de requête » n Puis sur le bouton « Fermer » de la fenêtre Afficher la table n Enfin sur le bouton SQL

72 71 MsAccess Select n Alors on voit la commande SELECT –A compléter n Le tout est la méthode basique n Après quelque temps on fait le max en mode création (QBE) –Voir le cours sur QBE n Puis on passe en mode SQL n On complète

73 72 MsAccess Select

74 73 MsAccess Select n Une fois la requête SQL formulée il peut être utile sous MsAccess de repasser en vue QBE –Mode Création n On peut définir alors des propriétés inaccessible en mode SQL –Formatage des attributs –Masques de saisie –Résultat en forme graphique par défaut –…

75 74 Interrogations (vraiment) simples n Projections d'une table sur certains attributs: SELECT [S#] FROM S Combien de lignes de programmation faudrait-il pour cette requête en Cobol ? 20 ? 50 ? 100 ? MsAccess S# s1 s2 s3 s4 s5 n L'ordre de présentation est fixé par le SGBD et peut changer dans le temps

76 75 Projection avec duplicata SELECT CITY FROM S; Le résultat peut avoir les duplicata Le résultat peut avoir les duplicata alors, il n'est pas une relation, mais un bag alors, il n'est pas une relation, mais un bag

77 76 Elimination de duplicata SELECT DISTINCT CITY FROM S; CITY Athens London Paris n DISTINCT est optionnel pour deux raisons: –éliminer les duplicata coûte en temps de réponse –les fonctions agrégats en ont besoin. Combien de lignes de programmation faudrait-il pour cette requête en C ? 20 ? 50 ? 100 ?

78 77 Projection multi-attribut n 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

79 78 SELECT * n Tout sur toutes les fournitures : SELECT S#, P#, QTY FROM SP; n Formulation plus courante : SELECT * FROM SP; n 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 ?

80 79 ORDER BY SELECT * FROM SP ORDER BY QTY DESC, [S#];

81 80 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 ?

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

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

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

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

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

87 86 Restrictions simples SELECT [P#], PNAME FROM P WHERE COLOR = 'RED'; Product IDProduct Name p1nuts p4screw p6cog n Les noms d'attributs sont les légendes créées à la création de P n L'ordre de tuples délivrés est définit par le SGBD et peut changer d'une exécution à l'autre Est-il possible de faire: Est-il possible de faire: SELECT [Product ID], [Product Name]…

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

89 88 Restrictions composées n SELECT [P#], PNAME, CITY FROM P WHERE COLOR = 'RED' AND NOT CITY = 'PARIS'; Product IDProduct Namecity p1nutslondon p4screwlondon p6coglondon On peut utiliser les opérateurs AND, OR, NOT ainsi que IMP et XOR et EQV

90 89 Restrictions sur nuls n Un nul nest pas une valeur n Donc on a une clause spéciale –IS [NOT] NULL n 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 ?

91 90 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;

92 91 Restrictions par date n La date doit être encadrée par les # SELECT * FROM [Placement en actions] WHERE dat_v=#3/1/2008#; n Résultat (surprenant) Format date en ang pour comp avec format euro actionvaleurdat_vdat_v1 HP11001/03/200809/04/2008 IBM2501/03/2008

93 92 Expressions de valeur SELECT [P#], PNAME, 2.1* weight as [Poids £ ] FROM P order by 2.1*weight desc; Product ID Product NamePoids £ Product ID Product NamePoids £ p6cog 39.9 p3screw 35.7 p2bolt 35.7 p4screw 29.4 p5cam 25.2 p1nuts 25.2

94 93 Expressions de valeur n En général on peut employer les opérateurs: + - * / ^ et ( ) –- peut être un-aire n On dispose aussi sous MsAccess de : » modulo : A mod c »division entière symbolisée par \ SELECT S.SName, [S].[Status]/9 AS Div, [status]\9 AS [Div ent], S.Status, [status] Mod 9 AS Mod, -[status] AS moins, S.City FROM S WHERE [status]=20 Xor [city]="paris" ;

95 94 Expressions de valeur n La division \ est utile pour génération de quantiles et histogrammes SELECT ([N°]\10) AS Quantil, Int(Avg([serie].prix)) AS [Prix moyen par 10 périodes ] FROM [serie] GROUP BY ([N°]\10); n Requête fait appel aux clauses enseignés plus loin –Fonction scalaire Int –Agrégat Avg –Opération de regroupement

96 95 Expressions de valeur n Lexponentiation sert par exemple au calcul de rentabilité de placement SELECT montant, taux, montant*(1+taux/100)^durée AS [valeur finale après], durée as [durée du placement en années] n Notez absence de clause FROM n SQL peut servir de calculette –Essayez

97 96 Expressions de valeur n 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;

98 97 Expressions de valeur n On peut utiliser une expression de valeur comme argument dune clause de restriction …. WHERE WEIGTH = 200 *2,1 n On peut créer les expressions de valeur sur les attributs dynamiques SELECT sp.qty AS q, q+2 AS q1, log(q1)+3 AS q2 FROM sp;

99 98 Expressions de valeur n On peut utiliser une expression de valeur sur une Date/Temps –Now () pour la date/heure dans un an »Now () est une fonction scalaire (voir + loin) SELECT action, dat_v, dat_v1, dat_v1 - dat_v as [durée en jours] FROM [Placement en actions]; n On ne peut pas utiliser dans ORDER BY lalias défini pour une expression de valeur dan la clause SELECT –Essayez … ORDER BY [Poids £ ]

100 99 Expressions de valeur n On peut utiliser une expression de valeur sur une Date/Temps –Now () pour la date/heure dans un an »Now () est une fonction scalaire (voir + loin) SELECT action, dat_v, dat_v1, dat_v1 - dat_v as [durée en jours] FROM [Placement en actions]; actiondat_vdat_v1durée en jours HP03/11/200601/03/ HP01/02/200807/05/ HP01/03/200809/04/200839

101 100 JointuresJointures Raphaël Brancusi

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

103 102 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

104 103 Sémantique de la requête n Forme le produit cartésien C de tables dans la clause FROM n Sélectionne tout tuple t de C vérifiant le prédicat dans la clause WHERE (et seulement de tels tuples) n Projette tout t sur les attributs dans SELECT n Applique le mot-clé de SELECT La clause S.s# = SP.s# s'appelle equi-jointure La clause S.s# = SP.s# s'appelle equi-jointure 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

105 104 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;

106 105 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

107 106 Clause BETWEEN n 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 ?

108 107 Equi-jointures m-aires (avec *) n 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 s.city <> 'London'; n On peut aussi SELECT S.*, SP.*, P.* FROM S,SP, P bien-sûr n 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';

109 108 Equi-jointuresEqui-jointures n 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

110 109 Theta-jointures & Self-jointures n L'opérateur T de comparaison dans une clause de jointure peut-être en fait : –T =,, >= <>} n Une table peut-être jointe avec elle-même –On suppose que les noms de fournisseurs sont tos différents SELECT x.[s#], x.sname, y.[s#], y.sname, x.city FROM s x, s y /* x, y sont des aliases WHERE x.city = y.city and x.sname < y.sname; x.s#x.snamey.s#y.snamecity s4Clarks1SmithLondon s3 Blake s2 Jones Paris

111 110 n Possibilité nouvelle dans SQL2 (et MsAccess) n Prévue dans le nouvel SQL standard –SQL-2 n Permet de standardiser la formulation de jointures externes –On les verra plus tard n Permet aussi de fixer explicitement lordre de jointures –Pour optimiser la requête Jointures dans la clause FROM

112 111 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#]; Jointures dans la clause FROM s# Product IDQtyProduct NameS.cityP.city s1p6100cogLondonlondon s1p4200screwLondonlondon s1p1300nutsLondonlondon s4p4300screwLondonlondon s2p2400boltParisparis s3p2200boltParisparis

113 112 Jointures externes n 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

114 113 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 La notation dans la clause WHERE pourrait être ambiguë La notation dans la clause WHERE pourrait être ambiguë Pourquoi ? Pourquoi ? Doù la notation algébrique dans la clause FROM Doù la notation algébrique dans la clause FROM Introduite par SQL-2 Introduite par SQL-2 Elles sappliquent aussi aux jointures classiques dites dès lors internes Elles sappliquent aussi aux jointures classiques dites dès lors internes

115 114 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

116 115 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 Jointure externe complète avec une sélection pnameSNameS.CityP.City AdamsAthens boltBlakeParisparis boltJonesParisparis boltsmithParisparis camBlakeParisparis camJonesParisparis camsmithParisparis screwrome

117 116 Jointure externe self ou avec theta-comparaison n Self-jointure externe est possible –p.e. SP left joint SP… N° de tout fournisseur qui fournit une pièce en quantité la même que celle dun autre fournisseur ou est inconnue N° de tout fournisseur qui fournit une pièce en quantité la même que celle dun autre fournisseur ou est inconnue n Les opérateurs T sappliquent aussi aux jointures externes T =,, >= <>} N°s de tout fournisseur qui fournit une pièce en quantité moindre quun autre fournisseur dune même pièce ou en quantité inconnue. N°s de tout fournisseur qui fournit une pièce en quantité moindre quun autre fournisseur dune même pièce ou en quantité inconnue.

118 117 Jointures externes DB2 & SQL-Server & SQL-2… n 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 (+)

119 118 Mélange de jointures externes et internes Explosif (sous MsAccess surtout): Explosif (sous MsAccess surtout): OK: 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#]; interdit : 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#];

120 119 Mélange de jointures externes et internes n 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#];

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

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

123 122 On a cliqué d'abord ici On a cliqué ensuite ici Declaration de jointures implicites

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

125 124 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

126 125 Jointure Externes Implicites

127 126 Jointure Externes Implicites

128 127 Résultat SQL SELECT Personnes.*, Etud.*, Empl.* FROM (Personnes LEFT JOIN Etud ON Personnes.[P#] = Etud.[P#]) LEFT JOIN Empl ON Personnes.[P#] = Empl.[P#]; Jointures impl. générées automatiquement

129 128LimitationsLimitations n Si les tables choisies ne sont pas directement en relation, alors, il faut ajouter aussi sous QBE toutes les tables intermédiaires –Pour formuler SELECT sname, pname FROM S,P… avec les jointure implicites, il faut aussi inclure sous QBE la table SP »Bien que lon ne sélectionne aucun attribut de cette table

130 129LimitationsLimitations n Lordre de clauses résulte de celui de sélection de tables, mais seulement si lon suit les relations directes. –Essayez ajouter les tables et regarder le résultat SQL, selon les permutations suivants: »P,SP,S puis S,SP,P, puis P, S, SP puis S,P, SP –Conclusion ?

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

132 131

133 132 LimitationsLimitations n 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 n C'est un "bug" –MsAccess 2 n Pourquoi ? –bonne question à Microsoft n 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.

134 133

135 134

136 135

137 136

138 137

139 138

140 139 Jointure Automatique 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 –dun même nom –avec au moins étant la clé primaire n A ne pas confondre avec une self-jointure n Existe en option –A activer parmi les option de MsAccess –Trouvez où

141 140 Fonctions agrégats n Un nombre très limité: –COUNT, SUM, AVG, STDEV, VAR, MAX, MIN, »MIN, MAX sapplique aux Nuls ( à tort) »MsAccess: First, Last, VarP, StDevP –VarP et StDevP calcule sur la population, pendant que Var, StDev utilisent un échantillon –En pratique Var = n / (n-1) VarP etc »Par expressions de valeur on peut se créer dautres agrégat (corrélation, covariance…) n A mettre dans SELECT SELECT sum(P.Weight) AS PoidsCumule FROM P; PoidsCumule 91

142 141 Fonctions agrégats n SELECT Count (*) FROM S WHERE… compte tous les tuples n SELECT Count (CITY) FROM S ne compte pas de nulls –mais compte les doubles n 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 ? n 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)

143 142 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

144 143 Fonctions agrégats Expressions de Valeurs SELECT Avg([qty]*[Weight])-Avg([qty])*Avg([Weight]) AS Cov, sp.[s#] SELECT Avg([qty]*[Weight])-Avg([qty])*Avg([Weight]) AS Cov, sp.[s#] FROM P INNER JOIN sp ON P.[P#]=sp.[p#] GROUP BY sp.[s#]; On peut composer les agrégats pour définir des nouveaux On peut composer les agrégats pour définir des nouveaux

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

146 145 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 MsAccess: Affichage Mode Graphique par défaut MsAccess: Affichage Mode Feuille de Données

147 146 GROUP BY attributs multiples n Tous les attributs sélectionnés non-agrégés forment le GROUP BY SELECT S.SName, Sum(SP.Qty) as Somme, S.[S#] FROM S INNER JOIN SP ON S.[S#] = SP.[S#] WHERE SP.Qty > 100 GROUP BY S.SName, S.[S#] SnameSommeS# Clark900s4 Jones700s2 Jones200s3 Smith1100s1

148 147HAVINGHAVING n Permet de spécifier les prédicats sur les groupes de GROUP BY –et sur les attributs non agrégés, »double emploi avec WHERE SELECT SP.[p#], sum(qty) as [tot-qty] FROM SP WHERE (((SP.qty)>50)) GROUP BY SP.[p#] HAVING ((sum(SP.qty)>200)) order by sum(SP.qty) desc ; p#tot-qty p21000 p1600 p5500 p4500 p3400

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

150 149 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 Sous-requêtes dans clause WHERE

151 150 n La requête à sous-requête : SELECT [S#], SNAME FROM S WHERE STATUS > 100 AND CITY IN (SELECT CITY FROM S WHERE CITY = PARIS); est en général préférable à celle plus naturelle à restrictions composées: SELECT [S#], SNAME FROM S WHERE STATUS > 100 AND CITY = PARIS; n Le temps dexécution est plus petit. –Si les deux attributs sont indexés –La plupart de fournisseurs est à Paris –Il y a peu de fournisseurs de Statut > 100 n Bien que les deux requêtes soient logiquement équivalentes Sous-requêtes dans clause WHERE

152 151 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

153 152 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

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

155 154 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

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

157 156 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'; P#city p1London p1Paris p2London p2Paris p3London p4London p5London p6London Tous les duplicata sont éliminés Comment faire alors pour les agrégats ?

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

159 158 UNION ALL n Préserve les duplicata n Nécessaire pour appliquer des agrégations n Mais, souvent il faut néanmoins dans ce but au moins 2 requêtes SQL –Défaut de conception SQL –Solutions pratiques »clause FROM imbriquée »Une autre (DB2) voir cours SQL2 n 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

160 159 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

161 160 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

162 161 Clause FROM imbriquée n Définit une table dans la clause FROM dune expression de sélection SQL (SQL-Select) –Cette dernière peut-être imbriquée à son tour Select attrs…FROM [tbls], (SQL-Select) Where …. ; Select attrs…FROM [tbls], (SQL-Select) Where …. ; n Clause non-documentée sous MsAccess –La traduction SQL-QBE est boguée »À essayer

163 162 Clause FROM imbriquée Possibilités: –Agrégations par-dessus UNION ou UNION ALL –Imbrication des expressions de valeur –Calcul de COUNT (DISTINCT) »MsAccess –Récursivité limitée

164 163 Clause FROM imbriquée SELECT sum(weight) AS [poids-total] SELECT sum(weight) AS [poids-total] FROM (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*');

165 164 Clause FROM imbriquée select avg(moy1) as [moyenne-des-moyennes] FROM (SELECT avg(weight) as moy1 FROM P WHERE City like 'l*' UNION ALL SELECT avg(weight) as moy1 FROM p, SP, S WHERE p.[p#]=sp.[p#] and sp.[s#]=s.[s#] and s.City like 'p*');

166 165 Requêtes à paramètres n un paramètre : un [texte visualisé] à la place dune constante dans la clause WHERE pour que l'usager indique une valeur –le texte sous SQL peut être sans [], sil ne désigne pas dattribut et na pas de blancs, # etc. »Possibilité à éviter à cause de conflit de noms possible –"Paris" est une constante Paris serait un paramètre n Le type de données d'un paramètre par défaut est texte. n On peut-être déclarer un type différent par la clause PARAMETER »recommandée pour un paramètre dans une expression de valeur

167 166 Requêtes à paramètres n On peut utiliser plusieurs paramètres –pour une clause BETWEEN [Qty Min ?] AND [Max ?] n On peut utiliser la clause LIKE [City ?] n 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 n Alternativement on peut ajouter les caractères génériques à la réponse d'usager –P.e. LIKE [City ?] & "*"

168 167 Requêtes à paramètres Expression de paramètre peut être celle de valeur Expression de paramètre peut être celle de valeur …WHERE... Prix = [Prix HT svp] * 1,2 ?Est-ce une requête à paramètre SELECT S.SName, Sum(SP.Qty) as somme, S.[S#] FROM S INNER JOIN SP ON S.[S#] = SP.[S#] WHERE SP.Qty > [100] GROUP BY S.SName, S.[S#]

169 168 Fonctions scalaires n S appliquent aux valeurs individuelles –d attributs –d agrégations SQL n Il y a plusieurs catégories –mathématiques –financières –chaînes de caractères –dates… »voir le cours « SQL Subtilités » n Varient entre les dialectes –MsAccess possède UCASE, pas DB2 –DB2 possède LOG10, pas MsAccess

170 169 Fonctions scalaires

171 170 Fonctions scalaires Voir le cours SQL Avancé

172 171 Fonctions scalaires Aide :

173 172 Fonctions scalaires Permet de filtrer les nuls pour les fonctions math qui ne les supportent pas (log…)

174 173 Fonctions scalaires En anglais IIF : une fonction très utile Voir le cours SQL Avancé

175 174 Fonctions scalaires MsAccess Français n En QBE on voit les dénominations françaises n Passage en SQL les traduit auto –AmorLin SLN n Les noms français en SQL en général crée une erreur –AmorLin Fonction non définie

176 175 Fonctions scalaires MsAccess Français n Le séparateur entre les arguments dune fonction montré par le gén. dexpressions est ; –Mais cest valide seulement pour QBE –Traduit en, en SQL –Utiliser ; en SQL génère une erreur bizarre n Faut le découvrir –Bravo MS n Excell et VBA ont des fonctions qui nexistent pas sous Access –AmorLinC »Tient compte du prorata temporis

177 176 Fonctions scalaires n 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

178 177 Fonctions scalaires n Calcul dannuité en mode calculette SQL –La fonction PMT de SQL se traduit VPM en QBE français SELECT int(Pmt([rate],[nper],[pv])) AS Annuitée, rate as taux_annuel, nper as nbre_années, pv as [valeur présente], int(Annuitée*nper) as valeur_payée, valeur_payée + pv as surprime Fonction PMT calcul instructif d'annuité d'emprunt Annuitéetaux_annuelnbre_années valeur présente valeur_payéesurprime ,

179 178 Fonctions scalaires n Placement à taux variable – Somme et Fin sont les paramètres »voir le cours plus loin –Expression indirecte de lagrégat PRODUCT »Inexistant en SQL SELECT somme*exp(sum(log(1+taux/100))) FROM [placement à taux variable] WHERE [année relative] between 1 and fin; Année relative Taux Voir + dans le livre « SQL Design Patterns »

180 179 Fonctions scalaires Estampilles: SELECT S.SName, Now() AS Estampille FROM S; SNameEstampille Smith10/10/ :30:04 Jones10/10/ :30:04 Blake10/10/ :30:04 Clark10/10/ :30:04 Adams10/10/ :30:04 Toto10/10/ :30:04 Date() donne la date courante seulement En Mode Création, on peut définir dautres formats de date/heure

181 180 Fonctions scalaires / Group By SELECT count(*) as [clients / day] FROM estampille group by day(estampille); cleestampille 113/11/ :07:40 213/11/ :09:29 413/11/ :13:27 512/11/ :31: /11/ :37: /11/ :38: /11/ :38: /11/ :39: /11/ :49: /11/ :31:51 clients / day 6 4

182 181 Tabulations Croisées (Crosstab queries) n 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 n 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

183 182 TRANSFORM Sum(SP.Qty) SELECT SP.[S#], Sum(SP.Qty) AS [Total Qty] FROM SP GROUP BY SP.[S#] PIVOT SP.[p#]; Tabulations Croisées Nouvelles colonnes

184 183 S# Total Qty p1p2p3p4p5p6 s s s s L'intitulé Total Qty est mis par défaut par MsAccess Tabulations Croisées

185 184 n La fonction agrégat dans la clause TRANSFORM est obligatoire –bien que SUM(QTY) = AVG(QTY) = QTY –mais, COUNT(QTY) = 1 n 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

186 185 On peut utiliser la clause WHERE WHERE P# IN ('P1', 'P2') n Alors les fonctions ne calculent les agrégats que sur P1 et P2. n On peut aussi restreindre la tabulation seulement PIVOT SP.[p#] IN ('P1', P2') n 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 ? Si oui, quel serait leffet sur les valeurs pivotées ? Si oui, quel serait leffet sur les valeurs pivotées ? 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

187 186 Manipulations Multibases et Distribuées (Kandinsky: Ligne avec Accompagnement, 1937 )

188 187 Requêtes Multibases (MDB) MsAccess n On peut ouvrir une BD et faire les requêtes à d'autres BDs –il faut définir des aliases dans FROM n Base ouverte s'appelle s-p07.mdb –mais ce nom n'a pas d'importance ici n Jointure de tables dans deux bases externes à s-p07.mdb SELECT TOP 10 C.[Contact Name], C.City FROM [c:\access\nwind2.mdb].Customers AS C, [c:\access\ordentr2.mdb].customers AS O WHERE (o.Id= C.[customer Id]);

189 188 RésultatRésultat Contact NameCity Pat ParkesLondon Gladys LindsaySeattle Elizabeth LincolnTsawassen Olivia LaMontSan Francisco Terry HargreavesLondon Elizabeth BrownLondon Sylvia DunnLondon Ann DevonLondon Ronald MerrickLondon Bill LeePocatello

190 189 n Jointure d'une table locale à la base ouverte (S-P.mdb) et d'une table externe dans la base nwind2.mdb La base ouverte et [nwind2.mdb] se trouvent dans le répertoire par défaut La base ouverte et [nwind2.mdb] se trouvent dans le répertoire par défaut défini dans les Options défini dans les Options Requêtes MDB Alias obligatoire, contrairement à MSQL SELECT TOP 10 S.SName, C.[Contact Name], C.City FROM S, [nwind2.mdb].Customers AS C WHERE ((S.City= C.City)) Order by [contact name];

191 190 SName Contact NameCity ClarkAnn DevonLondon ClarkArchibald LangfordLondon ClarkCornelia GilesLondon ClarkDavid BirdLondon ClarkElizabeth BrownLondon ClarkG.K.ChattergeeLondon ClarkGerald PippsLondon ClarkHari KumarLondon ClarkJane AustenLondon ClarkJeffrey JefferiesLondon Résultat

192 191 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

193 192 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

194 193 Mise à jour UPDATE controle SET texte = "test", estampille = Now()-365 WHERE [clé] = 8; estampilleclétexte 10/10/ :59:447contrôle F 11/10/ :08:198test

195 194 Mise à jour n Update MsAccess peut être paramétré UPDATE SP SET qty = qty+incr WHERE qty = par;

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

197 196 DELETEDELETE n Comme pour UPDATE: DELETE [*] FROM table [ WHERE condition ] ; n 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)

198 197INSERTINSERT INSERT INTO P VALUES ('P8', 'nut', 'pink', 15, 'Nice') ; n pas bonne idée d'utiliser cette forme d'INSERT INSERT INTO P (weight, [P#] ) VALUES ( 100, 'P8') ; n 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#] n TEMP doit être préalablement crée ?Avec ou sans clé primaire ?Quelle différence pour INSERT

199 198INSERTINSERT n Pas de valeur à définir pour lattribut de type Compteur –Attribution automatique par MsAccess n Pour le type Date/Temps on peut insérer une estampille –Par la fonction Now () ou Date () »Now () Maintenant () en version française n On peut utiliser une expression de valeur sur lestampille Now () pour la date/heure dans un an

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

201 200 MAJ & Vues n On peut mettre à jour une table à travers sa vue –Toute vue incluant la clé primaire –Pas dexpression de valeur sur les attributs MAJ n A expérimenter sur MsAccess

202 201 ConclusionConclusion n SQL est un langage assertionnel –relationnellement complet –+ expressions de valeur et agrégats –+ mises à jour n Mais ce n'est pas un langage de programmation complet n Il y a des défauts de conception et inconsistances n Néanmoins c'est un MUST pour un informaticien aujourd'hui n On voit, néanmoins aussi que SQL n'est pas le langage pour les usagers ad-hoc ! n C'est n'est pas tout pour SQL, il y en a encore !

203 202 Exercices suppl. Clic hors diaporama

204 203 FIN

205 204


Télécharger ppt "1 SQL : Un Langage Relationnel (08-09) Witold LITWIN."

Présentations similaires


Annonces Google