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.