การกำหนดค่าตัวแปรผู้ใช้ (User-defined Variable) ด้วย SELECT INTO ใน MySQL
MySQL รองรับการเก็บผลลัพธ์ของคำสั่ง SELECT ลงในตัวแปรผู้ใช้ (User-defined Variable) โดยใช้คีย์เวิร์ด INTO ตัวแปรเหล่านี้ขึ้นต้นด้วย @ และมีขอบเขตเป็นระดับ Session
รูปแบบคำสั่ง
SELECT column_name INTO @variable_name FROM table_name [WHERE condition];
ตัวอย่าง: คำนวณผลรวมเงินเดือนและเก็บในตัวแปร
สร้างตารางและข้อมูล:
CREATE TABLE DemoTable (Salary INT); INSERT INTO DemoTable VALUES (100), (500), (400);
ข้อมูลในตาราง:
+--------+ | Salary | +--------+ | 100 | | 500 | | 400 | +--------+
คำสั่ง SELECT INTO ตัวแปร
SELECT SUM(Salary) INTO @TotalSalary FROM DemoTable;
ผลลัพธ์: Query OK, 1 row affected
แสดงค่าตัวแปร
SELECT @TotalSalary;
ผลลัพธ์
+--------------+ | @TotalSalary | +--------------+ | 1000 | +--------------+
คุณสมบัติของ User-defined Variables
| คุณสมบัติ | รายละเอียด |
|---|---|
| ชื่อขึ้นต้นด้วย @ | เช่น @var, @total, @my_var |
| ขอบเขต Session | ตายเมื่อปิด Connection ไม่ร่วมกันระหว่าง Session |
| ไม่ต้อง DECLARE | สร้างอัตโนมัติเมื่อใช้งานครั้งแรก |
| Type Dynamic | เปลี่ยนชนิดข้อมูลได้ตามค่าที่กำหนด |
| ใช้ได้ใน SQL ต่อไป | SELECT @var, WHERE col = @var, ORDER BY @var |
กรณีใช้งานที่นิยม
1. เก็บค่าสำหรับใช้ใน Query ถัดไป
SELECT MAX(Id) INTO @max_id FROM Orders; SELECT * FROM OrderDetails WHERE OrderId = @max_id;
2. ใช้ใน Stored Procedure / Trigger
CREATE PROCEDURE GetTotalSales()
BEGIN
SELECT SUM(Amount) INTO @total_sales FROM Sales;
SELECT @total_sales AS TotalSales;
END;
3. คำนวณค่าก่อนแล้วใช้ใน UPDATE
SELECT AVG(Price) INTO @avg_price FROM Products; UPDATE Products SET Price = Price * 1.1 WHERE Price < @avg_price;
ข้อจำกัดและข้อควรระวัง
- ต้อง Return 1 แถวเท่านั้น: หาก SELECT คืนหลายแถว จะ Error (
Subquery returns more than 1 row) - ไม่ใช้ใน Prepared Statement ได้โดยตรง: ต้องใช้ SET @var = ... แทน
- ไม่ใช่ Local Variable ใน Stored Program: ตัวแปรใน SP ใช้
DECLARE var INT;แทน - Performance: หลีกเลี่ยงการใช้ใน JOIN ซับซ้อน อาจทำให้ Optimizer ทำงานไม่เต็มที่
วิธีอื่น: SET @var = (SELECT ...)
รูปแบบที่อ่านง่ายกว่าและใช้ใน Prepared Statement ได้:
SET @TotalSalary = (SELECT SUM(Salary) FROM DemoTable);