Bəzən SQL-sorğuları çox böyük, mürəkkəb və təkrarlanan olur. Məsələn, tələbələrin orta balları və kurs sayı üzrə hesabat qurursan — və eyni subquery-ni beş yerdə yazırsan. Həmişə eyni şeyi kopyalamaq əvəzinə, view-lardan — yəni VIEW-dan istifadə et.
VIEW — bu, “saxlanılmış sorğu” kimidir, ona ad verib, sanki cədvəl kimi müraciət edə bilərsən. O, məlumatları saxlamır, sadəcə sorğunun strukturunu saxlayır.
Xüsusilə bu hallarda faydalıdır:
- SQL-kodun oxunaqlılığını artırmaq;
- çətin seçməni təkrar istifadə etmək;
- istifadəçilərdən texniki detalları gizlətmək;
- çıxış səviyyələrini məhdudlaşdırmaq (yalnız lazım olan məlumatları göstərmək).
VIEW necə işləyir?
View yaratmaq — SELECT-sorğusuna əsaslanan pseudo-table yaratmaq deməkdir. Məsələn:
CREATE VIEW student_avg_grades AS
SELECT
s.student_id,
s.name,
AVG(g.grade) AS avg_grade
FROM
students s
JOIN
grades g ON s.student_id = g.student_id
GROUP BY
s.student_id, s.name;
İndi student_avg_grades-a adi cədvəl kimi müraciət edə bilərsən:
SELECT * FROM student_avg_grades WHERE avg_grade > 4.5;
Universitetdən nümunə
Tez-tez tələbələri, onların kurslarını və ballarını analiz edirsən. Təsəvvür et ki, hər tələbə üçün ümumi hesabat qurmaq lazımdır:
- ad,
- kurslara yazılma sayı,
- orta bal.
Bunu bir sorğu ilə etməyə çalışsan — uzun və oxunmaz SQL alınacaq. Daha rahat yol: əvvəlcə iki view (VIEW) yaradırıq, sonra onları birləşdiririk.
students cədvəli
| id | name |
|---|---|
| 1 | Alex Lin |
| 2 | Anna Song |
| 3 | Maria Chi |
| 4 | Dan Seth |
enrollments cədvəli
| student_id | course_id | grade |
|---|---|---|
| 1 | 1 | 90 |
| 1 | 2 | 85 |
| 2 | 2 | 88 |
| 2 | 3 | 91 |
| 3 | 1 | 75 |
| 3 | 3 | NULL |
- View: kurs sayı
Bu view hər tələbənin neçə kursu olduğunu sayır:
CREATE VIEW student_course_count AS
SELECT
student_id,
COUNT(*) AS course_count
FROM
enrollments
GROUP BY student_id;
Nəticə:
| name |
|---|
| Alex Lin |
| Anna Song |
| Maria Chi |
- View: orta bal Bu isə — tələbənin orta balıdır (əgər bal yoxdursa — NULL, və təsir etmir):
CREATE VIEW student_avg_grade AS
SELECT
student_id,
AVG(grade) AS avg_grade
FROM
enrollments
WHERE grade IS NOT NULL
GROUP BY student_id;
- Bu
VIEW-lardan istifadə
SELECT
s.name,
c.course_count,
a.avg_grade
FROM
students s
LEFT JOIN student_course_count c ON s.student_id = c.student_id
LEFT JOIN student_avg_grade a ON s.student_id = a.student_id;
İndi səndə təmiz və başa düşülən sorğu var. Ən əsası — onu saxlamaq və dəyişmək asandır.
VIEW-un yenilənməsi
View-lar adətən məlumat saxlamır — bu sadəcə sorğuya “qabıq”dır. Amma, bəzi hallarda məlumatı yeniləmək üçün də istifadə etmək olar, əgər VIEW bir neçə şərtə cavab verirsə (məsələn, JOIN, GROUP BY, aggregat və subquery olmadan).
Yenilənə bilən view nümunəsi:
CREATE VIEW active_students AS
SELECT * FROM students WHERE active = true;
İndi bunu edə bilərsən:
UPDATE active_students SET name = 'İvan Petrov' WHERE student_id = 2;
Amma əgər VIEW mürəkkəbdirsə (məsələn, JOIN və ya GROUP BY varsa), o yalnız oxumaq üçündür. Yeniləmək üçün INSTEAD OF trigger-lər istifadə etmək olar, amma bu artıq advanced səviyyədir.
VIEW-u necə silmək və ya dəyişmək olar
Silmək:
DROP VIEW student_avg_grade;
Dəyişmək:
CREATE OR REPLACE VIEW student_avg_grade AS
SELECT student_id, ROUND(AVG(grade), 2) AS avg_grade
FROM grades
GROUP BY student_id;
Nümunələr: VIEW nə vaxt xüsusilə faydalıdır
- Hesabat qurmaq
Bir VIEW — bir məntiq. Məsələn, report_enrollments_by_month, report_payments_by_year və s. düzəldə bilərsən.
- Çıxışın məhdudlaşdırılması
Elə bir VIEW yarat ki, yalnız məhdud məlumatları göstərsin (məsələn, şəxsi məlumatlar olmadan) və çıxışı yalnız ona ver.
- Təkrar istifadə
Subquery-ni kopyalamaq əvəzinə — ona VIEW şəklində ad ver.
Tövsiyələr
- Aydın adlar ver:
view_avg_scores_by_group,active_users_view— oxumaq daha rahat olur. VIEWiçindəVIEWiçindəVIEWzənciri qurma — başa düşmək və debug etmək çətinləşir.- Performansa bax: PostgreSQL hər sorğuda
VIEW-u yenidən hesablayacaq, əgər buMATERIALIZED VIEWdeyilsə.
VIEW — PostgreSQL-də ən rahat və asan alətlərdən biridir. Yeni bilik tələb etmir, sadəcə bir az fərqli düşünmək lazımdır: «Bəlkə bu sorğunu saxlayım və cədvəl kimi istifadə edim?» Əgər sorğun çox uzanırsa — demək, o artıq VIEW olmağa layiqdir.
GO TO FULL VERSION