এসকিউএল যোগদান করুন এবং বিভিন্ন ধরণের JOIN


244

এসকিউএল কী JOINএবং বিভিন্ন প্রকারগুলি কী কী ?

উত্তর:


330

ডাব্লু 3 স্কুল থেকে একটি চিত্র :


ইনর জয়েন - কেবলমাত্র রেকর্ড যা উভয় টেবিলের শর্তের সাথে মেলে


বাম যোগদান - টেবিল 2 থেকে শর্তের সাথে মিলিত রেকর্ডগুলির সাথে একত্রে টেবিল 1 থেকে সমস্ত রেকর্ড রয়েছে


ডান যোগ দিন - শর্তের সাথে মেলে যা টেবিল 1 এর রেকর্ডের সাথে একত্রে টেবিল 2 থেকে সমস্ত রেকর্ড রয়েছে


সম্পূর্ণ আউটয়ার জয়েন - বাম এবং ডান উভয় আউটরের উভয়ের সংমিশ্রণ ক্লাউজের সাথে মিলছে তবে উভয় টেবিল সংরক্ষণ করে



27
@ কেএনইউ ডাব্লু 3 এর ফুলগুলি যেখানে ছবিগুলির ধারণা নিয়েছে সেখান থেকে creditণ দেওয়া উচিত। দেখুন এসকিউএল একটি ঠাহর যোগদান করে জেফ অ্যাটউড দ্বারা (হ্যাঁ, তাই সহ-রচনা) এবং লিগায় Turmelle দ্বারা সংযুক্ত নিবন্ধ যেখানে জেফ ধারণা নিয়েছিলাম এবং এটি explanded।
ypercubeᵀᴹ

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

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

1
এই ছবিগুলি বোঝাচ্ছে যে ইউনিয়নটি সম্পূর্ণ বাহ্যিক যোগ হিসাবে একই এবং ছেদটি অভ্যন্তরীণ যোগ হিসাবে সমান যা আমি যতটা জানি সঠিক নয় correct
পরাক্রমশালী

1
@ ডেভডেভ, কারণ জনপ্রিয় বিশ্বাসের বিপরীতে - একটি ছবি হাজার শব্দের পক্ষে মূল্যবান নয়। পরবর্তী উত্তর দেখুন।
হায়ানকভ

248

কী SQL JOIN?

SQL JOIN দুই বা ততোধিক ডেটাবেস টেবিল থেকে ডেটা পুনরুদ্ধার করার একটি পদ্ধতি।

বিভিন্ন SQL JOINএস কি?

মোট পাঁচটি JOINএস। তারা হ'ল:

  1. JOIN or INNER JOIN
  2. OUTER JOIN

     2.1 LEFT OUTER JOIN or LEFT JOIN
     2.2 RIGHT OUTER JOIN or RIGHT JOIN
     2.3 FULL OUTER JOIN or FULL JOIN

  3. NATURAL JOIN
  4. CROSS JOIN
  5. SELF JOIN

1. যোগদান বা অভ্যন্তরীণ যোগদান:

এই ধরণের একটিতে JOIN, আমরা সমস্ত রেকর্ডগুলি পাই যা উভয় টেবিলের শর্তের সাথে মিলে যায় এবং উভয় টেবিলের সাথে রেকর্ডগুলি মেলে না।

অন্য কথায়, INNER JOINএকক সত্যের উপর ভিত্তি করে: কেবলমাত্র টেবিলগুলির মধ্যে মেলানো এন্ট্রিগুলি তালিকাভুক্ত করা উচিত।

মনে রাখবেন, যে JOINঅন্য কোন ছাড়া JOIN(যেমন কীওয়ার্ড INNER, OUTER, LEFT, ইত্যাদি) একটি হল INNER JOIN। অন্য কথায়, এর JOINজন্য একটি সিনট্যাকটিক চিনি INNER JOIN(দেখুন: যোগ এবং অভ্যন্তরীণ যোগদানের মধ্যে পার্থক্য )।

2. আউট জয়েন:

OUTER JOIN আহরণ

হয়, এক টেবিলের সাথে সারি সারিগুলি এবং অন্য সারণীতে সমস্ত সারি বা সমস্ত সারণীতে সমস্ত সারি (কোনও মিল আছে কিনা তা বিবেচনা করে না)।

তিন ধরণের বহিরাগত যোগদান:

২.১ বাম আউটয়ার যোগ দিন বা বাম যোগদান করুন

