মাইএসকিউএল: যোগদানের ধরণগুলির দ্রুত ব্রেকডাউন


157

আমি মাইএসকিউএল যোগদানের ধরণগুলির একটি দ্রুত ব্রেকডাউন চাই। আমি এগুলি জানি, বাকিগুলি তারা কী বোঝাতে চাইছে তা আমি নিশ্চিত নই।

  • কমা দিয়ে পৃথক করা (যা ঠিক এই ছোট?):SELECT * FROM a, b WHERE b.id = a.beeId AND ...
  • খ এর সাথে কোনও মিল না থাকলেও একটি থেকে তথ্য প্রদর্শন করুন: SELECT * FROM a LEFT OUTER JOIN b ON b.id = a.beeId WHERE ...

আমি অন্য যোগদানগুলিতে দেখেছি, তবে কী কী তাদের আলাদা করে তোলে, কী INNER/ / কী পরিবর্তনগুলি OUTERযুক্ত করে তা জানতে চাই LEFT

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


উত্তর:


463

3
+1 তবে উভয়ই অনুপস্থিত cross join, যা কার্তেসিয়ান পণ্য করে does
ডেনিস ডি বার্নার্ডি

11
@denis: codinghorror.com লিঙ্কে একটি ঘনিষ্ঠ কটাক্ষপাত:There's also a cartesian product or cross join, which as far as I can tell, can't be expressed as a Venn diagram:
Rufinus

1
আমি অবাক, এই চিত্রগুলি মুদ্রণ করে আমার অফিসের দেয়ালে রেখে দিচ্ছি। তুমি আমার জীবনে পরিবর্তন এনেছো!
ইয়াসিকো

41
প্রশ্নটি বিশেষত মাইএসকিউএল সম্পর্কে। মাইএসকিউএল সম্পূর্ণ আউটরের যোগদানের সমর্থন করে না।
মাইক বারানজাক

4
এবং অবশ্যই এই গ্রাফিক পোস্ট না করার কারণ হওয়া উচিত। দীর্ঘশ্বাস
ফেলুন

27

আপনার মন্তব্যের উপর ভিত্তি করে, ডাব্লু 3 স্কুলগুলিতে প্রতিটিের সহজ সংজ্ঞা সবচেয়ে ভাল পাওয়া যায় প্রতিটি প্রকারের প্রথম লাইন যোগদানের প্রকারের একটি সংক্ষিপ্ত বিবরণ দেয়

  • যোগ দিন: উভয় টেবিলের মধ্যে কমপক্ষে একটি মিল থাকলে সারিগুলি ফিরুন
  • বাম যোগদান: ডান টেবিলের সাথে ম্যাচ না থাকলেও বাম টেবিল থেকে সমস্ত সারি ফিরুন
  • সঠিক যোগদান: বাম টেবিলে কোনও মিল না থাকলেও ডান টেবিল থেকে সমস্ত সারি ফিরিয়ে দিন
  • সম্পূর্ণ যোগদান: সারণীগুলির মধ্যে একটিতে কোনও মিল থাকলে সারিগুলি ফিরুন

শেষ সম্পাদনা

সংক্ষেপে, কমা বিচ্ছিন্ন উদাহরণ আপনি দিয়েছেন

SELECT * FROM a, b WHERE b.id = a.beeId AND ...

টেবিলগুলি পৃথককারী কমা দিয়ে টেবিল a এবং b থেকে প্রতিটি রেকর্ড নির্বাচন করছে, এটি কলামগুলিতেও ব্যবহার করা যেতে পারে যেমন

SELECT a.beeName,b.* FROM a, b WHERE b.id = a.beeId AND ...

তারপরে বি.আইডি কলাম এবং a.beeId কলামটি আপনার উদাহরণে মেলে এমনভাবে সারিতে নির্দেশিত তথ্য পাওয়া যাচ্ছে। সুতরাং আপনার উদাহরণে এটি টেবিল a এবং b থেকে সমস্ত তথ্য পাবেন যেখানে বি.আইডি a.beeId এর সমান। আমার উদাহরণে এটি বি টেবিলের সমস্ত তথ্য এবং শুধুমাত্র a.beeName কলাম থেকে তথ্য পাবেন যখন b.id a.beeId এর সমান হয়। মনে রাখবেন যে একটি AND শর্তও রয়েছে, এটি আপনার ফলাফলগুলিকে পরিমার্জন করতে সহায়তা করবে।

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

আমি আশা করি এটা আপনাকে সাহায্য করবে


এটা ঘটে যে আমি ইতিমধ্যে সমস্ত জানি। আমি আসলে সেখানে যোগ দেওয়ার প্রকারগুলি খুঁজছিলাম। দুঃখিত, আমি কী জানি তা সম্পর্কে আমি পরিষ্কার ছিলাম না। তবে আমি কেবল দ্রুত সংক্ষিপ্তসার পেতে দীর্ঘ ডকুমেন্টেশন খুঁজছিলাম না।
ব্রায়ান ফিল্ড

