27 / 100

FULL JOIN

Jadvallarni to'liq birlashtirish

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


PostgreSQL FULL JOIN buyrug'iga kirish

FULL JOIN ikkita jadvaldagi qatorlarni birlashtiradi va ikkala jadvaldagi barcha qatorlarni qaytaradi. Bundan tashqari, FULL JOIN boshqa jadvalda mos qatori bo'lmagan jadvalning har bir ustuni uchun NULL qiymatlaridan foydalanadi. Boshqacha qilib aytganda, FULL JOIN LEFT JOIN va RIGHT JOIN natijalar to'plamini o'zida birlashtiradi.

Mana FULL JOIN sintaksisi:

query.sql
SELECT
  table1.column1,
  table2.column2,
  ...
FROM
  table1
  FULL JOIN table2 ON table2.column1 = table1.column1;

Ushbu sintaksisda:

  • Birinchi, FROM bandida birinchi jadval nomini (table1) ko'rsating.
  • Ikkinchi, FULL JOIN bandida to'liq birlashtirmoqchi bo'lgan ikkinchi jadval nomini (table2) bering.
  • Uchinchi, ON bandida ikkala jadvaldagi qatorlarni moslashtirish shartini yozing. Bu shart table1 dagi column1 qiymatlarini table2 dagi column1 qiymatlari bilan solishtiradi.
  • Nihoyat, SELECT bandida ma'lumot olmoqchi bo'lgan ustunlarni ko'rsating.

FULL OUTER JOIN — FULL JOIN ning muqobil to'liq sintaksisidir:

query.sql
SELECT
  table1.column1,
  table2.column2,
  ...
FROM
  table1
  FULL OUTER JOIN table2 ON table2.column1 = table1.column1;

E'tibor bering, OUTER kalit so'zi ixtiyoriy (optional) bo'lib, uni tushirib qoldirish mumkin.

PostgreSQL FULL JOIN qanday ishlaydi:

  1. Birinchi, FROM bandi table1 jadvalidagi barcha qatorlarni oladi.
  2. Ikkinchi, FULL JOIN ikkala jadvaldagi column1 qiymatlarini solishtirish orqali table1 dagi har bir qatorni table2 dagi har bir qator bilan moslashtiradi. Agar ular mos kelsa, FULL JOIN ikkala qatorni bitta qatorga birlashtiradi. Aks holda, u moslik topilmagan jadval ustunlariga NULL qiymatlarini qo'yib, boshqa jadvaldagi qator bilan birlashtiradi.
  3. Uchinchi, SELECT bandida ko'rsatilgan ustunlarni o'z ichiga olgan natijalar to'plami qaytariladi.

PostgreSQL Full Join qanday ishlashini tushunish

Aytaylik, siz to'liq birlashtirish (full 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 jadvaliY jadvali
x tabley table

To'liq tashqi birlashtirish qatorlar boshqa jadvalda mos qatorga ega bo'lishidan qat'i nazar, ikkala jadvaldagi barcha qatorlarni o'z ichiga olgan natija to'plamini qaytaradi. U boshqa jadvalda mos qatori bo'lmagan qatorlar ustunlarini NULL bilan to'ldiradi:

PostgreSQL full join visualization

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

PostgreSQL full outer join Venn diagram


Namunaviy jadvallarni tayyorlash

Birinchi, brands jadvalini yarating:

query.sql
CREATE TABLE brands (
  brand_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR(255) NOT NULL
);

Ikkinchi, brands jadvaliga uchta qator kiriting:

query.sql
INSERT INTO
  brands (name)
VALUES
  ('Apple'),
  ('Samsung'),
  ('Google') 
RETURNING *;

Natija:

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

Uchinchi, products jadvalini yarating:

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

Nihoyat, products jadvaliga to'rtta qator kiriting:

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

Natija:

query.sql
 product_id |       name       |  price  | brand_id 
------------+------------------+---------+----------
          1 | iPhone 14 Pro    |  999.99 |        1
          2 | iPhone 15 Pro    | 1199.99 |        1
          3 | Galaxy S23 Ultra | 1149.47 |        2
          4 | Oppo Find Flip   |  499.99 |     NULL

PostgreSQL FULL JOIN amaliy misoli

Quyidagi so'rov products va brands jadvallaridagi qatorlarni birlashtirish uchun FULL JOIN dan foydalanadi:

query.sql
SELECT
  p.name AS product_name,
  p.price,
  b.name AS brand_name
FROM
  products p
  FULL JOIN brands b ON b.brand_id = p.brand_id;

Natija:

query.sql
   product_name   |  price  | brand_name 
------------------+---------+------------
 iPhone 14 Pro    |  999.99 | Apple
 iPhone 15 Pro    | 1199.99 | Apple
 Galaxy S23 Ultra | 1149.47 | Samsung
 Oppo Find Flip   |  499.99 | NULL
 NULL             |    NULL | Google

Bu qanday ishlaydi:

  1. Birinchi, FROM bandi products jadvalidan barcha qatorlarni oladi.
  2. Ikkinchi, FULL JOIN bandi products jadvalidagi har bir qatorni brand_id ustunidagi qiymatlarni solishtirish orqali brands jadvalidagi har bir qator bilan moslashtiradi:
    • product_id = 1 bo'lgan mahsulot brands jadvalidagi brand_id = 1 (Apple) qatori bilan mos keladi.
    • product_id = 2 bo'lgan mahsulot brands jadvalidagi brand_id = 1 (Apple) qatori bilan mos keladi.
    • product_id = 3 bo'lgan mahsulot brands jadvalidagi brand_id = 2 (Samsung) qatori bilan mos keladi.
    • product_id = 4 bo'lgan mahsulot (Oppo Find Flip) brands jadvalida hech qanday mos qatorga ega emas (brand_id si NULL), shuning uchun brands jadvali ustunlari NULL bilan to'ldiriladi.
    • brand_id = 3 bo'lgan brend (Google) products jadvalida hech qanday mos mahsulotga ega emas, shuning uchun products jadvalining ustunlari NULL bilan to'ldiriladi.
  3. Uchinchi, SELECT bandida ko'rsatilgan ustunlar berilgan taxalluslar bilan natijada qaytariladi.

Xulosa

  • Ikkita jadvaldagi qatorlarni to'liq birlashtirish va mos kelgan hamda mos kelmagan barcha qatorlarni olish uchun PostgreSQL FULL JOIN dan foydalaning.
  • FULL OUTER JOIN — FULL JOIN ning muqobil sintaksisidir.
QBilimingizni sinab ko'ring
1 / 5

1. FULL JOIN qanday qatorlarni natijalar to'plamiga kiritadi?