এই যোগদানটি ডান টেবিল থেকে ম্যাচিং সারিগুলির সাথে মিল রেখে বাম টেবিল থেকে সমস্ত সারি ফেরত দেয়। যদি ডান টেবিলের সাথে কোনও কলাম মেলে না, তবে এটি NULLমানগুলি দেয়।

২.২ রাইট আউটর জয়েন বা ডান যোগ দিন

এটি JOINডান টেবিল থেকে সমস্ত সারি বাম টেবিলের সাথে ম্যাচের সারিগুলির সাথে মিলিত করে ফিরে আসে। বাম টেবিলের সাথে কোনও কলাম মেলানো না থাকলে এটি NULLমানগুলি দেয় returns

২.৩ সম্পূর্ণ বাহিরে যোগদান করুন বা সম্পূর্ণ যোগদান করুন

এই JOINএকত্রিত LEFT OUTER JOINএবং RIGHT OUTER JOIN। শর্ত পূরণের সময় এটি উভয় সারণী থেকে সারিগুলি ফেরত দেয় এবং NULLকোনও মিল না থাকলে মান প্রদান করে।

অন্য কথায়, OUTER JOINএই তথ্যের উপর ভিত্তি করে: কেবলমাত্র এক টেবিলের মধ্যে মেলানো এন্ট্রি (ডান বা বাম) বা সারণীর দুটি অংশ (সম্পূর্ণ) তালিকাভুক্ত করা উচিত।

Note that `OUTER JOIN` is a loosened form of `INNER JOIN`.

৩. প্রাকৃতিক যোগদান:

এটি দুটি শর্তের উপর ভিত্তি করে:

  1. JOINসমতার জন্য একই নামের সব কলাম উপর তৈরি করা হয়।
  2. ফলাফল থেকে সদৃশ কলামগুলি সরায়।

এটি প্রকৃতির আরও তাত্ত্বিক বলে মনে হয় এবং ফলস্বরূপ (সম্ভবত) বেশিরভাগ ডিবিএমএস এটিকে সমর্থন করাও বিরক্ত করে না।

৪. যোগ দিন:

এটি জড়িত দুটি টেবিলের কার্টেসিয়ান পণ্য। একটি এর ফলাফল CROSS JOINবেশিরভাগ পরিস্থিতিতে বোঝায় না। তদুপরি, আমাদের এটিকে মোটেই প্রয়োজন হবে না (বা সুনির্দিষ্ট হওয়ার জন্য কমপক্ষে প্রয়োজন)।

5. নিজের সাথে যোগ দিন:

এটা বিভিন্ন ফর্ম নয় JOIN, বরং এটি একটি হল JOIN( INNER, OUTERনিজেই একটি টেবিলের, ইত্যাদি)।

অপারেটরগুলির উপর ভিত্তি করে যোগদান করুন

একটি JOINক্লজের জন্য ব্যবহৃত অপারেটরের উপর নির্ভর করে দুটি ধরণের JOINএস থাকতে পারে । তারা হয়

  1. ইকুই জয়েন
  2. থেটা জয়েন

1. ইকুই যোগ:

যে কোনও JOINপ্রকারের ( INNER, OUTERইত্যাদি) এর জন্য, যদি আমরা কেবলমাত্র সাম্য অপারেটর (=) ব্যবহার করি, তবে আমরা বলি যে এটি JOINএকটি EQUI JOIN

2. থেটায় যোগদান:

এটি একই EQUI JOINতবে এটি অন্যান্য সমস্ত অপারেটরকে>, <,> = ইত্যাদির অনুমতি দেয় allows

অনেকে উভয় EQUI JOINএবং থিতাকে JOINঅনুরূপ INNER, OUTER ইত্যাদি বিবেচনা করে JOIN। তবে আমি দৃ strongly়ভাবে বিশ্বাস করি যে এটি একটি ভুল এবং ধারণাগুলি অস্পষ্ট করে তোলে। কারণ INNER JOIN, OUTER JOINইত্যাদি সমস্ত সারণী এবং তাদের ডেটার সাথে সংযুক্ত EQUI JOINএবং THETA JOINযেখানে কেবলমাত্র আমরা আগে ব্যবহৃত অপারেটরগুলির সাথে সংযুক্ত।

