একটি প্রাকৃতিক যোগদান এবং একটি অভ্যন্তরীণ যোগদানের মধ্যে পার্থক্য কি?
একটি প্রাকৃতিক যোগদান এবং একটি অভ্যন্তরীণ যোগদানের মধ্যে পার্থক্য কি?
উত্তর:
INNER JOIN এবং Natural JOIN এর মধ্যে একটি উল্লেখযোগ্য পার্থক্য হ'ল ফিরে আসা কলামগুলির সংখ্যা।
বিবেচনা:
TableA TableB
+------------+----------+ +--------------------+
|Column1 | Column2 | |Column1 | Column3 |
+-----------------------+ +--------------------+
| 1 | 2 | | 1 | 3 |
+------------+----------+ +---------+----------+
INNER JOIN
COLUMN1 উপর TableA এবং TableB এর ফিরে আসবে
SELECT * FROM TableA AS a INNER JOIN TableB AS b USING (Column1);
SELECT * FROM TableA AS a INNER JOIN TableB AS b ON a.Column1 = b.Column1;
+------------+-----------+---------------------+
| a.Column1 | a.Column2 | b.Column1| b.Column3|
+------------------------+---------------------+
| 1 | 2 | 1 | 3 |
+------------+-----------+----------+----------+
NATURAL JOIN
TableA এবং COLUMN1 উপর TableB ফেরত হবে:
SELECT * FROM TableA NATURAL JOIN TableB
+------------+----------+----------+
|Column1 | Column2 | Column3 |
+-----------------------+----------+
| 1 | 2 | 3 |
+------------+----------+----------+
বারবার কলাম এড়ানো হয়।
(স্ট্যান্ডার্ড ব্যাকরণ থেকে AFAICT, আপনি প্রাকৃতিক যোগদানের সাথে যোগদানের কলামগুলি নির্দিষ্ট করতে পারবেন না; যোগদানটি কঠোরভাবে নাম ভিত্তিক Wikipedia উইকিপিডিয়া দেখুন ))
( ভিতরের একটি ঠকাই আছে আউটপুট অন্তর্ভুক্ত কর a.
এবং b.
যন্ত্রাংশ কলাম নামে হবে না; আপনি শুধু আছে চাই column1
, column2
, column1
, column3
শিরোনাম হিসাবে। )
NATURAL JOIN
নষ্ট করবে, কেন এটি অপ্রত্যাশিত এবং আপনি কী জগতে রয়েছেন সে সম্পর্কে আরও ব্যাখ্যা করতে পারেন ?
Customers
এবং Employees
, উপর যোগদান EmployeeID
। Employees
এছাড়াও একটি ManagerID
ক্ষেত্র আছে। সবকিছু জরিমানা. তারপরে, কোনও দিন, কেউ টেবিলে একটি ManagerID
ক্ষেত্র যুক্ত করে Customers
। আপনার যোগদানটি ভাঙ্গবে না (এটি একটি করুণা হবে), পরিবর্তে এটি এখন একটি দ্বিতীয় ক্ষেত্রকে অন্তর্ভুক্ত করবে এবং ভুলভাবে কাজ করবে । সুতরাং, একটি আপাতদৃষ্টিতে নিরীহ পরিবর্তন কেবল দূরত্ব সম্পর্কিত কিছুকে ভেঙে ফেলতে পারে। খুব খারাপ. প্রাকৃতিক যোগদানের একমাত্র উত্সাহটি সামান্য টাইপিং সাশ্রয় করে, এবং অবক্ষয়টি যথেষ্ট।
SELECT * FROM TableA INNER JOIN TableB USING (Column1)
4 টি কলাম দেয়। এটি সঠিক নয় কারণ SELECT * FROM TableA INNER JOIN TableB USING (Column1)
এবং SELECT * FROM TableA NATURAL JOIN TableB
সমান, তারা উভয়ই 3 টি কলাম দেয়।
natural left
বা এটি থাকতে পারে natural right
) যা জোয়ার মাপদণ্ডকে ধরে নেয় যেখানে উভয় সারণির ম্যাচে একই-নামযুক্ত কলামগুলি রয়েছেআমি প্লেগের মতো প্রাকৃতিক যোগদানগুলিকে এড়িয়ে যাব, কারণ প্রাকৃতিক যোগদানগুলি হ'ল:
NATURAL JOIN Checkouts
id
যোগ দেওয়া সর্বব্যাপী এবং অকেজো; সাধারণ বিদেশী মূল নাম হয় tablename_id
। প্রাকৃতিক যোগদানগুলি একটি খারাপ, খারাপ, খারাপ ধারণা।
প্রাকৃতিক যোগদানটি টাইপ করা এড়াতে কেবল একটি শর্টকাট, এমন একটি অনুমান সহ যে যোগদানটি সহজ এবং একই নামের ক্ষেত্রগুলির সাথে মেলে।
SELECT
*
FROM
table1
NATURAL JOIN
table2
-- implicitly uses `room_number` to join
হিসাবে একই...
SELECT
*
FROM
table1
INNER JOIN
table2
ON table1.room_number = table2.room_number
আপনি শর্টকাট বিন্যাসের সাহায্যে যা করতে পারবেন না তা তবে আরও জটিল যোগদান করে ...
SELECT
*
FROM
table1
INNER JOIN
table2
ON (table1.room_number = table2.room_number)
OR (table1.room_number IS NULL AND table2.room_number IS NULL)
NATURAL JOIN ... USING ()
? মানটি হয় a NATURAL JOIN b
বাa JOIN b USING (c)
room_number
, যেখানে আপনার অভ্যন্তরীণ যোগগুলিতে দুটি কলামের নাম থাকবে room_number
।
এসকিউএল অনেকভাবেই সম্পর্কের মডেলের প্রতি বিশ্বস্ত নয়। কোনও এসকিউএল ক্যোয়ারীর ফলাফল কোনও সম্পর্ক নয় কারণ এতে ডুপ্লিকেট নাম, 'বেনাম' (নামবিহীন) কলাম, নকল সারি, নাল ইত্যাদির সাথে কলাম থাকতে পারে এসকিউএল সারণিগুলিকে সম্পর্কের হিসাবে বিবেচনা করে না কারণ এটি কলাম ক্রম ইত্যাদির উপর নির্ভর করে etc.
NATURAL JOIN
এসকিউএল-এর পিছনে ধারণাটি হ'ল রিলেশনাল মডেলের আরও বিশ্বস্ত হওয়া সহজ করে তোলা। NATURAL JOIN
দুটি টেবিলের ফলাফলের নাম কলামগুলি ডি-ডুপ্লিকেট করে নাম থাকবে, সুতরাং কোনও বেনাম কলাম নেই। একইভাবে, UNION CORRESPONDING
এবং EXCEPT CORRESPONDING
উত্তরাধিকারে কলাম ক্রম উপর এসকিউএল এর নির্ভরতা মোকাবেলার জন্য সরবরাহ করা হয়UNION
সিনট্যাক্সে ।
যাইহোক, সমস্ত প্রোগ্রামিং কৌশল হিসাবে এটি শৃঙ্খলা দরকারী প্রয়োজন। সাফল্যের জন্য একটি প্রয়োজনীয়তা NATURAL JOIN
ধারাবাহিকভাবে নামযুক্ত কলামগুলির নামকরণ করা হয়, কারণ একই নামগুলির সাথে কলামগুলিতে যোগদান করা হয় (এটি লজ্জার বিষয় যে এসকিউএল-এ কলামগুলির নাম পরিবর্তনের জন্য বাক্য গঠনটি ভারবজ হয় তবে পার্শ্ব প্রতিক্রিয়াটি বেস টেবিলগুলিতে কলামের নামকরণ করার সময় শৃঙ্খলা উত্সাহিত করা এবং VIEW
গুলি :)
নোট করুন একটি এসকিউএল NATURAL JOIN
একটি ইকুই-জয়েন **, তবে এটি দরকারীতার কোনও বাধা নেই। বিবেচনা করুন যে NATURAL JOIN
এসকিউএল সমর্থিত যদি একমাত্র যোগদানের ধরণটি তখনও আপেক্ষিকভাবে সম্পূর্ণ হবে ।
যদিও এটি সত্য যে NATURAL JOIN
কোনওটি ব্যবহার INNER JOIN
এবং প্রজেকশন ( SELECT
) ব্যবহার করে লেখা যেতে পারে , এটিও সত্য isINNER JOIN
কোনওটি পণ্য ( CROSS JOIN
) এবং বিধিনিষেধ ( WHERE
) ব্যবহার করে লেখা যেতে পারে ; আরও নোট করুন যে NATURAL JOIN
কোনও কলামের নাম না থাকা সারণীগুলির মধ্যে একটি একই ফলাফল হিসাবে দেবে CROSS JOIN
। সুতরাং যদি আপনি কেবল সম্পর্কের ফলাফলগুলিতে আগ্রহী হন (এবং কেন কখনও হয় না!) তবে NATURAL JOIN
আপনার একমাত্র যুক্ত হওয়ার প্রয়োজন। অবশ্যই, এটি সত্য যে কোনও ভাষা নকশার দৃষ্টিকোণ থেকে শর্টহেন্ড যেমন INNER JOIN
এবংCROSS JOIN
তাদের মান রয়েছে তবে এটি বিবেচনা করুন যে প্রায় কোনও এসকিউএল কোয়েরিটি 10 টি সিন্ট্যাক্টিক্যালি আলাদা, তবে শব্দার্থগতভাবে সমতুল্য, উপায়গুলিতে লেখা যেতে পারে এবং এটিই এসকিউএল অনুকূলিতকরণকে খুব শক্ত করে তোলে উন্নতি করতে.
এখানে কিছু উদাহরণ জিজ্ঞাস্য ( সাধারণ অংশ এবং সরবরাহকারী ডাটাবেস ব্যবহার করে ) যা শব্দার্থগতভাবে সমতুল্য:
SELECT *
FROM S NATURAL JOIN SP;
-- Must disambiguate and 'project away' duplicate SNO attribute
SELECT S.SNO, SNAME, STATUS, CITY, PNO, QTY
FROM S INNER JOIN SP
USING (SNO);
-- Alternative projection
SELECT S.*, PNO, QTY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- Same columns, different order == equivalent?!
SELECT SP.*, S.SNAME, S.STATUS, S.CITY
FROM S INNER JOIN SP
ON S.SNO = SP.SNO;
-- 'Old school'
SELECT S.*, PNO, QTY
FROM S, SP
WHERE S.SNO = SP.SNO;
** সম্পর্কিত প্রাকৃতিক যোগদান কোনও সমীকরণ নয়, এটির একটি অভিক্ষেপ। - ফিলিপ্সি
একটি জোড় NATURAL
একটি নির্দিষ্ট INNER
যোগদানের জন্য কেবল সংক্ষিপ্ত বাক্য গঠন - বা "ইকুই-জয়েন" - এবং, সিন্ট্যাক্সটি একবার মুছে ফেলা হলে, উভয়ই একই সম্পর্কযুক্ত বীজগণিত ক্রিয়াকে উপস্থাপন করে। OUTER
( LEFT
/ RIGHT
) বা যোগদানের ক্ষেত্রে যেমন যোগ হয় তেমন কোনও "ভিন্ন ধরণের" নয় CROSS
।
উইকিপিডিয়ায় সম-যোগ বিভাগটি দেখুন :
একটি প্রাকৃতিক যোগদান ইক্যুয়ী-যোগগুলিতে আরও একটি বিশেষায়নের প্রস্তাব দেয়। যোগদানের টেবিলগুলিতে একই কলাম-নাম রয়েছে এমন উভয় টেবিলের সমস্ত কলামের সাথে তুলনা করে স্পষ্টভাবে উত্থিত হ'ল যোগদানের প্রাকটিকেট । ফলস্বরূপ যোগদান করা সারণিতে সমান-নামক কলামগুলির প্রতিটি জুটির জন্য কেবল একটি কলাম রয়েছে।
বেশিরভাগ বিশেষজ্ঞ সম্মত হন যে প্রাকৃতিক যোগদানগুলি বিপজ্জনক এবং তাই তাদের ব্যবহারকে দৃ strongly়ভাবে নিরুৎসাহিত করে। অজান্তেই নতুন কলাম যুক্ত হওয়ার পরে বিপদটি আসে, একই নামটিকে অন্য কলাম হিসাবে ...
এটি হ'ল, সমস্ত NATURAL
যোগদানকারীদের INNER
যোগ হিসাবে লেখা যেতে পারে (তবে রূপান্তরটি সত্য নয়)। এটি করার জন্য, কেবল স্পষ্টভাবে ভবিষ্যদ্বাণী তৈরি করুন - যেমন USING
বাON
- এবং জোনাথন লেফলার যেমন উল্লেখ করেছেন, পছন্দসই "নকল" এড়াতে পছন্দসই ফলাফল-সেট কলামগুলি নির্বাচন করুন।
শুভ কোডিং।
( NATURAL
শব্দ এছাড়াও প্রয়োগ করা যেতে পারে LEFT
এবং RIGHT
যোগদান করে, এবং একই প্রযোজ্য। একজন NATURAL LEFT/RIGHT
যোগদানের একটি জন্য অল্প সিনট্যাক্স হল নির্দিষ্ট LEFT/RIGHT
যোগদান করুন।)
প্রাকৃতিক যোগদান: এটি দুটি টেবিলের সমস্ত কলামের সংমিশ্রণ বা সম্মিলিত ফলাফল। এটি দ্বিতীয় টেবিলের প্রতি সম্মানের সাথে প্রথম সারণীর সমস্ত সারি ফিরিয়ে দেবে।
অভ্যন্তরীণ যোগদান: কলামের নামের কোনওটি দুটি টেবিলের মধ্যে একরকম না হলে এই জয়েনটি কাজ করবে
একটি প্রাকৃতিক যোগদান যেখানে সমস্ত সাধারণ কলামগুলির ভিত্তিতে 2 টি টেবিল যুক্ত হয়।
সাধারণ কলাম: একটি কলাম যা উভয় টেবিলের একই নাম রয়েছে + উভয় সারণীতে সামঞ্জস্যপূর্ণ ডেটাটাইপ রয়েছে। আপনি কেবল = অপারেটর ব্যবহার করতে পারেন
একটি অভ্যন্তরীণ যোগদান যেখানে ওএন ক্লজে উল্লিখিত সাধারণ কলামগুলির ভিত্তিতে 2 টি টেবিল যুক্ত হয়।
সাধারণ কলাম: একটি কলাম যা উভয় টেবিলের সাথে সামঞ্জস্যপূর্ণ ডেটাটাইপ রয়েছে তবে একই নামের প্রয়োজন নেই। তোমার মত শুধুমাত্র কোন comparision অপারেটর ব্যবহার করতে পারেন =
, <=
, >=
, <
, >
,<>
অভ্যন্তরীণ যোগদান এবং প্রাকৃতিক যোগদান প্রায় একই তবে তাদের মধ্যে সামান্য পার্থক্য রয়েছে। পার্থক্যটি প্রাকৃতিক যোগদানের ক্ষেত্রে শর্ত নির্দিষ্ট করার দরকার নেই তবে অভ্যন্তরীণ যোগদানের শর্তে বাধ্যতামূলক। যদি আমরা অভ্যন্তরীণ যোগদানের শর্তটি নির্দিষ্ট করি, তবে এটির ফলক সারণীগুলি কার্তেসিয়ান পণ্যের মতো।
mysql> SELECT * FROM tb1 ;
+----+------+
| id | num |
+----+------+
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM tb2 ;
+----+------+
| id | num |
+----+------+
| 4 | 40 |
| 5 | 50 |
| 9 | 90 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
6 rows in set (0.00 sec)
ভেতরের যোগ দিতে :
mysql> SELECT * FROM tb1 JOIN tb2 ;
+----+------+----+------+
| id | num | id | num |
+----+------+----+------+
| 6 | 60 | 4 | 40 |
| 7 | 70 | 4 | 40 |
| 8 | 80 | 4 | 40 |
| 1 | 1 | 4 | 40 |
| 2 | 2 | 4 | 40 |
| 3 | 3 | 4 | 40 |
| 6 | 60 | 5 | 50 |
| 7 | 70 | 5 | 50 |
| 8 | 80 | 5 | 50 |
.......more......
return 36 rows in set (0.01 sec)
AND NATURAL JOIN :
mysql> SELECT * FROM tb1 NATURAL JOIN tb2 ;
+----+------+
| id | num |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
3 rows in set (0.01 sec)
অভ্যন্তরীণ যোগদান, দুটি সারণিতে যোগদান করুন যেখানে কলামের নাম একই।
প্রাকৃতিক যোগদান, দুটি সারণিতে যোগদান করুন যেখানে কলামের নাম এবং ডেটা টাইপ একই।