ตัวแปร SQL: การประกาศ การกำหนดค่า และการเลือกใช้ตัวแปรใน SQL Server
⚡ สรุปอย่างชาญฉลาด
ตัวแปรใน SQL Server เป็นอ็อบเจ็กต์ที่มีชื่อ ซึ่งทำหน้าที่เป็นตัวแทนสำหรับค่าข้อมูลเดียวในหน่วยความจำ ตัวแปรจะต้องถูกประกาศด้วยคำสั่ง DECLARE ก่อนจึงจะสามารถกำหนดค่าและนำกลับมาใช้ใหม่ได้
ตัวแปรใน SQL Server คืออะไร?
In เซิร์ฟเวอร์ MS SQLตัวแปรคือวัตถุที่ทำหน้าที่เป็นตัวแทนของตำแหน่งในหน่วยความจำ ตัวแปรจะเก็บค่าข้อมูลเพียงค่าเดียว ซึ่งคุณสามารถอ่านและนำกลับมาใช้ใหม่ได้ในชุดคำสั่งหรือขั้นตอนการทำงาน
ประเภทตัวแปรใน SQL: Local, Global
MS SQL Server มีตัวแปรอยู่สองประเภท:
- ตัวแปรท้องถิ่น
- ตัวแปรส่วนกลาง
อย่างไรก็ตาม ผู้ใช้สามารถสร้างตัวแปรได้เฉพาะในเครื่องเท่านั้น รูปด้านล่างอธิบายตัวแปรสองประเภทที่มีอยู่ใน MS SQL Server
ตัวแปรท้องถิ่น
- ผู้ใช้ประกาศตัวแปรในพื้นที่
- โดยปกติแล้ว ชื่อตัวแปรโลคอลจะขึ้นต้นด้วย @
- ตัวแปรโลคอลทุกตัวจะมีขอบเขตจำกัดเฉพาะชุดคำสั่งหรือขั้นตอนปัจจุบันภายในเซสชันที่กำหนด
ตัวแปรส่วนกลาง
- ระบบจะเก็บรักษาตัวแปรส่วนกลางไว้ ผู้ใช้ไม่สามารถประกาศตัวแปรใหม่ได้
- ชื่อตัวแปรส่วนกลางจะขึ้นต้นด้วย @@
- มันจัดเก็บข้อมูลที่เกี่ยวข้องกับเซสชัน
วิธีการประกาศตัวแปรใน SQL
ก่อนที่จะใช้ตัวแปรใดๆ ในชุดข้อมูลหรือขั้นตอนการทำงาน SQLคุณต้องประกาศตัวแปรนั้นก่อน คำสั่ง DECLARE สร้างตัวแปรที่ทำหน้าที่เป็นตัวแทนสำหรับตำแหน่งในหน่วยความจำ ตัวแปรนั้นจะสามารถใช้งานได้ในส่วนถัดไปของชุดคำสั่งหรือขั้นตอนการทำงานก็ต่อเมื่อได้ประกาศตัวแปรแล้วเท่านั้น
ไวยากรณ์ TSQL:
DECLARE { @LOCAL_VARIABLE[AS] data_type [ = value ] }
กฎ:
- การกำหนดค่าเริ่มต้นนั้นเป็นทางเลือกในระหว่างการประกาศ
- โดยค่าเริ่มต้น คำสั่ง DECLARE จะกำหนดค่าเริ่มต้นให้กับตัวแปรเป็น NULL
- การใช้คำหลัก 'AS' เป็นทางเลือก
- หากต้องการประกาศตัวแปรโลคอลมากกว่าหนึ่งตัว ให้ใส่เครื่องหมายจุลภาคหลังการกำหนดค่าตัวแรก จากนั้นจึงระบุชื่อตัวแปรตัวถัดไป ประเภทข้อมูล.
ตัวอย่างการประกาศตัวแปร
ข้อความค้นหา: ด้วย 'AS'
DECLARE @COURSE_ID AS INT;
ข้อความค้นหา: ไม่มี 'AS'
DECLARE @COURSE_NAME VARCHAR (10);
แบบสอบถาม: ประกาศตัวแปรสองตัว
DECLARE @COURSE_ID AS INT, @COURSE_NAME VARCHAR (10);
การกำหนดค่าให้กับตัวแปร SQL
คุณสามารถกำหนดค่าให้กับตัวแปรได้สามวิธีดังต่อไปนี้:
- ระหว่างการประกาศตัวแปรโดยใช้คำสั่ง DECLARE
- โดยใช้คำสั่ง SET
- โดยใช้คำสั่ง SELECT
เรามาดูทั้งสามวิธีโดยละเอียดกัน
ระหว่างการประกาศตัวแปรโดยใช้คีย์เวิร์ด DECLARE
ไวยากรณ์ T-SQL:
DECLARE { @Local_Variable [AS] Datatype [ = value ] }
ในส่วนนี้ หลังจากระบุชนิดข้อมูลแล้ว คุณสามารถใช้เครื่องหมาย '=' ตามด้วยค่าที่จะกำหนดได้
ค้นหา:
DECLARE @COURSE_ID AS INT = 5 PRINT @COURSE_ID
เมื่อเรียกใช้คำสั่งค้นหา จะแสดงค่าที่กำหนดไว้ในระหว่างการประกาศ ดังแสดงด้านล่าง
การใช้ตัวแปร SQL SET
บางครั้งคุณอาจต้องการแยกการประกาศและการกำหนดค่าเริ่มต้นออกจากกัน คำสั่ง SET จะกำหนดค่าให้กับตัวแปรหลังจากที่ได้ประกาศไปแล้ว ด้านล่างนี้คือวิธีการต่างๆ ในการกำหนดค่าโดยใช้คำสั่ง SET
ตัวอย่าง: การกำหนดค่าให้กับตัวแปรโดยใช้คำสั่ง SET
ไวยากรณ์:
DECLARE @Local_Variable <Data_Type> SET @Local_Variable = <Value>
ค้นหา:
DECLARE @COURSE_ID AS INT SET @COURSE_ID = 5 PRINT @COURSE_ID
การเรียกใช้สคริปต์จะส่งคืนค่าที่กำหนดด้วยคำสั่ง SET ดังแสดงด้านล่าง
ตัวอย่าง: การกำหนดค่าให้กับตัวแปรหลายตัวโดยใช้คำสั่ง SET
ไวยากรณ์:
DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable_2 <Data_Type>, SET @Local_Variable_1 = <Value_1> SET @Local_Variable_2 = <Value_2>
กฎ: คำสั่ง SET หนึ่งคำสั่งสามารถกำหนดค่าให้กับตัวแปรได้เพียงตัวเดียวเท่านั้น
ค้นหา:
DECLARE @COURSE_ID as INT, @COURSE_NAME AS VARCHAR(5) SET @COURSE_ID = 5 SET @COURSE_NAME = 'UNIX' PRINT @COURSE_ID PRINT @COURSE_NAME
คำสั่ง PRINT ทั้งสองคำสั่งจะส่งคืนค่าที่กำหนดไว้ทั้งสองค่า ดังที่แสดงด้านล่าง
ตัวอย่าง: การกำหนดค่าให้กับตัวแปรด้วยซับเควรีแบบสเกลาร์โดยใช้คำสั่ง SET
ไวยากรณ์:
DECLARE @Local_Variable_1 <Data_Type>, @Local_Variable_2 <Data_Type>,SET @Local_Variable_1 = (SELECT <Column_1> from <Table_Name> where <Condition_1>)
กฎ:
- ใส่คำถามไว้ในวงเล็บ
- คำสั่งค้นหาควรเป็นคำสั่งค้นหาแบบสเกลาร์ ซึ่งหมายความว่าจะส่งคืนเพียงหนึ่งแถวและหนึ่งคอลัมน์เท่านั้น มิเช่นนั้น คำสั่งค้นหาจะเกิดข้อผิดพลาด
- หากการค้นหาไม่พบแถวใด ๆ ตัวแปรจะถูกตั้งค่าเป็น EMPTY หรือ NULL
สมมติว่าเรามี ตาราง ชื่อว่า 'Guruตารางขนาด 99 นิ้ว มีสองคอลัมน์ ดังแสดงด้านล่าง ตารางนี้ใช้ในตัวอย่างต่อไปนี้
ตัวอย่างที่ 1: เมื่อซับเควรีส่งคืนผลลัพธ์เพียงหนึ่งแถว
DECLARE @COURSE_NAME VARCHAR (10) SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 3) PRINT @COURSE_NAME
เนื่องจากซับเควรีส่งคืนแถวที่ตรงกันหนึ่งแถว ตัวแปรจึงได้รับค่านั้น ดังแสดงด้านล่าง
ตัวอย่างที่ 2: เมื่อซับเควรีส่งคืนผลลัพธ์เป็นศูนย์แถว
DECLARE @COURSE_NAME VARCHAR (10) SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5) PRINT @COURSE_NAME
เนื่องจากซับเควรีไม่ส่งคืนแถวใดๆ ค่าของตัวแปรจึงว่างเปล่า นั่นคือ NULL ดังนั้นจึงไม่มีอะไรพิมพ์ออกมา ดังที่แสดงด้านล่าง
การใช้ตัวแปร SQL SELECT
เช่นเดียวกับคำสั่ง SET คุณสามารถใช้คำสั่ง SELECT เพื่อกำหนดค่าให้กับตัวแปรหลังจากประกาศตัวแปรด้วยคำสั่ง DECLARE ได้เช่นกัน ด้านล่างนี้คือวิธีการต่างๆ ในการกำหนดค่าโดยใช้คำสั่ง SELECT
ตัวอย่าง: การกำหนดค่าให้กับตัวแปรโดยใช้คำสั่ง SELECT
ไวยากรณ์:
DECLARE @LOCAL_VARIABLE <Data_Type> SELECT @LOCAL_VARIABLE = <Value>
ค้นหา:
DECLARE @COURSE_ID INT SELECT @COURSE_ID = 5 PRINT @COURSE_ID
การกำหนดค่า SELECT จะพิมพ์ค่าออกมาดังที่แสดงด้านล่าง
ตัวอย่าง: การกำหนดค่าให้กับตัวแปรหลายตัวโดยใช้คำสั่ง SELECT
ไวยากรณ์:
DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = <Value_1>, @Local_Variable _2 = <Value_2>
กฎ: ต่างจากคำสั่ง SET คำสั่ง SELECT สามารถกำหนดค่าให้กับตัวแปรหลายตัวที่คั่นด้วยเครื่องหมายจุลภาคได้
DECLARE @COURSE_ID as INT, @COURSE_NAME AS VARCHAR(5) SELECT @COURSE_ID = 5, @COURSE_NAME = 'UNIX' PRINT @COURSE_ID PRINT @COURSE_NAME
ตัวแปรทั้งสองถูกกำหนดค่าในคำสั่ง SELECT เดียวกัน ดังแสดงด้านล่าง
ตัวอย่าง: การกำหนดค่าให้กับตัวแปรด้วยซับเควรีโดยใช้คำสั่ง SELECT
ไวยากรณ์:
DECLARE @Local_Variable_1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = (SELECT <Column_1> from <Table_name> where <Condition_1>)
กฎ:
- ใส่คำถามไว้ในวงเล็บ
- คำสั่งค้นหาจะต้องเป็นคำสั่งค้นหาแบบสเกลาร์ที่ส่งคืนข้อมูลหนึ่งแถวและหนึ่งคอลัมน์ มิเช่นนั้น คำสั่งค้นหาจะแสดงข้อผิดพลาด
- หากการค้นหาไม่พบแถวใด ๆ แสดงว่าตัวแปรนั้นว่างเปล่า หรือก็คือมีค่าเป็น NULL
พิจารณาใหม่อีกครั้งเกี่ยวกับ 'Guruโต๊ะขนาด 99 ฟุต
ตัวอย่างที่ 1: เมื่อซับเควรีส่งคืนผลลัพธ์เพียงหนึ่งแถว
DECLARE @COURSE_NAME VARCHAR (10) SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 1) PRINT @COURSE_NAME
ซับเควรีส่งคืนข้อมูลหนึ่งแถว ดังนั้นตัวแปรจึงเก็บค่าดังกล่าว ดังแสดงด้านล่าง
ตัวอย่างที่ 2: เมื่อซับเควรีส่งคืนผลลัพธ์เป็นศูนย์แถว
DECLARE @COURSE_NAME VARCHAR (10) SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5) PRINT @COURSE_NAME
หากไม่มีแถวที่ตรงกัน ตัวแปรจะว่างเปล่า หรือก็คือมีค่าเป็น NULL ดังแสดงด้านล่าง
ตัวอย่างที่ 3: การกำหนดค่าให้กับตัวแปรโดยใช้คำสั่ง SELECT ปกติ
ไวยากรณ์:
DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = <Column_1> from <Table_name> where <Condition_1>
กฎ:
- ต่างจากคำสั่ง SET ตรงที่หากคำสั่งค้นหาได้ผลลัพธ์หลายแถว ค่าของตัวแปรจะถูกกำหนดให้เป็นค่าของแถวสุดท้าย
- หากการค้นหาไม่พบแถวใด ๆ ตัวแปรจะถูกตั้งค่าเป็น EMPTY หรือ NULL
แบบสอบถามที่ 1: แบบสอบถามนี้จะส่งคืนข้อมูลหนึ่งแถว
DECLARE @COURSE_NAME VARCHAR (10) SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 3 PRINT @COURSE_NAME
แถวที่ตรงกันเพียงแถวเดียวจะกำหนดค่าตัวแปร ดังแสดงด้านล่าง
แบบสอบถามที่ 2: แบบสอบถามนี้ส่งคืนข้อมูลหลายแถว
DECLARE @COURSE_NAME VARCHAR (10) SELECT @COURSE_NAME = Tutorial_name from Guru99 PRINT @COURSE_NAME
เมื่อมีหลายแถวที่ตรงกัน ตัวแปรจะเก็บค่าจากแถวสุดท้าย ดังแสดงในภาพด้านล่าง
แบบสอบถามที่ 3: แบบสอบถามนี้ส่งคืนข้อมูลศูนย์แถว
DECLARE @COURSE_NAME VARCHAR (10) SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 5 PRINT @COURSE_NAME
เมื่อไม่มีแถวใดตรงกัน ตัวแปรจะมีค่าว่างเปล่า หรือก็คือ NULL ดังแสดงด้านล่าง
ตัวอย่างตัวแปร SQL อื่นๆ
ตัวแปรที่ประกาศไว้สามารถนำไปใช้ภายในคำสั่งค้นหาได้เช่นกัน ตัวอย่างเช่น ในส่วน WHERE เพื่อกรองแถวต่างๆ
ค้นหา:
DECLARE @COURSE_ID Int = 1 SELECT * from Guru99 where Tutorial_id = @COURSE_ID
ตัวแปรนี้จะกรองผลการค้นหาและส่งคืนแถวที่ตรงกัน ดังแสดงด้านล่าง
ข้อเท็จจริงที่น่าสนใจเกี่ยวกับตัวแปร SQL Server!
- สามารถแสดงค่าตัวแปรท้องถิ่นได้โดยใช้คำสั่ง PRINT เช่นเดียวกับคำสั่ง SELECT
- ชนิดข้อมูลตารางไม่อนุญาตให้ใช้ 'AS' ในระหว่างการประกาศ
- SET เป็นไปตามมาตรฐาน ANSI ในขณะที่ SELECT ไม่เป็นไปตามมาตรฐานดังกล่าว
- การสร้างตัวแปรโลคอลชื่อ @ ก็สามารถทำได้เช่นกัน ตัวอย่างเช่น สามารถประกาศได้ดังนี้:
'DECLARE @@ as VARCHAR (10)'
