আবার, এমন অনেক লোক আছেন যারা NATURAL JOINএকরকম "অদ্ভুত" হিসাবে বিবেচনা করেন EQUI JOIN। আসলে, এটি সত্য, কারণ আমি প্রথম শর্তটি উল্লেখ করেছি NATURAL JOIN। তবে, আমাদের কেবল এটি NATURAL JOINএকা সীমাবদ্ধ করতে হবে না । INNER JOINs, OUTER JOINs ইত্যাদি EQUI JOINখুব একটা হতে পারে ।


2
তুলনামূলকভাবে নতুন
ল্যাটারাল জয়েন রয়েছে

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

আপনি কিছু উদাহরণ প্রদান করতে পারেন?
এভিআই

67

সংজ্ঞা:


যোগদানগুলি হ'ল একাধিক টেবিলগুলি একসাথে একত্রিত করা ডেটাটিকে জিজ্ঞাসা করার উপায়।

যোগদানের প্রকারগুলি:


আরডিবিএমএসের সাথে সম্পর্কিত 5-প্রকারের যোগ দেয়:

  • ইকুই-জয়েন: সমতা শর্তের ভিত্তিতে দুটি সারণী থেকে সাধারণ রেকর্ড একত্রিত করে। প্রযুক্তিগতভাবে, একটি টেবিলের প্রাথমিক কী এর মান এবং অন্য সারণীর বিদেশী কী মানের তুলনা করার জন্য সমতা-অপারেটর (=) ব্যবহার করে তৈরি করুন, ফলস্বরূপ উভয় সারণীর সাধারণ (ম্যাচড) রেকর্ড অন্তর্ভুক্ত রয়েছে set বাস্তবায়নের জন্য ইনার-জয়েন দেখুন।

  • প্রাকৃতিক-যোগ দিন: এটি ইকুই-জয়েনের বর্ধিত সংস্করণ, এতে সিলেক্ট অপারেশন সদৃশ কলাম বাদ দেয়। বাস্তবায়নের জন্য ইনার-জয়েন দেখুন

  • নন-ইকুই-জয়েন: এটি ইক্যুই-জয়েনের বিপরীত যেখানে যোগদানের শর্তটি সমতুল্য অপারেটর (=) উদাহরণস্বরূপ,! =, <=,> =,>, <বা বিটওয়েন ইত্যাদি ব্যতীত অন্যদের ব্যবহার করে implementation

  • স্ব-যোগদান:: একটি টেবিল নিজের সাথে একত্রিত যেখানে যোগদানের একটি স্বনির্ধারিত আচরণ; স্ব-রেফারেন্সিং টেবিলগুলি (বা ইউনিারি রিলেশনশিপ সত্তা) জিজ্ঞাসা করার জন্য এটি সাধারণত প্রয়োজন। বাস্তবায়নের জন্য ইনার-জয়েনগুলি দেখুন।

  • কার্টেসিয়ান পণ্য: এটি কোনও শর্ত ছাড়াই উভয় টেবিলের সমস্ত রেকর্ড সংযুক্ত করে। প্রযুক্তিগতভাবে, এটি WHERE-Clause ব্যতীত কোনও প্রশ্নের ফলাফল সেট প্রদান করে returns

এসকিউএল উদ্বেগ এবং অগ্রগতি অনুসারে, এখানে 3-প্রকারের যোগদান হয় এবং সমস্ত আরডিবিএমএস যোগদান করে এই ধরণের যোগদান করে using

  1. ইনার-যোগ: এটি দুটি টেবিল থেকে সারি সারিগুলিকে একত্রিত করে (বা একত্রিত করে)। মিলটি টেবিলগুলির সাধারণ কলাম এবং তাদের তুলনামূলক অপারেশনের ভিত্তিতে করা হয়। যদি সাম্যতা ভিত্তিক শর্ত থাকে তবে: EQUI-JOIN সম্পাদিত হয়েছে, অন্যথায় নন- EQUI- যোগ দিন।

  2. আউট-জয়েন: এটি দুটি টেবিলের সাথে মিলিত সারিগুলিকে একত্রিত করে (বা একত্রিত করে) এবং ন্যূনাল মানগুলির সাথে মেলে না r যাইহোক, মিল না হওয়া সারিগুলির পছন্দসই পছন্দটি বেছে নিতে পারে যেমন প্রথম টেবিল বা উপ-প্রকারের দ্বারা দ্বিতীয় টেবিল থেকে তুলনাহীন সারি নির্বাচন: বাম আউটর জয়েন এবং রাইট আউটর জয়েন।

    2.1। বাম বাহ্যিক যোগদান (ওরফে, LEFT-JOIN): দুটি টেবিল থেকে সারি মেলে এবং কেবল বাম টেবিলের (যেমন প্রথম টেবিল) সাথে মেলে না।

    2.2। রাইট আউটটার জয়েন (ওরফে, ডানদিকে যোগ দিন): দুটি টেবিল থেকে সারি মিলেছে এবং কেবলমাত্র রাইট টেবিলের সাথে মেলে না।

    2.3। ফুল আউটর জয়েন (ওরফে আউটর জয়েন): দুটি টেবিলের সাথে ম্যাচটি এবং মিল নেই।

  3. ক্রস- যোগ : এই যোগদানটি কার্তেসিয়ান পণ্য সম্পাদন করার পরিবর্তে মার্জ / সংযুক্ত করে না।

