CodeGym /Kurslar /SQL SELF /PostgreSQL-də View-lar (`VIEW`)

PostgreSQL-də View-lar (`VIEW`)

SQL SELF
Səviyyə , Dərs
Mövcuddur

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
  1. 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
  1. 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;
  1. 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

  1. 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.

  1. Çı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.

  1. 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.
  • VIEW içində VIEW içində VIEW zə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 bu MATERIALIZED VIEW deyilsə.

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.

1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Daxili SELECT-lər
Daxili SELECT-lər
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION