যেখানে বনাম বনাম যোগ দিন


940

সরলতার জন্য, ধরে নিন সমস্ত প্রাসঙ্গিক ক্ষেত্রগুলি NOT NULL

আপনি করতে পারেন:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1, table2
WHERE
    table1.foreignkey = table2.primarykey
    AND (some other conditions)

অথবা:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1 INNER JOIN table2
    ON table1.foreignkey = table2.primarykey
WHERE
    (some other conditions)

এই দুটি কি একইভাবে কাজ করে MySQL?




18
আমি যদি সঠিকভাবে বুঝতে পারি তবে প্রথম বৈকল্পিকটি হ'ল এএনএসআই এসকিউএল-89 অন্তর্নিহিত বাক্য গঠন এবং দ্বিতীয় বৈকল্পিকটি এএনএসআই এসকিউএল -99 স্পষ্টত যুক্ত সিনট্যাক্স। উভয়ই এসকিউএল বাস্তবায়ন অনুসারে একই ফলাফলের ফলস্বরূপ এবং উভয়ই ভাল এসকিউএল বাস্তবায়নে একই ক্যোয়ারী পরিকল্পনার ফলস্বরূপ। আমি ব্যক্তিগতভাবে এসকিউএল -৯৯ বাক্য গঠনটি পছন্দ করি তবে অনেক লোক এসকিউএল -৯৯ সিনট্যাক্স পছন্দ করেন।
মিক্কো রেন্টালাইনেন

11
@ হোগান আমি বিভিন্ন সিনট্যাক্সের সরকারী নামগুলি দেখিয়েছিলাম। উত্তরের কোনও উত্তরই স্পষ্টভাবে পুরো নাম বানাননি তাই আমি সেগুলি মন্তব্য হিসাবে যুক্ত করার সিদ্ধান্ত নিয়েছি। তবে, আমার মন্তব্যটি আসল প্রশ্নের উত্তর দেয়নি তাই আমি এটিকে মন্তব্য হিসাবে যুক্ত করেছি, উত্তর হিসাবে নয়। (উচ্চ ভোট প্রাপ্ত উত্তরের দাবী যেমন "INNER JOIN is ANSI সিনট্যাক্স" এবং "অন্তর্ভুক্ত এএনএসআই সিনট্যাক্সটি পুরানো") যা কিছুই বলে না কারণ উভয় বাক্য গঠন আলাদা আলাদা এএনএসআই বাক্য গঠন।)
মিক্কো রেন্টালাইনেন

উত্তর:


710

INNER JOIN আপনার ব্যবহার করা উচিত যা এএনএসআই সিনট্যাক্স।

এটি সাধারণত বেশি পঠনযোগ্য বলে বিবেচিত হয়, বিশেষত যখন আপনি প্রচুর টেবিলগুলিতে যোগদান করেন।

OUTER JOINযখনই কোনও প্রয়োজন দেখা দেয় তখন এটিকে সহজেই প্রতিস্থাপন করা যায় ।

WHEREসিনট্যাক্স আরো রিলেশনাল মডেল ভিত্তিক হয়।

দুটি টেবিল JOINএডের ফলাফল হ'ল টেবিলগুলির একটি কার্টেসিয়ান পণ্য যেখানে একটি ফিল্টার প্রয়োগ করা হয় যা কেবলমাত্র কলামের সাথে মিল রেখে মিলগুলিতে সারি নির্বাচন করে।

WHEREসিনট্যাক্স সহ এটি দেখতে আরও সহজ ।

আপনার উদাহরণ হিসাবে, মাইএসকিউএলে (এবং সাধারণত এসকিউএল এ) এই দুটি প্রশ্নের সমার্থক শব্দ।

আরও মনে রাখবেন যে মাইএসকিউএলেরও একটি STRAIGHT_JOINধারা রয়েছে।

এই ধারাটি ব্যবহার করে আপনি JOINঅর্ডারটি নিয়ন্ত্রণ করতে পারবেন : কোন টেবিলটি বাইরের লুপে স্ক্যান করা হয় এবং কোনটি অভ্যন্তরীণ লুপে রয়েছে।

আপনি WHEREসিনট্যাক্স ব্যবহার করে মাইএসকিউএলে এটি নিয়ন্ত্রণ করতে পারবেন না ।


10
ধন্যবাদ, কাসনোই আপনি আপনার উত্তরগুলিতে প্রচুর বিবরণ পেয়েছেন; "হ্যাঁ, সেই প্রশ্নগুলি সমতুল্য, তবে আপনার অভ্যন্তরীণ যোগটি ব্যবহার করা উচিত কারণ এটি আরও পাঠযোগ্য, এবং সংশোধন করা সহজ?"
অ্যালিউরকোড

8
@allyourcode জন্য Oracle, SQL Server, MySQLএবং PostgreSQL- হ্যাঁ। অন্যান্য সিস্টেমে সম্ভবত খুব সম্ভবত, তবে আপনি আরও ভাল করে পরীক্ষা করে দেখুন।
কাসনসুই

13
এফডাব্লুআইডাব্লিউ, ক্লজটিতে শর্ত সাপেক্ষে কমা ব্যবহার WHEREকরেও এএনএসআই স্ট্যান্ডার্ডে রয়েছে।
বিল কারভিন

1
@Bill Karwin: JOINকীওয়ার্ডটি অতীতের সাম্প্রতিককালের মতো মনে হচ্ছে মালিকানাধীন মানের অংশ ছিল না। এটি Oracleকেবল সংস্করণে 9এবং সংস্করণে প্রবেশ PostgreSQLকরেছে 7.2(উভয় প্রকাশিত 2001)। এই কীওয়ার্ডটির উপস্থিতি ANSIস্ট্যান্ডার্ড গ্রহণের একটি অংশ ছিল এবং এ কারণেই এই কীওয়ার্ডটি সাধারণত যুক্ত হয় ANSI, যদিও পরবর্তীকালে CROSS JOINপাশাপাশি কমনার প্রতিশব্দ হিসাবে কমা সমর্থন করে ।
কাসনসুই

9
তবুও, এএনএসআই এসকিউএল -৯৯ নির্দিষ্টভাবে একটি ধারাতে কমা এবং শর্তাবলী সহ সম্পন্ন হতে যোগদান করে WHERE(শর্ত ছাড়াই, একটি জয়েন একটি ক্রস জোনের সমতুল্য, যেমনটি আপনি বলেছেন)। এএনএসআই এসকিউএল -২২ JOINকীওয়ার্ড এবং সম্পর্কিত সিনট্যাক্স যুক্ত করেছে তবে কমা-শৈলীর সিনট্যাক্সটি এখনও পশ্চাদপটে সামঞ্জস্যের জন্য সমর্থিত।
বিল কারভিন

182

অন্যরা উল্লেখ করেছে যে এটি INNER JOINমানুষের পঠনযোগ্যতাকে সহায়তা করে এবং এটি সর্বাধিক অগ্রাধিকার, আমি সম্মত। যোগদানের সিনট্যাক্সটি কেন বেশি পঠনযোগ্য তা বোঝানোর
চেষ্টা করি ।

একটি প্রাথমিক SELECTজিজ্ঞাসাটি হ'ল:

SELECT stuff
FROM tables
WHERE conditions

SELECTদফা আমাদের বলে কি আমরা ফিরে পেয়ে থাকেন; FROMদফা আমাদের বলে যেখানে আমরা থেকে এটা পেয়ে থাকেন, এবং WHEREধারা আমাদের বলে যা বেশী আমরা পেয়ে থাকেন।

JOIN টেবিলগুলি সম্পর্কে কী তা একটি বিবৃতি, সেগুলি কীভাবে একত্রে আবদ্ধ হয় (ধারণাগতভাবে, আসলে, একটি টেবিলের মধ্যে)।

টেবিলগুলি নিয়ন্ত্রণ করে এমন কোনও কোয়েরি উপাদানগুলি - যেখানে আমরা স্টাফগুলি পাই - শব্দার্থগতভাবে ক্লজটির অন্তর্ভুক্ত FROM(এবং অবশ্যই এটি সেখানেJOIN উপাদানগুলি চলে)। অংশে যোগ-উপাদানগুলি WHEREরেখে কোনটি এবং কোথা থেকে সংশ্লেষ হয় , সে কারণেই JOINবাক্য গঠনটি অগ্রাধিকার দেওয়া হয়।


7
কেন অভ্যন্তরীণ যোগদান কার্ল পছন্দ হয় তা স্পষ্ট করার জন্য ধন্যবাদ। আমি মনে করি আপনার উত্তরগুলি অন্যদের মধ্যে অন্তর্ভুক্ত ছিল তবে স্পষ্টতই সাধারণত ভাল (হ্যাঁ, আমি পাইথনের ভক্ত)।
অ্যালিউরকোড 21

2
চালু এবং যেখানে এর অর্থশাস্ত্রের অর্থ হ'ল শেষ আউটর জয়েনের পরে যোগদানের জন্য আপনি কোনটিই ব্যবহার করেন তা বিবেচ্য নয় । যদিও আপনার সাথে যোগ অংশ হিসাবে বৈশিষ্ট্য, এটা এছাড়াও একটি কার্টিজিয়ান পণ্য পরে একটি ফিল্টারিং। উভয় চালু এবং যেখানে কার্টেসিয়ান পণ্য ফিল্টার করে। তবে হয় বা একটি সাবলেট যা WHERE এর সাথে অবশ্যই শেষ আউটর জয়েনের আগে অবশ্যই ব্যবহার করা উচিত । (যোগদান করুন কলাম জোড়া "নেই"। যে কোনও শর্তে যে কোনও দুটি টেবিল যোগ দেওয়া যেতে পারে That's এটি বিশেষভাবে কলামগুলির সমতার বিষয়ে জয়েন্টগুলিকে ব্যাখ্যা করার একমাত্র উপায়))
ফিলিপ্সি

এমনকি আপনি যখন আন্তঃজিনের একই প্রভাবের জন্য WHERE ব্যবহার করছেন, আপনি কোয়েরির FROM অংশে আপনার দুটি সারণী উল্লেখ করতে যাচ্ছেন। সুতরাং মূলত আপনি এখনও বোঝাচ্ছেন যেখানে আপনি
এফআরএম ক্লজে