উত্তরের আর একটি রেফারেন্স ... আপনি যা চান তার চেয়ে বেশি হতে পারে।
রায়ান

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

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

1
মাইএসকিএলে কোনও পূর্ণ যোগদান নেই, সুতরাং এই লিঙ্কগুলি খুব কার্যকর নয়।
ইথার

13

আমার কাছে 2 টি টেবিল রয়েছে:

> SELECT * FROM table_a;
+------+------+
| id   | name |
+------+------+
|    1 | row1 |
|    2 | row2 |
+------+------+

> SELECT * FROM table_b;
+------+------+------+
| id   | name | aid  |
+------+------+------+
|    3 | row3 |    1 |
|    4 | row4 |    1 |
|    5 | row5 | NULL |
+------+------+------+

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

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

> SELECT * FROM table_a a INNER JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
+------+------+------+------+------+

আপনি যদি অর্ডারটি উল্টে দেন তবে তাতে যোগ দিতে কোনও পার্থক্য নেই, কারণ এটি উভয় টেবিলের যত্ন করে:

> SELECT * FROM table_b b INNER JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
+------+------+------+------+------+

আপনি একই সারিগুলি পান তবে কলামগুলি আলাদা ক্রমে রয়েছে কারণ আমরা সারণিগুলিকে আলাদা ক্রমে উল্লেখ করেছি।

বাম জয়েন্টগুলি কেবল প্রথম টেবিলের বিষয়ে চিন্তা করে

বাম যোগদান আপনি যে প্রথম টেবিলটি দিয়েছেন তা যত্নশীল এবং দ্বিতীয়টির বিষয়ে খুব বেশি চিন্তা করে না, তাই আপনি দ্বিতীয় টেবিলে কোনও সারি না থাকলেও আপনি সর্বদা প্রথম টেবিল থেকে সারিগুলি পান:

> SELECT * FROM table_a a LEFT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
|    2 | row2 | NULL | NULL | NULL |
+------+------+------+------+------+

উপরে আপনি টেবিল_এর সমস্ত সারি দেখতে পাবেন যদিও তাদের কয়েকটি টেবিল বিতে কোনও কিছুর সাথে মেলে না, তবে টেবিল_ বিয়ের সমস্ত সারি নয় - কেবল টেবিল_এতে কোনও কিছুর সাথে মেলে।

যদি আমরা টেবিলগুলির ক্রমটি বিপরীত করি, তবে বাম জয়েন্টগুলি অন্যরকম আচরণ করে:

> SELECT * FROM table_b b LEFT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
|    5 | row5 | NULL | NULL | NULL |
+------+------+------+------+------+

এখন আমরা টেবিল_ বি এর সমস্ত সারি পাই, তবে কেবল টেবিল_এর সারি মিলে।

ডান যোগদান করুন শুধুমাত্র দ্বিতীয় সারণির জন্য যত্নশীল

a RIGHT JOIN bআপনি ঠিক একই সারি পায় b LEFT JOIN a। পার্থক্যটি হ'ল কলামগুলির ডিফল্ট ক্রম।

> SELECT * FROM table_a a RIGHT JOIN table_b b ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | id   | name | aid  |
+------+------+------+------+------+
|    1 | row1 |    3 | row3 | 1    |
|    1 | row1 |    4 | row4 | 1    |
| NULL | NULL |    5 | row5 | NULL |
+------+------+------+------+------+

এটি একই সারিগুলির মতো table_b LEFT JOIN table_a, যা আমরা বাম যোগদানের অংশে দেখেছি।

একইভাবে:

> SELECT * FROM table_b b RIGHT JOIN table_a a ON a.id=b.aid;
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    4 | row4 | 1    |    1 | row1 |
| NULL | NULL | NULL |    2 | row2 |
+------+------+------+------+------+

একই সারি হয় table_a LEFT JOIN table_b

কোনও যোগ দেওয়া মোটেই আপনাকে সমস্ত কিছুর অনুলিপি দেয় না

যোগ দানের অংশ নেই: আপনি যদি টেবিলগুলি JOIN বিনা বিন্দুতে লিখে থাকেন, কেবলমাত্র কমা দ্বারা পৃথক করা, আপনি প্রথম টেবিলের প্রতিটি সারি দ্বিতীয় সারণির প্রতিটি সারিটির পাশে, প্রতিটি সম্ভাব্য সংমিশ্রণে পাবেন:

> SELECT * FROM table_b, table_a;        
+------+------+------+------+------+
| id   | name | aid  | id   | name |
+------+------+------+------+------+
|    3 | row3 | 1    |    1 | row1 |
|    3 | row3 | 1    |    2 | row2 |
|    4 | row4 | 1    |    1 | row1 |
|    4 | row4 | 1    |    2 | row2 |
|    5 | row5 | NULL |    1 | row1 |
|    5 | row5 | NULL |    2 | row2 |
+------+------+------+------+------+

(এটি আমার ব্লগ পোস্ট থেকে এসকিউএল যোগদানের ধরণের উদাহরণসমূহ )


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

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

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

11

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

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