مرحباً، أنا بقدم سلسلة دروس قواعد البيانات باستخدام Postgres. في هذا الدرس، سوف نتحدث عن أنواع Joins المختلفة:
Inner JoinLeft JoinRight JoinFull Joinقبل البدء، من المهم أن نضع بالنا أننا نعمل مع جدولين:
UsersHobbiesيمكنكم تبديل هذه التعاريف حسب احتياجاتكم، الترتيب ليس مهماً.
الدوائر في الرسوم البيانية تمثل الجداول:
UsersHobbiesفي جدول Users لدينا المستخدمون التاليون:
| ID | Name |
|---|---|
| 1 | John |
| 2 | Maria |
| 3 | Smith |
في جدول Hobbies لدينا الهوايات التالية:
| ID | Hobby | User ID |
|---|---|---|
| 1 | Code | 2 |
| 2 | Swimming | 1 |
| 3 | Climbing | 1 |
| 4 | Running | NULL |
لاحظوا أن:
Code مرتبطة مع User ID 2 (Maria)Swimming و Climbing مرتبطة مع User ID 1 (John)Running لا توجد لها أي مستخدم (NULL)Smith لا يوجد له أي هوايةInner Join يعني: الأشياء المشتركة بين الجدولين.
في الرسم البياني بدوائر فن (Venn Diagram)، Inner Join هو الجزء الذي تتقاطع فيه الدائرتان.
إذا قمتم بتنفيذ استعلام Inner Join، ستحصلون على النتائج التالية فقط:
| Name | Hobby |
|---|
اشترك في النشرة البريدية
دروس جديدة، مقالات، وأدوات مباشرة لبريدك.
| John | Swimming |
| John | Climbing |
| Maria | Code |
لاحظوا أن:
Smith تم حذفه لأنه لا يوجد له هواياتRunning تم حذفها لأنه لا يوجد مستخدم مرتبط بهاLeft Join يعني: كل شيء من الجدول الأيسر (Left)، بالإضافة إلى البيانات المشتركة.
| Name | Hobby |
|---|---|
| John | Swimming |
| John | Climbing |
| Maria | Code |
| Smith | NULL |
هنا Smith مُضمن في النتائج، لكن قيمة Hobby له هي NULL لأنه لا توجد هويات مرتبطة به.
Right Join هو عكس Left Join بالضبط.
يعني: كل شيء من الجدول الأيمن (Right)، بالإضافة إلى البيانات المشتركة.
| Name | Hobby |
|---|---|
| John | Swimming |
| John | Climbing |
| Maria | Code |
| NULL | Running |
هنا Running مُضمن في النتائج، لكن قيمة Name لها هي NULL لأنه لا يوجد مستخدم مرتبط بها.
Full Join يجمع كل شيء من كلا الجانبين.
يعني: كل شيء من الجدول الأيسر، وكل شيء من الجدول الأيمن، والبيانات المشتركة.
| Name | Hobby |
|---|---|
| John | Swimming |
| John | Climbing |
| Maria | Code |
| Smith | NULL |
| NULL | Running |
في Full Join:
NULLالأنواع الأكثر استخداماً هي:
Inner Join - الأكثر استخداماًLeft Join - الثاني الأكثر استخداماًهذان النوعان يغطيان معظم الحالات العملية التي ستصادفونها.
أولاً، دعونا ننشئ جدول Users:
CREATE TABLE Users (
id SERIAL PRIMARY KEY,
name VARCHAR
);في هذا الجدول:
id سيكون عدداً تسلسلياً ومفتاح أساسيname سيكون نصاًالآن، دعونا ننشئ جدول Hobbies:
CREATE TABLE Hobbies (
id SERIAL PRIMARY KEY,
hobby VARCHAR,
user_id INTEGER REFERENCES Users(id)
);في هذا الجدول:
id سيكون عدداً تسلسلياً ومفتاح أساسيhobby سيكون نصاًuser_id سيكون مفتاحاً أجنبياً يشير إلى Users.idالآن دعونا ننسخ بعض البيانات إلى الجداول:
INSERT INTO Users (name)
VALUES ('John'), ('Maria'), ('Smith');الآن دعونا نضيف الهوايات:
INSERT INTO Hobbies (hobby, user_id)
VALUES
('Code', 2),
('Swimming', 1),
('Climbing', 1),
('Running', NULL);دعونا نتحقق من أن جميع البيانات تم إدراجها بشكل صحيح:
SELECT * FROM Users;ستحصلون على:
id | name
----|-------
1 | John
2 | Maria
3 | SmithSELECT * FROM Hobbies;ستحصلون على:
id | hobby | user_id
----|----------|----------
1 | Code | 2
2 | Swimming | 1
3 | Climbing | 1
4 | Running | NULLالآن دعونا نكتب استعلام Inner Join:
SELECT
users.name AS username,
hobbies.hobby
FROM users
JOIN hobbies
ON users.id = hobbies.user_id;في هذا الاستعلام:
الخطوة 1 - اختيار الأعمدة:
نحن نختار name من جدول users و hobby من جدول hobbies. استخدمنا AS username لإنشاء اسم مستعار (Alias) للعمود.
الخطوة 2 - تحديد الجدول الأساسي:
FROM users - هذا يخبر PostgreSQL أن users هو الجدول الأساسي (Left Table).
الخطوة 3 - تحديد نوع Join:
JOIN hobbies - هذا يخبره أننا نريد الانضمام مع جدول hobbies. يمكنكم كتابة INNER JOIN أو JOIN، كلاهما نفس الشيء.
الخطوة 4 - تحديد شرط الربط:
ON users.id = hobbies.user_id - هذا يخبره على أي أساس سيتم الربط بين الجدولين.
النتيجة ستكون:
username | hobby
----------|----------
John | Swimming
John | Climbing
Maria | Codeكما توقعنا، الفقط Inner Join يعيد البيانات المشتركة بين الجدولين.