View là một bảng ảo dựa trên kết quả của một câu lệnh sql. Các trường trong view chỉ có thể xem mà không thể sửa đổi, nó là các trường được lấy ra từ 1 or nhiều bảng khác dựa theo câu lệnh tạo view của bạn.
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
DROP VIEW IF EXISTS view_name
Tạo một view để lấy ra phần trăm hoàn thành mục tiêu bán một sản phẩm, dựa theo 2 bảng products và transactions.
CREATE VIEW target_transactions AS
SELECT p.id as product_id, p.achievement_price, SUM(t.price) as total_amount,
(
CASE
WHEN SUM(t.price) * 100 / p.achievement_price < '100' THEN SUM(t.price) * 100 / p.achievement_price
WHEN SUM(t.price) * 100 / p.achievement_price >= '100' THEN SUM(t.price) * -100 / p.achievement_price
ELSE 0
END) AS target_percent
FROM products p
LEFT JOIN transactions t
ON p.id = t.product_id
GROUP BY p.id;
achievement_price là số tiền mong muốn đạt được khi bán 1 sản phẩm, transactions.price là số tiền bán một sản phẩm. Như vậy chúng ta đã tạo view target_transactions để lấy ra xem 1 sản phẩm đã bán được bao nhiêu phần trăm. khi quá 100% thì sẽ để phần trăm là số âm. Làm như trên chúng ta có thể order theo target_percent desc để lấy ra các sản phẩm gần hoàn thành mục tiêu nhất.
Tạo một view để thống kê có bao nhiêu coupons đã được sử dụng trong 2 bảng transactions và cf_transactions.
CREATE VIEW coupon_counts AS
SELECT
`coupon_id`,
'normal' AS `v_type`,
`coupon_price`
FROM transactions
WHERE `coupon_id` IS NOT NULL
UNION
SELECT
`coupon_id`,
'cf' AS `v_type`,
`coupon_price`
FROM cf_transactions
WHERE `coupon_id` IS NOT NULL;
Tạo một view gộp 2 bảng products và cf_products sắp xếp dữ liệu theo ngày tạo giảm dần.
CREATE VIEW v_products AS
SELECT X.*
FROM ( SELECT `id`,
`uuid`,
`title`,
`description`,
`status`,
`price`,
NULL AS `achievement_price`,
`published_from`
`created_at`,
`updated_at`,
`deleted_at`,
'normal' AS `v_type`
FROM `products`
WHERE `status` = 2
AND `published_from` <= CONVERT_TZ(NOW(),'+00:00','+09:00')
AND `deleted_at` IS NULL
UNION
SELECT `id`,
`uuid`,
`title`,
`description`,
`status`,
NULL AS `price`,
`achievement_price`,
`publish_start_at`
`created_at`,
`updated_at`,
`deleted_at`,
'cf' AS `v_type`
FROM `cf_products`
WHERE `published_status` = 2
AND `review_status` = 1
AND `publish_start_at` <= CONVERT_TZ(NOW(),'+00:00','+09:00')
AND `deleted_at` IS NULL
) X
ORDER BY X.`created_at` DESC;
Đối với các câu query phức tạp có thể tạo view để lấy dữ liệu dễ dàng hơn, query trong view cũng giống như query trong table bình thường. Để thay đổi view chúng ta chỉ việc xoá view đi rồi tạo lại, xoá view không ảnh hưởng gì đến dữ liệu của các bảng gốc.
Như vậy chúng ta đã tìm hiểu được các ứng dụng của view trong mysql. Bạn hay sử dụng view làm gì, hãy comment bên dưới nhé. Thank for reading...