Jadvallarni o'ngdan birlashtirish
Kirish: ushbu darsda siz ikkita jadval qatorlarini birlashtirish uchun PostgreSQL RIGHT JOIN bandidan qanday foydalanishni o'rganasiz.
RIGHT JOIN bandi ikkita jadvaldagi qatorlarni birlashtirish va o'ng jadvaldagi barcha qatorlarni hamda chap jadvaldagi mos keluvchi qatorlarni qaytarish imkonini beradi.
Mana RIGHT JOIN bandining sintaksisi:
SELECT
left_table.column1,
right_table.column2,
...
FROM
left_table
RIGHT JOIN right_table ON right_table.column1 = left_table.column1;
Ushbu sintaksisda:
FROM bandida chap jadval nomini (left_table) bering:FROM left_table
RIGHT JOIN bandida chap jadval bilan birlashtiriladigan o'ng jadval nomini (right_table) ko'rsating:RIGHT JOIN right_table
ON bandida o'ng jadval (right_table) qatorlarini chap jadval (left_table) qatorlari bilan moslashtirish shartini yozing:ON right_table.column1 = left_table.column1;
Ushbu shart o'ng jadvaldagi (right_table) column1 qiymatlarini chap jadvaldagi (left_table) column1 qiymatlari bilan solishtirish orqali qatorlarni moslashtiradi.
PostgreSQL har doim o'ng jadvaldagi qatorni va chap jadvaldagi mos kelgan qatorni natijaga kiritadi. Mos kelish degani ikkala jadval qatorlari column1 ustunida bir xil qiymatga ega ekanligini anglatadi.
Agar o'ng jadvaldagi qatorga chap jadvalda mos qator topilmasa, PostgreSQL quyidagilarni bajaradi:
NULL bilan to'ldiradi.Nihoyat, SELECT bandida ko'rsatilgan ustunlarni qaytaradi:
SELECT
left_table.column1,
right_table.column2,
...
Aytaylik, siz o'ngdan birlashtirish (right join) yordamida X va Y jadvallaridagi qatorlarni birlashtirmoqchisiz:
X jadvalida ikkita ustun mavjud: id (kalit) va x.Y jadvalida ham ikkita ustun mavjud: id (kalit) va y.| X jadvali (Chap) | Y jadvali (O'ng) |
|---|---|
O'ngdan birlashtirish o'ng jadvaldagi (Y) barcha qatorlarni va chap jadvaldagi (X) mos keluvchi qatorlarni o'z ichiga oladi. Agar o'ng jadvaldagi qator chap jadvalda (X) mos keluvchi qatorga ega bo'lmasa, o'ngdan birlashtirish chap jadval (X) ustunlari uchun NULL qiymatidan foydalanadi:
Quyidagi Venn diagrammasi right join qanday ishlashini tasvirlashning yana bir usulidir:
Aytaylik, bizda brands va products degan ikkita jadval mavjud:
CREATE TABLE brands (
brand_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
CREATE TABLE products (
product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
brand_id INT,
FOREIGN KEY (brand_id) REFERENCES brands (brand_id)
);
INSERT INTO
brands (name)
VALUES
('Apple'),
('Samsung'),
('Google')
RETURNING *;
INSERT INTO
products (name, price, brand_id)
VALUES
('iPhone 14 Pro', 999.99, 1),
('iPhone 15 Pro', 1199.99, 1),
('Galaxy S23 Ultra', 1149.47, 2),
('Oppo Find Flip', 499.99, NULL)
RETURNING *;
products jadvalida brands jadvalining brand_id asosiy kalit ustuniga havola qiluvchi brand_id tashqi kalit ustuni mavjud.
brands jadvali:
brand_id | name
----------+---------
1 | Apple
2 | Samsung
3 | Google
products jadvali:
product_id | name | price | brand_id
------------+------------------+---------+----------
1 | iPhone 14 Pro | 999.99 | 1
2 | iPhone 15 Pro | 1299.99 | 1
3 | Galaxy S23 Ultra | 1149.47 | 2
4 | Oppo Find Flip | 499.99 | NULL
Quyidagi so'rov brands jadvalidagi barcha qatorlarni va products jadvalidagi mos qatorlarni tanlab olish uchun RIGHT JOIN bandidan foydalanadi:
SELECT
brands.name AS brand_name,
products.name AS product_name,
products.price
FROM
products
RIGHT JOIN brands ON brands.brand_id = products.brand_id;
Natija:
brand_name | product_name | price
------------+------------------+---------
Apple | iPhone 14 Pro | 999.99
Apple | iPhone 15 Pro | 1199.99
Samsung | Galaxy S23 Ultra | 1149.47
Google | NULL | NULL
FROM bandi products jadvalini, RIGHT JOIN bandi esa brands jadvalini oladi. Birlashmada brands jadvali o'ng jadval hisoblanadi.RIGHT JOIN bandi brands jadvalidagi har bir qatorning brand_id ustunini products jadvalidagi har bir qatorning brand_id ustuni bilan solishtiradi.
id = 1 bo'lgan brend (Apple) products jadvalidagi ikkita qatorga mos keladi.id = 2 bo'lgan brend (Samsung) products jadvalidagi bitta qatorga mos keladi.id = 3 bo'lgan brend (Google) products jadvalidagi hech qanday qatorga mos kelmaydi. PostgreSQL products jadvaliga mos ustunlar uchun NULL qiymatlari bo'lgan soxta qator hosil qiladi va uni brands jadvalidagi qator bilan birlashtiradi.SELECT so'rovida ko'rsatilgan ustunlar qaytariladi.Jadval taxallusi — bu so'rov bajarilishi davomida jadvalga beriladigan vaqtinchalik nomdir. Quyidagi so'rovda brands va products jadvallari uchun jadval taxalluslari ishlatilgan:
SELECT
b.name AS brand_name,
p.name AS product_name,
p.price
FROM
products p
RIGHT JOIN brands b ON b.brand_id = p.brand_id;
Bir xil nomli ustunlar qiymatlarini tenglik (=) operatori orqali solishtirib ikkita jadvalni birlashtirganda, USING bandi sintaksisidan foydalanishingiz mumkin:
SELECT
left_table.column1,
right_table.column2
FROM
left_table
RIGHT JOIN right_table USING (column1);
Ushbu so'rovda biz RIGHT JOIN dagi ON bandi o'rniga USING bandidan foydalanamiz.
Quyidagi misolda USING sintaksisi bilan RIGHT JOIN bandi orqali products jadvali brands jadvali bilan birlashtiriladi:
SELECT
b.name AS brand_name,
p.name AS product_name,
p.price
FROM
products p
RIGHT JOIN brands b USING (brand_id);
RIGHT JOIN bandidan foydalaning.USING sintaksisidan foydalaning.