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 логик ашиглах аргыг үзнэ.