Oracle SQL-də JOIN əməliyyatları (Birləşdirmələr)
-
Verilənlər bazasında məlumatlar adətən normalizasiya edilmiş, yəni müxtəlif cədvəllərdə saxlanılır. Bu cədvəlləri əlaqələndirmək üçün
JOIN
əməliyyatlarından istifadə olunur. Oracle SQL-də bir neçə növJOIN
mövcuddur və hər biri fərqli ehtiyaclara cavab verir.
1.
INNER JOIN
– Daxili birləşdirməINNER JOIN
iki və ya daha çox cədvəldə yalnız uyğun gələn (ortaq açar dəyəri olan) sətirləri birləşdirir. Nəzəri olaraq,inner join
SQL sorğusu iki cədvəl arasında müqayisə edilən sətrlərin hamısının eyni dəyərlərə malik olması tələb olunur. Nəticədə, yalnız uyğunluq olan sətrləri nəticəyə əlavə edir.Nümunə üçün iki cədvəli düşünək:
Cədvəl 1: sifarişlər (
orders
)order_id customer_id goods_name order_date 101 1 Laptop 2024-05-01 102 1 Telefon 2024-05-03 103 2 Tablet 2024-05-02 104 3 Kamera 2024-05-04 105 3 Klaviatura 2024-05-05 Cədvəl 2: müştərilər (
customers
)customer_id name surname 1 Ali Məmmədov 2 Nigar Əliyeva 3 Cavid Məmmədli Bu iki cədvəli birləşdirmək üçün aşağıdakı SQL sorğusunu istifadə edə bilərik:
SELECT customers.name, customers.surname, orders.goods_name, orders.order_date FROM orders INNER JOIN customers ON customers.customer_id = orders.customer_id;
Bu sorğunun nəticəsi belə olacaq:
name surname goods_name order_date Ali Məmmədov Laptop 2024-05-01 Ali Məmmədov Telefon 2024-05-03 Nigar Əliyeva Tablet 2024-05-02 Cavid Məmmədli Kamera 2024-05-04 Cavid Məmmədli Klaviatura 2024-05-05 Bu sorğu “müştərilər” və “sifarişlər” cədvəllərini
customer_id
sütunu əsasında birləşdirir. Nəticədə, hər bir sifarişin hansı müştəri tərəfindən verildiyi və sifariş tarixi ilə birlikdə müştəri adını və soyadını göstərir.-- müştərilərilər cədvəlinin yaradılması CREATE TABLE customers ( customer_id NUMBER PRIMARY KEY, name VARCHAR2(50), surname VARCHAR2(50) ); -- müştərilər cədvəlinin doldurulması INSERT INTO customers (customer_id, name, surname) VALUES (1, 'Ali', 'Məmmədov'), (2, 'Nigar', 'Əliyeva'), (3, 'Cavid', 'Məmmədli'); -- sifarişlər cədvəlinin yaradılması CREATE TABLE orders ( order_id NUMBER PRIMARY KEY, customer_id NUMBER, goods_name VARCHAR2(100), order_date DATE, FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ); -- sifarişlər cədvəlinin doldurulması INSERT INTO orders (order_id, customer_id, goods_name, order_date) VALUES (101, 1, 'Laptop', DATE '2024-05-01'), (102, 1, 'Telefon', DATE '2024-05-03'), (103, 2, 'Tablet', DATE '2024-05-02'), (104, 3, 'Kamera', DATE '2024-05-04'), (105, 3, 'Klaviatura', DATE '2024-05-05');
2.
LEFT JOIN
– Sol birləşdirməLEFT JOIN
sol cədvəldəki bütün sətirləri, sağ cədvəldə isə yalnız uyğun gələnləri birləşdirir. Əgər sağ tərəfdə uyğun sətir yoxdursa, həmin sütunlardaNULL
göstərilir.İki cədvəl nümunəsi:
employees
cədvəli:employee_id name department_id 1 John Smith 10 2 Jane Doe NULL 3 Emily Davis 20 4 Michael Brown 30 departments
cədvəli:department_id department_name 10 IT 20 HR 30 Finance SELECT employees.employee_id, employees.name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.department_id;
Bu sorğunun nəticəsi belə olacaq:
employee_id name department_name 1 John Smith IT 2 Jane Doe NULL
3 Emily Davis HR 4 Michael Brown Finance CREATE TABLE departments ( department_id NUMBER PRIMARY KEY, department_name VARCHAR2(100) ); INSERT INTO departments (department_id, department_name) VALUES (10, 'IT'), (20, 'HR'), (30, 'Finance'); CREATE TABLE employees ( employee_id NUMBER PRIMARY KEY, name VARCHAR2(100), department_id NUMBER, FOREIGN KEY (department_id) REFERENCES departments(department_id) ); INSERT INTO employees (employee_id, name, department_id) VALUES (1, 'John Smith', 10), (2, 'Jane Doe', NULL), (3, 'Emily Davis', 20), (4, 'Michael Brown', 30);
3.
RIGHT JOIN
– Sağ birləşdirməRIGHT JOIN
sağ cədvəldəki bütün sətirləri, sol cədvəldə isə uyğun gələnləri birləşdirir. Əgər sol cədvəldə uyğun gələn sətir yoxdursa, onda nəticə dəstində sol cədvəldəki sütunlar üçünNULL
dəyərləri olacaq.Bir nümunə ilə izah edək. İki cədvəlimiz var:
Orders
(Sifarişlər)Customers
(Müştərilər)
Orders
cədvəli:OrderID CustomerID OrderDate 1 1001 2023-01-15 2 1002 2023-02-20 3 1003 2023-03-12 Customers
cədvəli:CustomerID CustomerName 1001 Ali 1002 Ayşe 1004 Mehmet RIGHT JOIN
sorğusu iləOrders
vəCustomers
cədvəllərini birləşdirək:SELECT Orders.OrderID, Orders.OrderDate, Customers.CustomerName FROM Orders RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
Bu sorğunun nəticəsi belə olacaq:
OrderID OrderDate CustomerName 1 2023-01-15 Ali 2 2023-02-20 Ayşe NULL NULL Mehmet Göründüyü kimi,
Customers
cədvəlindəki bütün müştərilər nəticədə göstərilir, həttaOrders
cədvəlində uyğun gələn sifariş olmadıqda belə. Mehmet üçün sifariş məlumatı olmadığından, onun üçün
NULL
dəyərləri qaytarılır.CREATE TABLE customers ( CustomerID NUMBER PRIMARY KEY, CustomerName VARCHAR2(100) ); INSERT INTO customers (CustomerID, CustomerName) VALUES (1001, 'Ali'), (1002, 'Ayşe'), (1004, 'Mehmet'); CREATE TABLE orders ( OrderID NUMBER PRIMARY KEY, CustomerID NUMBER, OrderDate DATE ); INSERT INTO orders (OrderID, CustomerID, OrderDate) VALUES (1, 1001, TO_DATE('2023-01-15', 'YYYY-MM-DD')), (2, 1002, TO_DATE('2023-02-20', 'YYYY-MM-DD')), (3, 1003, TO_DATE('2023-03-12', 'YYYY-MM-DD'));
4.
FULL OUTER JOIN
– Tam birləşdirməBu
JOIN
həm sol, həm də sağ cədvəldəki bütün sətirləri qaytarır. Uyğun gəlməyənlər üçünNULL
istifadə olunur.Nümunə:
SELECT employees.name, departments.name FROM employees FULL OUTER JOIN departments ON employees.dept_id = departments.id;
5.
CROSS JOIN
– Çarpaz birləşdirməCROSS JOIN
hər bir sətiri digər cədvəldəki bütün sətirlərlə birləşdirir. Bu zaman kartesian hasil yaranır.Nümunə:
SELECT A.name, B.name FROM tableA A CROSS JOIN tableB B;
Əgər
tableA
3 sətir,tableB
2 sətirdirsə, nəticə 6 sətirdən ibarət olacaq (3 × 2).
Alternativ JOIN Sintaksisi
Oracle-da daha əvvəlki dövrlərdə istifadə olunan sintaksis belə idi:
SELECT e.name, d.name FROM employees e, departments d WHERE e.dept_id = d.id;
Bu yazılış
INNER JOIN
-in qısa formasıdır. Amma müasir SQL-də açıq şəkildəJOIN
yazmaq daha oxunaqlı və texniki cəhətdən üstün sayılır.
Nəticə
JOIN Növü İzahı INNER JOIN
Hər iki cədvəldə uyğun olan sətirləri qaytarır LEFT JOIN
Sol cədvəldə olan bütün sətirləri, uyğun olanları sağdan RIGHT JOIN
Sağ cədvəldə olan bütün sətirləri, uyğun olanları soldan FULL OUTER JOIN
Hər iki cədvəldə olan bütün sətirləri qaytarır CROSS JOIN
Bütün mümkün birləşmələri (kartesian hasil) qaytarır
Bilik paylaşdıqca artan bir sərvətdir