CREATE VIEW în SQLite

Salvează un SELECT sub un nume, ca să îl folosești apoi ca pe un tabel. În SQLite, vederile sunt doar pentru citire.

Sintaxă
CREATE [TEMP] VIEW [IF NOT EXISTS] nume [(coloana1, ...)] AS SELECT ...;
DROP VIEW [IF EXISTS] nume;

Ce face CREATE VIEW

O vedere (view) este o interogare salvată. Nu păstrează date: de fiecare dată când citești din ea, SQLite rulează SELECT-ul din spate pe datele actuale. O folosești ca să nu repeți un JOIN sau un calcul complicat.

Diferența față de MySQL și PostgreSQL: în SQLite vederile sunt mereu doar pentru citire. INSERT, UPDATE sau DELETE pe o vedere dau eroare, cu excepția cazului în care definești un declanșator INSTEAD OF pe ea.

CREATE TEMP VIEW creează o vedere care există doar cât timp este deschisă conexiunea. O vedere nu poate fi modificată cu ALTER: o ștergi cu DROP VIEW și o creezi din nou.

Parametri

Parametru Descriere
TEMP Vederea este temporară, vizibilă doar în conexiunea curentă.
(coloana1, ...) Nume noi pentru coloanele rezultatului (SQLite 3.9.0+).
SELECT ... Interogarea salvată.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE clienti (
  id INTEGER PRIMARY KEY,
  nume TEXT NOT NULL,
  email TEXT,
  oras TEXT
);
INSERT INTO clienti (nume, email, oras) VALUES
  ('Ana Popescu', 'Ana@Exemplu.ro', 'Iași'),
  ('Mihai Ionescu', 'mihai@exemplu.ro', 'Cluj'),
  ('Elena Dima', 'elena@exemplu.ro', 'Iași');
CREATE TABLE comenzi (
  id INTEGER PRIMARY KEY,
  client_id INTEGER,
  total INTEGER,
  stare TEXT
);
INSERT INTO comenzi (client_id, total, stare) VALUES
  (1, 250, 'platita'),
  (2, 120, 'neplatita'),
  (1, 90, 'platita'),
  (3, 400, 'neplatita');

Exemplul 1: O vedere cu totalul pe client

Vederea ascunde JOIN-ul și gruparea; o interoghezi ca pe un tabel obișnuit, inclusiv cu WHERE.

CREATE VIEW total_clienti AS
SELECT c.nume, c.oras, sum(o.total) AS total, count(*) AS comenzi
FROM clienti c JOIN comenzi o ON o.client_id = c.id
GROUP BY c.id;

SELECT * FROM total_clienti WHERE oras = 'Iași' ORDER BY total DESC;

Rezultat

╭─────────────┬──────┬───────┬─────────╮
│    nume     │ oras │ total │ comenzi │
╞═════════════╪══════╪═══════╪═════════╡
│ Elena Dima  │ Iași │   400 │       1 │
│ Ana Popescu │ Iași │   340 │       2 │
╰─────────────┴──────┴───────┴─────────╯

Exemplul 2: Vederea arată mereu datele actuale

După ce Mihai își plătește comanda, vederea reflectă imediat schimbarea, pentru că nu ține o copie a datelor.

CREATE VIEW de_incasat (client, suma) AS
SELECT client_id, total FROM comenzi WHERE stare = 'neplatita';

SELECT * FROM de_incasat ORDER BY client;
UPDATE comenzi SET stare = 'platita' WHERE client_id = 2;
SELECT * FROM de_incasat ORDER BY client;

Rezultat

╭────────┬──────╮
│ client │ suma │
╞════════╪══════╡
│      2 │  120 │
│      3 │  400 │
╰────────┴──────╯
╭────────┬──────╮
│ client │ suma │
╞════════╪══════╡
│      3 │  400 │
╰────────┴──────╯

Exemplul 3: Vederile nu acceptă INSERT

Încercarea de a scrie într-o vedere dă eroare. Soluția este un declanșator INSTEAD OF (vezi CREATE TRIGGER).

CREATE VIEW clienti_iasi AS SELECT id, nume FROM clienti WHERE oras = 'Iași';
INSERT INTO clienti_iasi (nume) VALUES ('Radu');

Rezultat (eroare)

Parse error near line 2: cannot modify clienti_iasi because it is a view

Greșeli frecvente

  • Te aștepți ca o vedere să facă interogarea mai rapidă. Vederea nu salvează rezultatul; SQLite rulează aceeași interogare. Viteza vine din indexuri, nu din vedere.
  • Folosești SELECT * în vedere și apoi adaugi coloane în tabel. Lista de coloane a vederii poate rămâne cea veche până o recreezi; scrie coloanele explicit.

Comenzi înrudite

  • CREATE TRIGGER: Rulează automat instrucțiuni SQL când un rând este inserat, modificat sau șters: jurnal de modificări, validări, câmpuri calculate.
  • WITH (CTE): Dă un nume unei subinterogări (Common Table Expression) și o folosește apoi ca pe un tabel, ca interogarea să fie mai ușor de citit.
  • PRAGMA table_info: Afișează coloanele unui tabel: poziția, numele, tipul declarat, NOT NULL, valoarea implicită și cheia primară.
  • .schema: Afișează instrucțiunile CREATE pentru tabelele, indexurile, vederile și declanșatorii din bază, exact cum au fost scrise.