23 / 100

INNER JOIN

Jadvallarni ichki birlashtirish

Kirish: ushbu darsda siz ikkita jadvaldagi qatorlarni birlashtirish va faqat mos keluvchi qatorlarni tanlab olish uchun PostgreSQL INNER JOIN bandidan qanday foydalanishni o'rganasiz.


PostgreSQL INNER JOIN bandiga kirish

PostgreSQLda ma'lumotlar bazasi bir-biri bilan bog'langan bir nechta jadvallardan tashkil topadi. Ular o'zaro tashqi kalitlar (foreign keys) orqali bog'lanadi. Ikki yoki undan ortiq jadvallardan ma'lumotlarni tanlab olish uchun SELECT so'rovining INNER JOIN bandidan foydalanasiz.

Mana INNER JOIN bandining sintaksisi:

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

Ushbu sintaksisda:

  • Birinchi, FROM bandida birinchi jadval nomini (table1) ko'rsating.
  • Ikkinchi, INNER JOIN bandida birinchi jadval qatorlari bilan birlashtirmoqchi bo'lgan ikkinchi jadval nomini (table2) bering.
  • Uchinchi, ON bandida birinchi jadval (table1) qatorlarini ikkinchi jadval (table2) qatorlari bilan moslashtirish shartini ko'rsating. Bu shart table1 dagi column1 qiymatlarini table2 dagi column1 qiymatlari bilan solishtirish orqali ikkala jadvaldagi qatorlarni moslashtiradi. E'tibor bering, shartda boshqa taqqoslash operatorlaridan ham foydalanish mumkin. Agar bir nechta shartdan foydalanmoqchi bo'lsangiz, ON bandida ularni birlashtirish uchun AND mantiqiy operatoridan foydalanishingiz mumkin.
  • Nihoyat, SELECT bandida yakuniy natija to'plamiga kiritilishi kerak bo'lgan ikkala jadval ustunlarini sanab o'ting.

PostgreSQL avval FROM bandini, keyin INNER JOIN bandini va nihoyat SELECT bandini baholaydi.

PostgreSQLda inner join quyidagicha ishlaydi:

  • Birinchi, INNER JOIN ikkala jadvaldagi column1 qiymatlarini solishtiradi.
  • Ikkinchi, agar ular teng bo'lsa, mos keluvchi qatorlarni oraliq jadvalga birlashtiradi.
  • Uchinchi, SELECT bandida ko'rsatilgan ustunlarni yakuniy natija to'plamiga tanlab oladi.

PostgreSQL Inner Join qanday ishlashini tushunish

Aytaylik, siz X va Y jadvallaridagi qatorlarni ichki birlashtirish (inner join) yordamida birlashtirmoqchisiz:

  • X jadvalida ikkita ustun mavjud: id (kalit) va x.
  • Y jadvalida ham ikkita ustun mavjud: id (kalit) va y.
X jadvaliY jadvali
PostgreSQL inner join: Left TablePostgreSQL inner join: Right Table

Inner join faqat id ustunlaridagi qiymatlari mos keladigan qatorlarni o'z ichiga oladi. U natijalar to'plamiga mos kelmaydigan qatorlarni kiritmaydi:

PostgreSQL inner join visualization

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

PostgreSQL inner join Venn diagram


PostgreSQL Inner Join amaliy misoli

Aytaylik, sizda ikkita jadval mavjud: products va brands.

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    | 1199.99 |        1
          3 | Galaxy S23 Ultra | 1149.47 |        2
          4 | Oppo Find Flip   |  499.99 |     NULL

Quyidagi so'rov products jadvalidan mahsulot nomi va narxini hamda brands jadvalidan brend nomini tanlab olish uchun INNER JOIN dan foydalanadi:

query.sql
SELECT
  products.name,
  products.price,
  brands.name
FROM
  products
  INNER JOIN brands ON brands.brand_id = products.brand_id;

Natija:

query.sql
       name       |  price  |  name   
------------------+---------+---------
 iPhone 14 Pro    |  999.99 | Apple
 iPhone 15 Pro    | 1199.99 | Apple
 Galaxy S23 Ultra | 1149.47 | Samsung

So'rov qanday ishlaydi:

  1. Birinchi, FROM bandi products jadvalidagi har bir qatorni ko'rib chiqadi.
  2. Ikkinchi, INNER JOIN bandi products jadvalidagi har bir qatorning brand_id sini brands jadvalidagi har bir qatorning brand_id si bilan solishtiradi. Ular bir xil brand_id ga ega bo'lgani sababli, so'rov ikkala qatorni birlashtiradi:
query.sql
 product_id |     name      |  price  | brand_id | brand_id |  name   
------------+---------------+---------+----------+----------+---------
          1 | iPhone 14 Pro |  999.99 |        1 |        1 | Apple
          2 | iPhone 15 Pro | 1199.99 |        1 |        1 | Apple
          3 | Galaxy S23... | 1149.47 |        2 |        2 | Samsung

Batafsilroq:

  • products jadvalidagi 1 va 2 identifikatorli qatorlar brands jadvalidagi 1 identifikatorli qatorga mos keladi.
  • products jadvalidagi 3 identifikatorli qator brands jadvalidagi 2 identifikatorli qatorga mos keladi.
  • products jadvalidagi 4 identifikatorli qator (brand_id si NULL) brands jadvalidagi hech qaysi qatorga mos kelmaydi.
  1. Uchinchi, SELECT bandi products jadvalidan name va price ustunlarini hamda brands jadvalidan name ustunini tanlab oladi.

Ustun nomlarini aniqlashtirish (Qualifying column names)

products va brands jadvallarining ikkalasida ham bir xil nomli name ustuni bo'lgani sababli, ularga murojaat qilishda quyidagi sintaksisdan foydalanishimiz shart:

query.sql
table_name.column_name

Agar shunday qilmasak, PostgreSQL noaniqlik xatoligini (ambiguous error) chiqaradi. Masalan:

query.sql
SELECT
  name,
  price,
  name
FROM
  products
  INNER JOIN brands ON brands.brand_id = products.brand_id;

Xatolik:

query.sql
ERROR: column reference "name" is ambiguous

Natijada ikkita bir xil nomli (name) ustun hosil bo'ladi; ularni tushunarliroq qilish uchun ustun taxalluslaridan (column aliases) foydalanishimiz mumkin:

query.sql
SELECT
  products.name AS product_name,
  products.price,
  brands.name AS brand_name
FROM
  products
  INNER JOIN brands ON brands.brand_id = products.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

Jadvallarni jadval taxalluslari (table aliases) bilan birlashtirish

Har bir ustun oldidan jadval nomini to'liq yozib chiqish noqulaylik tug'dirishi mumkin. PostgreSQL so'rovda vaqtinchalik jadval nomlaridan — jadval taxalluslari (table aliases) dan foydalanishni qo'llab-quvvatlaydi.

Ustun taxallusi kabi, so'rov bajarilish vaqtida jadvalga quyidagi sintaksis yordamida vaqtinchalik taxallus berishingiz mumkin:

query.sql
table_name AS table_alias

AS kalit so'zi ixtiyoriy bo'lgani uchun uni quyidagicha tushirib qoldirishingiz ham mumkin:

query.sql
table_name table_alias

Quyidagi so'rov jadval taxalluslaridan foydalanib products jadvalini brands jadvali bilan birlashtiradi:

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

Ushbu misolda biz products jadvali uchun p va brands jadvali uchun b taxalluslarini belgiladik. So'ngra ikkala jadval ustunlariga murojaat qilish uchun ushbu jadval taxallaridan foydalandik.


USING sintaksisi

Agar siz ikkita jadvalni bir xil nomli ustunlar qiymatlarini tenglik (=) operatori orqali solishtirib birlashtirayotgan bo'lsangiz, USING bandi sintaksisidan foydalanishingiz mumkin:

query.sql
SELECT table1.column1, table2.column2, ...
FROM table1
INNER JOIN table2 USING (column1);

Ushbu sintaksisda biz quyidagi ON bandini:

query.sql
ON table1.column1 = table2.column1

USING bandiga almashtiramiz:

query.sql
USING (column1)

Masalan, quyidagi so'rov USING bandidan foydalanib products jadvalini brands jadvali bilan birlashtiradi:

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

Ushbu so'rovda biz jadval taxalluslari uchun AS kalit so'zini ishlatmadik va ON bandi o'rniga USING (brand_id) bandidan foydalandik.


Xulosa

  • Bir nechta jadvallardagi qatorlarni birlashtirish va faqat mos keluvchi qatorlarni tanlab olish uchun INNER JOIN bandidan foydalaning.
  • Jadval taxalluslari (table aliases) — bu so'rov davomida ishlatiladigan vaqtinchalik jadval nomlaridir.
  • Ikkala jadvalda ustun nomlari bir xil bo'lganda so'rovni ixchamlashtirish uchun USING sintaksisidan foydalaning.
QBilimingizni sinab ko'ring
1 / 5

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