Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การใช้ MySQL SELECT INTO กับตัวแปร User-defined Variable

การกำหนดค่าตัวแปรผู้ใช้ (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);