Jadvallarni chapdan birlashtirish
Kirish: ushbu darsda siz ikkita jadval qatorlarini birlashtirish uchun PostgreSQL LEFT JOIN bandidan qanday foydalanishni o'rganasiz.
LEFT JOIN — SELECT so'rovining ixtiyoriy bandlaridan biridir. LEFT JOIN bandi ikkita jadvaldagi qatorlarni birlashtiradi va chap jadvaldagi barcha qatorlarni hamda o'ng jadvaldagi mos keluvchi qatorlarni qaytaradi.
Mana LEFT JOIN bandining sintaksisi:
SELECT
left_table.column1,
right_table.column2,
...
FROM
left_table
LEFT JOIN right_table ON right_table.column1 = left_table.column1;
Ushbu sintaksisda:
FROM bandida chap jadval nomini (left_table) ko'rsating:FROM left_table
LEFT JOIN bandida chap jadval bilan birlashtiriladigan o'ng jadval nomini (right_table) bering:LEFT JOIN right_table
ON bandida chap jadval (left_table) qatorlarini o'ng jadval (right_table) qatorlari bilan moslashtirish shartini yozing:ON left_table.column1 = right_table.column1;
Ushbu shart chap jadvaldagi column1 qiymatlarini o'ng jadvaldagi column1 qiymatlari bilan solishtirish orqali qatorlarni moslashtiradi:
right_table.column1 = left_table.column1;
PostgreSQL har doim chap jadvaldagi qatorni o'ng jadvaldagi mos kelgan qator bilan birga natijaga kiritadi. Agar chap jadvaldagi qatorga o'ng jadvalda mos keluvchi hech qanday qator topilmasa, PostgreSQL quyidagilarni bajaradi:
NULL bilan to'ldiradi.Nihoyat, SELECT bandida ko'rsatilgan ustunlarni qaytaradi:
SELECT
left_table.column1,
right_table.column2,
...
E'tibor bering, FROM bandida ko'rsatilgan jadval chap jadval (left table), LEFT JOIN bandida ko'rsatilgan jadval esa o'ng jadval (right table) hisoblanadi.
Aytaylik, siz chapdan birlashtirish (left 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) |
|---|---|
Chapdan birlashtirish chap jadvaldagi (X) barcha qatorlarni va o'ng jadvaldagi (Y) mos keluvchi qatorlarni o'z ichiga oladi; agar chap jadvaldagi qator o'ng jadvalda mos qatorga ega bo'lmasa, LEFT JOIN o'ng jadval (Y) ustunlari uchun NULL qiymatini ishlatadi:
Quyidagi Venn diagrammasi left join qanday ishlashini tasvirlashning yana bir usulidir:
Keling, LEFT JOIN bandidan foydalanish misolini ko'rib chiqamiz.
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 kelgan qatorlarni tanlab olish uchun LEFT JOIN bandidan foydalanadi:
SELECT
brands.name brand_name,
products.name product_name,
products.price
FROM
brands
LEFT JOIN products ON products.brand_id = brands.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 brands jadvalidagi har bir qatorni ko'rib chiqadi.LEFT JOIN bandi brands jadvalidagi har bir qatorning brand_id ustunidagi qiymatlarini products jadvalidagi har bir qatorning brand_id ustunidagi qiymatlari bilan solishtiradi. Agar ular teng bo'lsa, PostgreSQL ikkala jadvaldan qatorlarni birlashtiradi. Agar ular teng bo'lmasa, PostgreSQL chap jadvaldagi ustunlar va NULL bilan to'ldirilgan o'ng jadval ustunlari bilan yangi qator hosil qiladi.
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 jadvalidagi ustunlarga mos ravishda barcha ustunlari NULL bo'lgan soxta qator yaratadi va uni chap jadvaldagi qator bilan birlashtiradi: brand_id | name | product_id | name | price | brand_id
----------+---------+------------+------------------+---------+----------
1 | Apple | 1 | iPhone 14 Pro | 999.99 | 1
1 | Apple | 2 | iPhone 15 Pro | 1299.99 | 1
2 | Samsung | 3 | Galaxy S23 Ultra | 1149.47 | 2
3 | Google | NULL | NULL | NULL | NULL
SELECT so'rovida ko'rsatilgan ustunlar qaytariladi va ularga ustun taxalluslari beriladi.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
brands b
LEFT JOIN products p ON p.brand_id = b.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
LEFT JOIN right_table USING (column1);
Ushbu so'rovda biz LEFT JOIN dagi ON bandi o'rniga USING bandidan foydalanamiz.
Quyidagi misolda USING sintaksisi bilan LEFT JOIN bandi orqali brands jadvali products jadvali bilan birlashtiriladi:
SELECT
b.name brand_name,
p.name product_name,
p.price
FROM
brands b
LEFT JOIN products p USING (brand_id);
LEFT JOIN bandidan foydalaning.NULL qiymati bilan to'ldiriladi.USING sintaksisidan foydalaning.