এখানে চিত্র বর্ণনা লিখুন দ্রষ্টব্য: স্ব-যোগদানের প্রয়োজনের ভিত্তিতে INNER-JOIN, OUTER-JOIN এবং CROSS-JOIN দ্বারা অর্জন করা যেতে পারে তবে টেবিলটি নিজের সাথে যোগ দিতে হবে join

আরও তথ্যের জন্য:

উদাহরণ:

1.1: ইনার-জয়েন: ইকুই-জয়েন বাস্তবায়ন

SELECT  *
FROM Table1 A 
 INNER JOIN Table2 B ON A.<Primary-Key> =B.<Foreign-Key>;

1.2: ইনার-যোগ: প্রাকৃতিক-যোগ বাস্তবায়ন implementation

Select A.*, B.Col1, B.Col2          --But no B.ForeignKeyColumn in Select
 FROM Table1 A
 INNER JOIN Table2 B On A.Pk = B.Fk;

১.৩: নন-ইকুই-বাস্তবায়নের সাথে ইনর-জয়েন

Select *
 FROM Table1 A INNER JOIN Table2 B On A.Pk <= B.Fk;

1.4: স্ব-যোগদানের সাথে আন্তঃ-যোগদান করুন

Select *
 FROM Table1 A1 INNER JOIN Table1 A2 On A1.Pk = A2.Fk;

২.১: আউট জয়েন (সম্পূর্ণ বাইরের যোগদান)

Select *
 FROM Table1 A FULL OUTER JOIN Table2 B On A.Pk = B.Fk;

২.২: বাম যোগ দিন

Select *
 FROM Table1 A LEFT OUTER JOIN Table2 B On A.Pk = B.Fk;

২.৩: সঠিক যোগদান করুন

Select *
 FROM Table1 A RIGHT OUTER JOIN Table2 B On A.Pk = B.Fk;

৩.১: ক্রস যোগ দিন

Select *
 FROM TableA CROSS JOIN TableB;

৩.২: ক্রস যোগ দিন স্ব-যোগদান করুন

Select *
 FROM Table1 A1 CROSS JOIN Table1 A2;

// অথবা //

Select *
 FROM Table1 A1,Table1 A2;

"সারণী 1" এবং "সারণি 2" এবং নীচে লেবেলগুলি অনুপযুক্ত, সেগুলি intersect/ except/ এর চিত্র থেকে নেওয়া union; এখানে চেনাশোনা সারি দ্বারা ফিরে হয় left& right join, যেমন সংখ্যাযুক্ত লেবেল বলে। এক্সএক্সবি চিত্রটি বাজে। cross join= inner join on 1=1এবং প্রথম চিত্রের একটি বিশেষ কেস।
ফিলিপ্সি

এটি এসকিউএল -২২ এর সংজ্ঞা দেয় উল্লেখযোগ্য UNION JOIN। এখন এসকিউএল: 2003 এ অচল করে দেওয়া।
ইমপ্লেয়ার

40

মজার বিষয় হল অন্যান্য বেশিরভাগ উত্তর এই দুটি সমস্যায় ভুগছে:

আমি সম্প্রতি এই বিষয়ের উপর একটি নিবন্ধ লিখেছি: একটি সম্ভবত অসম্পূর্ণ, এসকিউএল টেবিলগুলিতে যোগদানের বিভিন্ন উপায়ের জন্য বিস্তৃত গাইড , যা আমি এখানে সংক্ষিপ্ত করব।

প্রথম এবং সর্বাগ্রে: জোয়াইনগুলি কার্টেসিয়ান পণ্য

