Joins और Set Operations
Tables join क्यों?
अच्छा database data को अलग-अलग जुड़ी tables में रखता है (दोहराव से बचने के लिए)। “Pari किस department और floor पर है?” का जवाब देने के लिए दो tables की rows मिलानी पड़ती हैं – यही join है।
Sample tables
SELECT * FROM DEPT;
+-------+-------+-------+ | DCode | DName | Floor | +-------+-------+-------+ | D1 | Sales | 1 | | D2 | IT | 3 | | D3 | HR | 2 | +-------+-------+-------+
SELECT * FROM STAFF;
+-----+-------+--------+-------+ | SID | SName | Salary | DCode | +-----+-------+--------+-------+ | 1 | Neel | 40000 | D1 | | 2 | Ojas | 65000 | D2 | | 3 | Pari | 52000 | D2 | | 4 | Qasim | 38000 | D3 | +-----+-------+--------+-------+
Cartesian product
FROM में बिना शर्त दो tables लिखने पर पहली की हर row दूसरी की हर row से जुड़ती है। Rows = 4 × 3 = 12; degree = 4 + 3 = 7। ज़्यादातर जोड़े बेमतलब होते हैं।
SELECT SName, DName FROM STAFF, DEPT ORDER BY SName, DName;
+-------+-------+ | SName | DName | +-------+-------+ | Neel | HR | | Neel | IT | | Neel | Sales | | Ojas | HR | | Ojas | IT | | Ojas | Sales | | Pari | HR | | Pari | IT | | Pari | Sales | | Qasim | HR | | Qasim | IT | | Qasim | Sales | +-------+-------+
SELECT COUNT(*) AS 'Rows in STAFF x DEPT' FROM STAFF, DEPT;
+----------------------+ | Rows in STAFF x DEPT | +----------------------+ | 12 | +----------------------+
Equi-join
Common column बराबर होने की शर्त जोड़ें। जब column का नाम दोनों tables में हो तो table.column लिखें।
SELECT SName, Salary, DName FROM STAFF, DEPT WHERE STAFF.DCode = DEPT.DCode ORDER BY SName;
+-------+--------+-------+ | SName | Salary | DName | +-------+--------+-------+ | Neel | 40000 | Sales | | Ojas | 65000 | IT | | Pari | 52000 | IT | | Qasim | 38000 | HR | +-------+--------+-------+
JOIN … ON और aliases
छोटे aliases (S, D) queries छोटी करते हैं। JOIN … ON इसी equi-join को लिखने का modern तरीका है।
SELECT S.SName, D.DName, D.Floor FROM STAFF S JOIN DEPT D ON S.DCode = D.DCode WHERE D.Floor > 1 ORDER BY S.SName;
+-------+-------+-------+ | SName | DName | Floor | +-------+-------+-------+ | Ojas | IT | 3 | | Pari | IT | 3 | | Qasim | HR | 2 | +-------+-------+-------+
Natural join
NATURAL JOIN एक जैसे नाम वाले columns पर अपने आप join करता है और common column एक बार दिखाता है।
SELECT * FROM STAFF NATURAL JOIN DEPT ORDER BY SID;
+-------+-----+-------+--------+-------+-------+ | DCode | SID | SName | Salary | DName | Floor | +-------+-----+-------+--------+-------+-------+ | D1 | 1 | Neel | 40000 | Sales | 1 | | D2 | 2 | Ojas | 65000 | IT | 3 | | D2 | 3 | Pari | 52000 | IT | 3 | | D3 | 4 | Qasim | 38000 | HR | 2 | +-------+-----+-------+--------+-------+-------+
GROUP BY के साथ join
SELECT D.DName, COUNT(*) AS Staff, SUM(S.Salary) AS Total FROM STAFF S, DEPT D WHERE S.DCode = D.DCode GROUP BY D.DName ORDER BY D.DName;
+-------+-------+--------+ | DName | Staff | Total | +-------+-------+--------+ | HR | 1 | 38000 | | IT | 2 | 117000 | | Sales | 1 | 40000 | +-------+-------+--------+
Set operations
Set operations एक जैसी संख्या और type के columns वाले दो SELECTs के results मिलाते हैं।
SELECT Name FROM CLUB_A UNION SELECT Name FROM CLUB_B;
+-------+ | Name | +-------+ | Asha | | Ravi | | Neha | | Zoya | | Kabir | +-------+
SELECT Name FROM CLUB_A UNION ALL SELECT Name FROM CLUB_B;
+-------+ | Name | +-------+ | Asha | | Ravi | | Neha | | Ravi | | Zoya | | Neha | | Kabir | +-------+
MySQL 8.0.31+ में INTERSECT और EXCEPT भी हैं। हर version में चलने वाला तरीका, नीचे, IN और NOT IN है।
SELECT Name FROM CLUB_A WHERE Name IN (SELECT Name FROM CLUB_B);
+------+ | Name | +------+ | Ravi | | Neha | +------+
SELECT Name FROM CLUB_A WHERE Name NOT IN (SELECT Name FROM CLUB_B);
+------+ | Name | +------+ | Asha | +------+
Practice
- Table A में 5 rows और 3 columns, B में 4 rows और 2 columns। A × B की degree और cardinality? Degree 5, cardinality 20।
- 50000 से ज़्यादा कमाने वाले staff के नाम उनके floor के साथ दिखाइए। SELECT SName, Floor FROM STAFF S, DEPT D WHERE S.DCode = D.DCode AND Salary > 50000;
