24 / 100

LEFT JOIN

Jadvallarni chapdan birlashtirish

Kirish: ushbu darsda siz ikkita jadval qatorlarini birlashtirish uchun PostgreSQL LEFT JOIN bandidan qanday foydalanishni o'rganasiz.


PostgreSQL LEFT JOIN bandiga kirish

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:

query.sql
SELECT
  left_table.column1,
  right_table.column2,
  ...
FROM
  left_table
  LEFT JOIN right_table ON right_table.column1 = left_table.column1;

Ushbu sintaksisda:

  • Birinchi, FROM bandida chap jadval nomini (left_table) ko'rsating:
query.sql
FROM left_table
  • Ikkinchi, LEFT JOIN bandida chap jadval bilan birlashtiriladigan o'ng jadval nomini (right_table) bering:
query.sql
LEFT JOIN right_table
  • Uchinchi, ON bandida chap jadval (left_table) qatorlarini o'ng jadval (right_table) qatorlari bilan moslashtirish shartini yozing:
query.sql
ON left_table.column1 = right_table.column1;

Ushbu shart chap jadvaldagi column1 qiymatlarini o'ng jadvaldagi column1 qiymatlari bilan solishtirish orqali qatorlarni moslashtiradi:

query.sql
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:

  1. O'ng jadval ustunlariga ega "soxta" qator hosil qiladi.
  2. O'ng jadvalga tegishli barcha ustunlarni NULL bilan to'ldiradi.
  3. Ushbu soxta qatorni chap jadvaldagi qator bilan birlashtiradi.

Nihoyat, SELECT bandida ko'rsatilgan ustunlarni qaytaradi:

query.sql
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.


PostgreSQL Left Join qanday ishlashini tushunish

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)
PostgreSQL left join: Left TablePostgreSQL left join: Right Table

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:

PostgreSQL left join visualization

Quyidagi Venn diagrammasi left join qanday ishlashini tasvirlashning yana bir usulidir:

PostgreSQL left join Venn diagram


PostgreSQL LEFT JOIN bandiga misol

Keling, LEFT JOIN bandidan foydalanish misolini ko'rib chiqamiz.

Namunaviy jadvallarni tayyorlash

Aytaylik, bizda brands va products degan ikkita jadval mavjud:

query.sql
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:

query.sql
 brand_id |  name   
----------+---------
        1 | Apple
        2 | Samsung
        3 | Google

products jadvali:

query.sql
 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

Jadvallarni LEFT JOIN bandi yordamida birlashtirish

Quyidagi so'rov brands jadvalidagi barcha qatorlarni va products jadvalidagi mos kelgan qatorlarni tanlab olish uchun LEFT JOIN bandidan foydalanadi:

query.sql
SELECT
  brands.name brand_name,
  products.name product_name,
  products.price
FROM
  brands
  LEFT JOIN products ON products.brand_id = brands.brand_id;

Natija:

query.sql
 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

Bu qanday ishlaydi:

  1. Birinchi, FROM bandi brands jadvalidagi har bir qatorni ko'rib chiqadi.
  2. Ikkinchi, 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:
query.sql
 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
  1. Uchinchi, SELECT so'rovida ko'rsatilgan ustunlar qaytariladi va ularga ustun taxalluslari beriladi.

Jadvallarni jadval taxalluslari (table aliases) yordamida birlashtirish

Jadval taxallusi — bu so'rov bajarilishi davomida jadvalga beriladigan vaqtinchalik nomdir. Quyidagi so'rovda brands va products jadvallari uchun jadval taxalluslari ishlatilgan:

query.sql
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;

PostgreSQL LEFT JOIN bandi va USING sintaksisi

Bir xil nomli ustunlar qiymatlarini tenglik (=) operatori orqali solishtirib ikkita jadvalni birlashtirganda, USING bandi sintaksisidan foydalanishingiz mumkin:

query.sql
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:

query.sql
SELECT
  b.name brand_name,
  p.name product_name,
  p.price
FROM
  brands b
  LEFT JOIN products p USING (brand_id);

Xulosa

  • Ikkita jadvaldagi qatorlarni birlashtirish hamda chap jadvaldagi barcha qatorlarni o'ng jadvaldagi mos keluvchi qatorlar bilan birga olish uchun LEFT JOIN bandidan foydalaning.
  • Mos kelmay qolgan o'ng jadval ustunlari natijada NULL qiymati bilan to'ldiriladi.
  • Chapdan birlashtirishda ustun nomlari bir xil bo'lsa va tenglik sharti ishlatilsa, ixchamroq USING sintaksisidan foydalaning.
QBilimingizni sinab ko'ring
1 / 5

1. LEFT JOIN da chap jadvaldagi qatorga o'ng jadvalda mos qator topilmasa nima sodir bo'ladi?