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.
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.
Ushbu mavzuni o'rganish uchun products nomli jadval yaratamiz:
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');
Har bir brend bo'yicha eng qimmat mahsulotning nomi, brendi va narxini topish talab etilsin:
SELECT
name,
brand,
price
FROM
products p1
WHERE
price = (
SELECT
MAX(price)
FROM
products p2
WHERE
p2.brand = p1.brand
);
Natija:
name | brand | price
-------------------+---------+---------
iPhone 16 Pro Max | Apple | 1399.99
Galaxy S24 Ultra | Samsung | 1299.99
products jadvalidan (unga p1 deb nom beramiz) qatorlarni birma-bir o'qiydi.SELECT MAX(price) FROM products p2 WHERE p2.brand = p1.brand
p1.brand) mos keluvchi maksimal narxni hisoblaydi.WHERE sharti joriy mahsulot narxi ushbu brendning maksimal narxiga teng yoki yo'qligini tekshiradi. Agar teng bo'lsa, qator yakuniy natijaga kiritiladi.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:
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:
GROUP BY yordamida har bir brendning eng yuqori narxini atigi bir marta hisoblaydi.products jadvaliga brand va max_price ustunlari bo'yicha ulaydi.JOIN va agregat funksiyalar bilan almashtirish tavsiya etiladi.