এই কারণেই ভেন ডায়াগ্রামগুলি এগুলিকে এতগুলি সঠিকভাবে ব্যাখ্যা করে, কারণ একটি জোয়াইন দুটি যুক্ত টেবিলের মধ্যে কার্টেসিয়ান পণ্য তৈরি করে। উইকিপিডিয়া এটিকে সুন্দরভাবে বর্ণনা করেছে:

এখানে চিত্র বর্ণনা লিখুন

কার্টেসিয়ান পণ্যগুলির জন্য এসকিউএল সিনট্যাক্সটি CROSS JOIN। উদাহরণ স্বরূপ:

SELECT *

-- This just generates all the days in January 2017
FROM generate_series(
  '2017-01-01'::TIMESTAMP,
  '2017-01-01'::TIMESTAMP + INTERVAL '1 month -1 day',
  INTERVAL '1 day'
) AS days(day)

-- Here, we're combining all days with all departments
CROSS JOIN departments

যা অন্য টেবিলের সমস্ত সারিগুলির সাথে এক সারণীর সমস্ত সারি একত্রিত করে:

উৎস:

+--------+   +------------+
| day    |   | department |
+--------+   +------------+
| Jan 01 |   | Dept 1     |
| Jan 02 |   | Dept 2     |
| ...    |   | Dept 3     |
| Jan 30 |   +------------+
| Jan 31 |
+--------+

ফলাফল:

+--------+------------+
| day    | department |
+--------+------------+
| Jan 01 | Dept 1     |
| Jan 01 | Dept 2     |
| Jan 01 | Dept 3     |
| Jan 02 | Dept 1     |
| Jan 02 | Dept 2     |
| Jan 02 | Dept 3     |
| ...    | ...        |
| Jan 31 | Dept 1     |
| Jan 31 | Dept 2     |
| Jan 31 | Dept 3     |
+--------+------------+

আমরা যদি কেবল টেবিলগুলির একটি কমা দ্বারা পৃথকীকরণের তালিকাটি লিখি তবে আমরা সেগুলি পেয়ে যাব:

-- CROSS JOINing two tables:
SELECT * FROM table1, table2

অন্তর্ভুক্ত যোগদান (থিয়ে-যোগ)

একটি INNER JOINকেবলমাত্র একটি ফিল্টার CROSS JOINযেখানে ফিল্টার প্রিকেটকে Thetaরিলেশনাল বীজগণিত হিসাবে ডাকা হয়।

এই ক্ষেত্রে:

SELECT *

-- Same as before
FROM generate_series(
  '2017-01-01'::TIMESTAMP,
  '2017-01-01'::TIMESTAMP + INTERVAL '1 month -1 day',
  INTERVAL '1 day'
) AS days(day)

-- Now, exclude all days/departments combinations for
-- days before the department was created
JOIN departments AS d ON day >= d.created_at

মনে রাখবেন কীওয়ার্ডটি INNERoptionচ্ছিক (এমএস অ্যাক্সেস ব্যতীত)।

( ফলাফল উদাহরণের জন্য নিবন্ধটি দেখুন )

EQUI যোগদান

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

SELECT *
FROM actor AS a
JOIN film_actor AS fa ON a.actor_id = fa.actor_id
JOIN film AS f ON f.film_id = fa.film_id

এটি সমস্ত অভিনেতাকে তাদের চলচ্চিত্রের সাথে সংযুক্ত করে।

অথবা কিছু ডাটাবেসে:

SELECT *
FROM actor
JOIN film_actor USING (actor_id)
JOIN film USING (film_id)

USING()সিনট্যাক্স একটি কলাম একটি অপারেশন এর টেবিল যোগ দিন এবং ঐ দুটি কলাম উপর একটি সমতা সম্পৃক্ত সৃষ্টি যে উভয় পাশে উপস্থিত থাকতে হবে উল্লেখ জন্য করতে পারবেন।

প্রাকৃতিক যোগদান

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

এখানে বাক্য গঠন:

SELECT *
FROM actor
NATURAL JOIN film_actor
NATURAL JOIN film

আউট জয়েন

এটি বেশ কয়েকটি কার্টেসিয়ান পণ্য তৈরি করায় এখন OUTER JOINথেকে কিছুটা আলাদা । আমরা লিখতে পারি:INNER JOINUNION

-- Convenient syntax:
SELECT *
FROM a LEFT JOIN b ON <predicate>

-- Cumbersome, equivalent syntax:
SELECT a.*, b.*
FROM a JOIN b ON <predicate>
UNION ALL
SELECT a.*, NULL, NULL, ..., NULL
FROM a
WHERE NOT EXISTS (
  SELECT * FROM b WHERE <predicate>
)

