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

Syntax ตัวแปร (Variables) ใน MySQL Query ด้วย SET และ @

ใน MySQL สามารถกำหนด User-Defined Variables ด้วย SET @var := value แล้วนำไปใช้ใน Query ต่อๆ ไป (Session-scoped)

Syntax

SET @yourVariableName := yourValue;
SELECT * FROM yourTableName WHERE yourColumnName = @yourVariableName;

สร้างตารางและข้อมูล

mysql> create table DemoTable (
    Id int, FirstName varchar(20), LastName varchar(20)
);
mysql> insert into DemoTable values
(10,'Carol','Taylor'),(20,'John','Doe'),(30,'John','Smith'),(40,'David','Miller');

ข้อมูลในตาราง

+------+-----------+----------+
| Id   | FirstName | LastName |
+------+-----------+----------+
| 10   | Carol     | Taylor   |
| 20   | John      | Doe      |
| 30   | John      | Smith    |
| 40   | David     | Miller   |
+------+-----------+----------+

ตั้งค่า Variable และใช้ใน WHERE

mysql> SET @myId := 30;
mysql> SELECT * FROM DemoTable WHERE Id = @myId;

ผลลัพธ์

+------+-----------+----------+
| Id   | FirstName | LastName |
+------+-----------+----------+
| 30   | John      | Smith    |
+------+-----------+----------+

การกำหนดค่า Variable

ขอบเขต (Scope)

  • Session-scoped - ต้องใน Connection เดียวกัน Disconnect แล้วหาย
  • Case-insensitive - @myVar = @MYVAR = @MyVar
  • ไม่ต้อง DECLARE - สร้างได้ทันที

ประเภท Variable

  • User-Defined (@var) - Session, ไม่ต้อง Declare
  • System (@@var) - Global/Session Config (@@datadir, @@version)
  • Local (DECLARE) - ใน Stored Procedure/Function/Trigger เท่านั้น

กรณีใช้งาน

  • เก็บค่าระหว่าง Query หลายคำสั่ง
  • Dynamic SQL ใน Prepared Statement
  • Pass ค่าระหว่าง Procedure
  • Debug/Logging

คำเตือน

  • ไม่ควรใช้ใน Production Query หลัก (Optimizer ไม่รู้ค่า → Plan ไม่ Optimal)
  • Replication: Statement-based อาจต่าง Slave
  • Type ไม่คงที่ (Loosely Typed)

Prepared Statement กับ Variable

SET @id := 30;
PREPARE stmt FROM 'SELECT * FROM DemoTable WHERE Id = ?';
EXECUTE stmt USING @id;
DEALLOCATE PREPARE stmt;
Syntaxตัวอย่างคำอธิบาย
SET @var := valueSET @x := 10Assignment (ใน SET)
SET @var = valueSET @x = 10Assignment (ใน SET, = หรือ := ได้)
SELECT @var := valueSELECT @x := 10Assignment ใน SELECT (คืนค่า 10)
SELECT @var = valueSELECT @x = 10Comparison ใน SELECT (คืน 1/0)