View โ€” saqlangan so'rov bo'lib, jadval kabi ishlatiladi.

Oddiy VIEW

-- View yaratish
CREATE VIEW yuqori_ballilar AS
SELECT
    t.ism,
    t.email,
    k.nom AS kurs,
    t.ball
FROM talabalar t
JOIN kurslar k ON t.kurs_id = k.id
WHERE t.ball >= 80;

-- View ni ishlatish
SELECT * FROM yuqori_ballilar;
SELECT * FROM yuqori_ballilar WHERE kurs = 'Python';

View ni yangilash

CREATE OR REPLACE VIEW yuqori_ballilar AS
SELECT
    t.ism,
    t.email,
    k.nom AS kurs,
    t.ball,
    t.shahar  -- yangi ustun qo'shildi
FROM talabalar t
JOIN kurslar k ON t.kurs_id = k.id
WHERE t.ball >= 80;

VIEW orqali ma'lumot kiritish

-- Oddiy (bir jadvalga) VIEW larga INSERT/UPDATE mumkin
CREATE VIEW toshkent_talabalari AS
SELECT * FROM talabalar WHERE shahar = 'Toshkent';

INSERT INTO toshkent_talabalari (ism, email, shahar)
VALUES ('Sherali', 'sh@mail.uz', 'Toshkent');

MATERIALIZED VIEW

Oddiy view har safar hisoblaydi, materialized view natijani saqlaydi.

-- Yaratish
CREATE MATERIALIZED VIEW oylik_statistika AS
SELECT
    DATE_TRUNC('month', yaratildi) AS oy,
    COUNT(*) AS yangi_talabalar,
    AVG(ball) AS o'rta_ball
FROM talabalar
GROUP BY DATE_TRUNC('month', yaratildi);

-- Yangilash (qo'lda)
REFRESH MATERIALIZED VIEW oylik_statistika;

-- Yangilash (blokirovkasiz)
REFRESH MATERIALIZED VIEW CONCURRENTLY oylik_statistika;

View ni o'chirish

DROP VIEW yuqori_ballilar;
DROP VIEW IF EXISTS yuqori_ballilar CASCADE;
DROP MATERIALIZED VIEW oylik_statistika;

Amaliy foydalanish

-- Murakkab hisobot uchun view
CREATE VIEW moliyaviy_hisobot AS
SELECT
    k.nom AS kurs,
    COUNT(t.id) AS talabalar_soni,
    SUM(t.to'lov) AS umumiy_daromad,
    AVG(t.to'lov) AS o'rta_to'lov,
    MIN(t.yaratildi) AS birinchi_yozilish
FROM kurslar k
LEFT JOIN talabalar t ON k.id = t.kurs_id
GROUP BY k.id, k.nom;