উত্তর:
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
এই ধরণের একটিতে JOIN, আমরা সমস্ত রেকর্ডগুলি পাই যা উভয় টেবিলের শর্তের সাথে মিলে যায় এবং উভয় টেবিলের সাথে রেকর্ডগুলি মেলে না।
অন্য কথায়, INNER JOINএকক সত্যের উপর ভিত্তি করে: কেবলমাত্র টেবিলগুলির মধ্যে মেলানো এন্ট্রিগুলি তালিকাভুক্ত করা উচিত।
মনে রাখবেন, যে JOINঅন্য কোন ছাড়া JOIN(যেমন কীওয়ার্ড INNER, OUTER, LEFT, ইত্যাদি) একটি হল INNER JOIN। অন্য কথায়, এর JOINজন্য একটি সিনট্যাকটিক চিনি INNER JOIN(দেখুন: যোগ এবং অভ্যন্তরীণ যোগদানের মধ্যে পার্থক্য )।
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`.
এটি দুটি শর্তের উপর ভিত্তি করে:
JOINসমতার জন্য একই নামের সব কলাম উপর তৈরি করা হয়।এটি প্রকৃতির আরও তাত্ত্বিক বলে মনে হয় এবং ফলস্বরূপ (সম্ভবত) বেশিরভাগ ডিবিএমএস এটিকে সমর্থন করাও বিরক্ত করে না।
এটি জড়িত দুটি টেবিলের কার্টেসিয়ান পণ্য। একটি এর ফলাফল CROSS JOINবেশিরভাগ পরিস্থিতিতে বোঝায় না। তদুপরি, আমাদের এটিকে মোটেই প্রয়োজন হবে না (বা সুনির্দিষ্ট হওয়ার জন্য কমপক্ষে প্রয়োজন)।
এটা বিভিন্ন ফর্ম নয় JOIN, বরং এটি একটি হল JOIN( INNER, OUTERনিজেই একটি টেবিলের, ইত্যাদি)।
একটি JOINক্লজের জন্য ব্যবহৃত অপারেটরের উপর নির্ভর করে দুটি ধরণের JOINএস থাকতে পারে । তারা হয়
যে কোনও JOINপ্রকারের ( INNER, OUTERইত্যাদি) এর জন্য, যদি আমরা কেবলমাত্র সাম্য অপারেটর (=) ব্যবহার করি, তবে আমরা বলি যে এটি JOINএকটি EQUI JOIN।
এটি একই 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খুব একটা হতে পারে ।
সংজ্ঞা:
যোগদানগুলি হ'ল একাধিক টেবিলগুলি একসাথে একত্রিত করা ডেটাটিকে জিজ্ঞাসা করার উপায়।
আরডিবিএমএসের সাথে সম্পর্কিত 5-প্রকারের যোগ দেয়:
ইকুই-জয়েন: সমতা শর্তের ভিত্তিতে দুটি সারণী থেকে সাধারণ রেকর্ড একত্রিত করে। প্রযুক্তিগতভাবে, একটি টেবিলের প্রাথমিক কী এর মান এবং অন্য সারণীর বিদেশী কী মানের তুলনা করার জন্য সমতা-অপারেটর (=) ব্যবহার করে তৈরি করুন, ফলস্বরূপ উভয় সারণীর সাধারণ (ম্যাচড) রেকর্ড অন্তর্ভুক্ত রয়েছে set বাস্তবায়নের জন্য ইনার-জয়েন দেখুন।
প্রাকৃতিক-যোগ দিন: এটি ইকুই-জয়েনের বর্ধিত সংস্করণ, এতে সিলেক্ট অপারেশন সদৃশ কলাম বাদ দেয়। বাস্তবায়নের জন্য ইনার-জয়েন দেখুন
নন-ইকুই-জয়েন: এটি ইক্যুই-জয়েনের বিপরীত যেখানে যোগদানের শর্তটি সমতুল্য অপারেটর (=) উদাহরণস্বরূপ,! =, <=,> =,>, <বা বিটওয়েন ইত্যাদি ব্যতীত অন্যদের ব্যবহার করে implementation
স্ব-যোগদান:: একটি টেবিল নিজের সাথে একত্রিত যেখানে যোগদানের একটি স্বনির্ধারিত আচরণ; স্ব-রেফারেন্সিং টেবিলগুলি (বা ইউনিারি রিলেশনশিপ সত্তা) জিজ্ঞাসা করার জন্য এটি সাধারণত প্রয়োজন। বাস্তবায়নের জন্য ইনার-জয়েনগুলি দেখুন।
কার্টেসিয়ান পণ্য: এটি কোনও শর্ত ছাড়াই উভয় টেবিলের সমস্ত রেকর্ড সংযুক্ত করে। প্রযুক্তিগতভাবে, এটি WHERE-Clause ব্যতীত কোনও প্রশ্নের ফলাফল সেট প্রদান করে returns
এসকিউএল উদ্বেগ এবং অগ্রগতি অনুসারে, এখানে 3-প্রকারের যোগদান হয় এবং সমস্ত আরডিবিএমএস যোগদান করে এই ধরণের যোগদান করে using
ইনার-যোগ: এটি দুটি টেবিল থেকে সারি সারিগুলিকে একত্রিত করে (বা একত্রিত করে)। মিলটি টেবিলগুলির সাধারণ কলাম এবং তাদের তুলনামূলক অপারেশনের ভিত্তিতে করা হয়। যদি সাম্যতা ভিত্তিক শর্ত থাকে তবে: EQUI-JOIN সম্পাদিত হয়েছে, অন্যথায় নন- EQUI- যোগ দিন।
আউট-জয়েন: এটি দুটি টেবিলের সাথে মিলিত সারিগুলিকে একত্রিত করে (বা একত্রিত করে) এবং ন্যূনাল মানগুলির সাথে মেলে না r যাইহোক, মিল না হওয়া সারিগুলির পছন্দসই পছন্দটি বেছে নিতে পারে যেমন প্রথম টেবিল বা উপ-প্রকারের দ্বারা দ্বিতীয় টেবিল থেকে তুলনাহীন সারি নির্বাচন: বাম আউটর জয়েন এবং রাইট আউটর জয়েন।
2.1। বাম বাহ্যিক যোগদান (ওরফে, LEFT-JOIN): দুটি টেবিল থেকে সারি মেলে এবং কেবল বাম টেবিলের (যেমন প্রথম টেবিল) সাথে মেলে না।
2.2। রাইট আউটটার জয়েন (ওরফে, ডানদিকে যোগ দিন): দুটি টেবিল থেকে সারি মিলেছে এবং কেবলমাত্র রাইট টেবিলের সাথে মেলে না।
2.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;
intersect/ except/ এর চিত্র থেকে নেওয়া union; এখানে চেনাশোনা সারি দ্বারা ফিরে হয় left& right join, যেমন সংখ্যাযুক্ত লেবেল বলে। এক্সএক্সবি চিত্রটি বাজে। cross join= inner join on 1=1এবং প্রথম চিত্রের একটি বিশেষ কেস।
UNION JOIN। এখন এসকিউএল: 2003 এ অচল করে দেওয়া।
মজার বিষয় হল অন্যান্য বেশিরভাগ উত্তর এই দুটি সমস্যায় ভুগছে:
আমি সম্প্রতি এই বিষয়ের উপর একটি নিবন্ধ লিখেছি: একটি সম্ভবত অসম্পূর্ণ, এসকিউএল টেবিলগুলিতে যোগদানের বিভিন্ন উপায়ের জন্য বিস্তৃত গাইড , যা আমি এখানে সংক্ষিপ্ত করব।
এই কারণেই ভেন ডায়াগ্রামগুলি এগুলিকে এতগুলি সঠিকভাবে ব্যাখ্যা করে, কারণ একটি জোয়াইন দুটি যুক্ত টেবিলের মধ্যে কার্টেসিয়ান পণ্য তৈরি করে। উইকিপিডিয়া এটিকে সুন্দরভাবে বর্ণনা করেছে:
কার্টেসিয়ান পণ্যগুলির জন্য এসকিউএল সিনট্যাক্সটি 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চ্ছিক (এমএস অ্যাক্সেস ব্যতীত)।
( ফলাফল উদাহরণের জন্য নিবন্ধটি দেখুন )
একটি বিশেষ ধরণের থিতা-জোইন হ'ল ইক্যুই যোগ, যা আমরা সর্বাধিক ব্যবহার করি। শিকারিটি অন্য টেবিলের বিদেশী কী সহ এক টেবিলের প্রাথমিক কীটিতে যোগদান করে। যদি আমরা উদাহরণের জন্য সাকিলা ডাটাবেস ব্যবহার করি তবে আমরা লিখতে পারি:
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একটি সম্পর্কযুক্ত 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যা সাধারণত উল্লেখ করা হয়। আমার নিবন্ধে আরও বিশদ । এবং দয়া করে ভেন চিত্রগুলি চিত্রিত করার জন্য ব্যবহার বন্ধ করুন।
আমি আমার পোষ্য প্রুগ টিপতে যাচ্ছি: ব্যবহারের কীওয়ার্ড।
JOIN এর উভয় পাশের উভয় টেবিলের যদি তাদের বিদেশী কীগুলি সঠিকভাবে নামকরণ করা হয় (যেমন, একই নাম, কেবল "আইডি নয়) তবে এটি ব্যবহার করা যেতে পারে:
SELECT ...
FROM customers JOIN orders USING (customer_id)
আমি এটি খুব ব্যবহারিক, পঠনযোগ্য এবং প্রায়শই যথেষ্ট ব্যবহৃত হয় না বলে মনে করি।