@ আর্সেনখাচাতুরিয়ান কেবল যেহেতু কোনও কীওয়ার্ড বা সনাক্তকারী পাঠ্যে ব্যবহৃত হয় তার অর্থ এই নয় যে এটি কোড এবং কোডের বিন্যাসের প্রয়োজন needs এটি একটি ফর্ম্যাটিং পছন্দ যা কোনওভাবেই যেতে পারে এবং যদি এখানে সম্পাদনা করা যুক্তিসঙ্গত হয় তবে প্রতিটি পোস্টের জন্য নিয়মিতভাবে অন্য ফর্ম্যাটে সম্পাদনা করা ন্যায়সঙ্গত - যার অর্থ এটি ন্যায়সঙ্গত নয়। (প্লাস ইন-লাইন প্রতি-শব্দের কোড বিন্যাস পড়তে অসুবিধা হতে পারে)) এখানে অনুচ্ছেদের বিরতিগুলির জন্য একই - তারা বিশেষভাবে স্পষ্ট নয়। একই সাথে 'যা' বনাম 'যে'। এবং প্রোগ্রামিং ভাষার নামগুলি কোড ফর্ম্যাটে থাকা উচিত নয় । পিএস আপনি ত্রুটিযুক্তভাবে একটি লাইন ব্রেক যোগ করেছেন।
ফিলিপ্সি

@ ফিলিপ্সি যেমন আপনি উল্লেখ করেছেন "এর অর্থ এই নয় ...", তবে স্পষ্টতই এর অর্থ এই নয় যে এটি কোড কীওয়ার্ড দিয়ে চিহ্নিত করা যায় না। হ্যাঁ এটি তৈরি করা পছন্দ তবে সত্যটি না জেনে প্রচুর পোস্ট করা হয়। সুতরাং আমার পরিবর্তনগুলি করার সিদ্ধান্তটি কোনও কিছু ভাঙ্গার নয় বরং এটিকে আরও পাঠযোগ্য able যদি আপনি পরিবর্তনগুলি বিন্যাসের পরে কোনও বিরতি লক্ষ্য করেন, তবে এর জন্য দুঃখিত, এবং আপনি অবশ্যই এই ধরনের পরিবর্তনগুলি ফিরিয়ে আনতে পারেন।
আর্সেন খাচাতুরিয়ান

143

অন ​​/ WHERE এ শর্তাধীন বিবৃতি প্রয়োগ করা

এখানে আমি লজিকাল ক্যোয়ারী প্রসেসিং পদক্ষেপগুলি সম্পর্কে ব্যাখ্যা করেছি।


তথ্যসূত্র: মাইক্রোসফ্ট এসকিউএল সার্ভারের ভিতরে T 2005 টি এসকিউএল অনুসন্ধানী
প্রকাশক: মাইক্রোসফ্ট প্রেস
পাব তারিখ: মার্চ 07, 2006
প্রিন্ট আইএসবিএন-10: 0-7356-2313-9
মুদ্রণ আইএসবিএন -13: 978-0-7356-2313-2
পৃষ্ঠা: 640

মাইক্রোসফ্ট ® এসকিউএল সার্ভারের মধ্যে 2005 টি-এসকিউএল অনুসন্ধান

(8)  SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1)  FROM <left_table>
(3)       <join_type> JOIN <right_table>
(2)       ON <join_condition>
(4)  WHERE <where_condition>
(5)  GROUP BY <group_by_list>
(6)  WITH {CUBE | ROLLUP}
(7)  HAVING <having_condition>
(10) ORDER BY <order_by_list>

এসকিউএল এর প্রথম লক্ষণীয় দিক যা অন্যান্য প্রোগ্রামিং ভাষার চেয়ে পৃথক, কোডটি প্রক্রিয়াভুক্ত করার ক্রম। বেশিরভাগ প্রোগ্রামিং ভাষায়, কোডটি যেভাবে লেখা হয় তাতে প্রক্রিয়াজাত করা হয়। এসকিউএল-তে প্রথম ধারাটি প্রসেস করা হয় হ'ল এফআরওএম ক্লজ, যখন নির্বাচিত ধারাটি যা প্রথম প্রদর্শিত হয় প্রায় শেষ পর্যায়ে প্রক্রিয়াজাত হয়।

প্রতিটি পদক্ষেপ একটি ভার্চুয়াল টেবিল তৈরি করে যা নিম্নলিখিত ধাপে ইনপুট হিসাবে ব্যবহৃত হয়। এই ভার্চুয়াল টেবিলগুলি কলার (ক্লায়েন্ট অ্যাপ্লিকেশন বা বাহ্যিক ক্যোয়ারী) এর জন্য উপলভ্য নয়। শুধুমাত্র চূড়ান্ত পদক্ষেপের দ্বারা উত্পন্ন টেবিলটি কলারে ফিরে আসে। যদি কোনও কোয়েরিতে একটি নির্দিষ্ট ধারাটি নির্দিষ্ট না করা থাকে তবে সংশ্লিষ্ট পদক্ষেপটি সহজেই এড়ানো যায়।

লজিক্যাল ক্যোয়ারী প্রক্রিয়াজাতকরণ পর্যায়ের সংক্ষিপ্ত বিবরণ

পদক্ষেপগুলির বিবরণ আপাতত খুব বেশি অর্থবহ না করে বলে খুব বেশি চিন্তা করবেন না। এগুলি একটি রেফারেন্স হিসাবে সরবরাহ করা হয়। দৃশ্যের উদাহরণের পরে আসা বিভাগগুলি আরও বিশদে পদক্ষেপগুলি আবরণ করবে।

  1. FROM: একটি কার্টেসিয়ান পণ্য (ক্রস জয়েন) এফআরওএম ক্লজে প্রথম দুটি টেবিলের মধ্যে সঞ্চালিত হয় এবং ফলস্বরূপ, ভার্চুয়াল টেবিল ভিটি 1 উত্পন্ন হয়।

  2. চালু: ওএন ফিল্টারটি ভিটি 1 তে প্রয়োগ করা হয়। কেবলমাত্র সারিগুলির জন্য যার <join_condition>সত্য সত্য VT2 inোকানো হয়।

  3. আউটার (যোগ দিন): যদি একটি আউট জয়েন নির্দিষ্ট করা হয় (কোনও ক্রস যোগ বা একটি অভ্যন্তরীণ যোগদানের বিপরীতে), সংরক্ষিত টেবিল বা সারণীগুলির সারিগুলি যার জন্য কোনও মিল খুঁজে পাওয়া যায় নি, ভিটি 2 থেকে সারিগুলিকে বাইরের সারি হিসাবে যুক্ত করা হয়, VT3। যদি এফআরওএম ক্লজে দুটিরও বেশি সারণী উপস্থিত হয়, সমস্ত সারণী প্রক্রিয়া না হওয়া অবধি সর্বশেষ যোগদানের ফলাফল এবং পরবর্তী সারণীর FROM ধারাটিতে বারবার প্রয়োগ করা হয় are

  4. যেখানে: WHTE ফিল্টারটি ভিটি 3-তে প্রয়োগ করা হয়। কেবলমাত্র সারিগুলির জন্য যার <where_condition>সত্য সত্য VT4 inোকানো হয়।

  5. গ্রুপ দ্বারা: ভিটি 4 থেকে সারিগুলি গ্রুপের মাধ্যমে গ্রুপে সাজানো হয়েছে গ্রোপ বাই দফায় বর্ণিত কলাম তালিকার ভিত্তিতে। ভিটি 5 জেনারেট হয়।

  6. কিউব | রোলআপ: ভিটি 5 থেকে সারিগুলিতে সুপার গ্রুপগুলি (গোষ্ঠীগুলির গোষ্ঠীগুলি) যুক্ত করা হয়, ভিটি 6 তৈরি করে।

  7. HAVING: HAVING ফিল্টারটি VT6 এ প্রয়োগ করা হয়। কেবলমাত্র সেই গোষ্ঠীগুলির জন্য যাদের <having_condition>সত্যই VT7 toোকানো হয়।

  8. নির্বাচন করুন: নির্বাচন তালিকাটি ভিটি 8 তৈরি করে প্রক্রিয়াজাত করা হয়।

  9. DISTINCT: সদৃশ সারিগুলি VT8 থেকে সরানো হয়েছে। ভিটি 9 উত্পন্ন হয়।

  10. অর্ডার বাই: ভিটি 9 থেকে সারিগুলি অর্ডার বাই দফায় বর্ণিত কলাম তালিকা অনুসারে বাছাই করা হয়েছে। একটি কার্সার উত্পন্ন হয় (ভিসি 10)।

  11. শীর্ষ: সারিগুলির নির্দিষ্ট নম্বর বা শতাংশ ভিসি 10 এর শুরু থেকে নির্বাচিত হয়। সারণী ভিটি 11 জেনারেট করে কলারে ফিরে আসে।



অতএব, (অন্তর্ভুক্ত হওয়া) ওয়ান যেখানে বিধি প্রয়োগের আগে ডেটা ফিল্টার করবে (ভিটি-র ডেটা গণনা এখানে নিজেই হ্রাস পাবে)। পরবর্তী যোগদানের শর্তগুলি ফিল্টারযুক্ত ডেটা দিয়ে কার্যকর করা হবে যা কর্মক্ষমতা উন্নত করে। এর পরে কেবল WHERE শর্ত ফিল্টার শর্ত প্রয়োগ করবে।

(অন / WHERE এ শর্তাধীন বিবৃতি প্রয়োগ করা কয়েকটি ক্ষেত্রে খুব বেশি পার্থক্য আনবে না depends এটি নির্ভর করে যে আপনি কতগুলি টেবিলগুলিতে যোগদান করেছেন এবং প্রতিটি যোগদানের টেবিলে কতগুলি সারি উপলব্ধ রয়েছে)


10
"অতএব, (আধ্যাত্মিক যোগদান) ওভার যেখানে বিধি প্রয়োগের আগে ডেটা ফিল্টার করবে (ভিটি-র ডেটা গণনা এখানে নিজেই হ্রাস পাবে)।" অগত্যা। নিবন্ধটি প্রক্রিয়াজাতকরণের যৌক্তিক আদেশ সম্পর্কে is যখন আপনি বলছেন যে কোনও নির্দিষ্ট বাস্তবায়ন অন্য কোনও কাজের আগে একটি কাজ করবে, আপনি প্রক্রিয়াজাতকরণের বাস্তবায়িত আদেশের কথা বলছেন । বাস্তবায়নগুলি যেকোন অপ্টিমাইজেশন করার অনুমতি দেয়, যতক্ষণ না ফলাফলটি একই রকম হয় যদি বাস্তবায়নটি যৌক্তিক আদেশ অনুসরণ করে। জো সেলকো ইউজনেটে ​​এ সম্পর্কে অনেক কিছু লিখেছেন।
মাইক শেরিল 'ক্যাট রিকল'

@ ইরফীদিন "(অন্তর্ভুক্ত) ওপেন WHERE ক্লজ প্রয়োগ করার পূর্বে ... তথ্য ফিল্টার করবে ... যা কর্মক্ষমতা উন্নত করে।" ভাল যুক্তি. "তারপরে কেবল WHERE শর্তটি ফিল্টার শর্ত প্রয়োগ করবে" হাওয়িং ধারাটির কী হবে?
জেমস

@ জামেস রাফিধিনের দাবী ভুল। ম্যানুয়ালটিতে 'যোগদানের অপ্টিমাইজেশন' দেখুন। এছাড়াও এই পৃষ্ঠায় আমার অন্যান্য মন্তব্য। (এবং মাইকে শেরিল'কেট্রেকাল'র।) এই জাতীয় "যৌক্তিক" বিবরণ ফলাফলের মূল্য বর্ণনা করে, বাস্তবে এটি কীভাবে গণনা করা হয় তা নয়। এবং এ জাতীয় বাস্তবায়ন আচরণ পরিবর্তন না করার গ্যারান্টিযুক্ত নয়।
ফিলিপ্সি

66

অন্তর্নিহিত এএনএসআই সিনট্যাক্সটি পুরানো, কম সুস্পষ্ট এবং প্রস্তাবিত নয়।

এছাড়াও, আপেক্ষিক বীজগণিতটি WHEREঅনুচ্ছেদে এবং ভবিষ্যদ্বাণীগুলির মধ্যে আদান-প্রদানের বিনিময়ের অনুমতি দেয় INNER JOIN, সুতরাং এর সাথেও INNER JOINঅনুসন্ধান করেWHERE ক্লজ predicates অপটিমাইজার দ্বারা rearrranged থাকতে পারে।

আমি আপনাকে সর্বাধিক পঠনযোগ্য উপায়ে প্রশ্নগুলি লেখার পরামর্শ দিচ্ছি।

কখনও কখনও এর মধ্যে INNER JOINতুলনামূলকভাবে "অসম্পূর্ণ" করা এবং মানদণ্ডের কিছুটি অন্তর্ভুক্ত করা অন্তর্ভুক্তWHERE ফিল্টারিং মানদণ্ডগুলির তালিকা আরও সহজে বজায় রাখা যায় এমন জন্য কিছু মানদণ্ডকে সহজভাবে অন্তর্ভুক্ত করা অন্তর্ভুক্ত।

উদাহরণস্বরূপ, পরিবর্তে:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
    AND c.State = 'NY'
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
    AND a.Status = 1

লিখুন:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
WHERE c.State = 'NY'
    AND a.Status = 1

তবে এটি অবশ্যই নির্ভর করে।


16
আপনার প্রথম স্নিপেটটি অবশ্যই আমার মস্তিষ্ককে আরও ব্যথিত করে। কেউ কি আসলে তা করে? যদি আমি এমন কারও সাথে দেখা করি যে এটি করে, তবে তাকে আমার মাথার উপরে মারধর করা কি ঠিক হবে?
অ্যালিওরকোড 21

3
আমি সেই মানদণ্ডটি সনাক্ত করি যেখানে এটি সর্বাধিক অর্থবোধ করে। যদি আমি অস্থায়ীভাবে সামঞ্জস্যপূর্ণ স্ন্যাপশট লকিং টেবিলটিতে যোগ দিই (এবং আমার কাছে কোনও মতামত বা ইউডিএফ নেই যা একটি বৈধ তারিখ নির্বাচনকে কার্যকর করে), তবে আমি যোগদানের কার্যকর তারিখটি অন্তর্ভুক্ত করব এবং কোথায় থাকব না কারণ এটি কম দুর্ঘটনাক্রমে মুছে ফেলার সম্ভাবনা রয়েছে।
ক্যাড রক্স

14
@allyourcode: যদিও এই জাতীয় সংযোগগুলিতে এই জাতীয় সংশ্লেষের দেখা খুব কম দেখা যায়, রাইট জয়েন্টস এবং বাম যোগদানকারীদের ক্ষেত্রে এটি বেশ সাধারণ - জোড়ের প্রাকটিকেটে আরও বিশদ উল্লেখ করা একটি সাবকিয়ারির প্রয়োজনীয়তা দূর করে এবং আপনার বাহ্যিক যোগগুলিকে অজান্তে পরিণত হওয়া থেকে বিরত রাখে অন্তর্ভুক্ত যোগদান। (যদিও আমি স্বীকার করি যে INNER যোগদানের জন্য আমি প্রায় সর্বদা c.State = 'NY' যেখানে সর্বনিম্ন ধারায় রেখে দিতাম)
ডেভ মার্কেল

1
@allyourcode আমি অবশ্যই করছি! এবং আমি ক্যাডের সাথে একমত .. আমি কৌতূহল বোধ করি যে না করার
আর্থ

31

অন্তর্নিহিত যোগদান করে (যা আপনার প্রথম ক্যোয়ারী হিসাবে পরিচিত) অনেক বেশি বিভ্রান্তিকর, পড়া কঠিন এবং রক্ষণাবেক্ষণে শক্ত হয়ে ওঠার পরে একবার আপনার ক্যোয়ারীতে আরও সারণী যুক্ত করা শুরু করা দরকার। চার বা পাঁচটি আলাদা টেবিলের সাথে একই প্রশ্নটি এবং যোগদানের ধরণটি কল্পনা করুন ... এটি একটি দুঃস্বপ্ন।

সুস্পষ্ট যোগদান (আপনার দ্বিতীয় উদাহরণ) ব্যবহার করা অনেক বেশি পঠনযোগ্য এবং বজায় রাখা সহজ।


48
আমি আরও দ্বিমত করতে পারি না। যোগদানের সিনট্যাক্স অত্যন্ত শব্দযুক্ত এবং সংগঠিত করা কঠিন। আমার কাছে প্রচুর প্রশ্ন রয়েছে 5, 10, এমনকি 15 টি টেবিলের সাথে যেখানে ক্লউজ যোগ দেয় এবং সেগুলি পুরোপুরি পাঠযোগ্য। JOIN সিনট্যাক্স ব্যবহার করে এ জাতীয় একটি কোয়েরি পুনরায় লেখার ফলে গণ্ডগোলের সৃষ্টি হয়। যা কেবলমাত্র এই প্রশ্নের সঠিক উত্তর নেই তা দেখাতে যায় এবং এটি আপনার পক্ষে কী স্বাচ্ছন্দ্যময় তার উপর আরও নির্ভর করে।
নোহ ইয়েটার

33
নোহ, আমি মনে করি আপনি এখানে সংখ্যালঘুতে থাকতে পারেন।
ম্যাট বি

2
আমি ম্যাট এবং নোহকে +1 পাই। আমি বৈচিত্র্য পছন্দ করি :)। নোয়া কোথা থেকে আসছেন তা আমি দেখতে পাচ্ছি; অভ্যন্তরীণ যোগদানটি ভাষায় নতুন কিছু যুক্ত করে না এবং এটি অবশ্যই আরও ভার্ভোজ। অন্যদিকে, এটি আপনার 'কোথায়' শর্তটিকে আরও খাটো করে তুলতে পারে, যার অর্থ সাধারণত এটি পড়া সহজ।
অ্যালিউরকোড 21

5
আমি ধরে নেব যে কোনও বুদ্ধিমান ডিবিএমএস দুটি প্রশ্নকে একই কার্যকরকরণ পরিকল্পনায় অনুবাদ করবে; তবে বাস্তবে প্রতিটি ডিবিএমএস পৃথক এবং নিশ্চিতভাবে জানার একমাত্র উপায় হ'ল বাস্তবায়নের পরিকল্পনাটি পরীক্ষা করা (যেমন, আপনার নিজের এটি পরীক্ষা করে নিতে হবে)।
ম্যাট বি

এটি কি ঠিক সত্য যে @ ইরফিদীন অন্য উত্তরে (এসকিউএল মৃত্যুদণ্ডের বিস্তারিত ক্রম সহ একটি) পরামর্শ দিয়েছিলেন যে জয়নগুলি একবারে একটি ফিল্টার করা হয়, যখন একটি সম্পূর্ণ কার্টেসিয়ান যোগে 3 বা ততোধিক টেবিলের সাথে যুক্ত হওয়ার সাথে তুলনা করা হয় তখন যোগদানের আকার কমিয়ে দেয় কোথায় ফিল্টার retroactively প্রয়োগ করা হচ্ছে? যদি তা হয় তবে এটি JOIN এর কার্যকারিতা উন্নতির প্রস্তাব দেয় (পাশাপাশি বাম / ডান যোগদানের সুবিধাগুলি, পাশাপাশি অন্য উত্তরের দিকেও নির্দেশ করেছে) would
জেমস

26

আমি আরও উল্লেখ করতে পারি যে পুরানো বাক্য গঠনটি ব্যবহার করা ত্রুটির অধীনে। আপনি যদি কোনও অন-ধারা ছাড়াই অভ্যন্তরীণ যোগদান করে তবে আপনি একটি সিনট্যাক্স ত্রুটি পাবেন। আপনি যদি পুরানো বাক্য বাক্যটি ব্যবহার করেন এবং যেখানে শর্তের একটিতে যোগদানের শর্তটি ভুলে যান তবে আপনি ক্রস জয়েন পাবেন। বিকাশকারীরা প্রায়শই স্বতন্ত্র কীওয়ার্ড যুক্ত করে এটি সংশোধন করে (জোড় সংশোধন করার পরিবর্তে তারা এখনও বুঝতে পারেন না যে যোগদানটি নিজেই ভেঙে গেছে) যা সমস্যাটি নিরাময়ের জন্য উপস্থিত হতে পারে, তবে ক্যোয়ারীটি যথেষ্ট গতি কমিয়ে দেবে।

পুরানো বাক্য বাক্সে যদি আপনার ক্রস যোগ হয় তবে রক্ষণাবেক্ষণের জন্য, রক্ষণাবেক্ষণকারী কীভাবে জানতে পারবেন যে আপনার যদি একটি থাকে (এমন পরিস্থিতিতে আছে যেখানে ক্রস যোগ দেয় এমন প্রয়োজন হয়) বা যদি এটি একটি দুর্ঘটনা ছিল যা ঠিক করা উচিত?

