ضرب دکارتی جداول با استفاده از دستور Where
تلفيق دو جدول در Sql با ا ستفاده از دستور Select انجام مي پذيرد.تلفيق ها انواع مختلفي دارند كه هر يك را به اختصا ر بررسي مي كنيم:
تلفيق ضربدري:
در صورتي كه دو جدول را بدون به كارگيري بخش Where با هم تلفيق كنيم يك تلفيق ضربدري يا دكارتي خواهيم داشت.اين تلفيق تمام سطرهاي بخش From را با تمام سطرهاي همه جدول هاي ديگر تركيب مي كند.
براي مثال دو جدول Table1 و Table2 را در نظر بگيريد:
Table1-> Name Family
Ahmaadi Hassan
Alavi Naser
Table2 -> Lesson Code
Db 27370
Os 28490
حال اگر دستورات زير را براي تلفيق آنها به كا ر مي بريم:
Select * From Table1,table2 ;
بدين ترتيب خواهيم داشت:
Name Stno Lesson Code
Hassan Ahmadi Db 27370
Hassan Ahmadi Os 28490
Naser Alavi Db 27370
Naser Alavi Os 28490
به طوري كه مشاهده مي كنيم جدول حاصل داراي 4 ركورد است كه ار حاصلضرب جداول تلفيق شده به دست مي آيند .
آشنایی با دستور Order By :
تا الان یاد گرفتین که چطور یه سری فیلد رو محدود کنین ، تعداد رکوردها رو محدود کنین و جداول رو با هم ادغام کنین در این بخش هم میخوایم طریقه مرتب سازی جداولی را که از این فیلترینگ ایجاد کردین را توضیح بدیم . جهت مرتب سازی جداول ایجاد شده از دستور ORDER BY در SELECT استفاده میشه . بحث رو با یک مثال ساده که نحوه عملکرد دستور را شرح میدهد شروع میکنیم .
--------------------------------------------------------------------------------
مثال1 : میخواهیم از جدول مشخصات دانشجویان ، لیست نام و نام خانوادگی دانشجویان را انتخاب کرده و فیلدها را بر اساس نام خانوادگی دانشجو مرتب کنیم .
کد:
SELECT name, family
FROM student
ORDER BY family
* بهتر است خروجی علاوه بر اینکه براساس نام خانوادگی دانشجو مرتب میشود ، بر اساس نام دانشجو نیز مرتب شود ، البته در این مثال به علت عدم وجود نام خانوادگی تکراری در بانک اطلاعات دانشجو نتیجه خروجی فرقی نخواهد کرد لذا یک دانشجو جدید به این اضافه خواهیم کرد که تمایز آن با مثال فوق مشخص شود .
کد:
SELECT *
FROM student
ORDER BY family,name
--------------------------------------------------------------------------------
همانطور که مشاهده کردید برای مرتب سازی فیلدها در خروجی از ORDER BY استفاده شد و ترتیب مرتب سازی بترتیب جلوی این دستور نوشته شد . اگر دقت کرده باشید فیلدها بترتیب صعودی مرتب شدند (حالت پیش فرض T-SQL) حال اگر بخواهیم فیلدها بر اساس ترتیب نزولی مرتب شوند میتوان از دستور DESC (مخفف واژه Descending) استفاده کرد ، میتوان در مرتب سازی صعودی از دستور ASC (مخفف واژه Ascending) نیز استفاده نمائید ، لیکن همانطور که گفته شد ترتیب پیش فرض SQL صعودی (Ascending) میباشد و این دستور را بطور اتوماتیک حذف خواهد کرد .
مثال2 : میخواهیم در جدول دروس ، لیست کلیه دروس را بصورت نزولی نمایش دهیم :
کد:
SELECT *
FROM course
ORDER BY name DESC
تلفیق دستورات Select (بخش اول)
در این بحث میخوایم به ارتباط SELECT و دستور IN بپردازیم ، در مباحث بعدی توضیحاتی بیشتر در مورد اجتماع ، اشتراک ، حالضرب و . . . دستورات SELECT ارائه میدم . از این جهت که تقریبا 90% امور مربوط به گزراش گیری و اعمال پردازشی با دستور SELECT انجام میشه ، تبحر در این دستور و نحوه استفاده از اون اهمیت زیادی داره ، لذا سعی میکنم نکات کاربردی در مورد این دستور ارائه بدم .
تا اینجا با بانک نمونه آشنا شدین ، خب اجازه بدین بحث رو با یک سوال شروع کنم :
سوال : فرض کنین میخواین لیست تمام نمرات دانشجویانی رو بدست بیارین که در ترم اول 86 درس 2 واحدی داشتن .
خب تو یه تحلیل ساده پیش خودتون میگین اول باید کد تمام دروس 2 واحدی رو پیداکنم ، بعد بگم تمام نمراتی رو بهم نشون بده که کدش یکی از این کدهاست . تو این پست میخوام طریقه انجام این کار رو با دستور SELECT و IN توضیح بدم .
همونطور که در بحث مربوط به دستور IN دیدید ، با استفاده از این دستور میتونیم فیلدهایی رو که یکی از مشخصه های یک مجموعه مشخص رو داشته باشن رو انتخاب کنیم ، توصیه میشه پیش از ادامه بحث در صورتی که مطالب رو از ابتدا پیگیری نکردین اینجا رو بخونین .
جهت استفاده از دستور SELECT برای تعیین موارد انتخابی ای که دستور IN میتواند یکی از آن موارد باشد ، باید چند شرط را رعایت کنیم :
در دستور SELECT فقط و فقط یک فیلد را که کد شناسه ارتباطی بین جدول اصلی و ثانوی است را به عنوان خروجی ارسال کنیم (در اینجا فیلد مربوط به کد درس)
شرطی که باید فیلد داشته باشد را در بخش WHERE دستور SELECT داخلی قید میکنیم . (در اینجا شرط 2واحدی بودن)
خب بیاین و کد مربوط به سوالی رو که ابتدای بحث مطرح کردیم رو ایجاد کنیم ، با توجه به موارد قید شده دستور SELECT داخلی باید یک مجموعه از کدهای دروسی را در اختیار ما قرار دهد که درس مربوطه 2 واحدی باشد پس داریم :
کد:
SELECT Course.Crs_Code
FROM Course
WHERE Vahed=2
خب ، همینطوری که میبینین این دستور لیست یک سری درس رو بهمون نشون داد که میخوایم بدونیم کدوم دانشجوها این درس (یا دروس) رو در نیمسال اول 86 انتخاب کردن :
کد:
SELECT *
FROM nomreh
WHERE nomreh.term=1 AND nomreh.year=86
AND nomreh.crs_code IN
( SELECT Course.Crs_Code
FROM Course
WHERE Vahed=2)
تلفیق دستورات Select (بخش اول)
در این بحث میخوایم به ارتباط SELECT و دستور IN بپردازیم ، در مباحث بعدی توضیحاتی بیشتر در مورد اجتماع ، اشتراک ، حالضرب و . . . دستورات SELECT ارائه میدم . از این جهت که تقریبا 90% امور مربوط به گزراش گیری و اعمال پردازشی با دستور SELECT انجام میشه ، تبحر در این دستور و نحوه استفاده از اون اهمیت زیادی داره ، لذا سعی میکنم نکات کاربردی در مورد این دستور ارائه بدم .
تا اینجا با بانک نمونه آشنا شدین ، خب اجازه بدین بحث رو با یک سوال شروع کنم :
سوال : فرض کنین میخواین لیست تمام نمرات دانشجویانی رو بدست بیارین که در ترم اول 86 درس 2 واحدی داشتن .
خب تو یه تحلیل ساده پیش خودتون میگین اول باید کد تمام دروس 2 واحدی رو پیداکنم ، بعد بگم تمام نمراتی رو بهم نشون بده که کدش یکی از این کدهاست . تو این پست میخوام طریقه انجام این کار رو با دستور SELECT و IN توضیح بدم .
همونطور که در بحث مربوط به دستور IN دیدید ، با استفاده از این دستور میتونیم فیلدهایی رو که یکی از مشخصه های یک مجموعه مشخص رو داشته باشن رو انتخاب کنیم ، توصیه میشه پیش از ادامه بحث در صورتی که مطالب رو از ابتدا پیگیری نکردین
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
رو بخونین .
جهت استفاده از دستور SELECT برای تعیین موارد انتخابی ای که دستور IN میتواند یکی از آن موارد باشد ، باید چند شرط را رعایت کنیم :
در دستور SELECT فقط و فقط یک فیلد را که کد شناسه ارتباطی بین جدول اصلی و ثانوی است را به عنوان خروجی ارسال کنیم (در اینجا فیلد مربوط به کد درس)
شرطی که باید فیلد داشته باشد را در بخش WHERE دستور SELECT داخلی قید میکنیم . (در اینجا شرط 2واحدی بودن)
خب بیاین و کد مربوط به سوالی رو که ابتدای بحث مطرح کردیم رو ایجاد کنیم ، با توجه به موارد قید شده دستور SELECT داخلی باید یک مجموعه از کدهای دروسی را در اختیار ما قرار دهد که درس مربوطه 2 واحدی باشد پس داریم :
کد:
SELECT Course.Crs_Code
FROM Course
WHERE Vahed=2
خب ، همینطوری که میبینین این دستور لیست یک سری درس رو بهمون نشون داد که میخوایم بدونیم کدوم دانشجوها این درس (یا دروس) رو در نیمسال اول 86 انتخاب کردن :
کد:
SELECT *
FROM nomreh
WHERE nomreh.term=1 AND nomreh.year=86
AND nomreh.crs_code IN
( SELECT Course.Crs_Code
FROM Course
WHERE Vahed=2)