• ติดตามบน
การใช้ View ในฐานข้อมูล และตัวอย่างการคำนวณอัตโนมัติ

การใช้ View ในฐานข้อมูล และตัวอย่างการคำนวณอัตโนมัติ

Chalothorn Kosakul 18 สิงหาคม 2569 17 ครั้ง

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
1Clicker 1 ปุ่ม39.0050
2Clicker 2 ปุ่ม59.0040
3Clicker 3 ปุ่ม79.0030

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;
สูตรที่ใช้ในการคำนวณ
ยอดรวม = จำนวนสินค้า × ราคาต่อหน่วย
quantity * price

4. เรียกดูข้อมูลจาก View

SELECT *
FROM view_sales_detail;

ผลลัพธ์

สินค้าจำนวนราคายอดรวม
Clicker 1 ปุ่ม339.00117.00
Clicker 2 ปุ่ม259.00118.00
Clicker 3 ปุ่ม479.00316.00

5. การคำนวณอัตโนมัติ

จุดสำคัญของ View คือเราไม่จำเป็นต้องเก็บ total_price ลงในตารางจริง เพราะสามารถคำนวณจากข้อมูลต้นทางได้

s.quantity * p.price AS total_price
จำนวน
3
ราคา
39
ยอดรวม
117 บาท

6. 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;
ยอดขายรวม
551.00 บาท

8. ทดลองเพิ่มข้อมูลใหม่

เพิ่มการขายสินค้า ID 1 จำนวน 5 ชิ้น

INSERT INTO sales
(product_id, quantity)
VALUES
(1, 5);

ระบบจะคำนวณยอดเพิ่มจาก

5 × 39 = 195 บาท

ดังนั้นยอดขายรวมใหม่คือ

551 + 195 = 746 บาท

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 ต่างกันอย่างไร?

หัวข้อViewTrigger
ลักษณะตารางเสมือนชุดคำสั่งอัตโนมัติ
ทำงานเมื่อSELECT ข้อมูลINSERT / UPDATE / DELETE
เหมาะกับแสดงผล / รายงาน / คำนวณทำงานอัตโนมัติเมื่อข้อมูลเปลี่ยน

สรุป

View เป็นเครื่องมือที่ช่วยให้การจัดการข้อมูลในฐานข้อมูล มีความสะดวกและเป็นระบบมากขึ้น โดยเฉพาะการดึงข้อมูลจากหลายตารางและการคำนวณข้อมูล

คำนวณยอดต่อรายการ

quantity * price

หาจำนวนรวม

SUM(quantity)

หายอดขายรวม

SUM(quantity * price)
แนวคิดสำคัญ

หากข้อมูลสามารถคำนวณจากข้อมูลต้นทางได้ ไม่ควรรีบสร้างคอลัมน์เพื่อเก็บค่าที่คำนวณซ้ำ เพราะอาจทำให้ข้อมูลไม่ตรงกันในอนาคต การใช้ View ช่วยให้ข้อมูลที่แสดงอ้างอิงจากข้อมูลต้นทาง และได้ผลลัพธ์ล่าสุดเสมอเมื่อมีการเรียกใช้งาน


แชร์บทความนี้