1 / 128

SQL Avancé 2010

SQL Avancé 2010. Witold Litwin. Quoi & Pourquoi ?. Possibilités Etendues de Manipulation de BDs relationnelles Fondamentales pour l’exploration approfondie Statistiques, prévision de risques, analyse de la tendance… Gestion, Actuariat, ISF…. Exemple canon. SP. S. P. Synonymes.

Télécharger la présentation

SQL Avancé 2010

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. SQL Avancé2010 WitoldLitwin

  2. Quoi & Pourquoi ? • Possibilités Etendues de Manipulation de BDs relationnelles • Fondamentales pour l’exploration approfondie • Statistiques, prévision de risques, analyse de la tendance… • Gestion, Actuariat, ISF…

  3. Exemple canon SP S P

  4. Synonymes • "Différent de" peut être exprimé de trois manières: != ^= <> • Oracle, DB2 mais pas MsAccess • Type d'attribut peut être exprimé de plusieurs manières (SQL Oracle): CHAR(n) VARCHAR(n) FLOAT DECIMAL NUMBER INTEGER SMALLINT LONG LONG VARCHAR • Types de MsAccess ne sont pas ceux d’ANSI • Revoir mon cours SQL/QBE de base

  5. Nomsd'attributs • Peuvent contenir des blancs: "Nom de fournisseur" (Oracle) • Dans MSAccess: [Nom de fournisseur] ‘’Nom de fournisseur ’’ et ‘Nom de fournisseur ’ dans constantes, clause LIKE… • Dans SQL Server [ ] impliquent le respect de la casse • En général interdits: 95Bilan Commence avec un chiffre SELECT, Date…Mots réservés [A.B]   et [A!B]  MsAccess • Comment faire si besoin ?

  6. Insertion dans une Vue MsAccess • On peut insérer de tuples dans une vue MsAccess • Toute vue incluant la clé primaire • Notamment comme attribut de jointure • Y compris externe • Lien classe – sous-classe • Le résultat peut être l’insertion simultanée dans plusieurs tables sources de la vue • Le tuple inséré en QBE peut aussi disparaître à l’ouverture suivante de la vue

  7. Insertion dans une Vue MsAccess • L’insertion en mode QBE (feuille de données) dans la vue, de la clé d’un tuplet existant dans une table dont la vue dépend, peut induire l’apparition de tous les autres valeurs dans t • Le tuple inséré en mode QBE peut aussi disparaître à l’ouverture suivante de la vue

  8. Insertion dans une Vue MsAccess • A expérimenter sur la base S-P • Vue SP1 : SelectS.[S#], SNAME, STATUS, CITY, [P#], QTY FROM S, SP • Vue SP2 : Select SP.[S#], SNAME, STATUS, CITY, [P#], QTY FROM S, SP

  9. Insertion dans une Vue Insertion dans une Vue MsAccess • L’insertion QBE d’un déterminant dans une vue à jointure peut faire apparaître auto la valeur déterminée: • Insertion de Cpostal Ville dans : SELECT P.*, Ville FROM P, C WHERE P.Cpostal = C.Cpostal ; Avec : P (P#, Nom, CPostal) et C (Cpostal, Ville) • A expérimenter sur MsAccess

  10. Insertion dans une Vue Insertion dans une Vue MsAccess • L’insertion QBE dans une vue avec un attribut dynamique, d’une valeur de base de cet attribue, conduit à l’apparition auto de la valeur dynamique • PrixTTC = PrixHT * 1.2 • L’équivalent des attributs composés sous SQL Server & autres SGBDs • A expérimenter sur MsAccess

  11. MAJ d’une Vue MsAccess • On peut mettre à jour une vue • Toute vue incluant la clé primaire • Notamment comme attribut de jointure • Y compris externe • Lien classe – sous-classe • Le résultat peut être la MAJ simultanée de plusieurs tables sources de la vue • A expérimenter sur les vues SP1 et SP2

  12. MAJ d’une Vue MsAccess • La MAJ d’un déterminant dans une vue QBE à jointure peut faire changer auto le déterminé: • MAJ de Cpostal MAJ Ville dans l’exemple avant • On peut aussi MAJ Ville • Mais on ne peut pas MAJ Cpostal à une valeur qui ne serait pas dans C • A expérimenter sur les vues précédentes

  13. Suppression dans une Vue MsAccess • On peut supprimer des tuples dans une vue • Toute vue mono-table ou à un tuple de la vue correspond un tuple de la table • Pas de DISTINCT, GROUP BY… • Surprise ? • On insère un tuple dans une vue V à jointure • INSERT V… • DELETE V … ne peut pas le supprimer • A expérimenter idem

  14. MsAccess : Légendes • La légende a la priorité sur l’alias • Si la légende de P# dans SP de notre base S-P est Product Id • Alors, l’alias Produit est inopérant SELECT SP.[s#], SP.[p#] AS Produit, SP.qty FROM SP;

  15. Expressions de valeur • Peuvent être des attr. dynamiques, imbriquées dans SQL de MsAccessSELECT Qty, [S#], qty1-4 AS qty2, qty2/3 AS qty3, 2*qty AS qty1 FROM SP; • Mais ces atttr. ne peuvent pas être référencés dans la clause WHERE • SELECT Qty, [S#], qty1-4 AS qty2, qty2/3 AS qty3, 2*qty AS qty1 FROM SP whereqty1 > 200; • pourquoi ? • Une bonne question pour Microsoft

  16. Expressions de valeur • Toutefois sous QBE, l'attr. qty1 peut être référencé • donc la requête ci-dessus devient légale • vous avez dit bizarre ? • Le signe + signifie aussi une concaténation pour les attributs du type texte, soit a = 2 et b = 3 • a+b  23 • Ce qui peu surprendre dans une requête à paramètres • Texte est le type par défaut du paramètre • Il faut la clause Parameters a int, b int;

  17. Pour en savoir + sur les attributs dynamiques • Litwin, W., Vigier, Ph. Dynamic attributes in the multidatabase system MRDSM, IEEE-COMPDEC, (Feb. 1986). • Litwin, W., Vigier, Ph. New Functions for Dynamic Attributes in the Multidatabase System MRDSM. Honeywell Large Systems Users's Forum, HLSUA XIV, New Orleans, 1987, 467-475. • Voir le site du CERIA

  18. UNION et NomsD’attributs SELECT [s#] FROM S Union SELECT [p#] FROM p Quel nom d’attribut sera dans le résultat • Sous MSAccess • Dans SQL Server, MySQL, Oracle…

  19. UNION et ORDER BY SELECT [s#] FROM S Union SELECT [p#] FROM p • Par conséquent, où peut-on placer la (ou les) clauses ORDER BY ? • Après le 1er Select et/ou après le 2ème ? • Quels nom(s) y employer ? • Quel serait le résultat de ORDER BY [S#] après le 2ème SELECT ?

  20. ORDER BY et expressions de valeur • Les expressions de valeur peuvent être dans ORDER BY clause: ORDER BY SAL - COMM Exceptions : UNION, MINUS, INTERSECT • Cette clause peut référencer l'attribut par position: Select ENAME SAL 0.75 * (SAL + 500)FROM EMPORDER BY 3 ; • Un must dans UNION, MINUS, INTERSECT dans Oracle • Un alias dans le 1èr Select est acceptable dans MsAccess

  21. ORDER BY et expressions de valeur • ORDER BY clause peut aussi référencer un attribut et une expression qui n'est pas dans SELECT clause: Select S#, CITY FROM SORDER BY SNAME STATUS+50 ; • exceptions: UNION, MINUS, INTERSECT • DB2 SQL n'avait pas ces possibilités • Aux dernières nouvelles • ORDER BY et DISTINCT peuvent être en conflit • Essayez: SELECT distinct sp.[s#] FROM sp ORDER BY sp.qty;

  22. Ordre de priorité d'opérations • 1. Opérateurs de comparaison logique: = != >= > <= < BETWEEN...AND IN LIKE IS NULL • 2. NOT • 3. AND • 4. OR • De gauche à droite • Les parenthèses priment sur l'ordre ci-dessus [e#] [e#]

  23. Prédicat TOP SELECT TOP 3 b, c SELECT TOP 10 % b, c • Pas la même sémantique pour Access & SQL Server • Ce dernier ne tient pas compte d’ex-equos • SQL Server équivalent de TOP d’Access SELECT TOP …. WITH TIES

  24. Prédicat TOP • Sous MySQL and PostgreSQL c’est une clause séparée dite LIMIT • Select … FROM… WHERE…ORDERBY LIMIT 3 • La syntaxe est par ailleurs étendue à la sélection après les 1èrs éléments • Pour sélectionner les tuples 30,31,32: LIMIT 29, 3 ou LIMIT 3 OFFSET 29 • Traitement des ex-equos ? • Voir la doc • Peut-on faire comme fait OFFSET sous MsAccess ?

  25. Clause BETWEEN • Peut être appliquée au texte • Mais ne connaît pas de caractères génériques • contrairement à LIKE • Quel sera le résultat pour Jones et pourquoi SELECT * FROM S wheresnamebetween 'b*' and 'J*'; • Et si on écrit: SELECT * FROM S wheresnamebetween 'J*' and 'b*'; • Le résultat s ’applique aussi aux valeurs numériques

  26. Limitations de NOT • Trouver tous les fournisseurs qui ne sont pas dans une ville d'un fournisseur dans S SELECT * FROM S WHERE CITY NOT IN (SELECT CITY FROM S) ; • Que veut dire cette réponse (vide) ? • Il n'y a pas de tels fournisseurs • Hypothèse de Monde fermé • Ils ne sont pas connus de S • Hypothèse de Monde ouvert

  27. ANY et ALL • All peut surprendre d'une manière aléatoire: SELECT * FROM S WHERE STATUS = ALL (SELECT STATUS FROM S WHERE SNAME = 'BNP"); si le résultat interne est (x, ... x) le résultat peut être non-vide si le résultat interne est (x,..y <> x, x) le résultat est vide • Souvent l'intention de telles requêtes est: SELECT * FROM S WHERE STATUS = ANY (SELECT STATUS FROM S WHERE SNAME = 'BNP");

  28. Injection SQL • On ajoute en fraude à une requête a priori en restriction une condition qui annule cette restriction • Gros dégâts sur le WEB notamment SELECT * FROM S WHERE city="london" Or True;

  29. Injection SQL • La clause ajoutée désigne une colonne virtuelle dite True dont le prédicat évalue toujours à vrai • Quelle est ladifférence entre les deux requêtes: SELECT * FROM S WHERE status= 100 Or 200; SELECT * FROM S WHERE status= 100 Or status = 200; • Pourrait-on faire l’injection par ce qui suit ? SELECT * FROM S WHERE city="london" Or 100;

  30. Tabulations Croisées(Crosstabqueries, Pivot Queries) • 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

  31. Tabulations Croisées S# Total Qty p1 p2 p3 p4 p5 p6 s1 1300 300 200 400 200 100 100 s2 700 300 400 s3 200 200 s4 900 200 300 400 L'intituléTotal Qtyestmis par défaut par MsAccess

  32. Tabulations Croisées(Crosstabqueries, Pivot Queries) • 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

  33. Tabulations Croisées S# Total Qty p1 p2 p3 p4 p5 p6 s1 1300 300 200 400 200 100 100 s2 700 300 400 s3 200 200 s4 900 200 300 400 L'intituléTotal Qtyestmis par défaut par MsAccess

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

  35. Tabulations Croisées • 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 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 SPGROUP BY SP.[S#]PIVOT SP.[p#];

  36. Tabulations Croisées On peut utiliser la clause WHERE WHERE P# IN ('P1', 'P2') • Alors les fonctions ne calculent les agrégats que sur P1 et P2. • On peut aussi restreindre la tabulation seulement PIVOT SP.[p#] IN ('P1', P2') • Mais, cette clause n'affecte pas les calculs des agrégats • Peut-on appliquer la clause ORDER BY ? • Si oui, quel serait l’effet sur les valeurs pivotées ? • Peut-on ordonner par rapport à une fonction agrégat ? • Comme on a fait pour les requêtes à GROUP BY ? • Peut-on appliquer la clause HAVING ?

  37. XOR SELECT S.[S#], S.Status, S.City FROM S WHERE Status=10 Xor city="paris"; • A noter le traitement du nul dans City

  38. IMP SELECT S.[S#], S.Status, S.City FROM S WHERE Status=10 imp city="paris"; • A noter le traitement du nul dans City

  39. Sous-requêtes • A utiliser quand: • Il y a une fonction d'agrégat à mettre dans la clause WHERE • Il y des quantificateurs • Enfin, l’on sait qu'une telle formulation serait plus rapide qu'en utilisant les jointures, car la sous-requête est évaluée en première • de moins en moins vrai • Mais vous ne risquez rien en utilisant une sous-requête SELECT * FROM EMP WHERE SAL < (SELECT AVG(SAL) FROM EMP) ;

  40. Sous-requêtes • Eléments Dominant (Skyline) • Tout fournisseur d’une pièce X pour laquelle il n’y a pas d’un autre fournisseur qui : • Livrerait au moins la même quantité mais plus vite, ou • Livrerait au moins aussi vite, mais en quantité plus grande

  41. Sous-requêtes • Skyline • Tout objet non-dominé (caché totalement) par un autre SELECT X.[s#], X.[p#], qty, delay FROM SP X where not exists (select * from SP as Y where (Y.qty >= X.Qty and Y.Delay < X.Delay or Y.qty > X.Qty and Y.Delay <= X.Delay) and X.[p#] = Y.[p#]) order by X.[p#];

  42. Sous-requêtes S • Résultat

  43. Sous-requêtes • On peutavoirunesous-requêtedans la clause FROM (voiraussi + loin) SELECT Count(*) AS TotalQty FROM (select distinct qty from sp); • On peutaussiavoirunesous-requêtedans la clause SELECT SELECT SP.[s#], SP.[p#], qty, (select sum(qty) from sp as X where X.[s#] = SP.[s#]) AS TotalQty, round(qty/TotalQty, 3) AS Fraction FROM SP order by [s#];

  44. Sous-requêtes • Résultat

  45. Sous-requêtes • En Mode Graphique

  46. Application aux Probabilités • Quece que l’on calcule ici: SELECT (select count(qty) from SP where qty >= [seuilsvp ?]) / count(*) as résultat FROM SP; • Comment traite-on les nuls ici ? • Comment modifier la requête pour calculer une probabilité conditionnelle ?

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

  48. 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 • Pas de tabulation croisée dans FROM • Mais la référence au nom de la requête OK

  49. Clause FROM imbriquée 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.Citylike 'p*');

  50. 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.Citylike 'p*');

More Related