View คืออะไร?
View คือ ตารางเสมือน (Virtual Table) ที่สร้างขึ้นจากคำสั่ง SELECT โดยข้อมูลภายใน View จะอ้างอิงมาจากตารางจริงในฐานข้อมูล
จุดเด่นของ View คือช่วยลดความซับซ้อนของคำสั่ง SQL โดยเฉพาะกรณีที่ต้องเชื่อมโยงข้อมูลหลายตาราง หรือมีการคำนวณข้อมูลซ้ำ ๆ
ระบบขายสินค้ามีตารางสินค้าและตารางการขาย เราสามารถสร้าง View เพื่อให้ระบบแสดง ชื่อสินค้า × จำนวน × ราคา = ยอดรวม ได้อัตโนมัติ
1. สร้างฐานข้อมูลตัวอย่าง
ในตัวอย่างนี้เราจะสร้างระบบขายสินค้าแบบง่าย ๆ โดยใช้ตารางหลักจำนวน 2 ตาราง ได้แก่
- products สำหรับเก็บข้อมูลสินค้า
- sales สำหรับเก็บรายการขายสินค้า
ตาราง products
CREATE TABLE products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock INT NOT NULL DEFAULT 0
);จากคำสั่งด้านบน ตาราง products จะใช้สำหรับเก็บชื่อสินค้า ราคา และจำนวนสินค้าในสต๊อก
เพิ่มข้อมูลสินค้า
INSERT INTO products
(product_name, price, stock)
VALUES
('คีย์แคป Clicker 1 ปุ่ม', 39.00, 50),
('คีย์แคป Clicker 2 ปุ่ม', 59.00, 40),
('คีย์แคป Clicker 3 ปุ่ม', 79.00, 30);| ID | สินค้า | ราคา | Stock |
|---|---|---|---|
| 1 | Clicker 1 ปุ่ม | 39.00 | 50 |
| 2 | Clicker 2 ปุ่ม | 59.00 | 40 |
| 3 | Clicker 3 ปุ่ม | 79.00 | 30 |
2. สร้างตารางการขาย
CREATE TABLE sales (
sale_id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT NOT NULL,
quantity INT NOT NULL,
sale_date DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (product_id)
REFERENCES products(product_id)
);เพิ่มข้อมูลการขาย
INSERT INTO sales
(product_id, quantity)
VALUES
(1, 3),
(2, 2),
(3, 4);3. สร้าง View
ต่อไปเราจะสร้าง View เพื่อรวมข้อมูลจาก products และ sales พร้อมคำนวณยอดขายต่อรายการให้อัตโนมัติ
CREATE VIEW view_sales_detail AS
SELECT
s.sale_id,
p.product_name,
s.quantity,
p.price,
s.quantity * p.price AS total_price,
s.sale_date
FROM sales AS s
INNER JOIN products AS p
ON s.product_id = p.product_id;4. เรียกดูข้อมูลจาก View
SELECT *
FROM view_sales_detail;ผลลัพธ์
| สินค้า | จำนวน | ราคา | ยอดรวม |
|---|---|---|---|
| Clicker 1 ปุ่ม | 3 | 39.00 | 117.00 |
| Clicker 2 ปุ่ม | 2 | 59.00 | 118.00 |
| Clicker 3 ปุ่ม | 4 | 79.00 | 316.00 |
5. การคำนวณอัตโนมัติ
จุดสำคัญของ View คือเราไม่จำเป็นต้องเก็บ total_price ลงในตารางจริง เพราะสามารถคำนวณจากข้อมูลต้นทางได้
s.quantity * p.price AS total_price6. View สำหรับสรุปยอดขาย
View สามารถใช้งานร่วมกับฟังก์ชัน SUM() เพื่อสร้างข้อมูลสรุปได้เช่นกัน
CREATE VIEW view_product_sales_summary AS
SELECT
p.product_id,
p.product_name,
p.price,
COALESCE(SUM(s.quantity), 0)
AS total_quantity,
COALESCE(SUM(s.quantity * p.price), 0)
AS total_sales
FROM products AS p
LEFT JOIN sales AS s
ON p.product_id = s.product_id
GROUP BY
p.product_id,
p.product_name,
p.price;ในตัวอย่างนี้ใช้ COALESCE() เพิ่มเข้ามา เพื่อให้สินค้าที่ยังไม่เคยขายแสดงค่า 0 แทนค่า NULL
7. View สำหรับยอดขายทั้งหมด
CREATE VIEW view_total_sales AS
SELECT
COALESCE(
SUM(s.quantity * p.price),
0
) AS grand_total
FROM sales AS s
INNER JOIN products AS p
ON s.product_id = p.product_id;เรียกดูยอดขายรวม
SELECT *
FROM view_total_sales;8. ทดลองเพิ่มข้อมูลใหม่
เพิ่มการขายสินค้า ID 1 จำนวน 5 ชิ้น
INSERT INTO sales
(product_id, quantity)
VALUES
(1, 5);ระบบจะคำนวณยอดเพิ่มจาก
ดังนั้นยอดขายรวมใหม่คือ
9. นำ View ไปใช้งานกับ PHP
PHP สามารถเรียกข้อมูลจาก View ได้เหมือนกับการอ่านข้อมูลจาก Table ทั่วไป
<?php
$conn = new mysqli(
"localhost",
"root",
"",
"shop_db"
);
$conn->set_charset("utf8mb4");
$sql = "
SELECT *
FROM view_sales_detail
ORDER BY sale_id DESC
";
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
echo "<div class='sale-item'>";
echo "<strong>"
. htmlspecialchars($row['product_name'])
. "</strong><br>";
echo "จำนวน: "
. number_format($row['quantity'])
. " ชิ้น<br>";
echo "ราคา: "
. number_format($row['price'], 2)
. " บาท<br>";
echo "ยอดรวม: <strong>"
. number_format($row['total_price'], 2)
. " บาท</strong>";
echo "</div>";
}
?>10. แสดงยอดขายบน Dashboard
<?php
$sql = "
SELECT grand_total
FROM view_total_sales
";
$result = $conn->query($sql);
$row = $result->fetch_assoc();
$grandTotal = $row['grand_total'];
?>
<div class="dashboard-card">
<div class="dashboard-title">
ยอดขายทั้งหมด
</div>
<div class="dashboard-value">
<?=
number_format(
$grandTotal,
2
);
?>
บาท
</div>
</div>View ไม่เหมือน Trigger เพราะ View ไม่ได้ทำงานทันทีตอน INSERT หรือ UPDATE แต่ระบบจะนำคำสั่งภายใน View มาประมวลผลเมื่อมีการเรียกข้อมูลจาก View
View กับ Trigger ต่างกันอย่างไร?
| หัวข้อ | View | Trigger |
|---|---|---|
| ลักษณะ | ตารางเสมือน | ชุดคำสั่งอัตโนมัติ |
| ทำงานเมื่อ | SELECT ข้อมูล | INSERT / UPDATE / DELETE |
| เหมาะกับ | แสดงผล / รายงาน / คำนวณ | ทำงานอัตโนมัติเมื่อข้อมูลเปลี่ยน |
สรุป
View เป็นเครื่องมือที่ช่วยให้การจัดการข้อมูลในฐานข้อมูล มีความสะดวกและเป็นระบบมากขึ้น โดยเฉพาะการดึงข้อมูลจากหลายตารางและการคำนวณข้อมูล
คำนวณยอดต่อรายการ
quantity * priceหาจำนวนรวม
SUM(quantity)หายอดขายรวม
SUM(quantity * price)หากข้อมูลสามารถคำนวณจากข้อมูลต้นทางได้ ไม่ควรรีบสร้างคอลัมน์เพื่อเก็บค่าที่คำนวณซ้ำ เพราะอาจทำให้ข้อมูลไม่ตรงกันในอนาคต การใช้ View ช่วยให้ข้อมูลที่แสดงอ้างอิงจากข้อมูลต้นทาง และได้ผลลัพธ์ล่าสุดเสมอเมื่อมีการเรียกใช้งาน
