ตัวแปร SQL: การประกาศ การกำหนดค่า และการเลือกใช้ตัวแปรใน SQL Server

⚡ สรุปอย่างชาญฉลาด

ตัวแปรใน SQL Server เป็นอ็อบเจ็กต์ที่มีชื่อ ซึ่งทำหน้าที่เป็นตัวแทนสำหรับค่าข้อมูลเดียวในหน่วยความจำ ตัวแปรจะต้องถูกประกาศด้วยคำสั่ง DECLARE ก่อนจึงจะสามารถกำหนดค่าและนำกลับมาใช้ใหม่ได้

  • 📦 ความหมาย: ตัวแปรใน SQL Server จะเก็บค่าเพียงค่าเดียวและทำหน้าที่เป็นตัวแทนสำหรับตำแหน่งในหน่วยความจำ
  • 🔵 ระดับท้องถิ่นและระดับโลก: SQL Server รองรับตัวแปรโลคอลที่ผู้ใช้ประกาศซึ่งขึ้นต้นด้วย @ และตัวแปรโกลบอลที่ระบบดูแลซึ่งขึ้นต้นด้วย @@
  • 📝 ประกาศ: คำสั่ง DECLARE สร้างตัวแปรขึ้นมา และโดยค่าเริ่มต้นจะกำหนดค่าเริ่มต้นเป็น NULL
  • 🔀 วิธีการจัดสรรงาน 3 วิธี: สามารถกำหนดค่าได้ในระหว่างคำสั่ง DECLARE, SET หรือ SELECT
  • 🔎 แบบสอบถามย่อยแบบสเกลาร์: ทั้งคำสั่ง SET และ SELECT สามารถอ่านค่าเดียวจากคำสั่งค้นหาลงในตัวแปรได้
  • 🧠 SET กับ SELECT: คำสั่ง SET กำหนดค่าให้กับตัวแปรเพียงตัวเดียวและเป็นไปตามมาตรฐาน ANSI ในขณะที่คำสั่ง SELECT สามารถกำหนดค่าให้กับตัวแปรหลายตัวพร้อมกันได้

ตัวแปรใน SQL Server: DECLARE, SET และ SELECT

ตัวแปรใน SQL Server คืออะไร?

In เซิร์ฟเวอร์ MS SQLตัวแปรคือวัตถุที่ทำหน้าที่เป็นตัวแทนของตำแหน่งในหน่วยความจำ ตัวแปรจะเก็บค่าข้อมูลเพียงค่าเดียว ซึ่งคุณสามารถอ่านและนำกลับมาใช้ใหม่ได้ในชุดคำสั่งหรือขั้นตอนการทำงาน

ประเภทตัวแปรใน SQL: Local, Global

MS SQL Server มีตัวแปรอยู่สองประเภท:

  • ตัวแปรท้องถิ่น
  • ตัวแปรส่วนกลาง

อย่างไรก็ตาม ผู้ใช้สามารถสร้างตัวแปรได้เฉพาะในเครื่องเท่านั้น รูปด้านล่างอธิบายตัวแปรสองประเภทที่มีอยู่ใน MS SQL Server

แผนภาพแสดงประเภทตัวแปรสองประเภทใน 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

เมื่อเรียกใช้คำสั่งค้นหา จะแสดงค่าที่กำหนดไว้ในระหว่างการประกาศ ดังแสดงด้านล่าง

แสดงผลลัพธ์ของตัวแปรที่กำหนดค่าระหว่างการประกาศ โดยพิมพ์ค่า 5 ออกมา

การใช้ตัวแปร 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 โดยพิมพ์ค่า 5

ตัวอย่าง: การกำหนดค่าให้กับตัวแปรหลายตัวโดยใช้คำสั่ง 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 โดยพิมพ์ 5 และ UNIX

ตัวอย่าง: การกำหนดค่าให้กับตัวแปรด้วยซับเควรีแบบสเกลาร์โดยใช้คำสั่ง 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 นิ้ว มีสองคอลัมน์ ดังแสดงด้านล่าง ตารางนี้ใช้ในตัวอย่างต่อไปนี้

Guruตาราง 99 ที่มีคอลัมน์ Tutorial_ID และ Tutorial_name ถูกใช้ในตัวอย่าง

ตัวอย่างที่ 1: เมื่อซับเควรีส่งคืนผลลัพธ์เพียงหนึ่งแถว

DECLARE @COURSE_NAME VARCHAR (10)
SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 3)
PRINT @COURSE_NAME

เนื่องจากซับเควรีส่งคืนแถวที่ตรงกันหนึ่งแถว ตัวแปรจึงได้รับค่านั้น ดังแสดงด้านล่าง

