در قسمت ششم آموزش SQL Server ،کد نویسی SQL Server و همچنین aggregate functions را به شما آموزش دادیم.دراین قسمت قصد داریم Sub Query ها و نحوه ارتباطشان با Query ها را به شما آموزش بدیم.
ما در این اموزش قصد بررسی Sub Query ها و نحوه ارتباطشان با Queryها را داریم.
Sub Query ها در واقع Select هایی هستند که درون Select دیگری قرار میگیرند و خود به دو دسته تقسیم میشوند که شامل Uncorrelated و Correlated میباشند.
Correlated SubQuery : این نوع Sub Query ها مرتبط به Query خود هستند.
Uncorrelated Subquery :این نوع Query ها در مقابل Correlated SubQuery ها هستند بدین معنی که هیچ ارتباطی با Query خود ندارند.
به تصویر زیر دقت کنید
همانگونه که در تصویر بالا مشخص شده ما یک دستور Select 1 درون Select دیگری که همه ستون های جدول کتاب را مشخص میکند نوشته ایم که به این دستور Select درون پرانتز Sub Query گویند که همانگونه که میبینید نتیجه این Sub Query همان ستونی است که در قسمت Result با فلش مشخص شده که در هر سطر مربوط به جدول کتاب یک مقدار ۱ نیز اضافه کرده و همانگونه که میبینید این Sub Query از نوع Uncorrelated است چون هیچ ارتباطی با جدول کتاب که ذکر شده ندارد.
نوع دیگر دستورات Sub Query به صورت زیر است:
همانگونه که در تصویر زیر مشاهده میکنید ما دستور جدیدی را نوشتیم که یک Sub Query میباشد.
این خط دستور هایلایت شده بدین معنی میباشد که میتوان در دستور From نیز از Sub Query ها استفاده کرد که در این دستور همانگونه که میبینید ما از هیچ کدام از جداول موجود در دیتابیس استفاده نکرده ایم بلکه خودمان یک جدول در حافظه با نام table ساخته ایم و چون table یک نام رزرو شده است انرا در براکت قرار داده ایم و همچنین یک ستون با مقدار ۱ و با نام first نیز درون جدول ایجاد کرده ایم.
نتیجه نیز به همان صورتی است که مشاهده میکنید.
*همانگونه که در تصویر مشخص است ما دو دستور متفاوت و مجزا داریم که اگر دکمه Execute را کلیک کنیم هردو دستور اجر میشوند اما برای جلوگیری از این کار میتوان دستور مورد نظر خود را به صورت زیر هایلایت کرد و سپس دکمه Execute را کلیک کرد تا فقط نتیجه همان دستور انتخاب شده را مشاهده کرد
دستورات Sub Query درون Select و From را مشاهده کردید حال میخواهیم این Sub Query هارا درون دستور Where قرار دهیم و نتیجه را مشاهده کنیم.
select * from Tbl_Ketab where Code_Ketab=(select 4)
دستور بالا تمام ستون های جدول کتاب را به شرط انکه کد کتاب برابر با ۴ باشد را نشان میدهد که این شرط توسط Sub Query مشخص شده همان گونه که میبنید نوشته شده Select 4 بدین معنی که عدد ۴ را برای کد کتاب انتخاب کند. نتیجه به صورت زیر میباشد.
همانگونه که مشاهده میکنید فقط کتابی که کد ۴ را دارد انتخاب کرده و نمایش داده.
تمامیه این دستوراتی که تا به حال نوشته شده به صورت Uncorrelated بوده بدین معنی که هیچ ارتباطی با جداول ما نداشته اند.حال میخواهیم دستورات Correlated را مورد بحث قرار دهیم.
به تصویر زیر دقت کنید
همانگونه که در تصویر زیر مشاهده میکنید ما دو Correlated Subquery ما وظایف متفاوت نوشته ایم که هرکدام را برای شما توضیح خواهیم داد.
SubQuery که در تصویر با فلش و شماره ۱ مشخص شده برای نشان دادن نام کتاب است.همانگونه که میبینید خارج از SubQuery ها یا در واقع همان Queryهای اصلی دستور نوشته شده گفته تمامی ستون های جدول امانت را به ما نشان دهد حال پس از کاراکتر * یک کاما گزاشته شده و سپس در پرانتز SubQuery اول نوشته شده که میگوید از جدول کتاب فیلد نام کتاب را انتخاب کن و بعد شرطی گزاشته شده که این شرط در اموزش های قبلی به طور کامل توضیح داده شده و بدین معنی است که هرجا که د کتاب در جدول امانت برابر با کد کتاب در جدول کتاب برابر بود انتخاب شود پس از بستن پرانتز مربوطه یک نام برای ستون نام کتاب ها مشخص کرده ایم و سپس یک کاما چون میخواهیم یک عبارت (SubQuery) دیگری به Select اصلی اضافه کنیم*اگر در گزاشتن کاماها اشتباه کنیم برنامه خطا میگیرد*
SubQuery دوم که با فلش و عدد۲ مشخص شده نیز برای انتخاب نام گروه کتاب های به امانت رفته است که دقیقا مانند SubQuery بالا تنظیم شده همانگونه که میبینید ابتدا فیلد نام گروه در جرول گروه انتخاب شده سپس با شرطی مشخص شده که فقط گروه هایی که از انها کتابی به امانت رفته را مشخص کن در اخر هم نامی برای ای ستون در نظر گرفته شده. نتیجه نیز دقیقا همان چیزی شده که مدنظر ما بوده.
برنامه بالا یک Correlated Subquery است زیرا در SubQuery یک ارتباط با جدولی که در Query اصلی قید شده بوجود اورده ایم بدین صورت که ما در هردو Subquery ها از شروط “where Tbl_Amanat.code_ketab = Tbl_ketab.Code_ketab” و “Tbl_Amanat.IDGroup = Tbl_Group.ID” استفاده کرده ایم و اگر توجه کنید در هر دو شرط از جدول Tbl_Amanat استفاده شده و چون این جدول در Query اصلی نیز استفاده شده بدین دلیل این یک Correlated Subquery است.
حال میخواهیم دستوری که شامل هردو Correlated و UnCorrelated میباشد رابنویسیم.
همانگونه که در تصویر بالا میبینیم ما سه نوع Subquery مختلف تعیین کرده ایم که متفاوت هستند.
اگر به انها دقت کنید خواهید فهمید که Subquery 1و۲ از نوع Correlated و ۳ از نوع UnCorrelated میباشد به این دلیل که Subquery 1و۲ با Query اصلی که جدول امانت میباشد ارتباط برقرار کرده اما Subquery 3 هیچ ارتباطی با جدول امانت که Query اصلی میباشد ندارد و فقط جمع فیلد تعداد در جدول کتاب را برمیگرداند.
در کل اگر بخواهیم دستورات نوشته شده را توضیح دهیم میتوان گفت که در SubQuery اول ما فیلد تعداد از جدول کتاب را با شرط اینکه ان کتاب به امانت رفته باشد را برمیگرداند و بعد ان را در SubQuery دوم که فیلد قیمت کتاب را در جدول کتاب با همان شرط مشخص برمیگرداند ضرب میکند با علامت ‘*’ و سپس بر SubQuery سوم که جمع تمام فیلدهای تعداد کتاب در جدول کتاب را برمیگرداند تقسیم میکند در اخر نیز نام ستونی که ایجاد خواهد شد شد را تنظیم کرده ایم.
دستور Order By ترتیب قرار گرفتن ستون های نتیجه را بر اساس یک ستون مشخص که ما تعیین میکنیم راتنظیم میکند به صورت صعودی یا نزولی که ما اینجا ستون مشخصه را ستون جدیدی که ایجاد میشود (My_Column) قرار داده ایم.که همچنین میتوان صعودی یا نزولی بودن انرا مشخص کنیم که اگر مثل بالا چیزی ننویسیم به طور پیشفرض ستون مشخص شده را به صورت صعودی مرتب میکند ولی اگر از کلمه DESC استفاده کنیم به صورت نزولی مرتب میشود و در عین حال بقیه ستون ها متناسب با ستون تعیین شده تغییر میکنند.
در ادامه میخواهیم نوعی Subquery همراه با Aggregate Function را توضیح دهیم به برنامه زیر توجه کنید
همانگونه که در برنامه بالا میبینید ما در جلو اولین Select نه ستاره گزاشته ایم و نه نامه ستون خاصی بلکه از Aggregate function استفاده کرده ایم که این عبارت به معنی ماگسیموم یا همان بزرگتر است و درون پرانتز جلوی Max نام ستونی نوشته شده که ما قصد پیدا کردن بیشترین عبارت را درون ان ستون داریم که این ستون که ما نامش را Ketab قرار داده ایم در جدولی از دیتابیس ما قرار ندارد بلکه خودمان در ادامه انرا خواهیم ساخت و سپس نامی هم برای ستون مقداری که پیدا میکند قرار داده ایم.
در ادامه در مقابل From درون پرانتز عباراتی نوشته شده که مقدار ستون Ketab را مشخص میکند.
Select های تو درتویی مشاهده میکنید که اولین Select مربوط به جدول امانت میباشد و درون ان Select ما یک Select دیگر داریم که ستون Ketab را که میخواهیم مکسیمومش را پیدا کنیم را مشخص میکند.همانگونه که مشاهده میکنید این برنامه بسیار شبیه برنامه قبلی میباشد بدین صورت که اولین Select ستون تعداد کتاب در جدول کتاب مشخص میکند با شرطی مشخص که قبلا بسیار توضیح داده شده و سپس این ستون ضرب میشود در ستون بعدی که توسط Select ستون قیمت کتاب درون جدول کتاب و در اخر نامی برای این ستون انتخاب میشود که همان ستون Ketab خواهد شد در واقع در این مرحله ما یک ستون شامل حاصل ضرب های تعداد و قیمت کتاب هایی است که به امانت رفته را داریم حال در بالا ما از این ستون میخواهیم بیشترین مقدار را پیدا کنیم و در ستون جدید به نام Maximum و جدولی به نام Table انرا ذخیره و مشاهده میکنیم.
همانگونه که در اخر کدنویسی مشاهده میکنید ما نام جدولی که به طور موقت در حافظه ساخته میشود را مشخص کردیم و چون Table یک نام رزرو شده میباشد باید انرا درون براکت قرار دهیم.