SQL: bags, NULL logic और joins
लक्ष्य और execution model
छोटी tables से SQL results निकालें, जिनमें duplicates, missing values और unmatched joins हों। PostgreSQL documentation से illustrated standard core लें; किसी vendor-specific optimizer plan को assume नहीं करें। Logical order FROM/JOIN, WHERE, फिर SELECT तथा DISTINCT है; ORDER BY presentation order तय करता है। यह reasoning model है, engine के physical execution order का दावा नहीं।
1. SQL results प्रायः bags हैं
T(x) में 2,2,5 rows हों तो SELECT x FROM T तीन rows देता है। SELECT DISTINCT x FROM T में 2 और 5 एक-एक बार आते हैं। ORDER BY के बिना order unspecified है। UNION duplicates हटाता है; UNION ALL multiplicities जोड़कर रखता है। L result 2,2 और R result 2,5 हो तो UNION {2,5}; UNION ALL में तीन 2 और एक 5 है। Set operations में column counts तथा types compatible होने चाहिए।
Join multiplicities multiply होती हैं। एक key left में दो और right में तीन बार हो तो equality join छह pairs देता है, अगर सभी छह comparisons true हों। बाद में projection पर DISTINCT उन्हें घटा सकता है, लेकिन join केवल एक partner नहीं चुनता।
2. NULL ordinary value नहीं, marker है
x=5, x<>5, x=NULL जैसे ordinary comparisons में कोई operand NULL हो तो result UNKNOWN है। Ordinary equality में NULL=NULL भी UNKNOWN है। Marker जाँचने के लिए IS NULL या IS NOT NULL लें। WHERE केवल TRUE रखता है; FALSE और UNKNOWN दोनों हटते हैं। NULL स्वतः zero या empty string नहीं होता।
मुख्य three-valued identities: NOT UNKNOWN=UNKNOWN; FALSE AND UNKNOWN=FALSE; TRUE AND UNKNOWN=UNKNOWN; TRUE OR UNKNOWN=TRUE; FALSE OR UNKNOWN=UNKNOWN। इसलिए p UNKNOWN हो तो p OR NOT p भी UNKNOWN है; यह हर row रखने वाला filter नहीं।
Trace: T(x) में 2,NULL,5 हैं। WHERE x<>2 केवल 5 देता है। WHERE NOT(x=2) भी केवल 5। WHERE x<>2 OR x IS NULL से NULL तथा 5 मिलते हैं। WHERE x=NULL कोई row नहीं देता। “निश्चित रूप से अलग” और “अलग या unknown” अलग conditions हैं। Duplicate elimination में DISTINCT repeated NULL markers को एक साथ मानता है; यह ordinary NULL=NULL comparison का उपयोग नहीं है।
3. Inner join और explicit predicate
Student(sid,name)={(1,Ana),(2,Bob),(3,Chen)}, Enrol(sid,cid)={(1,A),(1,B),(2,A)} लें। सभी ids non-null हैं। SELECT s.sid,e.cid FROM Student s JOIN Enrol e ON s.sid=e.sid का result (1,A),(1,B),(2,A) है। Student 3 का match नहीं। Matching के लिए ON TRUE होना चाहिए। Nullable join keys दोनों NULL हों तो ordinary equality उन्हें match नहीं करती।
Aliases से columns स्पष्ट करें। JOIN ... ON अलग names वाले columns compare कर सकता है या non-equality predicate दे सकता है। NATURAL JOIN हर shared name को match करता है; नया shared column result बदल सकता है। Explicit ON intended relationship स्पष्ट रखता है।
4. Outer joins और predicate की जगह
LEFT JOIN हर left row को कम-से-कम एक बार रखता है। Matches वाली row अपने matching pairs देती है; कोई true match न हो तो right side null-extended होती है। ऊपर SELECT s.sid,e.cid FROM Student s LEFT JOIN Enrol e ON s.sid=e.sid से (1,A),(1,B),(2,A),(3,NULL) मिलता है।
दो queries:
Q1: SELECT s.sid,e.cid FROM Student s LEFT JOIN Enrol e ON s.sid=e.sid AND e.cid='B'; Q2: SELECT s.sid,e.cid FROM Student s LEFT JOIN Enrol e ON s.sid=e.sid WHERE e.cid='B';
Q1 देता है (1,B),(2,NULL),(3,NULL)। Bob का B match नहीं, फिर भी preserve है; Chen का कोई match नहीं, फिर भी preserve है। Q2 केवल (1,B) देता है: Bob की A row WHERE fail करती है, Chen की null-extended row पर condition UNKNOWN है। ON preservation से पहले matching तय करता है; WHERE बने result को filter करता है। इसलिए outer join के पार predicate move करना सामान्यतः safe नहीं।
RIGHT JOIN इसी तरह right side बचाता है; FULL JOIN दोनों ओर की unmatched rows बचाता है। Matching pairs पर वही multiplicity तथा truth rules लागू हैं।
5. Anti-join और assumption
बिना enrollment वाले students के लिए LEFT JOIN के बाद WHERE e.sid IS NULL उपयोग करें, जब real matching row में e.sid guaranteed non-null हो। Result student 3 है। Right-side non-null key जाँचें; nullable grade नहीं: वास्तविक enrollment का grade NULL हो सकता है, जिसे गलत तरह unmatched समझ लेंगे। NOT EXISTS का दूसरा सीधा तरीका अगले lesson में है।
सावधानियाँ
- Plain SELECT duplicates नहीं हटाता; ORDER BY बिना order guaranteed नहीं।
- UNKNOWN, TRUE नहीं; WHERE उसे नहीं रखता।
- NULL test IS NULL है, =NULL नहीं।
- Multiple matches से LEFT JOIN left input से अधिक rows दे सकता है।
- Right-side column को WHERE में filter करने से null-extended rows हट सकती हैं।
मौलिक अभ्यास: छह single-correct MCQ
ये मौलिक शिक्षण प्रश्न हैं, पिछले वर्षों के प्रश्न नहीं। ठीक एक उत्तर चुनें।
P01. T(x) में 7,7,NULL हैं। SELECT x FROM T कितनी rows देता है?
A. 1 B. 2 C. 3 D. 0
उत्तर: C
A: Plain SELECT सभी rows collapse नहीं करता।
B: DISTINCT duplicate 7 घटाता।
C: Filter या DISTINCT बिना तीनों rows रहती हैं।
D: Plain SELECT में NULL row नहीं हटाता।
P02. Ordinary SQL NULL=NULL का result क्या है?
A. TRUE B. FALSE C. UNKNOWN D. Zero
उत्तर: C
A: Missing values में equality यह स्थापित नहीं करती।
B: यह known false भी नहीं है।
C: NULL operand से ordinary equality UNKNOWN है।
D: Truth result numeric default zero नहीं है।
P03. x में NULL marker कौन-सा predicate चुनता है?
A. x=NULL B. x<>NULL C. x IS NULL D. NOT(x=NULL)
उत्तर: C
A: यह UNKNOWN है।
B: यह भी UNKNOWN है।
C: IS NULL marker सीधे जाँचता है।
D: NOT UNKNOWN भी UNKNOWN है।
P04. Join key L में 2 और R में 4 बार है। सभी equality matches true हैं। इस key के कितने pairs?
A. 2 B. 4 C. 6 D. 8
उत्तर: D
A: हर left occurrence के चार partners हैं।
B: Left में दो occurrences हैं, एक नहीं।
C: Multiplicities जोड़ना join नहीं।
D: 2×4=8 pairs।
P05. LEFT JOIN के बाद WHERE right_col=5 को null-extended row मिलती है। क्या होगा?
A. हमेशा रहती है B. Predicate UNKNOWN होने से हटती है C. Zero से replace होती है D. Duplicate होती है
उत्तर: B
A: WHERE केवल TRUE रखता है।
B: NULL=5 UNKNOWN है, इसलिए row हटती है।
C: Predicate value replace नहीं करता।
D: Filter rows duplicate नहीं करता।
P06. SQL three-valued logic में कौन TRUE है?
A. NOT UNKNOWN B. FALSE OR UNKNOWN C. TRUE AND UNKNOWN D. TRUE OR UNKNOWN
उत्तर: D
A: NOT UNKNOWN, UNKNOWN है।
B: FALSE OR UNKNOWN, UNKNOWN है।
C: TRUE AND UNKNOWN, UNKNOWN है।
D: एक TRUE disjunct OR को TRUE करता है।
स्रोत और दायरा
यह 2026 course के बताए भाग का पाठ है, पूरे Databases syllabus की समाप्ति नहीं। सभी गणनात्मक उदाहरण और प्रश्न मौलिक हैं। 2027 की पूर्णता का दावा नहीं।
प्रगति सहेजने के लिए साइन इन करें। साइन इन