কেউ উত্তরোত্তর লিখতে চায় না, তাই আমরা লিখি OUTER JOIN(যা সাধারণত ডেটাবেসগুলির দ্বারা আরও ভালতর অনুকূলিত হয়)।

পছন্দ করুন INNER, কীওয়ার্ডটি OUTERএখানে alচ্ছিক।

OUTER JOIN তিনটি স্বাদে আসে:

  • LEFT [ OUTER ] JOIN: JOINউপরের মত বর্ণিত মত প্রকাশের বাম টেবিলটি ইউনিয়নে যুক্ত করা হয়েছে।
  • RIGHT [ OUTER ] JOIN: JOINউপরের মত বর্ণিত মত প্রকাশের ডান ছকটি ইউনিয়নে যুক্ত করা হয়েছে।
  • FULL [ OUTER ] JOIN: JOINউপরের মত প্রকাশের উভয় সারণী ইউনিয়নে যুক্ত করা হয়েছে।

এই সমস্তগুলি কীওয়ার্ডের সাথে USING()বা এর সাথে একত্রিত করা যেতে পারে NATURAL( সাম্প্রতিক সময়ের জন্য আমার কাছে সত্যিকারের বিশ্ব ব্যবহারের কেস ছিলNATURAL FULL JOIN )

বিকল্প বাক্য গঠন

ওরাকল এবং এসকিউএল সার্ভারে কিছু historicতিহাসিক, অবহেলিত OUTER JOINবাক্য গঠন রয়েছে , যা এসকিউএল স্ট্যান্ডার্ডটির জন্য এর সিনট্যাক্সের আগেই সমর্থিত ছিল:

-- Oracle
SELECT *
FROM actor a, film_actor fa, film f
WHERE a.actor_id = fa.actor_id(+)
AND fa.film_id = f.film_id(+)

-- SQL Server
SELECT *
FROM actor a, film_actor fa, film f
WHERE a.actor_id *= fa.actor_id
AND fa.film_id *= f.film_id

এতক্ষণ বলার পরে, এই সিনট্যাক্সটি ব্যবহার করবেন না। আমি কেবল এটি এখানে তালিকাবদ্ধ করেছি যাতে আপনি এটি পুরানো ব্লগ পোস্ট / লিগ্যাসি কোড থেকে সনাক্ত করতে পারেন।

বিভক্ত OUTER JOIN

খুব কম লোকই এটি জানেন তবে এসকিউএল স্ট্যান্ডার্ড পার্টিশনযুক্ত নির্দিষ্ট করে OUTER JOIN(এবং ওরাকল এটি প্রয়োগ করে)। আপনি এই জাতীয় জিনিস লিখতে পারেন:

WITH

  -- Using CONNECT BY to generate all dates in January
  days(day) AS (
    SELECT DATE '2017-01-01' + LEVEL - 1
    FROM dual
    CONNECT BY LEVEL <= 31
  ),

  -- Our departments
  departments(department, created_at) AS (
    SELECT 'Dept 1', DATE '2017-01-10' FROM dual UNION ALL
    SELECT 'Dept 2', DATE '2017-01-11' FROM dual UNION ALL
    SELECT 'Dept 3', DATE '2017-01-12' FROM dual UNION ALL
    SELECT 'Dept 4', DATE '2017-04-01' FROM dual UNION ALL
    SELECT 'Dept 5', DATE '2017-04-02' FROM dual
  )
SELECT *
FROM days 
LEFT JOIN departments 
  PARTITION BY (department) -- This is where the magic happens
  ON day >= created_at

ফলাফলের অংশগুলি:

+--------+------------+------------+
| day    | department | created_at |
+--------+------------+------------+
| Jan 01 | Dept 1     |            | -- Didn't match, but still get row
| Jan 02 | Dept 1     |            | -- Didn't match, but still get row
| ...    | Dept 1     |            | -- Didn't match, but still get row
| Jan 09 | Dept 1     |            | -- Didn't match, but still get row
| Jan 10 | Dept 1     | Jan 10     | -- Matches, so get join result
| Jan 11 | Dept 1     | Jan 10     | -- Matches, so get join result
| Jan 12 | Dept 1     | Jan 10     | -- Matches, so get join result
| ...    | Dept 1     | Jan 10     | -- Matches, so get join result
| Jan 31 | Dept 1     | Jan 10     | -- Matches, so get join result

