মূল কন্টেন্টে যান
মডিউল 5 · 4-এর পাঠ 4কোর্সে 20/57~12 min
মডিউল পাঠ (4/4)

ইউনিয়ন, ছেদ, ব্যতীত (এবং ক্রস যোগদান)

এখন পর্যন্ত আপনি অনুভূমিকভাবে ডেটা একত্রিত করেছেন: JOIN কলাম সংযুক্ত করে সম্পর্কিত সারি থেকে। SQL এছাড়াও অপারেটর যে অন্য পরিবার প্রস্তাব দুটি SELECTs-এর ফলাফল হিসাবে বিবেচনা করে উল্লম্বভাবে ডেটা একত্রিত করে সেট: UNION, INTERSECT, EXCEPT। এছাড়াও আমরা CROSS JOIN, থি কার্টেসিয়ান পণ্য।

ক্রস যোগদান: প্রতিটি সারির সাথে প্রতিটি সারি

CROSS JOIN এর কোনো ON নেই: এটি প্রতিটি সম্ভাব্য সমন্বয় তৈরি করে দুটি টেবিলের মধ্যে সারি (কার্টেসিয়ান পণ্য)। যদি A এর n সারি থাকে এবং B থাকে m সারি আছে, ফলাফলে n × m আছে।

SQL
-- Tutte le combinazioni cliente × prodotto:
SELECT c.email, p.name
FROM   customers c
CROSS JOIN products p;

12 গ্রাহক × 16 পণ্য = 192 সারি। এটি বাস্তব ডেটাতে খুব কমই ব্যবহৃত হয় (এটি ব্যয়বহুল!), কিন্তু এটি এর জন্য দরকারী:

  • "সকলের বিপরীতে" সমন্বয় তৈরি করা (যেমন একটি সামঞ্জস্যতা ম্যাট্রিক্স);
  • ধ্রুবক / পরামিতিগুলির একটি ছোট টেবিলের সাথে একটি টেবিল যুক্ত করা।

ইউনিয়ন এবং ইউনিয়ন সব

UNION দুটি SELECT এর ফলাফল একই সংখ্যার সাথে যুক্ত করে এবং কলামের ধরন:

SQL
SELECT email FROM customers WHERE country = 'Italia'
UNION
SELECT email FROM customers WHERE country = 'Francia';

নিয়ম:

  • দুটি SELECT এর অবশ্যই একই সংখ্যক কলাম থাকতে হবে, সাথে সামঞ্জস্যপূর্ণ প্রকার
  • UNION (ALL ছাড়া) সদৃশগুলি সরিয়ে দেয় — কার্যকরভাবে একটি সম্পাদন করে চূড়ান্ত ফলাফলে DISTINCT;
  • UNION ALL ডুপ্লিকেটও রাখে, এবং অনেক দ্রুত কারণ এটি ডিডপ্লিকেশনের জন্য বাছাই/হ্যাশ এড়িয়ে যায়।
SQL
-- Email di clienti che hanno ordinato O recensito qualcosa, senza duplicati:
SELECT c.email
FROM   customers c JOIN orders  o ON o.customer_id = c.id
UNION
SELECT c.email
FROM   customers c JOIN reviews r ON r.customer_id = c.id;

ছেদ এবং ব্যতীত

INTERSECT রাখে শুধুমাত্র সারি উভয়ই ফলাফলে উপস্থিত থাকে; EXCEPT রাখে প্রথমটির সারি যা দ্বিতীয়টিতে নেই (সেট "পার্থক্য")।

SQL
-- Clienti che hanno sia ordinato sia recensito:
SELECT c.email FROM customers c JOIN orders  o ON o.customer_id = c.id
INTERSECT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;

-- Clienti che hanno ordinato ma mai recensito:
SELECT c.email FROM customers c JOIN orders  o ON o.customer_id = c.id
EXCEPT
SELECT c.email FROM customers c JOIN reviews r ON r.customer_id = c.id;

INTERSECT এবং EXCEPT এছাড়াও ডিফল্টরূপে সদৃশগুলি সরিয়ে দেয়; দ INTERSECT ALL / EXCEPT ALL ভেরিয়েন্ট করে না।

নিজে চেষ্টা করে দেখুন

ব্যায়াম#sql.m5.l4.e1
প্রচেষ্টা: 0লোড হচ্ছে...

Trova tutte le email dei clienti che hanno ordinato qualcosa OPPURE recensito qualcosa (senza duplicati)। উনা কোলোনা: ইমেইল। ইমেইল প্রতি Ordina.

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

দুটি নির্বাচনের মধ্যে UNION একই ইমেল কলাম ফেরত দিচ্ছে৷ ORDER BY শেষ পর্যন্ত, চূড়ান্ত ফলাফলের উপর।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম পর্যালোচনা করুন

ব্যায়াম#sql.m5.l4.e2
প্রচেষ্টা: 0লোড হচ্ছে...

Trova le email dei clienti che hanno ordinato ma non hanno mai recensito nulla. ইউএসএ ব্যতীত। উনা কোলোনা: ইমেইল। ইমেইল প্রতি Ordina.

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

EXCEPT বাম SELECT থেকে শুধুমাত্র সারি রাখে যা ডানদিকে নেই।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