آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

دستورات شرطی در Sql

دوره های مرتبط با این مقاله

فیلتر کننده ی داده ها (Data Filters): مقدمه ای بر دستورات شرطی

در دنیای پایگاه داده، فیلتر در واقع مانند یک صافی می باشد که کار آن گزینش برخی از رکوردها و نادیده گرفتن یا حذف برخی دیگر است. برای مشخص کردن نحوه ی انجام4. همان طور که به یاد دارید، در مباحث پیشین پایگاه داده ای به نام Department Store1 database ایجاد کردیم. در Object Explorer، بر روی علامت + در کنار DepartmentStore1 کلیک کرده تا باز شود.
فیلتر، بایستی با استفاده از عملیات بولی، یک شرط را برقرار کنید. شرط را در دستور SELECT تعریف می کنیم، پس از واکشی اطلاعات فیلتر شده آن ها را مورد تجزیه و تحلیل قرار می دهیم.
با استفاده از Query Editor یا Query Designer، می توان تمام دستور SQL را بدون نوشتن یک خط کد و به صورت ویژوال ایجاد کرد. البته می توان دستور را با دانش خود از زبان SQL و به صورت کدنویسی نیز ایجاد کرده و اجرا نمود.


آموزش کاربردی: بکار گیری فیلتر کننده های داده

1. رایانه ی خود را راه اندازی کرده و وارد سیستم شوید.
2. محیط Microsoft SQL Server را اجرا کرده و در پنجره ی محاوره ای اتصال به سرور، دکمه ی Connect را کلیک نمایید.
3. در محیط SQL Server، به پنجره ی Object Explorer مراجعه کرده و گره Databases را باز کنید.
4. همان طور که به یاد دارید، در مباحث پیشین پایگاه داده ای به نام Department Store1 database ایجاد کردیم. در Object Explorer، بر روی علامت + در کنار DepartmentStore1 کلیک کرده تا باز شود.
5. بر روی DepartmentStore1 راست کلیک کرده و سپس گزینه ی New Query را انتخاب نمایید.
6. گره Tables را باز نمایید.
7. بر روی جدول Inventory.StoreItems راست کلیک نموده و گزینه ی Edit Top 200 Rows را انتخاب کنید.


8. در نوارابزار Query Designer، بر روی دکمه های آموزش SQL، آموزش SQLو آموزش SQLکلیک نمایید.
9. در پنجره ی SQL، دستور را به ترتیب زیر ویرایش نمایید:


SELECT ItemNumber AS [Item #],
       Manufacturer,
       Category, 
       ItemName AS [Name/Description], 
       UnitPrice AS [Unit Price]
FROM   Inventory.StoreItems

10. در منوی اصلی: Query Designer -> Execute SQL.


دستور شرطی WHERE

در هنگام واکشی اطلاعات، برای استخراج داده های مورد نظر، می توان از یک یا چند فیلتر کمک گرفت. به منظور تعریف یک شرط به صورت ویژوال:
1. در بخش مربوط به نمایش نتایج داخل پنجره ی Query Editor، پس از بررسی رکوردها، شرط مورد نظر را (در ذهن خود) اعمال و سپس کادر خاکستری واقع در سمت چپ آن سطر را کلیک نمایید. در مثال زیر، کاربر قصد دارد آن رکوردی را انتخاب کند که شماره ی دانشجویی آن (student #)، 24795711 می باشد:


آموزش SQL

2. داخل Query Designer و در پنجره ی Criteria، بر روی کادر موجود در زیر سرستون Filter کلیک کنید: .


آموزش SQL

در زبان SQL، کلیدواژه ی ای که تعریف کننده ی شرط بوده و بیشترین کاربرد را دارد، دستور WHERE می باشد. نحوه ی نگارش دستور شرطی WHERE به صورت زیر می باشد:


SELECT WhatField(s) FROM WhatObject WHERE Expression;

دستور Where برای افزودن شرط به منظور محدود کردن نتايج جستجو و واکشی نتايج دقيق تر بکار می رود. دستور شرطی مزبور بایستی بلافاصله بعد از دستور Select و ذکر ستون های دلخواه از جدول مورد نظر درج گردد. باز می گردیم به فرمول فوق. از قبل با بخش SELECT تا واژه ی کلیدی WHERE آشنا هستیم. Expression ذکر شده در این شرط از عملگرهای رشته ای، منطقی و جبری تشکیل می شود. Expression بکار رفته در دستور WHERE، در واقع یک معیار (برای جستجو و استخراج اطلاعات مد نظر) خوانده می شود.
داخل Expression اسم ستون، عملگر مورد نظر و مقدار را مشخص می کنیم.


ColumnName Operator Value

المان ColumnName می بایست اسم یک ستون (جاری) از جدول مورد نظر باشد. پس از اسم ستون عملگر مناسب را تایپ کرده و در پایان مقدار المان Value را مشخص می کنیم. این مقدار شرط را تنظیم می کند.
برای خوانایی بهتر، می توان Expression را داخل پرانتز، پس از دستور شرطی Where محصور نمود.


مقایسه های منطقی

می توانید برای پایگاه داده های خود، عبارت هایی ایجاد کنید که ترکیبی از مقادیر، متغیرها و عملگرها می باشد. برای پشتیبانی از این امکان، T-SQL عملگرهای ویژه ای را ارائه می دهد.
مقایسه در واقع یک عملیات بولی است که بسته به مقادیر موجود در دو طرف مقایسه، true یا false را برمی گرداند. مقایسه بین دو مقدار از نوع یکسان اجرا می شود. به عنوان مثال، می توان دو عدد یا دو کاراکتر و یا اسم دو شهر را با هم مقایسه نمود، در حالی که مقدار یک ستون یا هر دو ستون یک ثابت می باشد.


عملگر تساوی (=)

همان طور که گفته شد، می توان از عملگرهای مقایسه ای در دستور WHERE استفاده نمود. یکی از این عملگرها، عملگر تساوی یا equality می باشد. عملگر ذکر شده برای سنجش برابری دو مقدار بکار می رود:


Value1 = Value2

بنابراین، مفسر SQL مقدار هر دو طرف عملگر را با هم مقایسه کرده و در صورت برابر بودن این دو مقدار، نتیجه ی TRUE را بازمی گرداند. چنانچه دو مقدار با یکدیگر برابر نباشند، مقایسه نتیجه ی FALSE را برمی گرداند. نگاره ی زیر عملیات سنجش برابری دو مقدار را به نمایش می گذارد:


آموزش SQL

این امکان وجود دارد که عملیات مقایسه سنجش برابری را بر روی تمامی ستون هایی که حاوی مقدار از نوع داده های مختلف هستند اجرا کرد. اما پیش از اقدام به این عمل باید چند نکته را به یاد داشت:
1. زمانی که مقادیر دو طرف در مقایسه اعداد طبیعی هستند، عملیات تساوی صرفا بررسی می کند آیا دو مقدار با هم مساوی هستند یا خیر. اغلب مقایسه بین عدد صحیح بسیار آسان بوده و دقیق ترین نتیجه را برمی گرداند.
2. هنگامی که عملیات مقایسه بر روی دو مقدار از نوع رشته انجام می شود، در آن صورت کاراکتر یا علامت موجود در دو طرف مقایسه، به ترتیب از نظر موقعیت مکانی با یکدیگر مقایسه می گردند. توجه داشته باشید که مقایسه بر اساس قوانین زبان مشخص شده در collation پایگاه داده صورت می پذیرد.
3. بایستی از مقایسه ی دو عدد ممیز شناور (مقداری که نوع داده ای آن float می باشد) برای سنجش برابری خودداری نمایید، در غیر این صورت با نتایج ناصحیح و غیر منتظره مواجه می شوید. به عنوان مثال ما می دانیم که 2.67 و 2.99 ممکن است بسته به نحوه ی پیکربندی نوع داده ای decimal (اینکه آیا دارای دقت اعشار/scale و عدد/precision هست یا خیر و نیز با توجه به نوع آن ها) به عدد 3 تبدیل و گرد شود. به عنوان مثالی دیگر، مقادیر 2.49 و 2.51 ممکن است بسته به تنظیم نوع داده ای آن ها، هر یک به ترتیب به 2.00 و 3.00 تبدیل شوند. طبیعتا دو عدد 2.67 از 2.99 با یکدیگر برابر نیستند. حال اگر مقدار دو ستون که از نوع decimal وdecimal(6.3) هستند را با یکدیگر مقایسه کنید، ممکن است دو عدد ذکر شده با یکدیگر مساوی در نظر گرفته شوند.
اجرای مقایسه برای سنجش برابری دو مقدار که از نوع ارزی هستند نیز ممکن است نتایج پیش بینی نشده و نامعتبر تولید کند. برای مثال مزد ساعتی دو کارکن را درنظر بگیرید که هر یک به ترتیب $12.50 و $12.51 هستند. دو مقدار نام برده بی شک با هم برابر نبوده و نباید مورد مقایسه قرار گیرد. حال مزد دو کارکن را در سال درنظر بگیرید که هر یک $48,000 و &48,250 هستند. آیا این دو مقدار تفاوت بسیار زیادی با هم دارند؟ فرض کنید می خواهید برنامه ای بنویسید که محسبات مالیات بر درآمد را در پایان هر سال انجام می دهد. آیا مقایسه ی دو مقدار $88,250 و $88,255 برای سنجش برابری صحیح می باشد؟ اگر نتیجه ی مقایسه مقدار False بود، آیا بدین معنی است که دو مقدار خیلی با یکدیگر تفاوت دارند؟


آموزش کاربردی: مقایسه ی دو عدد برای سنجش برابری

1. در کادر Criteria (داخل پنجره ی Query Designer)، ابتدا بر روی اولین کادر واقع در زیر سرستون Filter کلیک نمایید.
2. مقدار 81307492 را درون کادر ذکر شده، وارد نمایید. 3. در نوار ابزار Query Designer، بر روی دکمه ی آموزش SQL کلیک نمایید.
4. حال تب SQLQuery1.sql را انتخاب نمایید.
5. دستور زیر را در آن درج کنید:


USE DepartmentStore1;
GO
SELECT ALL * FROM Inventory.StoreItems
WHERE Category = N'Men';
GO

6. برای اجرای دستور، کلید F5 را فشار دهید.

عملگر نامساوی <>

این عملگر درست عکس عملگر تساوی کارمی کند و برای سنجش عدم برابری یا نامساوی بودن دو مقدار بکار می رود. نحوه ی استفاده از آن به صورت زیر می باشد:


Value1 <> Value2

<> در واقع مانند دیگر عملگرهای منطقی، یک عملگر دودویی می باشد که توسط ISO پیشنهاد شده است. عملگر ذکر شده برای مقایسه ی دو مقدار بکار می رود. مقادیر می توانند از دو متغیر باشند مانند: Variable1 <> Variable2. اگر مقدار دو طرف عملگر برابر نباشند، در آن صورت عملیات TRUE را برمی گرداند. در غیر این صورت، عملیات مقایسه در خروجی مقدار FALSE یا NULL را بازمی گرداند.
نمودار زیر عملیات مقایسه ی سنجش نابرابری را نمایش می دهد:


آموزش SQL

عملگر نامساوی دقیقا ضد عملگر تساوی می باشد.
علاوه بر عملگر دودویی <> که توسط ISO عرضه و پشتیبانی می شود، T-SQL از عملگر نامساوی زبان C، != نیز پشتیبانی می کند. دو عملگر اساسا نقشی یکسان را ایفا می کنند و در شرایط یکسان بکار می روند.
در زمان استفاده از این عملگر باید نکات زیر را درنظر داشت:


  1. اعداد طبیعی بهترین گزینه برای مقایسه بوده و دقیق ترین نتیجه را بدست می دهد.
  2. مقایسه ی نابرابری دو مقدار رشته ای از همان قوانین مربوط به مقایسه ی برابری دو رشته پیروی می کند.
  3. مقایسه ی نابرابری مقادیر عددی از نوع decimal، اغلب TRUE برمی گرداند.
  4. همان مسائلی که در زمان اجرای مقایسه ی برابری دو مقدار ارزی (پولی) درنظر گرفته می شود باید در مقایسه ی نابرابری نیز به آن توجه شود.

مقایسه ی نابرابری دو مقدار

1. داخل پنجره ی Query Editor کلیک نموده و کلیدهای Ctrl + A را برای انتخاب تمامی دستورات، همزمان فشار دهید.
2. کد زیر را در آن وارد نمایید:


SELECT ALL * FROM Inventory.StoreItems
WHERE SubCategory <> N'Shoes';
GO

3. برای اجرای کد، کلید F5 را بزنید.
4. تب DepartmentStore1.Inventory.StoreItems را انتخاب کرده و باز نمایید.
5. داخل پنجره ی Criteria، دستور delete = 81307492 را تایپ کنید.
6. در کادر Criteria، با کلیک بر روی چک باکس مربوط به فیلد Manufacturer آن را تیک دار نموده و عبارت <> N'Nautica' را تایپ کنید.
7. داخل پنجره ی راست کلیک کرده و گزینه ی Execute SQL را انتخاب کنید.


عملگر کوچکتر از >

برای بررسی اینکه آیا مقداری از مقدار دیگر کوچک تر است یا خیر، می توان از عملگر < استفاده کرد. فرمول استفاده از آن به صورت زیر می باشد:


Value1 < Value2

مقدار ذخیره شده در متغیر Value1 با مقدار متغیر Value2مقایسه می شود. از آنجایی که عملگر ذکر شده یک عملگر دودویی می باشد، قادر است فقط دو مقدار را با هم مقایسه کند. چنانچه مقدار ذخیره شده در متغیر Value1 کوچکتر از مقدار متغیر Value2 باشد، در آن صورت عملیات مقایسه مقدار true یا نتیجه ی مثبت را در خروجی برمی گرداند.
نگاره ی زیر این عملیات را به تصویر می کشد:


آموزش SQL
مقایسه برای به دست آوردن مقدار کوچکتر از بین دو مقدار، بسته به نوع داده ای متفاوت خواهد بود:
  1. بار دیگر یاداور می شویم که اعداد صحیح بهترین گزینه برای مقایسه بوده و مطمئن ترین نتیجه را بدست می دهد.
  2. به هنگام مقایسه ی دو متعیر رشته ای برای بدست آوردن مقدار کوچکتر، توجه داشته باشید که اولین کاراکتر یا علامت مقدار دو طرف عملگر بر اساس ترتیب الفبای زبان مشخص شده در بخش collation پایگاه داده، با یکدیگر مقایسه می شود. بر اساس ترتیب حروف الفبا، اگر اولین حرف از رشته ی واقع در سمت چپ عملگر، از نظر ترتیب حروف الفبا، پایین یا کوچک تر از اولین کاراکتر مقدار طرف دیگر عملگر باشد، عملیات با شکست مواجه شده و خاتمه می باید. در غیر این صورت مقایسه به کاراکتر دوم ادامه یافته و در صورت برابر بودن کاراکتر مقدار رشته ای دو طرف، به کاراکتر بعدی می رود. چنانچه تمامی کاراکترها و علامت ها که دارای موقعیت مکانی یکسان هستند، با هم برابر باشند، مقایسه true را برمی گرداند.
  3. همان طور که قبلا گفته شد، باید از مقایسه ی اعداد ممیز شناور یا مقادیر ارزی برای سنجش برابری یا نابرابری خودداری نمود. با این حال، مقایسه ی دو مقدار عددی اعشاری (از نوع decimal)، برای بدست آوردن مقدار کوچک تر، نتیجه ی دقیق تری را بدست می دهد.

آموزش کاربردی

1. در پنجره ی Criteria، <> N'Aldredge' را از کادر Filter فیلد مربوطه حذف کنید.
2. در زیر سرستون Filter، بر روی کادر مربوط به فیلد UnitPrice کلیک نموده و < 100 را تایپ کنید.
3. در نوار ابزار Query Designer، دکمه ی آموزش SQLرا کلیک نمایید.


عملگر کوچکتر یا مساوی =>

می توان دو عملگر < و = را بایکدیگر ترکیب کرده و به وسیله ی آن دو مقدار را با هم مقایسه کرد. این عملگر ترکیبی را می توان برای مقایسه ی برابری دو مقدار یا کوچکتری اولین مقدار از مقدار دوم مورد استفاده قرار داد. نحوه ی کلی استفاده از آن به شرح زیر می باشد:


 Value1 <= Value2

در صورتی که متغیر Value1 و Value2 از نظر مقدار با یکدیگر برابر باشند، نتیجه مثبت یا true خواهد بود. چنانچه عملوند سمت چپ دارای مقدار بزرگتر از عملوند سمت راست باشد، نتیجه ی عملیات باز هم صحیح می باشد. اگر مقدار متغیر اول (Value1) بزرگتر از مقدار متغیر دوم (Value2) باشد، نتیجه ی عملیات مقایسه FALSE خواهد بود. نمودار زیر این عملیات را نمایش می دهد:


آموزش SQL

آموزش کاربردی: استفاده از عملگر مقایسه ای =>

1. در کادر Criteria، عملگر <= را جایگزین < نمایید تا این عبارت بدست آید: <= 40
2. در نوار ابزار Query Designer، بر روی دکمه ی آموزش SQLکلیک کنید.
3. تب SQLQuery1.sql را باز کنید. داخل آن کلیک نموده و با زدن کلیدهای Ctrl + A تمامی دستورات را انتخاب کنید. حال کد زیر را جایگزین آن نمایید:


SELECT ALL * FROM Inventory.StoreItems
WHERE Category <= N'Girls';
GO

4. برای اجرای دستورات، کلید F5 را فشار دهید:


آموزش SQL

عملگر بزرگتر و مساوی =>

عملگرهای بزرگتر و مساوی را می توان با یکدیگر ترکیب نموده و عملگر جدیدی ایجاد نمود. عملگر ادغامی بزرگتر و مساوی همانند دیگر عملگرها برای مقایسه ی دو مقدار بکار می رود. نحوه ی استفاده از عملگر ذکر شده به صورت زیر می باشد:


Value1 >= Value2

عملیات مقایسه بر روی دو عملوند انجام می گیرد: Value1و Value2. اگر مقدار متغیر اول از مقدار متغیر دوم بزرگتر باشد، مقایسه نتیجه ی مثبت یا مقدار TRUE را برمی گرداند. اگر مقدار عملوند سمت چپ بزرگتر از مقدار عملوند سمت راست باشد، باز هم مقایسه مقدار TRUE یا مثبت را برمی گرداند. اگر مقدار عملوند سمت چپ بزرگتر مقدار عملوند سمت راست باشد، مقایسه مقدار FALSE یا NULL را برمی گرداند. نمودار زیر این عملیات را به نمایش گذاشته است:


آموزش SQL
عملگر >= مخالف < می باشد.

آموزش کاربردی

1. دستورات را داخل Query Editor به ترتیب زیر ویرایش کنید:
USE LambdaSquare1;
GO
SELECT "Unit #" = aparts.UnitNumber,
       Beds = aparts.Bedrooms, 
       Baths = aparts.Bathrooms,
       [Monthly Rent] = aparts.Price, 
       "Primary Deposit" = aparts.Deposit,
       (aparts.Price + aparts.Deposit) "Due Before Moving", 
       aparts.Available
FROM Presentation.Units aparts
WHERE aparts.Price >= 1100
ORDER BY [Monthly Rent], "Primary Deposit";
GO

2. برای اجرای دستورات، کلید F5 را فشار دهید.
آموزش SQL

عملگر !>

زبان Transact-SQL از عملگر !> پشتیبانی می کند. این عملگر نشان می دهد مقدار یک عملوند از مقدار عملوند دیگر بزرگتر نیست. این عملگر اغلب قابل جایگزین با "<=" می باشد.


مثال:
USE University3;
GO
SELECT ALL * FROM Inventory.StoreItems
WHERE LastName !> N'Alton';
GO

این دستور عملا به موتور db می گوید که رکوردهایی را که فیلد LastName آن ها از Alton بزرگتر نباشد را برگرداند.


آموزش SQL

عملگر !<

T-SQL از یک عملگر مقایسه ای دیگر پشتیبانی می کند و آن "!<" می باشد. با این عملگر می توان دو مقدار را مقایسه کرد و بررسی نمود آیا یکی از دیگری کوچک تر است یا خیر. این عملگر تقریبا معادل >= می باشد.


مثال:
USE University3;
GO
SELECT ALL * FROM Inventory.StoreItems
WHERE LastName !< N'Alton';
GO 

آموزش SQL

بررسی NULL بودن فیلد

بسته به اینکه یک فیلد چگونه ایجاد و پیکربندی شده، فیلد می تواند یک مقدار واقعی داشته باشد یا تهی بوده و مقدار NULL داشته باشد. برای بررسی اینکه آیا فیلدی دارای مقدار NULL می باشد یا خیر، فرمول زیر را همراه دستور WHERE بکار ببرید:


 WHERE ColumnName IS NULL

در پی اجرای دستوری با این ساختار، تنها آن رکوردهایی که NULL هستند (که در جایگاه ColumnName در فرمول بالا درج می گردد) در خروجی آورده می شوند. با توجه به آنچه گفته شد، دستور ISNULL زمانی بکار می رود که بخواهیم تمام فیلدهای null را در خروجی داشته باشیم.


آموزش کاربردی: بررسی NULL بودن مقدار یک فیلد

1. تب DepartmentStore1.Inventory.StoreItems را کلیک نمایید.
2. در پنجره ی Criteria، عبارت <= 40 را از کادر Filter مربوط به فیلد Manufacturer حذف کرده، عبارت is null را جایگزین آن نمایید.
3. در منوی اصلی: Query Designer -> Execute SQL.


آموزش SQL

4. حال تب SQLQuery1 را باز کنید.
5. دستور مربوطه را در Query Editor به صورت زیر ویرایش نمایید:


USE DepartmentStore1;
GO
SELECT ItemNumber, Manufacturer, Category, SubCategory, ItemName
FROM Inventory.StoreItems
WHERE Category IS NULL;
GO

6. F5 را زده تا کد جاری اجرا شود.


عبارت IS NOT NULL

بجای استخراج رکوردهای NULL، می توان آن رکورهایی را از جدول بیرون کشید که NULL نیستند. نقطه ی مقابل دستور is null در sql، دستور is not Null می باشد که مقادیری را واکشی می کند که Null نباشد (مقادیر غیر NULL را استخراج کرده و برمی گرداند). برای این منظور کافی است کلمه ی کلیدی NOT را به عبارت IS NULL اضافه نمایید.

همان طور که قبلا ذکر شد، یکی از راه هایی که موتور DB به شما اجازه می دهد دریابید آیا یک شی قبلا ایجاد شده یا خیر، فراخوانی تابع OBJECT_ID() است. تابع OBJECT_ID یک نام شی به عنوان ورودی دریافت کرده و در صورت وجود آن شی، id یا شناسه ی آن را در خروجی بر می گرداند. اگر شی مورد نظر وجود نداشت NULL را بازیابی می کند. از این تابع برای تشخیص موجودیت اشیا استفاده می شود.


IF OBJECT_ID('Employees', 'U') IS NOT NULL
  DROP TABLE Employees
GO

کد بالا درباره ی وجود یک جدول به نام Employees پرس و جو می کند. اگر تابع نام برده NULL را به عنوان خروجی برگرداند، بدین معنی است که جدول مورد نظر در پایگاه داده وجود ندارد. اگر تابع نتیجه ی دیگری غیر از NULL برگرداند، مانند شناسه یا ID جدول، در آن صورت شی مورد نظر وجود داشته و شما می توانید عملیات و اقدام لازم را انجام دهید.


آموزش عملی

1. دستور را به شکل زیر تغییر دهید:

SELECT ItemNumber, Manufacturer, Category, SubCategory, ItemName
FROM Inventory.StoreItems
WHERE Category IS NOT NULL;
GO

2. برای اجرا کلید F5 را فشار دهید.
آموزش SQL

دستورات شرطی

به عنوان یک تعریف ساده از دستورات شرطی می توان گفت که با این دست از دستورها می توان وجود یا عدم شرطی را بررسی کرده و بر اساس مثبت یا منفی بودن خروجی ارزیابی و بررسی شرط، با توجه به نیاز، عملیاتی را انجام داد. اغلب دستور طوری نوشته می شود که پس از ارزیابی، خروجی آن TRUE یا FALSE می شود. سپس بسته به نتیجه می توانید عملیات لازم را انجام دهید. یک شرط معمولا تا حد امکان ساده نوشته می شود تا برای برنامه نویس و مفسر کاملا واضح باشد. اگرچه مفسر هیچگاه اشتباه نمی کند و دچار سردرگمی نمی شود، با این حال امکان دارد در صورت بیش از حد پیچیده بودن شرط نتیجه ی پیشبینی نشده ارائه دهد.
در بخش های بعدی به کلیدواژه ها و فرمول هایی که T-SQL برای نوشتن عبارت های صریح و روشن ارائه می کند، خواهیم پرداخت. عبارت ها معمولا با یک واژه ی کلیدی آغاز می شوند و بلافاصله پس از آن خود عبارت قرار می گیرد.پس از عبارت، دستوری که با آن به مفسر اعلان می کنیم چه عملیاتی باید انجام دهد را مشخص می کنیم. نحوه ی کلی نگارش این دستور به شرح زیر می باشد:


Keyword Expression
	Statement

بلوک دستور BEGIN...END

در چارچوب فرمول بالا به شما توضیح می دهیم کدام کلیدواژه را چرا و کجا باید بکار ببرید. پس از Expression در فرمول فوق، می توانید Statement را در یک خط مجزا و در پایین آن درج نمایید. این statement دستوری است که با برقراری شرط مشخص شده در if/when، اجرا می شود. اغلب لازم می شود که دستور اجرایی را در چند خط ادامه دهید (محدود به یک خط نخواهد بود).
به طور کلی، مفسر هر چیزی که پس از Statement در فرمول قرار می گیرد را یک واحد در نظر می گیرد (فقط آن بخشی از کد که بلافاصله پس از Expression درج می گردد). با بلاک کد به مفسر اعلان می کنیم که دستور ما یک مجموعه است که در چند خط ادامه دارد. بلاک کد یا مجموعه دستور در SQL، یک برنامه قابل اجرا است که کار مشخصی را انجام می دهد. کوچکترین بلاک اجرایی یک کد با واژه ی رزروی BEGIN آغاز می شود و به واژه ی کلیدی END ختم می شود. فرمول دستور شرطی به شکل زیر می باشد:


Keyword Expression
BEGIN
	Statement Line 1
	Statement Line 2
	Statement Line n
END

اگر دستور تنها از یک خط کد تشکیل شده، باز هم می توان آن را در بلوک دستور و بین دو کلیدواژه ی BEGIN...END قرار داد، بدین صورت:


Keyword Expression
BEGIN
	Statement
END

با استفاده از ترکیب دو کلمه ی رزرو شده ی BEGIN...END می توان خوانایی کد را بهبود بخشید، زیرا شروع و پایان دستور را به طور صریح مشخص و نشان گذاری می کند.


ساختار شرطی IF

همان طور که گفته شد، از دستورات شرطی برای اجرای دستورات معین در زمان وقوع و برقراری شرایط خاص استفاده می شود. با دستور شرطی IF می توان بررسی کرد آیا دستور درست است یا خیر. دستورات IF تنها زمانی اجرا می شود که شرط آن true باشد. نحوه ی کلی استفاده از آن به صورت زیر می باشد:


IF Condition
	Statement

به هنگام نوشتن دستور شرطی IF، ابتدا یک عبارت Condition برای آن فراهم نمایید که پس از ارزیابی مقدار true یا false را تولید کند. برای ایجاد شرط (Condition)، می توانید از متغیر و یک عملگر مقایسه ای منطقی استفاده نمایید. پیش از اینکه مفسر دستور را اجرا کند، شرط را ارزیابی می کند. اگر نتیجه ی آن true بود، در آن صورت مفسر دستور (Statement) را اجرا می کند.


ساختار شرطی IF…ELSE

دستور شرطی IF که در بالا معرفی شد تنها برای زمانی مناسب می باشد که یک دستور داریم و می خواهیم در صورت برقراری شرط اجرا کنیم. اما اگر شرط اول درست نبود چی؟
مثال زیر را درنظر بگیرید:


-- Square Calculation
DECLARE @Side As Decimal(10,3),
        @Perimeter As Decimal(10,3),
        @Area As Decimal(10,3);
SET     @Side = 48.126;
SET     @Perimeter = @Side * 4;
SET     @Area = @Side * @Side;
IF SIGN(@Side) > 0
    BEGIN
	PRINT N'Square Characteristics';
	PRINT N'-----------------------';
	PRINT N'Side      = N' + TRY_CONVERT(varchar(10), @Side, 10);
	PRINT N'Perimeter = N' + TRY_CONVERT(varchar(10), @Perimeter, 10);
	PRINT N'Area      = N' + TRY_CONVERT(varchar(10), @Area, 10);
    END;
ELSE
	PRINT N'You must provide a positive value';
GO

اجرای دستور بالا:
آموزش SQL
در زیر مثالی دیگر را مشاهده می کنید:
DECLARE @Number As Decimal(6, 2);
SET @Number = 258.4062;
IF SIGN(@Number) > 0
    PRINT N'The square root of 258.4062 is ' + 
           TRY_CONVERT(varchar(12), SQRT(@Number));
ELSE
    PRINT N'You must provide a positive number';
GO

در زیر نتیجه ی اجرای دستور را مشاهده می کنید:
آموزش SQL

ساختار شرطی CASE...WHEN...THEN

کلیدواژه ی CASE به عنوان یک عملگر شرطی ایفای نقش می کند. این واژه مقداری را در نظر گرفته و آن را ارزیابی می کند، سپس با توجه به مقدار، نتیجه ی خاصی را برمی گرداند.
فرمول استفاده از دستور شرطی CASE به شرح زیر می باشد:

CASE Expression
	WHEN Value1 THEN Result
	WHEN Value2 THEN Result
	WHEN Value_n THEN Result
END

در مثال زیر، یک حرف که نشانگر دانش آموز است به عنوان مقدار ارائه گردیده است. اگر آن حرف M یا m باشد، رشته ای تحت عنوان Male ایجاد شده و به عنوان نتیجه برگردانده می شود. اگر حرف f یا F به عنوان مقدار ارائه گردید، در آن صورت رشته ی متنی Female به عنوان نتیجه بازیابی می شود:


DECLARE @CharGender Char(1),
	@Gender  Varchar(20);
SET @CharGender = N'F';
SET @Gender = 
	CASE @CharGender
		WHEN N'm' THEN N'Male'
		WHEN N'M' THEN N'Male'
		WHEN N'f' THEN N'Female'
		WHEN N'F' THEN N'Female'
	END;
SELECT N'Student Gender: ' + @Gender;
GO


آموزش کاربردی: استفاده از Case

1. تب SQLQuery1.sql را انتخاب نمایید.
2. کد را در Query Editor به ترتیب زیر ویرایش نمایید:


USE LambdaSquare1;
GO
SELECT "Unit #" = aparts.UnitNumber,
       Beds = aparts.Bedrooms, 
       Baths = aparts.Bathrooms,
       [Monthly Rent] = aparts.Price, 
       "Primary Deposit" = aparts.Deposit,
       (aparts.Price + aparts.Deposit) "Due Before Moving", 
       CASE aparts.Available
	    WHEN 0 THEN N'No or Not Yet'
	    WHEN 1 THEN N'Yes'
       END "Available"
FROM Presentation.Units aparts
ORDER BY [Monthly Rent], "Primary Deposit";
GO

3. برای اجرای مجموعه دستورات کلید F5 را فشار دهید.


آموزش SQL

ساختار شرطی CASE...WHEN...THEN...ELSE

اگر مقدار ورودی case برای ما قابل پیشبینی باشد (از قبل بدانیم چه مقداری در اختیار case قرار می گیرد)، در آن صورت با case..when قابل مدیریت می باشد. اما چنانچه مقدار ورودی چیزی غیر از مقدار مورد انتظار ما می باشد، در آن صورت آن را با else اداره می کنیم.


CASE Expression
	WHEN Value1 THEN Result
	WHEN Value2 THEN Result
	WHEN Value_n THEN Result
	
	ELSE Alternative
END

دستور Else، عملا زمانی بکار می رود که هیچ یک از مقادیر مشخص شده در دستورات WHEN با عبارت تعریف شده در CASE در فرمول فوق همخوانی نداشته باشد (عبارتی که در CASE مشخص شده با هر یک از مقادیر مقایسه می شود و اگر با هریک منطبق بود نتیجه ی تعیین شده برای آن مقدار به عنوان خروجی بازیابی می شود. اگر هیچ یک از مقادیر مشخص شده در دستورات WHEN با Expression در فرمول بالا منطبق نبود، در آن صورت مقدار مشخص شده در Else به عنوان خروجی برگردانده می شود).
چنانچه مقداری غیر قابل پیش بینی ارائه گردد، ولی دستور Else برای مدیریت آن در نظر گرفته نشده باشد، در آن صورت NULL به عنوان خروجی ارائه می گردد

مثال:
DECLARE @CharGender Char(1),
	@Gender  NVarchar(20);
SET     @CharGender = N'Q';
SET @Gender = 
	CASE @CharGender
		WHEN N'm' THEN N'Male'
		WHEN N'M' THEN N'Male'
		WHEN N'f' THEN N'Female'
		WHEN N'F' THEN N'Female'
		ELSE N'Unknown'
	END;
SELECT N'Student Gender: ' + @Gender;
GO

آموزش SQL

از این رو توصیه می شود دستور Else را محض احتیاط، در ساختمان دستور CASE به عنوان یک sub-statement بکار ببرید.


حلقه ی تکرار WHILE

از این ساختار کنترلی برای انجام دستورات مادام اینکه شرط آن برقرار می¬باشد استفاده می¬گردد.
برای بررسی یک شرط و ارزیابی آن پیش از انجام کار خاصی، می توان عملگر WHILE را مورد استفاده قرار داد. نحوه ی نگارش آن به صورت زیر می باشد:


WHILE Expression 
    Statement

ابتدا می بایست یک Expression پس از کلیدواژه ی WHILE در نظر گرفت. عبارت (Expression) پس از ارزیابی، مقدار true یا false را برمی گرداند. در صورتی که عبارت true باشد، مفسر دستور یا Statement را اجرا می کند. پس از اجرای دستور، عبارت بار دیگر بررسی می شود و این روال تا زمانی که عبارت false می شود ادامه می یابد. فلوچارت زیر این روند را به زیبایی نمایش می دهد:


آموزش SQL
نمونه:
DECLARE @Number As int
WHILE @Number < 5
	SELECT @Number AS Number
GO

برای اینکه شرط while به درستی اجرا شود، باید یک مکانیزم یا سازوکار برای مفسر مشخص کنید که به وسیله ی آن مقدار مورد اشاره برای شرط، متغیر یا عبارت مورد بررسی (در حال ارزیابی) را بدست آورد. معمولا این کار در قالب یک متغیر که مقداردهی اولیه می شود، صورت می پذیرد. نمودار زیر ساختار شرطی که حلقه ی while در آن بکار رفته را به نمایش می گذارد:


آموزش SQL
در زیر مثال دیگری را مشاهده می کنید:
DECLARE @Number As int
SET @Number = 1
WHILE @Number < 5
    BEGIN
	SELECT @Number AS Number
	SET @Number = @Number + 1
    END
GO

نتیجه ی زیر را برمی گرداند:
آموزش SQL

توابع منطقی: انتخاب از میان چندین مقدار (تابع CHOOSE)

جدول زیر را در نظر بگیرید:
CREATE TABLE Administration.Contractors
(
    ContractorCode nchar(7),
    FirstName nvarchar(25),
    LastName nvarchar(25),
    Gender int,
    EmploymentStatus nvarchar(26),
    TimeRecordingCode nchar(4)
);
GO

برای کاهش احتمال رخداد اشتباه، از کاربر می خواهیم یک مقدار برای Gender، یک مقدار برای Employment Status و یک مقدار برای TimeRecordingCode انتخاب کرده و ارائه نماید. راه های مختلفی برای انجام این کار وجود دارد. زبان T-SQL تابعی به نام CHOOSE را ارائه می دهد.

تابع CHOOSE() یک مجموعه یا آرایه ای از مقادیر را در نظرگرفته و مقدار مورد نظر که دارای اندیس (شماره ی مکان قرار گیری) خاصی است را برمی گرداند. نحوه ی نگارش و استفاده از این تابع به صورت زیر می باشد:


CHOOSE(index int,
       val_1 sql_variant,
       val_2 sql_variant [, val_n sql_variant])
       RETURNS sql_variant;

اولین آرگومان از نوع Integral (عدد صحیح) می باشد. پارامتر ورودی یکی مانده به آخر صرفا تعدادی مقدار را تشکیل می دهد. نوع مقدار می تواند از هر نوع داده ای که در T-SQL پشتیبانی می شود، اعم از integer، decimal، string باشد. مقادیر توسط ویرگول از یکدیگر جدا می شوند تا هر آرگومان یا مقدار یک مکان خاص که در اصطلاح اندیس نیز خوانده می شود را اشغال کند. این تابع (پس از فراخوانی) آیتمی را که در شماره ی مکان قرارگیری متناظر با (مربوط به) آرگومان index قرار گرفته را به عنوان خروجی بازمی گرداند



مثال:
INSERT INTO Administration.Contractors
VALUES(N'931-846', N'Bertrand', N'Onobiono',
       CHOOSE(1, 1, 2, 3), CHOOSE(1, N'Full-Time', N'Part-Time', N'Temporary'),
       CHOOSE(2, N'FLEM', N'PRTL', N'CNTR', N'CVLN')),
      (N'527-168', N'chris', N'Pastore',
       CHOOSE(3, 1, 2, 3), CHOOSE(2, N'Full-Time', N'Part-Time', N'Temporary'),
       CHOOSE(3, N'FLEM', N'PRTL', N'CNTR', N'CVLN')),
      (N'824-506', N'Joan', N'Orendon',
       CHOOSE(2, 1, 2, 3), CHOOSE(2, N'Full-Time', N'Part-Time', N'Temporary'),
       CHOOSE(1, N'FLEM', N'PRTL', N'CNTR', N'CVLN')),
      (N'527-168', N'chris', N'Pastore',
       CHOOSE(3, 1, 2, 3), CHOOSE(2, N'Full-Time', N'Part-Time', N'Temporary'),
       CHOOSE(3, N'FLEM', N'PRTL', N'CNTR', N'CVLN')),
      (N'248-007', N'James', N'Orendon',
       CHOOSE(1, 1, 2, 3), CHOOSE(1, N'Full-Time', N'Part-Time', N'Temporary'),
       CHOOSE(4, N'FLEM', N'PRTL', N'CNTR', N'CVLN'));
GO

رکوردهای مورد نظر را می توان با دستور زیر verify کرد:


SELECT staff.ContractorCode [Empl Code],
	   staff.FirstName [First Name],
	   staff.LastName [Last Name],
	   staff.Gender,
	   staff.EmploymentStatus [Emplmt Status],
	   staff.TimeRecordingCode [Time Code]
FROM Administration.Contractors staff;
GO

تابع IIF

جدول زیر حاوی تعدادی خانه است که به اجاره گذاشته شده اند:
USE master
GO
CREATE DATABASE ApartmentsRentings1;
GO
USE ApartmentsRentings1;
GO
CREATE SCHEMA Listing;
GO
CREATE TABLE Listing.Properties
(
	PropertyNumber  nvarchar(10),
	PropertyType    nvarchar(20),
	Bedrooms    	smallint,
	Bathrooms   	float,
	MonthlyRate     money,
	SecurityDeposit	money
);
GO
INSERT INTO Listing.Properties(PropertyNumber, PropertyType,
			Bedrooms, Bathrooms, MonthlyRate, SecurityDeposit)
VALUES(N'7283-0884', N'Condominium',   2,   2, 1475, 1000),
      (N'8241-0600', N'Apartment',     1,   1,  895,  250),
      (N'5927-5940', N'Apartment',     0,   1,  865,  225),
      (N'8250-2082', N'Townhouse',     3, 2.5, 1450,  850),
      (N'2729-3971', N'Apartment',     1,   1,  925,  275),
      (N'2864-4816', N'Townhouse',     3, 2.5, 1850, 1200),
      (N'6200-8048', N'Apartment',     2,   1, 1100,  500),
      (N'6286-6408', N'Apartment',     0,   1,  950,  450),
      (N'9736-6181', N'Single Family', 3, 2.5, 1650, 1200),
      (N'6304-0796', N'Apartment',     2,   1, 1500, 1000),
      (N'6029-7570', N'Condominium',   1,   1,  820,  500),
      (N'9255-7497', N'Condominium',   2,   2, 1475, 1000),
      (N'2930-8048', N'Condominium',   1,   1, 1265,  850),
      (N'6209-2252', N'Condominium',   1,   1, 1265,  850),
      (N'3730-1637', N'Single Family', 4, 2.5, 2650, 1500),
      (N'2927-1539', N'Apartment',     0,   1,  825,  200),
      (N'4855-5702', N'Townhouse',     3, 2.5, 1580, 1200),
      (N'9359-9502', N'Condominium',   1,   1,  760,  500),
      (N'3840-0002', N'Apartment',     3,   2, 1450,  600),
      (N'2057-0794', N'Single Family', 4, 3.5, 2880, 1500),
      (N'4927-5396', N'Apartment',     3,   2, 1350,  425),
      (N'3006-6088', N'Apartment',     1,   1, 1100,  600),
      (N'1397-0492', N'Apartment',     2,   1, 1050,  350);
GO

T-SQL با ارائه ی کلیدواژه ی IF این امکان را به ما می دهد که یک شرط را بررسی کنیم. در صورت درست بودن شرط، می توان عبارت خاصی را اجرا کرد. اگر شرط false بود، می توان با بهره گیری از کلمه ی رزرو شده ی Else دستور جایگزین را اجرا نمود. بجای استفاده از ساختار شرطی IF ... ELSE، می توان از تابع IIF بهره گرفت که توسط T-SQL ارائه و پشتیبانی می شود. سینتکس آن به صورت زیر می باشد:


IIF(Condition to Check, What to do if Condition is true, What to do if Condition is false)
RETURNS BIT

تابع نام برده سه آرگومان می گیرد. اولین پارامتر یک شرط منطقی است که باید بررسی شده و در خروجی true یا false را برمی گرداند. اگر نتیجه صحیح بود، دومین پارامتر اعمال می شود. اما اگر نتیجه ی آن false بود، پارامتر سوم اعمال می گردد.


مثال:
USE ApartmentsRentings1;
GO
SELECT props.PropertyNumber,
       props.PropertyType + N', ' + TRY_CONVERT(nvarchar(20), props.Bedrooms) +
           IIF(TRY_CONVERT(nvarchar(20), props.Bedrooms) < 2, N' bedroom', N' bedrooms') "Property Details"
FROM Listing.Properties props;
GO

نتیجه ی زیر را بدست می دهد:
آموزش SQL

می توانید هر تعداد تابع IIF() که لازم دارید صدا بزنید. مثال زیر از دو تابع IIF() استفاده می کند:


USE ApartmentsRentings1;
GO
SELECT props.PropertyNumber,
       props.PropertyType + N', ' + TRY_CONVERT(nvarchar(20), props.Bedrooms) +
           IIF(TRY_CONVERT(nvarchar(20), props.Bedrooms) < 2, N' bedroom', N' bedrooms')
		+ N', ' +	TRY_CONVERT(nvarchar(20), props.Bathrooms) + 
	   IIF(TRY_CONVERT(nvarchar(20), props.Bedrooms) < 2, N' bathroom', N' bathrooms') "Property Details"
FROM Listing.Properties props;
GO

از آنجایی که تنها یک دستور شرطی IF یا IF…ELSE را می توان داخل دیگری گنجاند (nest کرد)، همین طور هم می توان یک تابع را در بدنه یا پرانتز دیگری فراخوانی نمود. تابع IIF() به شما این اجازه را می دهد که داخلش یک تابع IIF() دیگر nest کرده و صدا بزنید.


IIF(Main Condition to Check,
    What to do if Main Condition is true,
    	IIF(Nested Condition to Check,
    	    What to do if Nested Condition is true,
    	    What to do if Nested Condition is false)
	RETURNS BIT)
RETURNS BIT

سینتکس آن به صورت زیر می باشد:
IIF(Main Condition to Check,
    What to do if Main Condition is true,
    	IIF(Nested Condition to Check,
    	    What to do if Nested Condition is true,
    	    What to do if Nested Condition is false)
	RETURNS BIT)
RETURNS BIT

نتیجه ی زیر را برمی گرداند:
آموزش SQL

به همین نحو، می توانید توابع IIF() تودرتو ایجاد نمود. نحوه ی کلی نگارش آن به صورت زیر می باشد:


IIF(Main Condition to Check,
    What to do if Main Condition is true,
    	IIF(Nested Condition to Check,
    	    What to do if Nested Condition is true,
        	IIF(Nested Condition to Check,
                    What to do if Nested Condition is true,
    		    What to do if Nested Condition is false)
    	        ) RETURNS BIT
	) RETURNS BIT)
RETURNS BIT

  • 21767
  •    1396
  • تاریخ ارسال :   1394/11/28

دانلود PDF دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .