একটি অন্তর্ভুক্ত যোগদান এবং একটি আউট জয়েন মধ্যে পার্থক্য কি?


35

আমি এসকিউএল এ নতুন এবং জানতে চেয়েছিলাম যে এই দুটি JOINধরণের মধ্যে পার্থক্য কী ?

SELECT * 
FROM user u
INNER JOIN telephone t ON t.user_id = u.id

SELECT * 
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id

আমি কখন এক বা অন্যটি ব্যবহার করব?


6
এটি কি ডিবিএ প্রশ্ন হিসাবে খাপ খায়? এটি আমার কাছে আরও কোডিং প্রশ্ন বলে মনে হচ্ছে।
ব্ল্যাকসাইস

1
আপনার চিন্তা @David মেটা
Sathyajith ভাট

@ ডেভিড এর পরে ভিটিসি যদি আপনার মনে হয় সাইটের পক্ষে এটি ভুল। আমরা সর্বদা আবার খুলতে পারি।
jcolebrand

3
আমি মনে করি এটি একটি দুর্দান্ত প্রশ্ন, এবং সাইটের জন্য খুব উপযুক্ত।
ডেটাগোড

এটি ডিবিএর বাইরে সরানো দরকার ডিবিএর পারফরম্যান্স টিউন করার জন্য একটি নূব ডিবিএ স্লিভ করা: পি
এমডিবি

উত্তর:


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

আপনার প্রথম উদাহরণে, ব্যবহারকারীদের জন্য যদি কমপক্ষে একটি টেলিফোন রেকর্ড উপস্থিত থাকে তবে আপনি কেবলমাত্র ব্যবহারকারী এবং টেলিফোন নম্বরগুলির তালিকা ফিরিয়ে আনবেন।

আপনার দ্বিতীয় উদাহরণে, আপনি সমস্ত ব্যবহারকারীর একটি তালিকা , এবং যদি কোনও টেলিফোন রেকর্ডগুলি উপলব্ধ থাকে তবে তা ফিরিয়ে আনবেন (যদি তারা উপলব্ধ না হয় তবে আপনি NULLটেলিফোনের মানগুলি পাবেন)।


13

যখনই কেউ এই প্রশ্নটি জিজ্ঞাসা করেন, তার উত্তরটি এখানে রয়েছে: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

আশা করি এটি আপনাকে বুঝতে সহায়তা করবে,


3
আমি 20 বছর যোগদানের সাথে কাজ করেছি এবং এই চিত্রগুলি আমার কাছে বিভ্রান্ত বলে মনে হয়েছে।
হোগান

3
আমি @ হোগানের সাথে আছি - ভেন ডায়াগ্রামগুলি এর পক্ষে সর্বোত্তম ব্যাখ্যা নয় what কোন গ্রিডগুলি দেখায় যে সংমিশ্রণগুলি কীভাবে ফিরে আসবে তা সম্ভবত আরও ভাল।
জো

যা দেখায় তা হ'ল আপনি কোনও ভেন ডায়াগ্রাম বুঝতে পারেন না। এগুলি যোগ দেওয়ার ধরণের সাথে পুরোপুরি সম্পর্কযুক্ত তবে মনে রাখবেন এগুলি নতুন যারা যোগ দেয় তাদের বোঝার জন্য একটি সরঞ্জাম। আপনি যদি ইতিমধ্যে অন্য একটি ধারণাকে মাথায় রেখেই শিখে থাকেন তবে এটি আপনার কাছে অপরিচিত দেখায় বাধ্য bound এটি কোনও সমস্যা নয়, তবে চিত্রগুলির কার্যকারিতার জন্য এটি কোনও ভাল সূচকও নয়।
জেমসআরয়ান

@ জেমসরিয়ান এটি সত্য নয়, তারা পুরোপুরি সম্পর্ক রাখে না, সংযুক্তি এবং ইউনিয়ন নয়, সেটগুলির কার্তেসিয়ান পণ্যগুলির সাথে মিলিত হয়, ভেন ডায়াগ্রাম অ্যানালগ কেবলমাত্র অনন্য কীগুলির সাথে যোগ দিলে কাজ করে, যদি আপনার নকল কী থাকে তবে আপনি হেরে যান কারটিশিয়ান পণ্য দিক।
উইল

