Joins
26. What are SQL joins?
SQL joins হলো একটি পাওয়ারফুল technique যা দিয়ে আমরা দুই বা ততোধিক tables থেকে data কে একসাথে combine করতে পারি। এটি relational database এর সবচেয়ে গুরুত্বপূর্ণ features এর মধ্যে একটি।
- একাধিক tables এর মধ্যে relationship establish করে data retrieve করা
- Common column বা key এর মাধ্যমে tables গুলো connect করা
- Complex queries তৈরি করে comprehensive reports পাওয়া
SQL Joins এর প্রকারভেদ:
- INNER JOIN - শুধুমাত্র matching records
- LEFT JOIN (LEFT OUTER JOIN) - বাম table এর সব records + matching records
- RIGHT JOIN (RIGHT OUTER JOIN) - ডান table এর সব records + matching records
- FULL JOIN (FULL OUTER JOIN) - দুই table এর সব records
- CROSS JOIN - Cartesian product
- SELF JOIN - Same table এর সাথে join
Explain INNER JOIN with example?
INNER JOIN হলো সবচেয়ে common এবং widely used join। এটি শুধুমাত্র সেই records গুলো return করে যেগুলো দুই tables এ matching condition satisfy করে।
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
ধরি আমাদের দুইটি tables আছে:
Students Table:
CREATE TABLE Students (
student_id INT,
student_name VARCHAR(50),
department_id INT
);
INSERT INTO Students VALUES
(1, 'রহিম', 101),
(2, 'করিম', 102),
(3, 'ফাতেমা', 101),
(4, 'আয়েশা', 103),
(5, 'আলী', NULL);
Departments Table:
CREATE TABLE Departments (
department_id INT,
department_name VARCHAR(50)
);
INSERT INTO Departments VALUES
(101, 'Computer Science'),
(102, 'Mathematics'),
(103, 'Physics'),
(104, 'Chemistry');
INNER JOIN Query:
SELECT s.student_name, d.department_name
FROM Students s
INNER JOIN Departments d
ON s.department_id = d.department_id;
| student_name | department_name |
|---|---|
| রহিম | Computer Science |
| করিম | Mathematics |
| ফাতেমা | Computer Science |
| আয়েশা | Physics |
লক্ষ্য করুন:
- আলী এবং Chemistry department result এ নেই
- কারণ আলীর department_id NULL এবং Chemistry এর কোনো matching student নেই
Difference between LEFT JOIN and RIGHT JOIN?
LEFT JOIN (LEFT OUTER JOIN):
- বাম table (FROM clause এ যে table আছে) এর সব records return করে
- ডান table থেকে শুধু matching records নেয়
- যদি match না হয় তাহলে ডান table এর columns এ NULL values দেয়
SELECT s.student_name, d.department_name
FROM Students s
LEFT JOIN Departments d
ON s.department_id = d.department_id;
| student_name | department_name |
|---|---|
| রহিম | Computer Science |
| করিম | Mathematics |
| ফাতেমা | Computer Science |
| আয়েশা | Physics |
| আলী | NULL |
RIGHT JOIN (RIGHT OUTER JOIN):
- ডান table (JOIN clause এর পরে যে table আছে) এর সব records return করে
- বাম table থেকে শুধু matching records নেয়
- যদি match না হয় তাহলে বাম table এর columns এ NULL values দেয়
SELECT s.student_name, d.department_name
FROM Students s
RIGHT JOIN Departments d
ON s.department_id = d.department_id;
| student_name | department_name |
|---|---|
| রহিম | Computer Science |
| ফাতেমা | Computer Science |
| করিম | Mathematics |
| আয়েশা | Physics |
| NULL | Chemistry |
মূল পার্থক্য:
| বিষয় | LEFT JOIN | RIGHT JOIN |
|---|---|---|
| Priority | বাম table এর সব data | ডান table এর সব data |
| NULL values | ডান table এর columns এ | বাম table এর columns এ |
| Use case | Master table এর সব records চাই | Reference table এর সব records চাই |
What happens when join condition returns NULL?
SQL এ NULL values এর সাথে কোনো comparison operation FALSE return করে, এমনকি NULL = NULL ও FALSE।
বিভিন্ন JOIN এ NULL এর প্রভাব:
1. INNER JOIN এ NULL:
-- এই query তে আলী আসবে না কারণ NULL = কোনো value FALSE
SELECT s.student_name, d.department_name
FROM Students s
INNER JOIN Departments d
ON s.department_id = d.department_id;
2. LEFT JOIN এ NULL:
-- আলী আসবে কিন্তু department_name NULL হবে
SELECT s.student_name, d.department_name
FROM Students s
LEFT JOIN Departments d
ON s.department_id = d.department_id;
3. NULL Values Handle করার উপায়:
COALESCE ব্যবহার:
SELECT s.student_name,
COALESCE(d.department_name, 'No Department') as department_name
FROM Students s
LEFT JOIN Departments d
ON s.department_id = d.department_id;
ISNULL/IFNULL ব্যবহার:
-- SQL Server এর জন্য
SELECT s.student_name,
ISNULL(d.department_name, 'Unknown') as department_name
FROM Students s
LEFT JOIN Departments d
ON s.department_id = d.department_id;
NULL এর সাথে Advanced Scenarios:
উভয় দিকে NULL:
-- যদি উভয় table এ NULL values থাকে
INSERT INTO Students VALUES (6, 'নাদিয়া', NULL);
INSERT INTO Departments VALUES (NULL, 'Unknown Department');
-- INNER JOIN এ কোনোটাই match হবে না
-- LEFT/RIGHT JOIN এ NULL values আলাদাভাবে show হবে
Multiple Columns এ NULL:
SELECT s.student_name, d.department_name
FROM Students s
LEFT JOIN Departments d
ON s.department_id = d.department_id
AND s.student_name IS NOT NULL -- Additional condition
AND d.department_name IS NOT NULL;
Best Practices NULL Handle করার জন্য:
- Data Validation: Insert/Update এর সময় NULL check করা
- Default Values: Table design এ default values set করা
- COALESCE/ISNULL: Query তে appropriate default values দেওয়া
- WHERE Clauses: NULL values filter করার জন্য
IS NULLবাIS NOT NULLব্যবহার
Performance Considerations:
- NULL values index এ special handling প্রয়োজন
- Join operations এ NULL values extra processing time নিতে পারে
- Query optimization এর সময় NULL values consider করা জরুরি
এই সব concepts একসাথে ব্যবহার করে আপনি complex database queries efficiently handle করতে পারবেন।
27. What is FULL OUTER JOIN?
FULL OUTER JOIN হলো SQL এর একটি advanced join type যা দুইটি tables এর সব records return করে, regardless of whether they match or not। এটি LEFT JOIN এবং RIGHT JOIN এর combination এর মতো কাজ করে।
- বাম table এর সব records return করে
- ডান table এর সব records return করে
- Matching records একবারই show করে
- Non-matching records এর জন্য opposite side এ NULL values দেয়
SELECT columns
FROM table1
FULL OUTER JOIN table2
ON table1.column = table2.column;
-- অথবা শুধু
FULL JOIN table2
ON table1.column = table2.column;
আমাদের আগের Students এবং Departments tables ব্যবহার করি:
Students Table:
student_id | student_name | department_id
-----------|-------------|---------------
1 | রহিম | 101
2 | করিম | 102
3 | ফাতেমা | 101
4 | আয়েশা | 103
5 | আলী | NULL
6 | নাদিয়া | 105 -- এই department exist করে না
Departments Table:
department_id | department_name
--------------|------------------
101 | Computer Science
102 | Mathematics
103 | Physics
104 | Chemistry -- এই department এ কোনো student নেই
SELECT s.student_name, d.department_name
FROM Students s
FULL OUTER JOIN Departments d
ON s.department_id = d.department_id;
| student_name | department_name |
|---|---|
| রহিম | Computer Science |
| ফাতেমা | Computer Science |
| করিম | Mathematics |
| আয়েশা | Physics |
| আলী | NULL |
| নাদিয়া | NULL |
| NULL | Chemistry |
ব্যাখ্যা:
- রহিম, ফাতেমা, করিম, আয়েশা → Matching records
- আলী, নাদিয়া → Students without matching departments
- Chemistry → Department without any students
How is it different from UNION?
এটি একটি common confusion। অনেকে মনে করেন FULL OUTER JOIN এবং UNION same কাজ করে, কিন্তু এদের মধ্যে fundamental differences আছে।
FULL OUTER JOIN:
- দুইটি tables এর columns একসাথে রাখে
- Horizontal combination (columns side by side)
- Result এ both tables এর columns থাকে
UNION:
- Same structure এর tables এর rows একসাথে রাখে
- Vertical combination (rows উপর নিচে)
- Result এ শুধু একটি table structure থাকে
FULL OUTER JOIN Example:
SELECT s.student_name, s.department_id as s_dept,
d.department_id as d_dept, d.department_name
FROM Students s
FULL OUTER JOIN Departments d
ON s.department_id = d.department_id;
| student_name | s_dept | d_dept | department_name |
|---|---|---|---|
| রহিম | 101 | 101 | Computer Science |
| করিম | 102 | 102 | Mathematics |
UNION Example:
SELECT student_name as name, 'Student' as type
FROM Students
UNION
SELECT department_name as name, 'Department' as type
FROM Departments;
| name | type |
|---|---|
| রহিম | Student |
| করিম | Student |
| Computer Science | Department |
| Mathematics | Department |