English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
استخدام جملة JOIN في PostgreSQL لجمع سجلات من طاولتين أو أكثر بناءً على الحقول المشتركة بين هذه الطاولات.
في PostgreSQL، هناك خمس أنواع من JOINات:
CROSS JOIN: الاتصال العكسي
INNER JOIN: الاتصال الداخلي
LEFT OUTER JOIN: الاتصال الخارجي اليسرى
RIGHT OUTER JOIN: الاتصال الخارجي اليمنى
FULL OUTER JOIN: الاتصال الخارجي الكامل
دعونا الآن ننشئ جدولين COMPANY و DEPARTMENT。)
إنشاء جدول COMPANY (تحميل ملف SQL لـ COMPANY )، محتويات البيانات كالتالي:
w3codeboxdb# select * from COMPANY; id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall | 45000 7 | James | 24 | Houston | 10000 (7 rows)
نحن نضيف بضعة سجلات إلى الجدول:
INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00); INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00); INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00);
في هذه اللحظة، السجلات في جدول COMPANY كالتالي:
id | name | age | address | salary ----+-------+-----+--------------+-------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall | 45000 7 | James | 24 | Houston | 10000 8 | Paul | 24 | Houston | 20000 9 | James | 44 | Norway | 5000 10 | James | 45 | Texas | 5000 (10 rows)
إنشاء جدول DEPARTMENT وإضافة ثلاثة حقول:
CREATE TABLE DEPARTMENT( ID INT PRIMARY KEY NOT NULL, DEPT CHAR(50) NOT NULL, EMP_ID INT NOT NULL );
إدخال ثلاثة سجلات في جدول DEPARTMENT:
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (1, 'IT Billing', 1); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (2, 'Engineering', 2); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (3, 'Finance', 7);
في هذه الحالة، تسجيلات جدول DEPARTMENT تكون كالتالي:
id | dept | emp_id ----+-------------+-------- 1 | IT Billing | 1 2 | Engineering | 2 3 | Finance | 7
ربط التقاطع (CROSS JOIN) يقوم بمطابقة كل سطر في الجدول الأول مع كل سطر في الجدول الثاني. إذا كان لديك x سطرًا في الجدول الأول و y سطرًا في الجدول الثاني، فإن جدول النتائج سيكون يحتوي على x*y سطرًا.
بما أن ربط التقاطع (CROSS JOIN) قد ينتج جدولاً كبيرًا جدًا، يجب استخدامه بحذر، فقط في الأوقات المناسبة.
إليك بنية اللغة الأساسية لـ CROSS JOIN:
SELECT ... FROM table1 CROSS JOIN table2 ...
بناءً على الجدول أعلاه، يمكننا كتابة ربط متقاطع (CROSS JOIN) كالتالي:
w3codeboxdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
حصلت النتائج التالية:
w3codeboxdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT; emp_id | name | dept --------+-------+-------------------- 1 | Paul | IT Billing 1 | Allen | IT Billing 1 | Teddy | IT Billing 1 | Mark | IT Billing 1 | David | IT Billing 1 | Kim | IT Billing 1 | James | IT Billing 1 | Paul | IT Billing 1 | James | IT Billing 1 | James | IT Billing 2 | Paul | Engineering 2 | Allen | Engineering 2 | Teddy | Engineering 2 | Mark | Engineering 2 | David | Engineering 2 | Kim | Engineering 2 | James | Engineering 2 | Paul | Engineering 2 | James | Engineering 2 | James | Engineering 7 | Paul | Finance
الربط الداخلي (INNER JOIN) يدمج بين عمودي جدولين (table1 و table2) بناءً على قواعد الاتصال لإنشاء جدول جديد للنتائج. سيقوم الاستعلام بمقارنة كل سطر في table1 مع كل سطر في table2 ليجد كل زوج من السطور التي تفي بمعيار الاتصال.
عندما يتم استيفاء شرط الاتصال، يتم دمج قيم الأعمدة في كل مجموعة التطابق بين A و B في سطر نتيجة واحد.
الارتباط الداخلي (INNER JOIN) هو نوع الاتصال الأكثر شيوعًا، وهو النوع المبدئي.
كلمة INNER اختيارية.
هذا هو جدول الجملة للارتباط الداخلي (INNER JOIN):
SELECT table1.column1, table2.column2... FROM table1 INNER JOIN table2 ON table1.common_filed = table2.common_field;
بناءً على الجدول السابق، يمكننا كتابة ارتباط داخلي، كالتالي:
w3codeboxdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID; emp_id | name | dept --------+-------+-------------- 1 | Paul | IT Billing 2 | Allen | Engineering 7 | James | Finance (3 rows)
الارتباط الخارجي هو توسيع للارتباط الداخلي. يحدد معيار SQL ثلاثة أنواع من الاتصالات الخارجية: LEFT، RIGHT و FULL، يدعم PostgreSQL جميع هذه الأنواع.
بالنسبة للارتباط الخارجي يسار، أولاً يتم تنفيذ ارتباط داخلي. ثم، لكل سطر في جدول T1 الذي لا يوافق شرط الاتصال في جدول T2، حيث يمكن أن تكون هناك قيم null في أعمدة جدول T2، يتم إضافة سطر اتصال. لذلك، على الأقل سطر واحد في الجدول المتصل في T1.
هذا هو الجدول الأساسي للارتباط الخارجي يسار (LEFT OUTER JOIN):
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
بناءً على الجدولين السابقين، يمكننا كتابة ارتباط خارجي يسار، كالتالي:
w3codeboxdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID; emp_id | name | dept --------+-------+---------------- 1 | Paul | IT Billing 2 | Allen | Engineering 7 | James | Finance | James | | David | | Paul | | Kim | | Mark | | Teddy | | James | (10 rows)
أولاً، يتم تنفيذ الاتصال الداخلي. ثم، لكل سطر في الجدول T2 الذي لا يوافق أي سطر في الجدول T1 لاتصال، إذا كانت هناك قيم null في أعمدة T1، يتم إضافة سطر إلى النتيجة. هذا عكس الاتصال اليسرى؛ للجدول T2، دائمًا ما يكون هناك سطر في جدول النتيجة.]}
هذه هي قواعد اللغة الأساسية للاتصال الخارجي يمين (RIGHT OUT JOIN):
SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...
باستخدام هذين الجدولين، يمكننا إنشاء اتصال خارجي يمين:
w3codeboxdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID; emp_id | name | dept --------+-------+----------------- 1 | Paul | IT Billing 2 | Allen | Engineering 7 | James | Finance (3 rows)
أولاً، يتم تنفيذ الاتصال الداخلي. ثم، لكل سطر في الجدول T1 الذي لا يوافق أي سطر في الجدول T2 لاتصال، إذا كانت هناك قيم null في أعمدة T2، يتم إضافة سطر إلى النتيجة. بالإضافة إلى ذلك، لكل سطر في T2 الذي لا يوافق أي سطر في T1 لاتصال، يتم إضافة سطر يحتوي على قيم null في أعمدة T1 إلى النتيجة.
هذه هي قواعد اللغة الأساسية للاتصال الخارجي:
SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...
باستخدام هذين الجدولين، يمكننا إنشاء اتصال خارجي:
w3codeboxdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID; emp_id | name | dept --------+-------+----------------- 1 | Paul | IT Billing 2 | Allen | Engineering 7 | James | Finance | James | | David | | Paul | | Kim | | Mark | | Teddy | | James | (10 rows)