کاربرد تابع DATEDIFF در Query نویسی - قسمت سوم

پنجشنبه 28 آبان 1394

در این مقاله با یک دیتابیس کوچک اما با پتانسیل، برای نوشتن Query آشنا میشویم

در ادامه قسمت دوم این مقاله در این جلسه با Query های زیر و نکات آن آشنا شده

Query ششم : 

هر مادری چند فرزند به دنیا آورده است ؟ 

SELECT  P.PersonID ,
        P.FirstName ,
        P.LastName ,
        ChildCountTempTable.Children
FROM    Person P
        JOIN ( SELECT   MotherID ,
                        COUNT(*) AS Children
               FROM     Person
               WHERE    MotherID IS NOT NULL
               GROUP BY MotherID
             )
		ChildCountTempTable
	    ON P.PersonID = ChildCountTempTable.MotherID

ORDER BY ChildCountTempTable.Children DESC;


 

یکی از قابلیت هایی که در Query نویسی وجود دارد همان طور که مشاهده میکنید نوشتن یک Select کامل و دادن یک اسم به آن میباشد . حال میتوان Select دیگری را با این جدول موقت Join کرد . 

 

در مثال ما ChildCountTempTable یک دستور ساده است که توسط Group By و تابع Count مشخص میکند که هر کد MotherID چندبار تکرار شده است و سپس با دستور Join مشخصات دیگر هم به خروجی خود اضافه میکنیم

نکته : همانطور که مطلع هستید برای هر مسئله ای ممکن است چندین راه حل وجود داشته باشد و این قضیه در خصوص Query نویسی هم صدق میکند. اما ما در مثال های آموزشی معمولن به دنبال آموزش روش های مختلف هستیم نه صرفا ساده ترین راه

 

Query هفتم : 

چه اشخاصی بیش از یک بار ازدواج کرده اند ؟

برای این مثال باید مشخص شود که یک HusbandID یا WifeID مشخص آیا بیشتر از یک بار در دیتابیس ذخیره شده است یا خیر ؟ از مثال قبل حتمن متوجه میشویم که باید از Group By استفاده کنیم اما این سری یک شرط هم داریم و آن اینکه تعداد این تکرار ها باید بیشتر از 1 باشد . در همچین مواردی از عبارت Having استفاده میکنیم . 


SELECT  Person.FirstName + ' ' + Person.LastName
FROM    Person
WHERE   PersonID IN ( SELECT    HusbandID
                      FROM      Marriage
                      GROUP BY  HusbandID
                      HAVING    COUNT(MarriageID) > 1 )

        OR
		PersonID IN ( SELECT WifeID
                         FROM   Marriage
                         GROUP BY WifeID
                         HAVING COUNT(MarriageID) > 1 );


 

در این مثال همانطور که مشاهده میکنید از دستور IN هم استفاده شده است و نکته ایی که مهم است جنس و موجودیت فیلد های قبل و بعد آن باید همنوع باشند تا معنا پیدا کند مثل PersonID و HusbandID یا WifeID

 

 

Query هشتم : 

هر مادری در چند سالگی فرزند خود را به دنیا آورده است ؟ 


SELECT  Mother.FirstName + ' ' + Mother.LastName AS MotherName ,
        DATEDIFF(yy, Mother.DateOfBirth, Child.DateOfBirth) AS MotherAge ,
        Child.FirstName AS ChildName
FROM    Person Mother
        INNER JOIN Person Child
		ON Mother.PersonID = Child.MotherID
ORDER BY 1;


 

در این مثال هم مثل نمونه های قبل از Self Join استفاده کردیم اما نکته ایی که شاید جدید باشد در دستور ORDER BY است که مشخص کردیم بر اساس اولین ستون Select مرتب سازی انجام شود . یعنی اسم و فامیل مادر . (چرا در این مثال این بهترین انتخاب است ؟)

 

 

Query نهم : 

چه اشخاصی دوقلو هستند ؟ 

برای این مثال باید چک کنیم که هر دو نفری که MotherID آنها یکسان باشد ، تاریخ تولدشان هم یکسان باشد و چون از Self Join استفاده میکنیم باید چک کنیم که ID خودشان با هم برابر نباشد ! 

برای این مثال دو راه وجود دارد که در ادامه میبینیم .


SELECT  P.FirstName + ' ' + P.LastName AS Person ,
        Twin.FirstName + ' ' + Twin.LastName AS Twin ,
        P.DateOfBirth
FROM    Person P
        INNER JOIN Person Twin
		ON P.MotherID = Twin.MotherID
WHERE   P.DateOfBirth IS NOT NULL
        AND P.PersonID != Twin.PersonID
        AND P.DateOfBirth = Twin.DateOfBirth;

در این راه شرط Join بر اساس برابر بودن MotherID ها قرار گرفته است که کاملا هم درست است و شرط های دیگر در قسمت Where  آمده اند . 

اما در روش دوم به این شکل همین Query نوشته میشود : 


SELECT  P.FirstName + ' ' + P.LastName AS Person ,
        Twin.FirstName + ' ' + Twin.LastName AS Twin ,
        P.DateOfBirth
FROM    Person P
        INNER JOIN Person Twin 
		ON P.PersonID != Twin.PersonID
             AND P.MotherID = Twin.MotherID
             AND P.DateOfBirth = Twin.DateOfBirth

WHERE   P.DateOfBirth IS NOT NULL;

همان طور که مشاهده میکنید شرط های بیشتری برای Join در نظر گرفته شده است !

 

در جلسه بعد (جلسه آخر)  با چند مثال کامل تر آشنا خواهید شد.

 

 

فایل های ضمیمه

سروش صدر

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

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید