Recette #4:
Les VUES

Février 2011


Précédent

Table des matières

Suivant


SQLite possède une fonctionnalité très intéressante appelée VIEW (VUES).
En simplifiant, une VUE/VIEX est a mi chemin entre une TABLE et une requête:

  • une VIEW est un objet persistant (exactement comme une TABLE).

  • vous pouvez interroger une VIEW comme si c'était une table TABLE:
    il n'y a pas de différences permettant de différencier une VIEW d’une TABLE au niveau de la clause SELECT.

  • En fait, une VIEW est un peu comme une requête glorifiée.
      Une VIEW ne comporte aucune donnée.
    les données semblant appartenir à une VIEW est simplement extraite d'une TABLE , à chaque fois que nécessaire

  • Dans SQLite's les VIEW sont des objets uniquement en lecture seule:
    les clauses SQL INSERT, UPDATE ou DELETE sur une VIEW n'est pas autorisé.

Ceci dit, quelques exemples valent mieux qu'un long discours.



CREATE VIEW view_lc AS
SELECT lc.lc_id AS lc_id,
  lc.lc_name AS lc_name,
  lc.population AS population,
  c.county_id AS county_id,
  c.county_name AS county_name,
  c.car_plate_code AS car_plate_code,
  r.region_id AS region_id,
  r.region_name AS region_name,
  lc.geometry AS geometry
FROM local_councils AS lc
JOIN counties AS c ON (
  lc.county_id = c.county_id)
JOIN regions AS r ON (
  c.region_id = r.region_id);

Et voila, votre première VIEW:



SELECT lc_name, population, county_name
FROM view_lc
WHERE region_name = 'LAZIO'
ORDER BY lc_name;


lc_name

population

county_name

ACCUMOLI

724

RIETI

ACQUAFONDATA

316

FROSINONE

ACQUAPENDENTE

5788

VITERBO

ACUTO

1857

FROSINONE

AFFILE

1644

ROMA

...

...

...

Vous pouvez effectuer une requête sur cette VIEW.

SELECT region_name,
  Sum(population) AS population,
  (Sum(ST_Area(geometry)) / 1000000.0)
    AS "area (sq.Km)",
  (Sum(population) /
    (Sum(ST_Area(geometry)) / 1000000.0))
      AS "popDensity (peoples/sq.Km)"
FROM view_lc
GROUP BY region_id
ORDER BY 4;


region_name

population

area (sq.Km)

popDensity (peoples/sq.Km)

VALLE D'AOSTA

119548

3258.405868

36.689107

BASILICATA

597768

10070.896921

59.355984

...

...

...

...

MARCHE

1470581

9729.862860

151.140979

TOSCANA

3497806

22956.355019

152.367656

...

...

...

...

LOMBARDIA

9032554

23866,529331

378.461144

CAMPANIA

5701931

13666.322146

417.224981

Et même des requêtes plus complexes.

SELECT v.lc_name AS LocalCouncil,
  v.county_name AS County,
  v.region_name AS Region
FROM view_lc AS v
JOIN local_councils AS lc ON (
  lc.lc_name = 'NORCIA'
    AND ST_Touches(v.geometry, lc.geometry))
ORDER BY v.lc_name, v.county_name, v.region_name;


LocalCouncil

County

Region

ACCUMOLI

RIETI

LAZIO

ARQUATA DEL TRONTO

ASCOLI PICENO

MARCHE

CASCIA

PERUGIA

UMBRIA

CASTELSANTANGELO SUL NERA

MACERATA

MARCHE

CERRETO DI SPOLETO

PERUGIA

UMBRIA

CITTAREALE

RIETI

LAZIO

MONTEMONACO

ASCOLI PICENO

MARCHE

PRECI

PERUGIA

UMBRIA

Vous pouvez JOINdre une VIEW avec une table TABLE (ou deux VIEWs, etc ...)
Juste une petite explication: cette JOINture est en fait basé sur une relation spatiale (jointure spatiale):
les résultats contiennent la liste des Local Councils voisins du Local Councils Norcia .
Vous pourrez voir un exemple bien plus complexe ici (Recettes Haute cuisine).



VIEW est une des merveilleuses possibilités offertes par SQL.
Et l'implémentation des VIEWs sur SQLite est très probablement l'une des meilleures.
Ainsi, vous pouvez utiliser les VIEW aussi souvent que vous le souhaitez: vous découvrirez vite que cela permet de gérer des BDD très complexes très facilement.

note: interroger une VIEW peut en effet être plus rapide que pour une TABLE.
Cependant, une VIEW ne peut pas être plus efficace que la requête dont elle est issue; une requête non optimisée et lente entraînera la création d'une  VIEW avec de faibles performances.


Précédent

Table des matières

Suivant


Author: Alessandro Furieri a.furieri@lqt.it
Traduced from English By RIVIERE Romain

This work is licensed under the Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license.


Permission is granted to copy, distribute and/or modify this document under the terms of the
GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.