ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 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 మరియు UNION అన్నీ

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 మరియు మినహా

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). Una colonna: ఇమెయిల్. ప్రతి ఇమెయిల్‌కి ఆర్డినా.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

రెండు ఎంపికల మధ్య UNION ఒకే ఇమెయిల్ నిలువు వరుసను అందిస్తుంది. ఆర్డర్ ద్వారా ఆర్డర్ చివరి ఫలితంపై చివరిలో ఉంటుంది.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం సమీక్షించండి

వ్యాయామం#sql.m5.l4.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

ట్రోవా లే ఇమెయిల్ డీ క్లయింటీ చే హన్నో ఆర్డినాటో మా నాన్ హన్నో మై రీసెన్సిటో నుల్లా. USA మినహా. Una colonna: ఇమెయిల్. ప్రతి ఇమెయిల్‌కి ఆర్డినా.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

మినహా ఎడమవైపు SELECT నుండి కుడివైపున లేని అడ్డు వరుసలను మాత్రమే ఉంచుతుంది.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది