site:enseignement:master:bdle:tmes:sqlrecursif
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| site:enseignement:master:bdle:tmes:sqlrecursif [08/12/2016 17:41] – créée amann | site:enseignement:master:bdle:tmes:sqlrecursif [19/10/2017 11:06] (Version actuelle) – hubert | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== | + | {{indexmenu_n> |
| - | + | ||
| + | ====== | ||
| + | |||
| ===== Connexion Oracle ===== | ===== Connexion Oracle ===== | ||
| - | [[http:// | + | <del>[[http:// |
| + | [[site: | ||
| + | |||
| + | Quelques liens intéressants: | ||
| + | * [[https:// | ||
| ===== Chargement de Données ===== | ===== Chargement de Données ===== | ||
| - | Conectez vous à Oracle et exécutez la commande: | + | Conectez vous à Oracle et |
| + | ===== Premiers pas ===== | ||
| + | |||
| + | Créez la table myedges: | ||
| <code SQL> | <code SQL> | ||
| - | SQL> @facebook-bdle | + | drop table myedges; |
| + | create table myedges ( | ||
| + | | ||
| + | insert into myedges values (1,2); | ||
| + | insert into myedges values (2,3); | ||
| + | insert into myedges values (2,4); | ||
| + | insert into myedges values (4,5); | ||
| </ | </ | ||
| + | |||
| + | ==== Questions ==== | ||
| + | |||
| + | |||
| + | ---- | ||
| + | **Question 1**: Dessinez le graphe G stocké dans la graphe myedges; | ||
| + | |||
| + | |||
| + | ---- | ||
| + | **Question 2**: Exécutez la requête suivante et expliquez ce qu' | ||
| + | |||
| + | <code sql> | ||
| + | SELECT DISTINCT target, level, SYS_CONNECT_BY_PATH(SOURCE, | ||
| + | FROM myedges | ||
| + | START WITH SOURCE=1 | ||
| + | CONNECT BY prior target=SOURCE; | ||
| + | </ | ||
| + | |||
| + | |||
| + | ---- | ||
| + | **Question 3**: Affichez tous les pairs de noeuds dans G et la longueur des chemins entre eux (il faut utiliser [[https:// | ||
| + | |||
| + | |||
| + | |||
| + | ---- | ||
| + | **Question 4**: Insérez les deux arcs suivants et évaluez à nouveaux les requêtes précédentes (il faudra ajouter le mot clé [[https:// | ||
| + | |||
| + | <code SQL> | ||
| + | insert into myedges values (5,1); | ||
| + | insert into myedges values (4,1); | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | **Question 5**: Affichez tous les pairs de noeuds dans G et la longueur des chemins entre eux ainsi l' | ||
| + | |||
| + | |||
| + | ---- | ||
| + | **Question 6**: Affichez que tous les cycles (source=target) et leur longueur (utilisez la possibilité de mettre une sous-requête SQL dans la clause FROM d'une requête ou créez une vue). Affichez le nombre de cycles. | ||
| + | |||
| + | |||
| + | ---- | ||
| + | **Question 7**: Affichez pour chaque noeud le nombre de cycles. | ||
| + | |||
| + | ---- | ||
| + | ***Question 8**: Exécutez la requête suivante et analysez le résultat. Changez la stratégie de parcours (DEPTH FIRST, BREADTH FIRST) et l' | ||
| + | <code SQL> | ||
| + | with R2(source, | ||
| + | as ( | ||
| + | | ||
| + | union all | ||
| + | | ||
| + | ) | ||
| + | search breadth first by source set o1 | ||
| + | cycle target set end to 1 default 0 | ||
| + | select * from R2 | ||
| + | order by o1; | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ---- | ||
| + | **Question 9**: Ecrivez une requête qui retourne tous les pairs de noeuds et la longueur du plus court chemin. | ||
| + | |||
| + | |||
| ===== Graphe Facebook : ===== | ===== Graphe Facebook : ===== | ||
| Ligne 21: | Ligne 101: | ||
| Les clés primaires sont soulignées. Les attributs usr et neighbor dans la table Edges | Les clés primaires sont soulignées. Les attributs usr et neighbor dans la table Edges | ||
| - | sont des clés étrangères. La table Users contient 4039 utilisateurs, | + | sont des clés étrangères. La table Users contient 4039 utilisateurs, |
| <code SQL> | <code SQL> | ||
| + | @facebook-bdle | ||
| desc Users | desc Users | ||
| desc Edges | desc Edges | ||
| Ligne 30: | Ligne 110: | ||
| Par défaut le graphe est dirigé (e.g on stocke dans Edges seulement les arcs a → b sans stocker aussi les arcs b → a). | Par défaut le graphe est dirigé (e.g on stocke dans Edges seulement les arcs a → b sans stocker aussi les arcs b → a). | ||
| - | ==== Question 1 : ==== | + | ==== Questions |
| - | Écrivez une requête SQL sans récursivité qui retourne | + | |
| + | ---- | ||
| + | **Question 1** : | ||
| + | Écrivez une requête SQL sans récursivité qui retourne | ||
| Résultat: graphe dirigé 7 lignes, graphe non dirigé 9 lignes | Résultat: graphe dirigé 7 lignes, graphe non dirigé 9 lignes | ||
| - | ==== Question 2 : ==== | ||
| - | Écrivez une requête SQL sans récursivité pour connaître les noms des amis des amis de Kendall (à distance 2 de Kendall), en considérant d' | ||
| - | Résultat: graphe dirigé 52 lignes, graphe non dirigé | + | ---- |
| + | **Question 2 **: | ||
| + | Écrivez une requête SQL sans récursivité pour connaître les noms des amis des amis de Kendall (à distance 2 de Kendall), en considérant d' | ||
| + | |||
| + | Résultat: graphe dirigé 52 lignes, graphe non dirigé | ||
| + | |||
| + | |||
| + | ---- | ||
| + | **Question 3** : | ||
| + | Donnez une requête hiérarchique (clause CONNECT BY) qui retourn les noms des utilisateurs atteignables dans le graphe dirigé à une distance donnée à partir de l' | ||
| + | |||
| + | Essayez la requête pour plusieurs distances (pour distance 2 vérifiez que vous obtenez le même résultat que pour la question 2). | ||
| - | ==== Question 3 : ==== | ||
| - | Donnez les noms des utilisateurs atteignables à une distance donnée | ||
| Résultat: 52 lignes pour la profondeur 2 | Résultat: 52 lignes pour la profondeur 2 | ||
| - | ==== Question | + | |
| - | Affichez tous les chemins de longueur inférieure ou égale à une distance donnée entre ' | + | ---- |
| + | **Question | ||
| + | |||
| + | |||
| + | ---- | ||
| + | **Question 4** : | ||
| + | Affichez tous les chemins de longueur inférieure ou égale à une distance donnée entre ' | ||
| Résultat: 13 lignes pour profondeur< | Résultat: 13 lignes pour profondeur< | ||
| - | ==== Question | + | ---- |
| - | Donnez une requête qui affiche, pour les utilisateurs ' | + | **Question 4.1** : Question 4 en utilisant une requête récursive (clause WITH et sans CONNECT_BY). Pour construire le chemin on peut concaténer deux chaînes de caractères en utilisant |
| + | |||
| + | ---- | ||
| + | **Question 4.2** : Au lieu d' | ||
| + | |||
| + | < | ||
| + | SET autotrace trace stat | ||
| + | </ | ||
| + | |||
| + | Exécutez la requête précédente (ou d' | ||
| + | |||
| + | Explications : | ||
| + | |||
| + | Avant de conteinuer, il faut faire: | ||
| + | < | ||
| + | SET autotrace off | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | **Question | ||
| + | Donnez une requête qui affiche, pour les utilisateurs ' | ||
| Résultat: 154 lignes | Résultat: 154 lignes | ||
| - | ==== Question | + | ---- |
| + | **Question | ||
| + | |||
| + | ---- | ||
| + | **Question 6** : | ||
| Écrivez une requête qui affiche les noms des utilisateurs qui sont atteignables à la fois à partir de ' | Écrivez une requête qui affiche les noms des utilisateurs qui sont atteignables à la fois à partir de ' | ||
| Résultat: 223 ligne(s) sélectionnée(s). | Résultat: 223 ligne(s) sélectionnée(s). | ||
| - | ==== Question | + | |
| + | ---- | ||
| + | **Question | ||
| Écrivez en SQL sans récursivité la requête qui calcule le nombre total de triangles contenant l' | Écrivez en SQL sans récursivité la requête qui calcule le nombre total de triangles contenant l' | ||
| <code SQL> | <code SQL> | ||
| - | Create VIEW edges_view(usr, | + | Create VIEW edges_view(usr, |
| + | SELECT usr, neighbor FROM edges | ||
| + | UNION ALL | ||
| + | SELECT neighbor, | ||
| + | ); | ||
| </ | </ | ||
| Résultat: 1612010 | Résultat: 1612010 | ||
| - | ==== Question | + | |
| + | ---- | ||
| + | **Question | ||
| Calculez le nombre de triangles contenant ' | Calculez le nombre de triangles contenant ' | ||
| Résultat: 34 | Résultat: 34 | ||
| - | ==== Question 9 (Optionnel) : | + | ---- |
| - | Écrivez le code PL/SQL permettant de calculer les noeuds atteignables à partir d' | + | ***Question 8bis**: Calculez l' |
| - | Créer une table temporaire pour stocker les noeuds distincts rencontrés pendant la traversée: | + | |
| - | On s' | + | ---- |
| + | **Question 9** (Optionnel) : | ||
| + | |||
| + | Écrivez le code [[http:// | ||
| + | Le code sera écrit dans le fichier <ff sans-serif> | ||
| + | Vérifiez la procédure avec le script | ||
| + | |||
| + | <fc # | ||
| <code SQL> | <code SQL> | ||
| CREATE GLOBAL TEMPORARY TABLE fermeture (id INTEGER PRIMARY KEY); | CREATE GLOBAL TEMPORARY TABLE fermeture (id INTEGER PRIMARY KEY); | ||
| + | |||
| @proc_fermeture_transitive | @proc_fermeture_transitive | ||
| @read_start_node_fermeture | @read_start_node_fermeture | ||
| + | |||
| DROP TABLE fermeture; | DROP TABLE fermeture; | ||
| DROP TABLE fermeture; | DROP TABLE fermeture; | ||
| Ligne 88: | Ligne 227: | ||
| Le fichier read_start_node_fermeture.sql est donné à la fin de l' | Le fichier read_start_node_fermeture.sql est donné à la fin de l' | ||
| - | ==== Question 10(Optionnel) : | + | |
| - | Écrivez | + | ---- |
| + | **Question 10** (Optionnel) : | ||
| + | Écrivez | ||
| <code SQL> | <code SQL> | ||
| @proc_compter_triangles | @proc_compter_triangles | ||
| @read_start_node_triangles | @read_start_node_triangles | ||
| + | </ | ||
| - | read_start_node_fermeture.sql : | + | ==== Scriptes d' |
| + | |||
| + | <ff sans-serif> | ||
| + | <code SQL> | ||
| ACCEPT start_user PROMPT " | ACCEPT start_user PROMPT " | ||
| SET SERVEROUTPUT ON | SET SERVEROUTPUT ON | ||
| SET VERIFY OFF | SET VERIFY OFF | ||
| execute fermeture_transitive('& | execute fermeture_transitive('& | ||
| + | </ | ||
| - | read_start_node_triangles.sql : | + | <ff sans-serif> |
| + | <code SQL> | ||
| ACCEPT start_user PROMPT " | ACCEPT start_user PROMPT " | ||
| SET SERVEROUTPUT ON | SET SERVEROUTPUT ON | ||
| Ligne 109: | Ligne 256: | ||
| + | ===== Mandelbrot en SQL récursif ===== | ||
| - | + | Téléchargez le fichier [[http:// | |
| - | + | ||
| - | + | ||
| - | | + | |
| - | http://www-bd.lip6.fr/wiki/lib/images/smaller.gif | + | <code SQL> |
| + | -- Mandelbrot set visualization in SQL for Oracle | ||
| + | -- | ||
| + | -- Ported to Oracle from the PostgreSQL version https:// | ||
| + | -- Author: Luca.Canali@cern.ch, | ||
| + | -- | ||
| + | -- Additional references: | ||
| + | -- http://thedailywtf.com/ | ||
| + | -- https://en.wikipedia.org/wiki/Mandelbrot_set | ||
| + | -- https:// | ||
| + | -- https:// | ||
| + | -- http:// | ||
| + | -- | ||
| + | -- Tested on Oracle (SQL*plus) 11.2.0.4 for Linux using Putty as terminal emulator | ||
| + | -- | ||
| + | |||
| + | -- Oracle SQL*plus page setup and formatting parameters | ||
| + | set verify off | ||
| + | set lines 250 | ||
| + | set pages 999 | ||
| + | |||
| + | -- Configuration parameters for the Mandelbrot set calculation | ||
| + | -- Edit to change the region displayed and/or resolution by changing the definitions here below | ||
| + | -- Edit your terminal screen resolution and/or modify XPOINTS and YPOINTS so that the image fits the screen | ||
| + | define XMIN=-2.0 | ||
| + | define YMIN=-1.4 | ||
| + | define XMAX=0.5 | ||
| + | define YMAX=1.4 | ||
| + | define XPOINTS=150 | ||
| + | define YPOINTS=80 | ||
| + | define XSTEP=" | ||
| + | define YSTEP=" | ||
| + | |||
| + | -- Visualization parameters | ||
| + | define PALETTESTRING=" | ||
| + | define MAXITER=" | ||
| + | define ESCAPE_VAL=4 | ||
| + | |||
| + | WITH | ||
| + | XGEN AS ( -- X dimension values generator | ||
| + | SELECT CAST(& | ||
| + | YGEN AS ( -- Y dimension values generator | ||
| + | SELECT CAST(& | ||
| + | Z(IX, IY, CX, CY, X, Y, I) AS ( -- Z point iterator. Makes use of recursive common table expression | ||
| + | SELECT IX, IY, X, Y, X, Y, 0 FROM XGEN, YGEN | ||
| + | UNION ALL | ||
| + | SELECT IX, IY, CX, CY, X*X - Y*Y + CX, 2*X*Y + CY, I+1 FROM Z WHERE X*X + Y*Y < & | ||
| + | | ||
| + | SELECT IX, IY, MAX(I) AS VAL FROM Z -- VAL=MAX(I) represents how quickly the values reached the escape point | ||
| + | GROUP BY IY, IX) | ||
| + | SELECT LISTAGG(SUBSTR('& | ||
| + | FROM MANDELBROT_MAP | ||
| + | GROUP BY IY | ||
| + | ORDER BY IY DESC; | ||
| + | </ | ||
| + | |||
| + | © [[http:// | ||
| + | |||
site/enseignement/master/bdle/tmes/sqlrecursif.1481215272.txt.gz · Dernière modification : de amann
