نمایش نتایج 1 تا 11 از 11

نام تاپیک: تفاوت بین دستور IN و Exists در شرط Where

  1. #1

    تفاوت بین دستور IN و Exists در شرط Where

    سلام.

    در این تاپیک نکاتی در مورد این دو دستور بیان خواهد شد.

    جداول زیر رو ایجاد بفرمائید.

    Create Table
    Customers(CustId int not null,
    CustomerName varchar(20),
    Constraint PK_Customers primary Key(CustID)
    );

    Create Table Orders
    (OrderId int not null,
    CustId Int Null,
    Price Int,
    Constraint PK_Orders primary key(OrderId)
    );

    Insert Into Customers
    Values(1,'Hamid'),
    (2,'Mohammad'),
    (3,'Ali'),
    (4,'Reza'),
    (5,'ALireza');

    Insert Into Orders
    Values(1,1,1000),
    (2,1,5000),
    (3,2,6000),
    (4,Null,7000),
    (5,4,8000);


    ما میخواهیم لیست مشتریانی رو بدست بیاوریم که هیچ فروشی برای آنها در جدول orders ثبت نشده است.
    به دو روش میتوان آنرا انجام داد.
    هم با استفاده از دستور In هم با استفاده از دستور Exists.
    دستور زیر را ابتدا اجرا بفرمائید.


    Select * from Customers
    Where CustId not in(select CustId from Orders)

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

    حال دستور زیر رو اجرا کنید.

    Select * from Customers
    Where Not Exists(Select * from Orders
    Where Customers.custid=Orders.Custid)

    مشاهده میکنید که نتیجه مورد نظر مارا نمایش داد.

    هردو دستور از لحاظ منطقی و ساختاری درست هستند ولی چرا با In نتیجه دلخواه را نمایش نداد ولی با Exists نتیجه دلخواه را دریافت کردیم؟

    برای اینکه بتوانیم نتیجه را با In نیز ببینیم باید چه تغییری در دستور بدهیم و چرا؟؟

  2. #2

    نقل قول: تفاوت بین دستور IN و Exists در شرط Where

    ولی این دستور نتیجه ای رو به ما نمایش نخواهد داد.(دلیل آنرا بیان کنید)
    دستور In وقتی نتیجه مقایسه رو True بر میگردونه که صراحتا مقدار مورد نظر رو در Sub Query یا لیست ارائه شده ببینه ولی دستور Exists وقتی Sub Query حاوی حداقل 1 رکورد باشه مقدار True بر میگردونه ( مثل Select Count ) عمل میکنه ولی به صورت بهینه تر .

    در جدول Orders مقدار فیلد CustID یکی از رکوردها ( شماره 4 ) پوچ ( Null ) هست ، Null قابل مقایسه با هیچ چیزی نیست ، حتی با خود Null ؛ پس دستور In نمیتونه عدد پاس داده شده به Sub Query رو با مقدار Null مقایسه کنه و False بر میگردونه .

    برای حل مشکل باید رکوردهای Null رو از نتیجه Sub Query کنار گذاشت :
    Select * from Customers
    Where CustId not in(select CustId from Orders where CustId is not null)

  3. #3

    نقل قول: تفاوت بین دستور IN و Exists در شرط Where

    باتشکر از جناب تاجیک .جواب صحیح هست. در واقع Exists وقتی به null برمیخوره باهاش مثل یک مقدار False رفتار میکنه.ولی وقتی In به یک مقدار null برخورد میکنه باهاش مثل یک مقدار not Unknown برخورد میکنه و هیچ رفتاری نشون نمیده به همین خاطر هیچ رکوردی رو برنمیگردونه.
    این دو دستور نیز در این مورد از لحاظ Plan شبیه هم میباشند و در Performance هیچ تفاوتی باهم ندارند.

  4. #4
    کاربر دائمی آواتار کامروا
    تاریخ عضویت
    دی 1388
    محل زندگی
    ایالات متحده جهرم
    پست
    535

    نقل قول: تفاوت بین دستور IN و Exists در شرط Where

    نقل قول نوشته شده توسط مجتبی تاجیک مشاهده تاپیک
    در جدول Orders مقدار فیلد CustID یکی از رکوردها ( شماره 4 ) پوچ ( Null ) هست ، Null قابل مقایسه با هیچ چیزی نیست ، حتی با خود Null ؛ پس دستور In نمیتونه عدد پاس داده شده به Sub Query رو با مقدار Null مقایسه کنه و False بر میگردونه .
    نقل قول نوشته شده توسط حمیدرضاصادقیان مشاهده تاپیک
    در واقع Exists وقتی به null برمیخوره باهاش مثل یک مقدار False رفتار میکنه.ولی وقتی In به یک مقدار null برخورد میکنه باهاش مثل یک مقدار not Unknown برخورد میکنه و هیچ رفتاری نشون نمیده به همین خاطر هیچ رکوردی رو برنمیگردونه.
    در پاسخ آقای تاجیک، منظور از False برگرداندن ، SubQuery است درسته؟ چون گفتیم که null قابل قیاس با هیچ چیز نیست. و در درنهایت چون مقدار SubQuery برابر False می باشد هیچ خروجی نداریم؟
    اما توی Exists رکورد حاوی null رو False بر میگرداند.

    سپاس

  5. #5

    نقل قول: تفاوت بین دستور IN و Exists در شرط Where

    منظور از unknown یعنی نه false نه True. درواقع چون نتیجه برای In مشخص نیست نمیتونه کنترلی روی نتیجه داشته باشه و هیچ رکوردی رو برنمی گردونه ولی در Exists مقدار Null رو با False کنترل میکنه و نتیجه درست رو به ما میده.

  6. #6
    کاربر دائمی آواتار کامروا
    تاریخ عضویت
    دی 1388
    محل زندگی
    ایالات متحده جهرم
    پست
    535

    نقل قول: تفاوت بین دستور IN و Exists در شرط Where

    نقل قول نوشته شده توسط حمیدرضاصادقیان مشاهده تاپیک
    منظور از unknown یعنی نه false نه True. درواقع چون نتیجه برای In مشخص نیست نمیتونه کنترلی روی نتیجه داشته باشه و هیچ رکوردی رو برنمی گردونه ولی در Exists مقدار Null رو با False کنترل میکنه و نتیجه درست رو به ما میده.
    ممنون از پاسختون.

    خب پاسخ این قسمت آقای تاجیک

    س دستور In نمیتونه عدد پاس داده شده به Sub Query رو با مقدار Null مقایسه کنه و False بر میگردونه .
    منظور از False، چیست؟

  7. #7

    نقل قول: تفاوت بین دستور IN و Exists در شرط Where

    هیچ مناقشه ای در مثل نیست، ولی چرا باید مقدار ستون CustId در جدول orders قابلیت پذیرش مقدار null را داشته باشه.

  8. #8

    نقل قول: تفاوت بین دستور IN و Exists در شرط Where

    این یک مثاله.در واقع حرف شما درسته.
    ولی غرض نشان دادن تفاوت نتیجه ارائه شده توسط این دو دستور بود.
    نظر شما در این زمینه چیه؟

  9. #9

    نقل قول: تفاوت بین دستور IN و Exists در شرط Where

    ایده و نظر خاصی ندارم. منتهی میتونیم مشکل not in رو با دو سطح سابکوری (two level subquery) بشکل خنده دار زیر حل کنیم، که جواب کد 3و5 مورد نظر هست.
    select custid
    from customers
    where custid not in
    (select custid
    from customers
    where custid in (select custid
    from orders));

  10. #10

    نقل قول: تفاوت بین دستور IN و Exists در شرط Where

    خوب اینم راهیه. راه ساده ترش استفاده از is null هست که با یک in هم حل میشه.
    درواقع میخواستم مشکل In رو دربرخورد با Null ها مطرج کنم.

  11. #11

    نقل قول: تفاوت بین دستور IN و Exists در شرط Where

    با سلام و خسته نباشید خدمت شما
    از بابت این آموزش خیلی عالی بسیار ممنونم خیلی عالی بود
    ممنونم جناب آقای مهندس حمیدرضاصادقیان
    با تشکر از شما

تاپیک های مشابه

  1. تفاوت بین نوع Char و Varchar
    نوشته شده توسط کم حوصله در بخش SQL Server
    پاسخ: 11
    آخرین پست: چهارشنبه 09 دی 1388, 16:48 عصر
  2. چند تفاوت بین چند دستور dot net و SqlServer خیلی واسم مهم هستش
    نوشته شده توسط mamizadeh در بخش ASP.NET Web Forms
    پاسخ: 4
    آخرین پست: دوشنبه 19 اسفند 1387, 15:16 عصر
  3. تفاوت بین اسمبلی تحت ویندوز و تحت داس
    نوشته شده توسط maleknasab در بخش برنامه نویسی اسمبلی خانواده x86
    پاسخ: 4
    آخرین پست: چهارشنبه 01 بهمن 1382, 18:22 عصر
  4. تفاوت بین insert و insert into
    نوشته شده توسط tazekar در بخش T-SQL
    پاسخ: 1
    آخرین پست: دوشنبه 31 شهریور 1382, 20:49 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •