PostgreSQL / View үүсгэх ба ашиглах

View үүсгэх ба ашиглах

Та нэг нарийн төвөгтэй JOIN болон WHERE бүхий асуулгыг өдөр бүр давтан бичдэг үү? View бол тийм асуулгыг нэг удаа тодорхойлж, цаашид хүснэгт шиг нэрээр дуудах боломж олгодог. View нь өгөгдлийг давхар хадгалдаггүй — дуудах үед асуулгыг гүйцэтгэж үр дүнг буцаадаг.

View гэж юу вэ?

View нь өгөгдлийн санд хадгалагдсан асуулга юм. Хэрэглэгчид нарийн бүтцийг мэдэхгүйгээр энгийн нэрээр мэдээлэл авах боломжтой болдог. Жишээ болгон дараах хүснэгтүүдийг ашиглая:

sql
CREATE TABLE departments (
    id   SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);

CREATE TABLE employees (
    id            SERIAL PRIMARY KEY,
    full_name     TEXT NOT NULL,
    email         TEXT NOT NULL,
    department_id INT REFERENCES departments(id),
    salary        NUMERIC NOT NULL,
    hired_at      DATE NOT NULL
);

INSERT INTO departments (name) VALUES ('Инженер'), ('Санхүү'), ('Маркетинг');

INSERT INTO employees (full_name, email, department_id, salary, hired_at) VALUES
    ('Болд Баатар',   'bold@co.mn',    1, 2500000, '2022-03-15'),
    ('Сарнай Гантөр', 'sarnai@co.mn',  2, 1800000, '2021-07-01'),
    ('Ганбаяр Лхагва','gan@co.mn',     1, 2200000, '2023-01-10'),
    ('Номин Дорж',    'nomin@co.mn',   3, 1600000, '2022-11-20'),
    ('Баяр Мөнх',     'bayar@co.mn',   1, 2800000, '2020-05-05');

View үүсгэх

CREATE VIEW командаар view үүсгэнэ:

sql
-- Ажилчид болон тэдний хэлтсийн нэрийг хамт харуулах view
CREATE VIEW employee_details AS
SELECT
    e.id,
    e.full_name,
    e.email,
    d.name AS department,
    e.salary,
    e.hired_at
FROM employees e
JOIN departments d ON e.department_id = d.id;

-- View-г хүснэгт шиг дуудах
SELECT * FROM employee_details;

-- WHERE, ORDER BY бүхнийг ашиглаж болно
SELECT full_name, salary
FROM employee_details
WHERE department = 'Инженер'
ORDER BY salary DESC;

View-г ашиглан асуулга бичих нь яг хүснэгттэй ажиллахтай адил — хэрэглэгчид дотоод бүтцийг мэдэх шаардлагагүй.

View-г шинэчлэх ба устгах

View-н тодорхойлолтыг өөрчлөхийн тулд CREATE OR REPLACE VIEW ашиглана:

sql
-- View-д hired_at-г хэдэн жил ажилласан болгон өөрчлөх
CREATE OR REPLACE VIEW employee_details AS
SELECT
    e.id,
    e.full_name,
    e.email,
    d.name AS department,
    e.salary,
    DATE_PART('year', AGE(NOW(), e.hired_at))::INT AS ажилласан_жил
FROM employees e
JOIN departments d ON e.department_id = d.id;

-- View устгах
DROP VIEW employee_details;

-- View байгаа эсэхийг шалгахгүйгээр устгах
DROP VIEW IF EXISTS employee_details;

Тооцоолсон view

View нь нэгтгэх функц болон нарийн тооцоог нуун хадгалж болно:

sql
-- Хэлтэс тус бүрийн статистик view
CREATE VIEW department_stats AS
SELECT
    d.name                          AS хэлтэс,
    COUNT(e.id)                     AS ажилчдын_тоо,
    ROUND(AVG(e.salary), 0)         AS дундаж_цалин,
    MAX(e.salary)                   AS дээд_цалин,
    MIN(e.salary)                   AS доод_цалин
FROM departments d
LEFT JOIN employees e ON e.department_id = d.id
GROUP BY d.id, d.name
ORDER BY дундаж_цалин DESC;

-- Нэг мөрт дуудах
SELECT * FROM department_stats;

-- Хэлтэс тус бүрийн дундаж цалин
SELECT хэлтэс, дундаж_цалин FROM department_stats;

View-н давуу тал — аюулгүй байдал

View нь тодорхой талбаруудыг нуун хэрэглэгчдэд зөвхөн шаардлагатай мэдээллийг харуулж болно:

sql
-- Цалинг нуусан, зөвхөн нийтийн мэдээллийн view
CREATE VIEW employee_public AS
SELECT id, full_name, email, hired_at
FROM employees;

-- Энэ view-д цалингийн мэдээлэл байхгүй
GRANT SELECT ON employee_public TO readonly_user;

View нь байнга хэрэглэгддэг нарийн асуулгуудыг нэг газар нэгтгэж, кодын давталтыг багасгадаг маш хэрэгтэй хэрэгсэл юм.

Дараагийн хичээлд:

Ердийн view нь дуудах болгонд асуулга гүйцэтгэдэг. Materialized view нь үр дүнг дискэнд хадгалж, удаан асуулгыг маш хурдан болгодог — ялгааг нь судална.