50 / 100

CORRELATED SUBQUERY

Bog'langan quyi so'rovlar

Kirish: Ushbu qo'llanmada siz PostgreSQL bog'langan quyi so'rovlaridan (correlated subquery) foydalanib, tashqi so'rovning har bir qatoriga bog'liq ma'lumotlarni tanlashni va ularni optimallashtirishni o'rganasiz.

PostgreSQL bog'langan quyi so'roviga kirish

Bog'langan quyi so'rov (correlated subquery) — bu o'zining shartida tashqi so'rov ustunlarining qiymatlaridan foydalanadigan ichki so'rovdir.

Mustaqil ravishda bir marta bajariladigan oddiy quyi so'rovlardan farqli o'laroq, bog'langan quyi so'rov tashqi so'rovdagi har bir qator uchun alohida qaytadan ishga tushiriladi.

Shu sababli, katta hajmdagi ma'lumotlar bilan ishlaganda so'rov tezligini oshirish uchun bog'langan quyi so'rovlar o'rniga JOIN yoki umumiy jadval ifodalaridan (CTE) foydalanish tavsiya etiladi.

Namunaviy jadval va ma'lumotlar

Ushbu mavzuni o'rganish uchun products nomli jadval yaratamiz:

query.sql
CREATE TABLE products (
  id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  price DEC(11, 2) NOT NULL CHECK (price > 0),
  brand VARCHAR(50) NOT NULL
);

INSERT INTO
  products (name, price, brand)
VALUES
  ('Galaxy S24', 799.99, 'Samsung'),
  ('iPhone 16', 1099.99, 'Apple'),
  ('iPhone 16 Pro Max', 1399.99, 'Apple'),
  ('iPhone 16 Plus', 1199.99, 'Apple'),
  ('Galaxy S24 Ultra', 1299.99, 'Samsung'),
  ('Galaxy S24 Plus', 1119.99, 'Samsung');

Bog'langan quyi so'rovga misol

Har bir brend bo'yicha eng qimmat mahsulotning nomi, brendi va narxini topish talab etilsin:

query.sql
SELECT
  name,
  brand,
  price
FROM
  products p1
WHERE
  price = (
    SELECT
      MAX(price)
    FROM
      products p2
    WHERE
      p2.brand = p1.brand
  );

Natija:

matn
       name        |  brand  |  price
-------------------+---------+---------
 iPhone 16 Pro Max | Apple   | 1399.99
 Galaxy S24 Ultra  | Samsung | 1299.99

So'rov qanday ishlaydi?

  1. Tashqi so'rov products jadvalidan (unga p1 deb nom beramiz) qatorlarni birma-bir o'qiydi.
  2. Har bir ko'rib chiqilayotgan qator uchun ichki so'rov ishga tushadi:
    query.sql
    SELECT MAX(price) FROM products p2 WHERE p2.brand = p1.brand
    
    Ichki so'rov tashqi qatorning brendiga (p1.brand) mos keluvchi maksimal narxni hisoblaydi.
  3. Tashqi so'rovning WHERE sharti joriy mahsulot narxi ushbu brendning maksimal narxiga teng yoki yo'qligini tekshiradi. Agar teng bo'lsa, qator yakuniy natijaga kiritiladi.

Bog'langan so'rovni JOIN yordamida optimallashtirish

Katta jadvallarda ichki so'rov minglab yoki millionlab marta takroriy bajarilishi mumkin. Buni oldini olish va tezlikni keskin oshirish uchun so'rovni JOIN yordamida qayta yozish mumkin:

query.sql
SELECT
  p1.name,
  p1.brand,
  p1.price
FROM
  products p1
  JOIN (
    SELECT
      brand,
      MAX(price) AS max_price
    FROM
      products
    GROUP BY
      brand
  ) p2 ON p1.brand = p2.brand
  AND p1.price = p2.max_price;

Bunda:

  • Ichki so'rov GROUP BY yordamida har bir brendning eng yuqori narxini atigi bir marta hisoblaydi.
  • Tashqi so'rov esa hosil bo'lgan natijani products jadvaliga brand va max_price ustunlari bo'yicha ulaydi.
  • Natijada resurslar tejaladi va so'rov bir zumda bajariladi.

Xulosa

  • Bog'langan quyi so'rov tashqi so'rovning maydonlariga tayanadi va tashqi so'rovning har bir qatori uchun qayta bajariladi.
  • Katta jadvallarda samaradorlikni oshirish uchun bog'langan so'rovlarni JOIN va agregat funksiyalar bilan almashtirish tavsiya etiladi.