मुख्य सामग्री पर जाएं
मॉड्यूल 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';

नियम:

  • दो SELECTs में संगतता के साथ समान संख्या में कॉलम होने चाहिए प्रकार;
  • 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लोड हो रहा है...

आपके द्वारा भेजे गए ईमेल ग्राहकों की संख्या अधिक है (डुप्लिकेट से अधिक)। ऊना कोलोना: ईमेल. प्रति ईमेल ऑर्डिना.

संपादक लोड हो रहा है...
संकेत दिखाएँ

समान ईमेल कॉलम लौटाने वाले दो चयनों के बीच यूनियन। ORDER BY अंत में, अंतिम परिणाम पर जाता है।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#sql.m5.l4.e2
प्रयास: 0लोड हो रहा है...

ईमेल द्वारा भेजे गए ग्राहकों में से केवल एक ही समय में कुछ नया प्राप्त हुआ है। यूएसए को छोड़कर। ऊना कोलोना: ईमेल. प्रति ईमेल ऑर्डिना.

संपादक लोड हो रहा है...
संकेत दिखाएँ

EXCEPT केवल बाईं ओर से उन पंक्तियों को रखता है जो दाईं ओर मौजूद नहीं हैं।

3 प्रयासों के बाद समाधान उपलब्ध है