আপনি যদি এই বামে যোগ দিয়ে থাকেন তবে অন্তর্নির্মিত বাক্য গঠনটি কেন খারাপ তা দেখতে আপনাকে এই প্রশ্নের দিকে ইঙ্গিত করি। সাইব্যাস * = একই অভ্যন্তরের টেবিলের জন্য 2 টি পৃথক বাইরের টেবিল সহ আনসি স্ট্যান্ডার্ড

প্লাস (এখানে ব্যক্তিগত রেন্ট), স্পষ্টভাবে যোগ দেওয়া মানটি 20 বছরেরও বেশি পুরানো, যার অর্থ অন্তর্নিহিত যোগদানের বাক্য গঠনটি সেই 20 বছরের জন্য পুরানো। আপনি কি 20 বছর ধরে পুরানো সিনট্যাক্স ব্যবহার করে অ্যাপ্লিকেশন কোডটি লিখবেন? আপনি কেন ডাটাবেস কোড লিখতে চান?


3
@ এইচএলজিএম: যদিও আমি সম্পূর্ণরূপে সম্মত হই যে স্পষ্টভাবে যোগদানকারীরা আরও ভাল, ততক্ষেত্রে এমন কিছু ঘটনা ঘটে যখন আপনাকে কেবল পুরানো বাক্য বাক্য গঠন ব্যবহার করতে হবে। একটি বাস্তব বিশ্বের উদাহরণ: এএনএসআই জিনস কেবল ২০০i সালে প্রকাশিত 9i সংস্করণে ওরাকলে উঠেছে, এবং কেবল এক বছর আগে পর্যন্ত (স্ট্যান্ডার্ড প্রকাশের মুহুর্তের 16 বছর আগে) আমাকে 8i ইনস্টলমেন্টের একটি গুচ্ছ সমর্থন করতে হয়েছিল যার জন্য আমাদের ছিল সমালোচনামূলক আপডেট প্রকাশ করতে। আমি দুটি সেট আপডেট বজায় রাখতে চাইনি, তাই আমরা 8i সহ সমস্ত ডাটাবেসের বিরুদ্ধে আপডেটগুলি বিকাশ ও পরীক্ষা করে দেখেছি যার অর্থ আমরা এএনএসআই জয়েনগুলি ব্যবহার করতে পারিনি।
কাসনসুই

+1 আকর্ষণীয় বিন্দু যখন আপনি উল্লেখ করেন যে INNER JOIN ব্যতীত সিনট্যাক্স আরও ত্রুটিযুক্ত। আপনি যখন বলেন তখন আমি আপনার শেষ বাক্যটি সম্পর্কে বিভ্রান্ত হয়ে পড়েছি ... "সুস্পষ্ট যোগদানের মানটি 17 বছর বয়সী" old তাহলে আপনি কি অভ্যন্তরীণ কীওয়ার্ডটি ব্যবহার করার পরামর্শ দিচ্ছেন নাকি?
মার্কো ডেমাইও

1
@ মার্কো ডেমাইও, হ্যাঁ সর্বদা অভ্যন্তরীণ যোগ দিন বা যোগদান করুন (এই দুটি একই) বা বাম যোগদান বা সঠিক যোগদান বা ক্রস যোগ যোগ করুন এবং অন্তর্নিহিত কমাতে যোগদান করবেন না।
এইচএলজিইএম

2
"আপনি কেন [20 বছরের পুরানো] ডাটাবেস কোডটি লিখতে চান?" - আমি লক্ষ্য করেছি যে আপনি এসকিউএল ব্যবহার করে লেখেন HAVINGযা এসকিউএল উদ্ভূত টেবিলগুলিকে সমর্থন করা শুরু করার পরে 'পুরানো' হয়েছে। আমি এটাও লক্ষ্য করেছি যে আপনি এটি ব্যবহার করে ব্যবহার করবেন না NATURAL JOINযদিও আমি যুক্তি দিয়েছিলাম যে এটি INNER JOIN'পুরানো' হয়ে গেছে। হ্যাঁ, আপনার কারণ রয়েছে (এগুলি আবার এখানে বর্ণিত করার দরকার নেই!): আমার বক্তব্যটি হ'ল, যারা পুরানো বাক্য গঠন ব্যবহার করতে পছন্দ করেন তাদের কারণগুলিও খুব বেশি এবং সিনট্যাক্সের আপেক্ষিক বয়স যদি সামঞ্জস্য হয় তবে সামান্য হয়।
onedaywhen

1
যেখানে এখনও স্ট্যান্ডার্ডে রয়েছে (আমাকে দেখান যেখানে এটি নেই)। সুতরাং, পুরানো কিছুই, স্পষ্টতই। এছাড়াও, "যোগদান সংশোধন করার পরিবর্তে" আমাকে এমন বিকাশকারী দেখায় যাকে সাধারণভাবে খুব বেশি দূরে ডিবিএমএস থেকে দূরে রাখা উচিত ।
জারজেন এ। এয়ারহার্ড

12

তাদের পৃথক পৃথক মানব পাঠযোগ্য অর্থ রয়েছে have