এখানে মুল বক্তব্যটি হ'ল জোনের পার্টিশন করা দিক থেকে সমস্ত সারি JOINফলাফলটির সাথে মিলিত হবে "JOIN এর অন্য দিকে" কোনও কিছুর সাথে মেলে না কেন । দীর্ঘ গল্প সংক্ষিপ্ত: এটি প্রতিবেদনগুলিতে স্পার্স ডেটা পূরণ করা। খুব দরকারী!

সেমি যোগ দিন

সিরিয়াসলি? অন্য কোন উত্তর এটি পেল না? অবশ্যই তা নয়, কারণ এটির এসকিউএলে নেটিভ সিনট্যাক্স নেই, দুর্ভাগ্যক্রমে (ঠিক নীচে এটিতে যোগদানের মতো)। তবে আমরা ব্যবহার করতে পারি IN()এবং EXISTS(), উদাহরণস্বরূপ ফিল্মে অভিনয় করা সমস্ত অভিনেতা খুঁজে পেতে:

SELECT *
FROM actor a
WHERE EXISTS (
  SELECT * FROM film_actor fa
  WHERE a.actor_id = fa.actor_id
)

WHERE a.actor_id = fa.actor_idযেমন আধা সম্পৃক্ত যোগদানের সম্পৃক্ত কাজ করে। যদি আপনি এটি বিশ্বাস না করেন তবে কার্যকর করার পরিকল্পনাগুলি পরীক্ষা করুন, যেমন ওরাকলে। আপনি দেখতে পাবেন যে ডেটাবেস একটি সেমি যোগ অপারেশন চালায়, প্রিডিকেট নয় EXISTS()

এখানে চিত্র বর্ণনা লিখুন

অন্তর্ভুক্ত

এটি SEMI JOIN এর ঠিক বিপরীত ( যদিও এটির একটি গুরুত্বপূর্ণ সতর্কতা রয়েছে তাই ব্যবহার না করার বিষয়ে সতর্ক থাকুনNOT IN )

এখানে চলচ্চিত্র ছাড়া সমস্ত অভিনেতা রয়েছেন:

SELECT *
FROM actor a
WHERE NOT EXISTS (
  SELECT * FROM film_actor fa
  WHERE a.actor_id = fa.actor_id
)

কিছু লোকেরা (বিশেষত মাইএসকিউএল লোকেরা) এন্টি যোগদান করে:

SELECT *
FROM actor a
LEFT JOIN film_actor fa
USING (actor_id)
WHERE film_id IS NULL

আমি মনে করি historicতিহাসিক কারণটি হল পারফরম্যান্স।

সাম্প্রতিক যোগদান

ওএমজি, এটি খুব দুর্দান্ত। আমি একমাত্র এটির উল্লেখ করব? এখানে একটি দুর্দান্ত প্রশ্ন:

SELECT a.first_name, a.last_name, f.*
FROM actor AS a
LEFT OUTER JOIN LATERAL (
  SELECT f.title, SUM(amount) AS revenue
  FROM film AS f
  JOIN film_actor AS fa USING (film_id)
  JOIN inventory AS i USING (film_id)
  JOIN rental AS r USING (inventory_id)
  JOIN payment AS p USING (rental_id)
  WHERE fa.actor_id = a.actor_id -- JOIN predicate with the outer query!
  GROUP BY f.film_id
  ORDER BY revenue DESC
  LIMIT 5
) AS f
ON true

এটি অভিনেতা হিসাবে শীর্ষ 5 উপার্জনমূলক চলচ্চিত্রগুলি খুঁজে পাবে। প্রতিবার যখন আপনাকে কোনও শীর্ষ-এন-কিউ ক্যোয়ারী প্রয়োজন LATERAL JOINহবে তখন আপনার বন্ধু হবে। আপনি যদি কোনও এসকিউএল সার্ভারের ব্যক্তি হন তবে আপনি এই JOINনামে এই নামে জানেনAPPLY

SELECT a.first_name, a.last_name, f.*
FROM actor AS a
OUTER APPLY (
  SELECT f.title, SUM(amount) AS revenue
  FROM film AS f
  JOIN film_actor AS fa ON f.film_id = fa.film_id
  JOIN inventory AS i ON f.film_id = i.film_id
  JOIN rental AS r ON i.inventory_id = r.inventory_id
  JOIN payment AS p ON r.rental_id = p.rental_id
  WHERE fa.actor_id = a.actor_id -- JOIN predicate with the outer query!
  GROUP BY f.film_id
  ORDER BY revenue DESC
  LIMIT 5
) AS f

