14. Tables join का होतात: Keys आणि Relationships
14.3 SQL लिहिण्याआधी छोटा relationship map कसा काढायचा
का (Why). Tables कशी जोडलेली आहेत याचं दोन मिनिटांचं चित्र काढलं की चुकीच्या column वर join लिहिणं टळतं. कुठल्या बाजूला repeats असू शकतात तेही कळतं.
काय (What). Relationship map म्हणजे छोटं चित्र: प्रत्येक table साठी एक box आणि प्रत्येक foreign key पासून त्याच्या primary key पर्यंत एक रेघ. COUNT(*) आणि COUNT(DISTINCT key) सारखे असतील आणि key मध्ये NULL नसेल तेव्हा key unique असतो. Orphan म्हणजे असा row ज्याच्या foreign key value ला match नाही, जसं नसलेल्या hub कडे बोट दाखवणारी shipment. नसलेला key वेगळा असतो: तो NULL असतो, म्हणजे आत्ताची value माहीत नाही किंवा उपलब्ध नाही.
कसं (How). hubs आणि hub_contacts मध्ये uniqueness तपासा, मग ज्या shipments चा hub अस्तित्वात नाही किंवा नसलेला आहे त्या शोधा.
पायऱ्या
- customers, shipments, hubs आणि hub_contacts साठी boxes काढा आणि प्रत्येक key साठी एक रेघ ओढा.
- पहिलं उदाहरण run करा: rows आणि distinct_ids सारखे असतील तर key unique आहे.
- दुसरं उदाहरण run करा आणि hub_contacts मध्ये hub_id वर repeats आहेत असं नोंदवा.
- Orphans आणि नसलेले keys बघायला तिसरं उदाहरण run करा, मग तोच check NOT EXISTS ने करणारं चौथं उदाहरण run करा.
उदाहरणे
उदाहरण 1 · dataset: swiftship_logistics
SELECT COUNT(*) AS rows,
COUNT(DISTINCT hub_id) AS distinct_ids
FROM hubs;Output
| rows | distinct_ids |
|---|---|
| 5 | 5 |
Meaning. 5 rows आणि 5 distinct ids, म्हणजे hubs मध्ये hub_id unique आहे.
उदाहरण 2 · dataset: swiftship_logistics
SELECT COUNT(*) AS rows,
COUNT(DISTINCT hub_id) AS distinct_ids
FROM hub_contacts;Output
| rows | distinct_ids |
|---|---|
| 5 | 4 |
Meaning. 5 rows पण फक्त 4 distinct ids, म्हणजे एका hub चे एकापेक्षा जास्त contacts आहेत. या table सोबत join केला तर rows परत येऊ शकतात.
उदाहरण 3 · dataset: swiftship_logistics
SELECT shipment_id, hub_id
FROM shipments
WHERE hub_id IS NULL
OR hub_id NOT IN (SELECT hub_id FROM hubs);Output
| shipment_id | hub_id |
|---|---|
| 1009 | 9 |
| 1010 | NULL |
Meaning. 1009 orphan आहे: hub 9 अस्तित्वात नाही. 1010 चा key नसलेला आहे: त्याचा hub आत्ता माहीत नाही. दोन्ही तपासायला हवेत, पण वेगळ्या कारणांसाठी. hubs.hub_id हा INTEGER PRIMARY KEY आहे आणि तो कधीच NULL होऊ शकत नाही, म्हणूनच इथे हा NOT IN check सुरक्षित आहे.
उदाहरण 4 · dataset: swiftship_logistics
SELECT s.shipment_id, s.hub_id
FROM shipments AS s
WHERE s.hub_id IS NULL
OR NOT EXISTS (SELECT 1 FROM hubs AS h
WHERE h.hub_id = s.hub_id);Output
| shipment_id | hub_id |
|---|---|
| 1009 | 9 |
| 1010 | NULL |
Meaning. NOT EXISTS सुद्धा त्याच दोन shipments देतो. दुसऱ्या table मध्ये NULL key असला तरी तो बरोबर राहतो, म्हणून key NOT NULL आहे याची खात्री नसेल तेव्हा ही सुरक्षित सवय आहे.
Ravindra Bagale's Tip
Keep the IS NULL check in the orphan query, because NOT IN never returns a row whose own value is NULL. Also, if the subquery itself returns a NULL, NOT IN returns no rows at all, so use NOT EXISTS when the other key might be NULL.
Ravindra Bagale's Tip – मराठी
Orphan query मध्ये IS NULL check ठेवा, कारण ज्या row ची स्वतःची value NULL आहे तो NOT IN कधीच परत देत नाही. तसंच subquery नेच NULL दिला तर NOT IN एकही row देत नाही, म्हणून दुसरा key NULL असू शकत असेल तर NOT EXISTS वापरा.
Ravindra Bagale's Tip – हिंदी
Orphan query में IS NULL check रखिए, क्योंकि जिस row की अपनी value NULL है उसे NOT IN कभी नहीं लौटाता। और अगर subquery ही NULL दे, तो NOT IN एक भी row नहीं देता, इसलिए दूसरी key NULL हो सकती हो तो NOT EXISTS लगाइए।