تعریف متغیر در SQL به معنی در نظر گرفتن فضایی از حافظه با نام مشخص – به منظور مراجعه ساده و سریع به آن – است که باید دادههای موقتی را برای انجام عملیات مختلف در کوئریها نگهداری کند. داشتن دانش درباره نحوه تعریف متغیر در SQL برای نوشتن کدهای مقیاسپذیر بسیار مهم است. متغیرها به عنوان ظرفهایی برای نگهداری دادهها کار میکنند. در نتیجه مدیران پایگاه داده میتوانند، اطلاعات را درون برنامههای SQL ذخیره کرده و روی آنها به اجرای عملیات بپردازند. متغیرهای SQL جزو ساختارهای بنیادین برای ساخت اپلکیشنهای پایگاه داده قدرتمند و کارآمد هستند. استفاده از این متغیرها باعث افزایش انعطافپذیری و کارآمدی کوئریهای پایگاه داده میشود.
در این مطلب از مجله فرادرس به بررسی روشهای مختلف و اصول توصیه شده برای تعریف متغیر در SQL پرداختهایم. همراه با سینتکس هر روش، مثالهای کدنویسیشدهای را نیز ارائه دادهایم. با رعایت این روشها و اصول میتوان کوئریهای پویاتر و کارآمدتری نوشت.
روش تعریف متغیر در SQL چیست؟
متغیر به عنوان ظرفی برای نگهداری مقادیر مختلف استفاده میشود. با کمک متغیرها میتوان انواع عملیات مختلف را بر روی دادههای ذخیره شده پیادهسازی کرد. زبان SQL چندین روش متنوع را برای تعریف و استفاده از متغیرها فراهم کرده است. این روشها شامل استفاده از عبارت WITH، دستور SET و غیره میشوند.
در فهرست زیر، تمام روشهای مربوط به تعریف متغیر را در SQL معرفی کردهایم.
- استفاده از دستور SET در SQL
- استفاده از عبارت WITH در SQL
- استفاده از «زیرکوئریهای مرتبهای» (Scalar Subqueries) یا زیرکوئریهای اسکالر
- استفاده از «جدولهای موقت» (Temporary Tables)
- استفاده از عبارت دستوری DECLARE
در ادامه تمام روشهای بالا را به ترتیب بررسی کرده و برای هر کدام مثالهایی را نمایش میدهیم. آخرین روش به عنوان رایجترین تکنیک تعریف متغیر در نرمافزار SQL Server شناخته میشود. بنابراین آن را به صورت مفصلتر در بخش جداگانهای بررسی کردیم.
استفاده از دستور SET برای تعریف متغیر در SQL
با اینکه زبان SQL مانند بعضی از سامانههای مدیریت پایگاه داده، به صورت ازپیشتعریفشده، دستوری به نام SET ندارد، برای تخصیص دادن متغیرها میتوانیم از توابع تعریف شده توسط کاربر استفاده کنیم.
بعد از اجرای کد بالا، با فرض اینکه سطرها و ستونهای متناظر با کوئری وجود داشته باشند، خروجی زیر ظاهر میشود.
در کد بالا، کوئری رشته GFG را انتخاب کرده و آن را با نام NAME نامگذاری کرده است. در نتیجه، خروجی به شکل یک ستون با نام NAME و رشتهای با مقدار GFG در تنها ردیف آن ایجاد میشود.
توجه: دستور SET به صورت درونی در SQL تعریف نشده است. اما در پایگاهدادهای مانند SQL Server تعریف شده و قابل استفاده است. روش استفاده از این دستور را در بخشهای بعدی نمایش دادهایم.
استفاده از عبارت WITH برای تعریف متغیر
عبارت WITH در SQL برای تولید جدول نتایج موقتی در کوئریها به کار برده میشود. در داخل عبارت WITH میتوان متغیرهای مختلفی را نیز تعریف و مقداردهی کرد.
در کدهای پایین، روش تخصیص مقدار را به متغیر، نمایش دادهایم.
بعد از اجرای کد بالا، با فرض اینکه سطرها و ستونهای متناظر با کوئری وجود داشته باشند، خروجی زیر ظاهر میشود.
در خروجی بالا، جدول مجازی به نام Customers با استفاده از «عبارتهای جدول رایج» (Common Table Expression) یا همان CTE در SQL ایجاد شده است. این جدول شامل فقط یک ستون به نام NAME است که رشتهی GFG به عنوان مقدار درون آن قرار دارد.
عبارت SELECT در SQL همه ردیفهای جدول Customers را فراخوانی میکند. در نتیجه تنها ردیف موجود در جدول با مقدار GFG در خروجی نمایش داده میشود.
استفاده از جدول های موقت برای تعریف متغیر
در زمان برقراری سشنها میتوان از جدولهای موقت برای ذخیرهسازی و اجرای عملیات بر روی دادهها استفاده کرد. به همین صورت توسعهدهندگان هم میتوانند از مزایای جدولهای موقت برای شبیهسازی تعریف متغیرها استفاده کنند.
در کوئری زیر، مثال سادهای را از این بابت پیادهسازی کردهایم.
بعد از اجرای کوئری بالا، خروجی زیر تولید شده و نمایش داده میشود.
در مثال بالا، جدول موقتی به نام Temp_Table ایجاد شده و در خروجی نمایش داده شده است. این جدول حاوی دو ستون زیر است.
تنها ردیف در این جدول با مقادیر 23 و GFG پر شده است. سپس عبارت دستوری SELECT ردیفهای این جدول را فراخوانی کرده و در خروجی با همین ترتیب موجود در جدول، نمایش میدهد.
استفاده از زیرکوئری های اسکالر برای تعریف متغیر
از زیرکوئری در SQL برای قرار دادن کوئریها درون کوئریهای دیگر استفاده میشود. با کمک این تکنیک هم میتوان در SQL متغیر تعریف کرد. در کد زیر مثال سادهای از تعریف متغیر با این روش را نمایش دادهایم.
بعد از اجرای کد بالا، جدول مجازی زیر تشکیل شده و در خروجی نمایش داده میشود.
در خروجی بالا مقدار 23 به ستونی با نام num اختصاص داده شده است. این عملیات با استفاده از زیرکوئری SELECT درون کوئری SELECT انجام شد. در این روش مقدار حاصل از کوئری درونی به صورت مستقیم به ستون num که توسط کوئری بیرونی تعریف شده، اختصاص داده میشود.
پایگاه داده SQL Server ابزارها و روشهای بیشتری هم برای تعریف متغیر فراهم کرده است. در بخش بعد به بررسی روشهای اختصاصی این پایگاه داده میپردازیم.
فیلم های آموزش SQL Server در فرادرس
SQL Server یکی از بهترین و محبوبترین نرمفزارهایی است که میتواند به ما برای ساخت، نگهداری و مدیریت بانکهای اطلاعاتی کمک کند. این نرمافزار توسط شرکت مایکروسافت توسعه داده شده است و قابلیت ذخیره، مدیریت و بازیابی دادهها را در پایگاه داده رابطهای (RDBMS) فراهم میکند. برای یادگرفتن روش استفاده از SQL Server میتوانید فیلمهای آموزشی مربوط به این پایگاه داده را در فرادرس مشاهده کرده و پابهپای مراحل آموزشی آنها به پیش بروید. این دورهها به شکلی طراحی و تولید شدهاند که تمام مراحل SQL Server را از سطوح مبتدی تا پیشرفته آموزش بدهند.
وبسایت فرادرس، یکی از بهترین موسسات آموزشی است و فیلمهای بسیار مناسبی را برای آموزش پایگاه داده SQL Server تولید کرده. در فرادرس برای آموزش کامل SQL Server، فیلمهای متنوعی تولید شدهاند. یعنی اینکه برای هر کس با توجه به سطح علمی آن فرد گزینه مناسبی پیدا میشود. به طور کل میتوان به کیفیت بالای مطالب مورد تدریس و فیلمهای تهیه شده، هزینه مقرون بهصرفه و امکان بازبینی چندین باره آموزشها به عنوان مزایای فیلمهای آموزشی اشاره کرد. در پایین چند مورد از این فیلمهای آموزشی را فهرست کردهایم. با کلیک بر روی تصویر بالا به صفحه اصلی این مجموعه آموزشی هدایت شده و از فیلمهای بیشتر دیدن کنید.
روش تعریف متغیر در نرم افزار SQL Server
در این بخش از مطلب به بررسی روش تعریف و استفاده از متغیر در پایگاه داده SQL Server پرداختهایم. قبل از بیان روشهای استفاده از متغیرها باید روش اختصاصی SQL Server برای ساخت آنها را بررسی کنیم. در پایگاه داده SQL Server از کلمه کلیدی DECLARE برای تعریف متغیر استفاده میشود. بعد از آن هم باید نام متغیر را تعریف کنیم.
نکته: در این مطلب از نمونه مجموعهدادههای «AdventureWorks» – قابل دانلود از لینک (+) – استفاده کردهایم. برای استفاده از این مجموعه داده فقط کافیست که آن را به پایگاه داده خود وارد کنید. در انتهای مطلب، توضیحات کاملی درباره روش افزودن فایل دانلود شده این مجموعه داده به SQL Server ارائه شده است.
سینتکس تعریف متغیر در SQL Server
در کادر پایین، سینتکس اولیه مربوط به تعریف متغیر در SQL Server را نمایش دادهایم.
اکنون باید سینتکس بالا را تفسیر کنیم.
- همینطور که مشاهده میکنید در ابتدای سینتکس از کلمه کلیدی DECLARE استفاده شده است. این کلمه مختص پایگاه داده SQL Server است.
- در مرحله بعدی نام متغیر را مشخص میکنیم. به آرگومان @LOCAL_VARIABLE توجه کنید. نام متغیرهای محلی در SQL Server باید با نماد @ شروع شوند. این یکی از الزامات سینتکس تعریف متغیر در SQL سرور است.
- در نهایت هم باید نوع دادههای قابل پذیرش توسط متغیر را اعلام کنیم. نوع داده را در جایگاه آرگومان data_type مینویسیم.
- آرگومان value که در سینتکس مشخص شده، پارامتر اختیاری است که به اختصاص دادن مقدار اولیه به متغیر در طول فرایند تعریف، کمک میکند.
از طرف دیگر میتوان در مراحل بعد نیز به این متغیرها مقدار اختصاص داد و هم مقدار آنها را بهروزرسانی کرد. اگر برای متغیر تعریف شده مقداردهی اولیه نکنیم، به صورت پیشفرض مقدار NULL را میپذیرد.
در مثال زیر، متغیری را تعریف کردهایم که نام آن @TestVariable است. نوع قابل پذیرش توسط این متغیر varchar بوده و همزمان با تعریف، عبارت Save Our Planet را هم به عنوان مقدار رشتهای به آن اختصاص دادهایم.
بعد از اجرای کوئری بالا پیغام Save Our Planet
در خروجی نمایش داده میشود.
تخصیص مقدار به متغیر در SQL
پایگاه داده SQL Server، به غیر از تکنیک مقداردهی اولیه متغیرها دو روش دیگر هم برای تخصیص مقدار به متغیر را ارائه میدهد.
- در روش اول، از عبارت SET استفاده میشود.
- و در روش دوم، عبارت دستوری SELECT به کار برده میشود.
در مثال زیر، ابتدا متغیری را تعریف کرده و سپس با استفاده از دستور SET به آن مقدار مشخص شدهای را اختصاص میدهیم.
بعد از اجرای کوئری بالا پیغام One Planet One Life در خروجی نمایش داده میشود.
در مثال بعدی، از عبارت SELECT برای تخصیص مقدار به متغیر رشتهای تعریف شده استفاده کردهایم.
بعد از اجرای کوئری بالا پیغام Save the Nature
در خروجی نمایش داده میشود.
علاوه بر موارد بیان شده، میتوان از عبارت SELECT برای اختصاص دادن مقدار از درون View در SQL، جدول یا «توابعی با مقدارهای اسکالر» (Scalar-Valued Functions) نیز به متغیر استفاده کرد. با استفاده از مثال پایین، نگاهی به این مفهوم کاربردی انداختهایم.
بعد از اجرای کوئری بالا پیغام Australia Bike Retailer در خروجی نمایش داده میشود. در کد بالا به متغیر @PurchaseName از درون جدول Vendor مقداری اختصاص داده شده است.
اکنون در کد زیر میخواهیم از تابعی اسکالری مقداری را به متغیر تخصیص بدهیم.
بعد از اجرای کد بالا، جدول موقت زیر تولید شده و در خروجی به کاربر نمایش داده میشود.
تعریف چندین متغیر در SQL
در زمان کار با پایگاههای داده، سناریوهای مختلفی پیش میآید که شاید در طول آنها لازم شود چندین متغیر مختلف تعریف کنیم. در واقع میتوانیم این کار را با تعریف کردن هر متغیر به صورت مجزا و اختصاص دادن مقداری به هر کدام انجام بدهیم.
در کوئری زیر، دو متغیر را به صورت جدا از هم تعریف کرده و به هر کدام مقداری را اختصاص دادهایم.
بعد از اجرای کد بالا، خروجی زیر تولید شده و نمایش داده میشود.
Save Water Save Life 6D8446DE-68DA-4169-A2C5-4C0995C00CC1
روش نمایش داده شده برای تعریف متغیر، نامناسب و خسته کننده است. البته روش کارآمدتری نیز برای تعریف چندین متغیر مختلف در یک خط کد وجود دارد. به منظور تعریف چند متغیر در یک خط، میتوانیم مانند مثال بالا از کلمه کلیدی DECLARE استفاده کنیم. در مثال زیر، برای مقداردهی این متغیرها از یک عبارت SELECT نیز استفاده کردهایم.
بعد از اجرای کد بالا، خروجی زیر تولید شده و نمایش داده میشود.
Save Water Save Life 6D8446DE-68DA-4169-A2C5-4C0995C00CC1
همچنین میتوانیم از عبارت SELECT با هدف تخصیص مقدار به چندین متغیر از درون جدولهای مختلف نیز استفاده کنیم. عبارت SELECT یکی از کلیدیترین عبارتهای SQL برای تشکیل جدولهای موقت و View-ها است. در صورت استفاده از عبارت WHERE در کنار این عبارت امکان سفارشیسازی بیشتر مجموعه داده نتیجه نیز ممکن میشود. برای آشنایی و کسب دانش بیشتر درباره کار با این عبارتها میتوانید مطلب راهنمای جامع عبارت های SELECT و WHERE در زبان SQL را از مجله فرادرس مشاهده کنید.
در کد زیر، مثال سادهای را به این منظور پیادهسازی کردهایم، البته این مثال هم بر روی پایگاه داده از پیش تعریف شده «AdventureWorks» اعمال شده است. در صورت استفاده از مثالها بر روی پایگاه داده شخصی، حتما به تنظیم کردن نام جدولها و ستونها توجه کنید.
بعد از اجرای کد بالا، خروجی زیر نمایش داده میشود.
AUSTRALI0001 Australia Bike Retailer
نکات مفید درباره تعریف متغیر در SQL
کوئرینویسی، فرایندی است که در آن، به کمک زبان خاصی مانند SQL، دادهها را از پایگاه داده استخراج میکنیم. در واقع، کوئرینویسی به کاربران اجازه میدهد تا به سادگی و با سرعت، دادههای مورد نیاز خود را از پایگاه داده بدست بیاورند. تعریف متغیر در SQL یکی از هزاران دستور قابل اجرا در کوئرینویسی است. برای حرفهای شدن در این امر میتوانید فیلم آموزش کوئری نویسی پیشرفته در SQL Server را از فرادرس مشاهده کنید. لینک مربوط به این فیلم را در پایین نیز قرار دادهایم.
در این بخش از مطلب، چند مورد از مهمترین نکاتی را مورد اشاره قرار دادهایم که در زمان کار با متغیرها مورد توجه قرار میگیرند. عدم توجه به این نکات میتواند منجر به بروز خطاهایی شود که شاید برای برطرف شدن مدت زمان زیادی از وقت توسعهدهندگان را تلف کنند.
توجه به دامنه فعالیت متغیرهای محلی
دامنه متغیرهای محلی در انتهای محدوده عملیاتی آنها به پایان میرسد. در کدهای پایین مثالی از این مشکل را مشاهده میکنیم.
بعد از اجرای کد بالا با پیغام خطای زیر روبهرو میشویم.
Msg 137, Level 15, State 2, Server 80ee02d42e2a, Line 1 Must declare the scalar variable "@TestVariable".
اسکریپت بالا به دلیل استفاده از عبارت GO باعث بهوجود آمدن پیغام خطا شده است. در پایگاه داده SQL Server، عبارت GO به عنوان تعیین کننده انتهای دستهای از دستورات به کار برده میشود. بنابراین طول عمر متغیر @TestVariable با عبارت GO به پایان میرسد. هرچند با استفاده از جدولهای موقت برای نگهداری مقدار متغیر، میتوان بر این مشکل غلبه کرد. در کادر زیر روش استفاده از جدول موقت را نشان دادهایم.
بعد از اجرای کد بالا، عبارت Hello World در خروجی به کاربر نمایش داده میشود.
تعیین دقیق مقدار موجود در متغیر
فرض کنید که مقداری را از درون جدول خاصی استخراج کرده و به متغیری اختصاص دادهایم. اما مجموعه نتایج برگشت داده شده توسط عبارت SELECT شامل چندین ردیف مختلف میشود. مشکل اصلی در این مسئله اینجاست که باید بدانیم کدام مقدار به متغیر مورد نظر اختصاص داده شده است. با توجه به این شرایط مقدار تخصیص داده شده به متغیر باید آخرین ردیف از مجموعه نتایج عبارت SELECT باشد.
در مثال زیر، آخرین ردیف از مجموعه جوابهای کوئری، مقداری است که به متغیر تخصیص داده میشود.
در جدول زیر مجموعه نتایج عبارت SELECT نمایش داده شده و همینطور که میبینید دوربر جواب با کادر قرمز علامت زدهایم.
تطابق نوع در مقدار و متغیر
اگر نوع دادهای که برای متغیر تعیین کردهایم با مقدار دادهای که به آن تخصیص داده شده، همسان نباشند، خود SQL Server در طی فرایند تخصیص، تلاش میکند که نوع مقدار داده شده را به صورت خودکار تغییر بدهد. البته به شرطی که ممکن باشد.
در SQL Server، نوع داده با اولویت پایینتر به نوع با اولویت بالاتر تبدیل میشود. اما بعضی وقتها این عملیات منجر به از دست دادن اطلاعات میشود. در مثال پایین، مقداری را با نوع Float به متغیری تخصیص دادهایم که برای پذیرش اعداد با نوع Integer تعریف شده است.
بعد از اجرای کد بالا، در خروجی مقدار 12312 چاپ میشود.
فیلم های آموزش کار با انواع پایگاه های داده
«پایگاه داده» (Database) مجموعهای منظم شده از اطلاعات است که در سیستمهای کامپیوتری ذخیره میشود. مدیریت و کار با پایگاههای داده جزو مهمترین بخشها در حوزهی فناوری اطلاعات هستند. نرمافزارهای پایگاه داده متنوعی مانند MySQL و SQLite و PostgreSQL با استفاده از قواعد زبانی SQL کار میکنند. برای کسب توانایی در کار پایگاههای داده، منابع خوبی در فرادرس پیدا میشود. سایت تولید فیلمهای آموزشی فرادرس، گزینههای متنوع و خوبی را متناسب با انواع پایگاههای داده، تولید و منتشر کرده است. در پایین چند مورد از این فیلمهای آموزشی را فهرست کردهایم.
برای دیدن فیلمهای آموزشی بیشتر، با کلیک بر روی تصویر زیر میتوانید وارد صفحه مربوط به مجموعه آموزش پایگاه داده فرادرس شوید.
روش استفاده از پایگاه داده مورد استفاده در این مطلب
همینطور که در ابتدای مطلب اشاره شد، برای نمایش مثالهای مربوط به بخش کار با متغیر در SQL Server از پایگاه داده AdventureWorks استفاده شده است. لینک مربوط به دانلود این پایگاه داده را در ابتدای مطلب قرار دادهایم. اما هدف اصلی از این قسمت نشان دادن روش استفاده از آن است.
فایل مورد نظر بعد از خارج شدن از حالت ZIP با پسوند .bak نشان داده میشود. این فایل را میتوان توسط پایگاه داده SQL Server بازیابی کرد. به این منظور، هم میتوان از فرمان RESTORE در SQL استفاده کرد و هم میتوان از رابط کاربری گرافیکی SQL Server Management Studio | SSMS یا نرمافزار مدیریت پایگاه داده SQL Server استفاده کرد. البته این فایلها توسط نرمافزار Azure Data Studio نیز خوانده میشوند.
دستورات زیر مربوط به بازیابی این دادهها در نرمافزار SQL Server Management Studio است. برای بازیابی هر پایگاه داده در SSMS طبق روال زیر به پیش بروید.
- گام اول: فایل مناسب را با پسوند .bak دانلود کرده و در پوشه مشخصی از کامپیوتر قرار دهید.
- گام دوم: این فایل را به محل فایلهای «پشتیبان» (Backup) نرمافزار SQL Server منتقل کنید. موقعیت این پوشه با توجه به محل نصب SQL Server در سیستم هرکس، نام مجموعه داده و نسخه SQL Server متفاوت است. برای مثال، موقعیت پیشفرض برای نرمافزار «SQL Server 2022» با نسخه ۱۶٫x را در کادر زیر نشان دادهایم.
C:Program FilesMicrosoft SQL ServerMSSQL16.MSSQLSERVERMSSQLBackup
- گام سوم: نرمافزار SSMS را باز کرده و به نمونه SQL Server متصل شوید.
- گام چهارم: از مسیر «Object Explorer > Restore Database» بر روی گزینه «Databases» راست کلیک کنید. سپس در منوی آبشاری باز شده گزینه نصب خودکار «Restore Database» را انتخاب کنید.
- گام پنجم: ابتدا گزینه Device را انتخاب کرده و سپس برای انتخاب ابزار مورد نظر بر روی نقطه چینهای روبهروی این گزینه «…» کلیک کنید.
- گام ششم: بر روی گزینه «Add» کلیک کرده و سپس فایل .bak مورد نظر خود را انتخاب کنید. اگر فایل خود را همینطور که گفته شد، به محل فایلهای پشتیبانی Backup انتقال دادهاید اما در این پنجره دیده نمیشود. به معنای این است که SQL Server یا کاربری که به SQL Server وارد شده مجوز لازم برای مشاهده این فایل را در این پوشه ندارد.
- گام هفتم: برای تایید کردن فایل پشتیبانی انتخاب شده بر روی دکمه «OK» کلیک کرده و پنجره «Select backup devices» را ببندید.
- گام هشتم: برای اطمینان از بازیابی شدن فایل مورد نظر و همسان بودن فایل بازیابی شده با فایل هدف به سربرگ «Files» رفته و پوشهها را بررسی کنید.
- گام نهم: اگر فایل بازیابی شده با فایل هدف یکی بودند، میتوانید بر روی دکمه «OK» کلیک کرده و فرایند بازیابی پایگاه داده مورد نظر خود را تکمیل کنید.
جمعبندی
متغیرهای SQL کاربردهای بسیار زیادی دارند. بخصوص وقتی که با جدولهای موقت کار میکنیم. برای اجرای بیشتر عملیات محاسبات بر روی دادهها باید از متغیرها کمک بگیریم. توسعهدهندگان حرفهای SQL Server لازم است که در امر استفاده از متغیرها مهارت داشته باشند. زیرا در پایگاههای داده با مسائل مختلفی روبهرو میشوند. بخصوص در پایگاههای دادهای که بر روی پروژههایی در حوزه تحلیل داده کار میکنند.
در این مطلب از مجله فرادرس، به بررسی مفهوم و روش تعریف متغیر در SQL از زوایای گوناگون پرداختهایم. همچنین آموختیم که چگونه متغیری را تعریف کرده و چگونه به آن مقدار مشخصی را تخصیص دهیم. برای تمام موارد در این مطلب، از مثالهای کدنویسی شده استفاده کردهایم.
source