ঠিক আছে, সম্ভবত এটি প্রতারণা করছে, কারণ একটি LATERAL JOINবা APPLYএক্সপ্রেশনটি আসলেই একটি "সংযুক্তিযুক্ত সাবকোয়ারি" যা বেশ কয়েকটি সারি তৈরি করে। তবে আমরা যদি "পারস্পরিক সম্পর্কযুক্ত সাবকিউরিয়েন্স" এর জন্য অনুমতি দিই, তবে আমরা ...

MULTISET

এটি কেবলমাত্র ওরাকল এবং ইনফর্মিক্স (আমার জ্ঞানের) দ্বারা বাস্তবায়িত হয়েছে, তবে এটি অ্যারে এবং / অথবা এক্সএমএল ব্যবহার করে পোস্টগ্রিএসকিউএল এবং এক্সএমএল ব্যবহার করে এসকিউএল সার্ভারে অনুকরণ করা যেতে পারে।

MULTISETএকটি সম্পর্কযুক্ত subquery উত্পাদন করে এবং বাইরের ক্যোয়ারিতে সারিগুলির ফলস্বরূপ সেট তৈরি করে। নীচের ক্যোয়ারী সমস্ত অভিনেতা বাছাই করে এবং প্রতিটি অভিনেতার জন্য নেস্টেড সংগ্রহে তাদের চলচ্চিত্রগুলি সংগ্রহ করে:

SELECT a.*, MULTISET (
  SELECT f.*
  FROM film AS f
  JOIN film_actor AS fa USING (film_id)
  WHERE a.actor_id = fa.actor_id
) AS films
FROM actor

আপনি যেমন দেখেছি যে, সেখানে শুধু "বিরক্তিকর" চেয়ে JOIN আরো ধরনের হয় INNER, OUTERএবং CROSS JOINযা সাধারণত উল্লেখ করা হয়। আমার নিবন্ধে আরও বিশদ । এবং দয়া করে ভেন চিত্রগুলি চিত্রিত করার জন্য ব্যবহার বন্ধ করুন।


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

@ ফিলিপ্সি: আমার উত্তরে আমার কিছু নির্দিষ্ট হওয়া উচিত? আপনি একটি সম্পাদনার পরামর্শ দিতে পারেন ...
লুকাস এডার

10

আমি একটি দৃষ্টান্ত তৈরি করেছি যা আমার মতে শব্দের চেয়ে আরও ভাল ব্যাখ্যা করে: এসকিউএল ব্যাখ্যা সারণিতে যোগদান করুন


@ নিরাজ চেনাশোনা এ এবং বি এন্ড বি এ সারি ধারণ করে না এগুলি অন্ধভাবে অন্য কোথাও creditণ ছাড়াই অনুলিপি করা হয়েছে। আন্তঃ যোগদানের ক্ষেত্রে ক্রস জয়েন অন্তর্ভুক্ত থাকে, এটি 1 = 1 এ অভ্যন্তরীণ যোগদান করে। কীভাবে ছবির এই অংশগুলি "নিখুঁত"?
ফিলিপ্সি

@ ফিলিপ্সি দুঃখিত তবে এটি অন্য কোথাও থেকে অনুলিপি করা হয়েছে কিনা তা নিয়ে আমি মাথা ঘামাই না। এবং উপরের ছবিতে কোনটি সঠিক নয় তা আমি নিশ্চিত নই। আমার জন্য এটি ঠিক আছে। ক্রস জয়েন এখানে বর্ণিত হয় না। এটি অভ্যন্তরীণ যোগদানের অন্তর্ভুক্ত নয় ..
নিরাজ

-3

আমি আমার পোষ্য প্রুগ টিপতে যাচ্ছি: ব্যবহারের কীওয়ার্ড।

JOIN এর উভয় পাশের উভয় টেবিলের যদি তাদের বিদেশী কীগুলি সঠিকভাবে নামকরণ করা হয় (যেমন, একই নাম, কেবল "আইডি নয়) তবে এটি ব্যবহার করা যেতে পারে:

SELECT ...
FROM customers JOIN orders USING (customer_id)

আমি এটি খুব ব্যবহারিক, পঠনযোগ্য এবং প্রায়শই যথেষ্ট ব্যবহৃত হয় না বলে মনে করি।


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