MySQL / View
View
View нь хадгалагдсан SELECT query — ашиглах бүрт тухайн query ажилладаг хийсвэр хүснэгт. Нарийн query-г нэрлэж хадгалах, хэрэглэгчийн хандалтыг хязгаарлахад хэрэглэнэ.
Суурь жишээ
sql
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
customer VARCHAR(100),
product VARCHAR(100),
amount DECIMAL(10,2),
status VARCHAR(20) DEFAULT 'pending',
created_at DATETIME DEFAULT NOW()
);
INSERT INTO orders (customer, product, amount, status) VALUES
('Болд', 'Ном', 15000, 'paid'),
('Оюун', 'Дэвтэр', 3500, 'pending'),
('Дорж', 'Үзэг', 1200, 'paid'),
('Болд', 'Тоглоом', 45000, 'cancelled');
CREATE VIEW
sql
-- Зөвхөн төлбөр хийгдсэн захиалгын view
CREATE VIEW paid_orders AS
SELECT id, customer, product, amount, created_at
FROM orders
WHERE status = 'paid';
-- View-г хүснэгт шиг ашиглах
SELECT * FROM paid_orders;
код
id | customer | product | amount | created_at
---|----------|---------|--------|----------
1 | Болд | Ном | 15000 | ...
3 | Дорж | Үзэг | 1200 | ...
View нь өгөгдлийг хуулж хадгалдаггүй — ашиглах бүрт дотоод query ажиллана.
View ашиглах давуу тал
Нарийн query хялбарчлах:
sql
-- Энэ нарийн query-г
SELECT
u.username,
COUNT(o.id) AS захиалга,
SUM(o.amount) AS нийт,
MAX(o.created_at) AS сүүлийн_захиалга
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.status = 'paid'
GROUP BY u.id, u.username;
-- View болгоод энгийн болгоно
CREATE VIEW user_stats AS
SELECT
u.username,
COUNT(o.id) AS захиалга,
SUM(o.amount) AS нийт,
MAX(o.created_at) AS сүүлийн_захиалга
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.status = 'paid'
GROUP BY u.id, u.username;
-- Хаанаас ч энгийнээр дуудна
SELECT * FROM user_stats WHERE нийт > 50000;
Аюулгүй байдал: Нууц баганыг нуух
sql
-- Нууц үг, картын дугаар агуулаагүй safe view
CREATE VIEW public_users AS
SELECT id, username, email, created_at
FROM users;
-- password, card_number гэх мэт баганыг оруулаагүй
View шинэчлэх ба устгах
sql
-- View-г дахин тодорхойлох
CREATE OR REPLACE VIEW paid_orders AS
SELECT id, customer, product, amount, status, created_at
FROM orders
WHERE status = 'paid'
ORDER BY created_at DESC;
-- View устгах
DROP VIEW paid_orders;
DROP VIEW IF EXISTS paid_orders;
-- View-н тодорхойлолт харах
SHOW CREATE VIEW paid_orders;
Updatable view — view-р өгөгдөл өөрчлөх
Зарим view-д INSERT, UPDATE, DELETE хийж болно:
sql
CREATE VIEW pending_orders AS
SELECT id, customer, product, amount, status
FROM orders
WHERE status = 'pending';
-- View-р мэдээлэл өөрчлөх
UPDATE pending_orders SET status = 'paid' WHERE id = 2;
-- Үр дүн: orders хүснэгтийн id=2 мөр шинэчлэгдэнэ
View нь updatable байхын тулд:
- Нэг хүснэгтэд суурилсан байх
GROUP BY,DISTINCT, aggregate функц агуулаагүй байхUNIONагуулаагүй байх
WITH CHECK OPTION
sql
-- View-н нөхцөлд нийцэхгүй өгөгдөл оруулахыг хориглох
CREATE VIEW pending_orders AS
SELECT id, customer, amount, status
FROM orders
WHERE status = 'pending'
WITH CHECK OPTION;
-- Энэ INSERT амжилтгүй болно (status='paid' нөхцөлд нийцэхгүй)
INSERT INTO pending_orders (customer, amount, status)
VALUES ('Болд', 5000, 'paid');
-- ERROR: CHECK OPTION failed
Stored view vs Inline view
sql
-- Stored view: CREATE VIEW-р хадгалсан, дахин дахин ашиглана
CREATE VIEW active_products AS
SELECT * FROM products WHERE stock > 0;
SELECT * FROM active_products; -- хаанаас ч дуудна
-- Inline view (derived table): FROM дотор нэг удаа ашиглах
SELECT *
FROM (
SELECT * FROM products WHERE stock > 0
) AS active_products
WHERE price > 10000;
Stored view нь олон газар давтан хэрэглэгдэх query-д тохиромжтой. Inline view нь нэг query дотор тусгай шүүлт хийхэд хэрэглэнэ.
Бүх view жагсаах
sql
-- Одоогийн database-н view-үүд
SHOW FULL TABLES WHERE Table_type = 'VIEW';
-- Тодорхой view-н бүтэц
DESCRIBE paid_orders;
Дараагийн хичээлд:
Stored procedure — MySQL-д процедур хадгалах, параметр дамжуулах, IF/WHILE логик ашиглах аргыг үзнэ.