1
আমি দৃ strongly়ভাবে একমত নই, ভেন ডায়াগ্রামগুলির ইতিমধ্যে একটি খুব ভাল সংজ্ঞায়িত ব্যাখ্যা, সেট ছেদ এবং ইউনিয়ন রয়েছে। আপনি অ-অনন্য কীগুলির মাধ্যমে যোগদান করার সময় এই ব্যাখ্যার সাথে যোগ দেয় না। আমি মনে করি আপনি ভেন ডায়াগ্রামগুলি খুব বিস্তৃতভাবে ব্যাখ্যা করেন।
উইল

8

একটি ভেতরের যোগদানের আয় সারি যে মিলিত যোগদানের মাপকাঠির ভিত্তিতে করা যেতে পারে।
একটি বাহ্যিক জোড় এগুলি এবং সমস্ত সারি ফেরত দেয় ...
   ... বাম জোড়ার জন্য প্রথম টেবিল
   থেকে ... ডান জোড়ার জন্য দ্বিতীয় টেবিল
   থেকে ... সম্পূর্ণ জোড়ার জন্য উভয় টেবিল থেকে

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

আরও তথ্যের জন্য এই প্রশ্নটি স্ট্যাকওভারফ্লোতে দেখুন


7

আপনার যদি নীচের মতো 2 টি টেবিল থাকে:

Table1 :   A1    B1          Table2  :    B2     C2 
           -     -                        -      -
           1     2                        1      1
           2     4                        2      4
           3     5                        5      2

আপনি যদি ইনার জয়েন ব্যবহার করেন তবে পাবেন:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2

আপনি যদি পুরো আউটার যোগ দেন তবে আপনি পাবেন:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL
NULL   NULL    1       1

আপনি যদি বাম বহিরাগত যোগদান করেন তবে আপনি পাবেন:

 A1     B1     B2      C2  
 -      -      -       -
 1      2      2       4
 3      5      5       2
 2      4    NULL     NULL

6

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

SELECT SNO , PNO 
FROM   SP 
UNION  
SELECT SNO , 'nil' AS PNO 
FROM   S 
WHERE  SNO NOT IN ( SELECT SNO FROM SP )

বিকল্পভাবে, এখানে একই হিসাবে এসকিউএল আউটার জোড় অপারেটর ব্যবহার করে একই ফল পাওয়া যাবে COALESCE:

SELECT SNO , COALESCE ( PNO , 'nil' ) AS PNO 
FROM ( S NATURAL LEFT OUTER JOIN SP ) AS TEMP

সিজে তারিখ দ্বারা "এসকিউএল এবং রিলেশনাল থিওরি: সঠিক এসকিউএল কোড কীভাবে লিখবেন" এ আউটার জয়েনের উপর একটি মন্তব্য


5

একটি অভ্যন্তরীণ যোগদান একটি যোগদান যেখানে একটিমাত্র প্রদর্শিত ফলাফলগুলি যেখানে চাবিগুলি উভয় টেবিলে থাকে in একটি বাহ্যিক জোড় একটি টেবিলে সমস্ত কীগুলির ফলাফল প্রদর্শন করবে, প্রথম থেকে একটি বাম জোড় এবং দ্বিতীয় থেকে ডান জোড়। উদাহরণ স্বরূপ:

ধরা যাক যে টেবিল 1 এ নিম্নলিখিত প্রাথমিক কী এবং ডেটা জোড়া রয়েছে: (1, ক), (2, খ), (3, সি)

আসুন আমরা এটাও বলে রাখি যে টেবিল 2 এ নিম্নলিখিত প্রাথমিক কী এবং ডেটা জোড়া রয়েছে: (1, মজা), (3, ক্যান), (4, ঘটবে)

সুতরাং প্রাথমিক কীগুলিতে টেবিল 1 থেকে টেবিল 2 এর অভ্যন্তরীণ সংযোগের ফলে নিম্নলিখিত ফলাফলগুলি ট্রিপলগুলি আসবে (সাধারণ প্রাথমিক কীটি প্রথম, প্রথম টেবিলের দ্বিতীয় আইটেম দ্বিতীয় এবং দ্বিতীয় টেবিলের দ্বিতীয় আইটেম তৃতীয়): (1, এ, মজা), ( 3, সি, ক্যান)

প্রাথমিক কীগুলিতে টেবিল 1 থেকে টেবিল 2 এর একটি বাম বাহিরের জোড় নিম্নলিখিত ফলস্বরূপ ট্রিপলগুলি উত্পন্ন করবে (উপরের মতো একই বিন্যাস): (1, ক, মজা), (2, খ, নূ), (3, সি, ক্যান)

প্রাথমিক কীগুলিতে টেবিল 1 থেকে টেবিল 2 এর ডান বাহিরের জোড়টি নিম্নলিখিত ফলাফলগুলি উপকার করবে (উপরের মতো একই ফর্ম্যাট): (1, এ, মজা), (3, সি, ক্যান), (4, ন্যূনল, ঘটবে)

আমি আশা করি এটি ধারণাটি ভালভাবে ব্যাখ্যা করেছে।


4

আমাকে এটি আরও কিছুটা স্বজ্ঞাতভাবে বর্ণনা করার চেষ্টা করি।

অভ্যন্তরীণ যোগদানটি ব্যবহারকারীদের দেখায়, যার টেলিফোন নম্বর (গুলি) এর সাথে এক বা একাধিক টেলিফোন রয়েছে।

বাম বাহ্যিক যোগদানটি অতিরিক্তভাবে সেই 'ব্যবহারকারীদের' তালিকাবদ্ধ করে যাদের কোনও টেলিফোন নেই।


4

যেহেতু আপনি কখন কী ব্যবহার করবেন জিজ্ঞাসা করেছেন, তাই এখানে প্রশ্নের সাথে একটি দৃশ্য রয়েছে - প্রয়োজনীয়তার উপর নির্ভর করে কোনটি ব্যবহার করবেন তা নির্বাচন করুন।

ডেটা:

সারণী ব্যবহারকারীদের 10 টি রেকর্ড রয়েছে। সারণী ফোনেওর 6 টি রেকর্ড রয়েছে (1: 1 সম্পর্কের সাথে, যার অর্থ যে ফোননোতে একটি এন্ট্রি ব্যবহারকারীদের মধ্যে কেবল একটি এন্ট্রি রেফারেন্স করতে পারে, এবং ফোননোতে কেবল একটি প্রবেশিকা ব্যবহারকারীদের প্রদত্ত এন্ট্রি উল্লেখ করতে পারে)।

প্রয়োজনীয়তা 1: সমস্ত ব্যবহারকারীদের তাদের ফোন নম্বর সহ দেখান। ফোন নম্বর ছাড়াই ব্যবহারকারীদের উপেক্ষা করুন।

প্রশ্ন:

SELECT u.uid, u.name, p.phonno 
  FROM user u 
INNER JOIN phones p ON p.uid = u.uid

ফলাফল: 6 জন ব্যবহারকারীকে ফোন নম্বর রয়েছে দেখায়

প্রয়োজনীয়তা 2: সমস্ত ব্যবহারকারীদের তাদের ফোন নম্বর সহ দেখান। যদি ব্যবহারকারীর কোনও ফোন ডিসপ্লে 'এন / এ' না থাকে (উপলব্ধ নেই)

প্রশ্ন:

SELECT u.uid, u.name, ifnull(p.phonno,'N/A') 
  FROM user u 
LEFT OUTER JOIN phones p ON p.uid = u.uid

ফলাফল:

সমস্ত 10 রেকর্ড দেখায়

দ্রষ্টব্য: ifnull নাল মানকে রূপান্তর করার জন্য একটি মাইএসকিএল সিনট্যাক্স। ফোনো শূন্য হলে ডিবি ইঞ্জিন শো 'এন / এ' করতে আমি এই ফাংশনটি ব্যবহার করেছি। আপনি যদি অন্য কোনও ডিবিএমএস ব্যবহার করে থাকেন তবে উপযুক্ত ফাংশনের সন্ধান করুন। এসকিউএল সার্ভারে আপনাকে CASEবিবৃতিটি ব্যবহার করতে হবে ।

আশা করি এটা কাজে লাগবে.

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