ความแตกต่างระหว่าง User-defined Variables และ Local Variables
User-defined Variables (Session Variables)
- ขึ้นต้นด้วย
@ (เช่น @my_var)
- เป็น Session-specific - อยู่จนกว่า session จะจบ
- Loosely typed - ไม่ต้องประกาศชนิดข้อมูล
- เข้าถึงได้จากทุกที่ใน session เดียวกัน
- ไม่ถูก re-initialize ระหว่าง session
Local Variables
- ไม่มี
@ นำหน้า
- ใช้ได้เฉพาะใน Stored Programs (Stored Procedures, Functions, Triggers, Events)
- ต้องประกาศด้วย
DECLARE พร้อม Data Type
- มีขอบเขต (Scope) ภายใน BEGIN...END block เท่านั้น
- ถูก re-initialize ทุกครั้งที่เรียก Stored Procedure
การประกาศและกำหนดค่า
User-defined Variables
-- วิธีที่ 1: SET
SET @my_var = 10;
-- วิธีที่ 2: SELECT ด้วย :=
SELECT @my_var := 10;
-- ⚠️ ไม่มี : จะกลายเป็นการเปรียบเทียบ (คืน 0/1)
SELECT @my_var = 10; -- ผลลัพธ์: 1 (true) แต่ @my_var ไม่เปลี่ยนค่า
Local Variables
DECLARE my_var INT DEFAULT 10;
SET my_var = my_var + 10;
-- หรือ
SELECT my_var + 10 INTO my_var;
ตัวอย่างเปรียบเทียบใน Stored Procedure
DELIMITER //
CREATE PROCEDURE sp_VariableDemo()
BEGIN
DECLARE local_var INT DEFAULT 10;
SET local_var = local_var + 10;
SET @user_var = @user_var + 10;
SELECT local_var, @user_var;
END //
DELIMITER ;
-- ตั้งค่าเริ่มต้น
SET @user_var = 10;
-- เรียกครั้งที่ 1
CALL sp_VariableDemo();
-- local_var: 20, @user_var: 20
-- เรียกครั้งที่ 2
CALL sp_VariableDemo();
-- local_var: 20 (reset to 10 + 10), @user_var: 30 (20 + 10)
-- เรียกครั้งที่ 3
CALL sp_VariableDemo();
-- local_var: 20, @user_var: 40
ตารางเปรียบเทียบ
| คุณสมบัติ | User-defined (@var) | Local Variable (DECLARE) |
| ขอบเขต (Scope) | Session 全体 | Stored Program block |
| ชนิดข้อมูล | Dynamic (Loosely typed) | Static (ต้อง DECLARE) |
| อายุการใช้งาน | จนกว่า Session จะจบ | จนกว่า Block จะจบ |
| Re-initialization | ไม่ (คงค่าไว้) | ทุกครั้งที่เข้าบล็อก |
| มองเห็นระหว่าง Session | ไม่ (Session แยกกัน) | N/A |
| ใช้ใน Prepared Statements | ได้ | ไม่ได้ |
เมื่อไหร่ควรใช้ตัวไหน
- User-defined: ส่งค่าระหว่าง queries ใน session เดียว, Dynamic SQL, Prepared statements
- Local: Logic ภายใน Stored Procedure/Function, Temporary calculations, Loop counters