ผลลัพธ์ของซับเควรีแบบสเกลาร์ที่กำหนดด้วย SET ซึ่งแสดงชื่อบทเรียนที่ตรงกัน

ตัวอย่างที่ 2: เมื่อซับเควรีส่งคืนผลลัพธ์เป็นศูนย์แถว

DECLARE @COURSE_NAME VARCHAR (10)
SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5)
PRINT @COURSE_NAME

เนื่องจากซับเควรีไม่ส่งคืนแถวใดๆ ค่าของตัวแปรจึงว่างเปล่า นั่นคือ NULL ดังนั้นจึงไม่มีอะไรพิมพ์ออกมา ดังที่แสดงด้านล่าง

ผลลัพธ์ของซับเควรี SET แบบสเกลาร์ที่ไม่ส่งคืนแถวใด ๆ ทำให้ตัวแปรเป็น 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 โดยแสดงผลเป็น 5

ตัวอย่าง: การกำหนดค่าให้กับตัวแปรหลายตัวโดยใช้คำสั่ง 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 เดียว โดยพิมพ์ 5 และ UNIX

ตัวอย่าง: การกำหนดค่าให้กับตัวแปรด้วยซับเควรีโดยใช้คำสั่ง 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

ซับเควรีส่งคืนข้อมูลหนึ่งแถว ดังนั้นตัวแปรจึงเก็บค่าดังกล่าว ดังแสดงด้านล่าง

ผลลัพธ์ของซับเควรีแบบสเกลาร์ที่กำหนดด้วยคำสั่ง SELECT ซึ่งแสดงชื่อบทเรียนที่ตรงกัน

ตัวอย่างที่ 2: เมื่อซับเควรีส่งคืนผลลัพธ์เป็นศูนย์แถว

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5)
PRINT @COURSE_NAME

หากไม่มีแถวที่ตรงกัน ตัวแปรจะว่างเปล่า หรือก็คือมีค่าเป็น NULL ดังแสดงด้านล่าง

ผลลัพธ์ของซับควอรี SELECT แบบสเกลาร์ที่ไม่ส่งคืนแถวใด ๆ ทำให้ตัวแปรเป็น 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

แถวที่ตรงกันเพียงแถวเดียวจะกำหนดค่าตัวแปร ดังแสดงด้านล่าง

ผลลัพธ์ของคำสั่ง SELECT ปกติที่ส่งคืนข้อมูลหนึ่งแถว

แบบสอบถามที่ 2: แบบสอบถามนี้ส่งคืนข้อมูลหลายแถว

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99
PRINT @COURSE_NAME

เมื่อมีหลายแถวที่ตรงกัน ตัวแปรจะเก็บค่าจากแถวสุดท้าย ดังแสดงในภาพด้านล่าง

ผลลัพธ์ของการกำหนดค่า SELECT ปกติที่ส่งคืนหลายแถว keeping ค่าแถวสุดท้าย

แบบสอบถามที่ 3: แบบสอบถามนี้ส่งคืนข้อมูลศูนย์แถว

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 5
PRINT @COURSE_NAME

เมื่อไม่มีแถวใดตรงกัน ตัวแปรจะมีค่าว่างเปล่า หรือก็คือ NULL ดังแสดงด้านล่าง

ผลลัพธ์ของการกำหนดค่า SELECT ปกติที่ไม่ส่งคืนแถวใด ๆ ทำให้ตัวแปรเป็น NULL

ตัวอย่างตัวแปร SQL อื่นๆ

ตัวแปรที่ประกาศไว้สามารถนำไปใช้ภายในคำสั่งค้นหาได้เช่นกัน ตัวอย่างเช่น ในส่วน WHERE เพื่อกรองแถวต่างๆ

ค้นหา:

DECLARE @COURSE_ID Int = 1
SELECT * from Guru99 where Tutorial_id = @COURSE_ID

ตัวแปรนี้จะกรองผลการค้นหาและส่งคืนแถวที่ตรงกัน ดังแสดงด้านล่าง

ผลลัพธ์ของการใช้ตัวแปรในเงื่อนไข WHERE เพื่อกรองข้อมูล Guruตาราง 99

ข้อเท็จจริงที่น่าสนใจเกี่ยวกับตัวแปร SQL Server!

  • สามารถแสดงค่าตัวแปรท้องถิ่นได้โดยใช้คำสั่ง PRINT เช่นเดียวกับคำสั่ง SELECT
  • ชนิดข้อมูลตารางไม่อนุญาตให้ใช้ 'AS' ในระหว่างการประกาศ
  • SET เป็นไปตามมาตรฐาน ANSI ในขณะที่ SELECT ไม่เป็นไปตามมาตรฐานดังกล่าว
  • การสร้างตัวแปรโลคอลชื่อ @ ก็สามารถทำได้เช่นกัน ตัวอย่างเช่น สามารถประกาศได้ดังนี้:
'DECLARE @@ as VARCHAR (10)'

คำถามที่พบบ่อย

หลังจากเรียกใช้คำสั่ง DECLARE โดยไม่มีการกำหนดค่า ตัวแปรใน SQL Server จะมีค่าเป็น NULL ตัวแปรนั้นมีอยู่แต่ไม่มีค่าจนกว่าคุณจะกำหนดค่าโดยใช้คำสั่ง DECLARE ร่วมกับเครื่องหมาย =, SET หรือ SELECT การอ้างอิงถึงตัวแปรก่อนการกำหนดค่าจะส่งคืนค่า NULL เช่นกัน

เมื่อซับเควรีไม่ส่งคืนแถวใดๆ คำสั่ง SET จะกำหนดค่าเป็น NULL และเขียนทับค่าปัจจุบัน ในขณะที่คำสั่ง SELECT จะคงค่าตัวแปรไว้เหมือนเดิมping ไม่ว่าจะมีค่าเท่าใดก็ตาม ความแตกต่างนี้มีความสำคัญเมื่อตัวแปรเริ่มต้นด้วยค่าที่ไม่ใช่ค่าว่าง (NULL)

ตัวแปรตารางที่ประกาศโดยใช้ DECLARE @t TABLE(…) จะเก็บชุดผลลัพธ์ขนาดเล็กที่จำกัดขอบเขตไว้เฉพาะชุดข้อมูลเดียว แตกต่างจากตารางชั่วคราว (#temp table) ตรงที่มันจะคงอยู่เฉพาะภายในชุดข้อมูลนั้น ๆ ไม่สามารถแก้ไขได้หลังจากสร้างแล้ว และมักเหมาะสำหรับชุดข้อมูลขนาดเล็ก

ตัวแปรโลคอลจะจำกัดอยู่เฉพาะในแบตช์ โพรซีเดอร์ที่จัดเก็บ หรือทริกเกอร์ที่ประกาศไว้ ภายในเซสชันเดียวเท่านั้น คำหลัก GO จะปิดท้ายแบตช์ ดังนั้นตัวแปรที่ประกาศก่อน GO จึงไม่สามารถอ้างอิงได้หลังจากนั้น

ตัวแปรสามารถใช้งานได้กับ SQL Server เกือบทุกรูปแบบ ประเภทข้อมูลรวมถึงชนิดข้อมูล int, decimal, varchar, nvarchar, date, datetime, bit และ table ควรจับคู่ตัวแปรกับคอลัมน์ที่ตัวแปรนั้นแสดง เพื่อหลีกเลี่ยงข้อผิดพลาดจากการแปลงชนิดข้อมูลโดยปริยาย

กำหนดค่าตัวแปรใหม่ให้เท่ากับตัวมันเองโดยใช้คำสั่ง SET ตัวอย่างเช่น SET @counter = @counter + 1 หรือจะใช้คำสั่ง SELECT ก็ได้ เช่น SELECT @total = @total + price รูปแบบนี้ใช้ในการสร้างลูปและการคำนวณผลรวมสะสมภายในสคริปต์และโพรซีเดอร์ที่จัดเก็บไว้

ใช่. นักบิน GitHub สามารถสร้างคำสั่ง DECLARE, SET และ SELECT จากข้อความแสดงความคิดเห็นที่เป็นภาษาธรรมชาติ และแนะนำชนิดข้อมูลที่เหมาะสมได้ ควรตรวจสอบชื่อ ชนิด และตรรกะการกำหนดค่าที่สร้างขึ้นเทียบกับสคีมาของคุณก่อนนำไปใช้งานจริงเสมอ

ผู้ช่วย AI และการเรียนรู้ของเครื่องจักร tracเช่น วิธีการรับและส่งค่าของตัวแปร การระบุตัวแปรที่ไม่ได้เริ่มต้นใช้งานหรือตัวแปรที่มีประเภทไม่ถูกต้อง และการแนะนำการเขียนใหม่โดยใช้ชุดข้อมูลที่มาแทนที่ลูปที่ทำงานช้าซึ่งใช้ตัวแปรเป็นตัวขับเคลื่อน นักพัฒนาซอฟต์แวร์ยังคงตรวจสอบการเปลี่ยนแปลงแต่ละครั้งกับข้อมูลและปริมาณงานจริงอยู่ดี

สรุปโพสต์นี้ด้วย: