Ravindra BagaleCourses & study guides Track your progress

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 अस्तित्वात नाही किंवा नसलेला आहे त्या शोधा.

पायऱ्या

  1. customers, shipments, hubs आणि hub_contacts साठी boxes काढा आणि प्रत्येक key साठी एक रेघ ओढा.
  2. पहिलं उदाहरण run करा: rows आणि distinct_ids सारखे असतील तर key unique आहे.
  3. दुसरं उदाहरण run करा आणि hub_contacts मध्ये hub_id वर repeats आहेत असं नोंदवा.
  4. 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

rowsdistinct_ids
55

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

rowsdistinct_ids
54

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_idhub_id
10099
1010NULL

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_idhub_id
10099
1010NULL

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.