তবে ক্যোয়ারী অপ্টিমাইজারের উপর নির্ভর করে মেশিনের সাথে তাদের একই অর্থ হতে পারে।

আপনার সর্বদা পঠনযোগ্য কোড হওয়া উচিত।

এর অর্থ এটি, যদি এটি অন্তর্নির্মিত সম্পর্ক হয় তবে স্পষ্টভাবে যোগ দিন use যদি আপনি দুর্বলতার সাথে সম্পর্কিত ডেটার সাথে মেলে, তবে ক্লজটি ব্যবহার করুন।


11

এসকিউএল: 2003 স্ট্যান্ডার্ড কিছু অগ্রাধিকার নিয়ম পরিবর্তন করেছে যাতে একটি জিন স্টেটমেন্ট "কমা" যোগদানের চেয়ে অগ্রাধিকার গ্রহণ করে। এটি আপনার ক্যোয়ারির ফলাফলগুলি কীভাবে সেটআপ হয় তার উপর নির্ভর করে এটি পরিবর্তন করতে পারে। এটি যখন মাইএসকিউএল 5.0.12 মানকে মেনে চলতে শুরু করে তখন কিছু লোকের জন্য কিছু সমস্যা সৃষ্টি করে।

সুতরাং আপনার উদাহরণে, আপনার অনুসন্ধানগুলি একই কাজ করবে। তবে আপনি যদি কোনও তৃতীয় টেবিল যুক্ত করেছেন: নির্বাচন করুন ... টেবিল 1 থেকে, টেবিল 2 টেবিল 3 জয়েন করুন ... যেখানে ...

মাইএসকিউএল 5.0.12 এর আগে টেবিল 1 এবং টেবিল 2 প্রথমে যোগ হবে, তারপরে টেবিল 3। এখন (5.0.12 এবং অন), টেবিল 2 এবং টেবিল 3 প্রথমে যোগ হবে, তারপরে টেবিল 1। এটি সর্বদা ফলাফল পরিবর্তন করে না, তবে এটি করতে পারে এবং আপনি এটি উপলব্ধি করতেও পারেন না।

আপনার দ্বিতীয় উদাহরণটি বেছে নিয়ে আমি আর কখনও "কমা" সিনট্যাক্স ব্যবহার করি না। এটি যাইহোক, আরও অনেক বেশি পাঠযোগ্য, JOIN শর্তগুলি JOIN- এর সাথে থাকে, আলাদা কোয়েরি বিভাগে বিভক্ত হয় না।


স্ট্যান্ডার্ড এসকিউএল পরিবর্তন হয়নি। মাইএসকিউএল ঠিক ভুল ছিল এবং এখন সঠিক। মাইএসকিউএল ম্যানুয়ালটি দেখুন।
ফিলিপ্সি

4

আমি জানি আপনি মাইএসকিউএল সম্পর্কে কথা বলছেন, তবে যাইহোক: ওরাকল 9 তে স্পষ্টত যোগদান করে এবং অন্তর্নিহিত যোগদানগুলি বিভিন্ন কার্যকরকরণ পরিকল্পনা তৈরি করে। ওএইএইএইকেকে ওরাকল 10+ এ সমাধান করা হয়েছে: এরকম আর কোনও পার্থক্য নেই।


1

এএনএসআই জয়েন্ট সিনট্যাক্স অবশ্যই আরও বহনযোগ্য।

আমি মাইক্রোসফ্ট এসকিউএল সার্ভারের একটি আপগ্রেডের মধ্য দিয়ে যাচ্ছি, এবং আমি এও উল্লেখ করব যে এসকিউএল সার্ভারে বাইরের সাথে যোগ দেওয়ার জন্য = * এবং * = সিনট্যাক্স 2005 এসকিএল সার্ভারের জন্য (সামঞ্জস্যতা মোড ছাড়াই) সমর্থিত নয়।


2
এমনকি এসকিউএল সার্ভার 2000 এও, = এবং = ভুল ফলাফল দিতে পারে এবং কখনও ব্যবহার করা উচিত নয়।
এইচএলজিইএম

2
*=এবং =*কখনই এএনএসআই ছিল না এবং কখনও ভাল পরিচয় ছিল না। এটা কেন চালু প্রয়োজন ছিল নেই - বাহ্য subselects অনুপস্থিতিতে যোগদান জন্য (যা একই সময়ে যোগ পেয়েছিলাম, তাই তারা আসলে ক্রস ও INNER যোগদান করে দেবার প্রয়োজন নেই।)
philipxy

1

আপনি যদি প্রায়শই গতিশীল স্টোরেজ পদ্ধতিগুলি প্রোগ্রাম করে থাকেন তবে আপনি আপনার দ্বিতীয় উদাহরণ (যেখানে ব্যবহার করছেন) এর প্রেমে পড়বেন। আপনার যদি বিভিন্ন ইনপুট প্যারামিটার এবং প্রচুর পরিমাণে মরফ গণ্ডগোল করে থাকে তবে কেবল এটিই একমাত্র উপায়। অন্যথায় তারা উভয়ই একই ক্যোয়ারী পরিকল্পনা চালাবেন তাই ক্লাসিক প্রশ্নের মধ্যে অবশ্যই স্পষ্টত কোনও পার্থক্য নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.