25 / 100

RIGHT JOIN

Jadvallarni o'ngdan birlashtirish

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


PostgreSQL RIGHT JOIN bandiga kirish

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:

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

Ushbu sintaksisda:

  • Birinchi, FROM bandida chap jadval nomini (left_table) bering:
query.sql
FROM left_table
  • Ikkinchi, RIGHT JOIN bandida chap jadval bilan birlashtiriladigan o'ng jadval nomini (right_table) ko'rsating:
query.sql
RIGHT JOIN right_table
  • Uchinchi, ON bandida o'ng jadval (right_table) qatorlarini chap jadval (left_table) qatorlari bilan moslashtirish shartini yozing:
query.sql
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:

  1. Chap jadval ustunlariga ega soxta qator yaratadi.
  2. Barcha bu ustunlarni NULL bilan to'ldiradi.
  3. Soxta qatorni o'ng jadvaldagi qator bilan birlashtiradi.

Nihoyat, SELECT bandida ko'rsatilgan ustunlarni qaytaradi:

query.sql
SELECT
  left_table.column1,
  right_table.column2,
  ...

PostgreSQL Right Join qanday ishlashini tushunish

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

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:

PostgreSQL right join visualization

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

PostgreSQL right join Venn diagram


PostgreSQL RIGHT JOIN bandiga misol

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

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

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

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 products jadvalini, RIGHT JOIN bandi esa brands jadvalini oladi. Birlashmada brands jadvali o'ng jadval hisoblanadi.
  2. Ikkinchi, 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.
  3. Uchinchi, SELECT so'rovida ko'rsatilgan ustunlar qaytariladi.

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
  products p
  RIGHT JOIN brands b ON b.brand_id = p.brand_id;

PostgreSQL RIGHT 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
  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:

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

Xulosa

  • Ikkita jadvaldagi qatorlarni birlashtirish va o'ng jadvaldagi barcha qatorlarni chap jadvaldagi mos keluvchi qatorlar bilan birga olish uchun RIGHT JOIN bandidan foydalaning.
  • Ikkala jadvalda ham bir xil nomli ustunlar bo'yicha tenglik shartida birlashtirish uchun ixcham USING sintaksisidan foydalaning.
QBilimingizni sinab ko'ring
1 / 5

1. RIGHT JOIN qaysi jadvaldagi barcha qatorlarni natijaga kiritishni kafolatlaydi?