Quyi so'rovlar
Kirish: Ushbu qo'llanmada siz yanada moslashuvchan va sodda so'rovlar yozish uchun PostgreSQL quyi so'rovlaridan (subquery) qanday foydalanishni o'rganasiz.
PostgreSQL bir so'rov ichida boshqa bir so'rovni joylashtirish (ichma-ich yozish) imkonini beradi. Ushbu ichki so'rov quyi so'rov (subquery), uni o'z ichiga olgan asosiy so'rov esa tashqi so'rov (outer query) deb ataladi.
Quyi so'rovni qayerlarda ishlatish mumkinligini tushunish uchun SELECT buyrug'ining asosiy tuzilishiga qaraylik:
SELECT
select_list
FROM
table1
JOIN table2 ON join_condition
WHERE
condition;
Ushbu SELECT tuzilmasida:
SELECT bandi bitta qiymatni (ifoda yoki ustun) qabul qilishi mumkin.FROM va JOIN bandlari jadvallarni yoki qatorlar va ustunlardan iborat natijalar to'plamini qabul qiladi.WHERE bandi shartdagi operatorga qarab yagona qiymatni yoki qiymatlar ro'yxatini qabul qilishi mumkin.Har bir band qanday turdagi ma'lumotni kutishiga qarab, mos quyi so'rovdan foydalaniladi.
Faraz qilaylik, products jadvalidan eng qimmat mahsulotni topmoqchisiz. Buni ikki bosqichli so'rov bilan amalga oshirish mumkin:
Birinchi navbatda eng yuqori narxni aniqlaymiz:
SELECT
MAX(price)
FROM
products;
Natija bitta son qaytaradi:
max
---------
2999.99
Ikkinchi navbatda narxi shu maksimal narxga teng mahsulotni tanlaymiz:
SELECT
product_name,
price
FROM
products
WHERE
price = 2999.99;
Natija:
product_name | price
-------------------------+---------
Samsung QN900C Neo QLED | 2999.99
WHERE shartidagi narx bitta son qabul qilgani uchun, birinchi so'rovni ikkinchisining ichiga quyi so'rov sifatida joylashtirishimiz mumkin:
SELECT
product_name,
price
FROM
products
WHERE
price = (
SELECT
MAX(price)
FROM
products
);
Natija:
product_name | price
-------------------------+---------
Samsung QN900C Neo QLED | 2999.99
Xuddi shunday, o'rtacha narxdan yuqori bo'lgan mahsulotlarni topish:
SELECT
product_name,
price
FROM
products
WHERE
price > (
SELECT
AVG(price)
FROM
products
);
SELECT bandida yakka qiymat (skalyar) qaytaruvchi quyi so'rovdan foydalanish mumkin.
Masalan, quyidagi so'rov brand_id = 2 bo'lgan mahsulotlar nomi, narxi va ushbu brendning maksimal narxini yonma-yon chiqaradi:
SELECT
product_name,
price,
(
SELECT
MAX(price)
FROM
products
WHERE
brand_id = 2
) AS max_price
FROM
products
WHERE
brand_id = 2;
Natija:
product_name | price | max_price
-------------------------+---------+-----------
Apple iPhone 15 | 1099.99 | 1299.99
Apple iPhone 15 Pro Max | 1299.99 | 1299.99
Apple iPad Pro 12.9 | 1099.99 | 1299.99
Apple AirPods Pro 3 | 249.99 | 1299.99
Apple Watch Series 9 | 399.99 | 1299.99
Apple iMac 24" | 1299.99 | 1299.99
Quyidagi misol mahsulot nomi va uning ombordagi umumiy sonini quyi so'rov orqali hisoblab chiqaradi:
SELECT
p.product_name,
(
SELECT
SUM(quantity)
FROM
inventories
WHERE
product_id = p.product_id
) AS inventory_qty
FROM
products p
ORDER BY
product_name;
FROM bandida jadval o'rnida qatorlar va ustunlar to'plamini qaytaruvchi quyi so'rovdan foydalanish mumkin.
Masalan, quyidagi so'rov barcha brendlar bo'yicha mahsulotlarning o'rtacha sonini hisoblaydi:
SELECT
AVG(product_count)
FROM
(
SELECT
brand_id,
COUNT(*) AS product_count
FROM
products
GROUP BY
brand_id
);
Natija:
avg
--------------------
2.5000000000000000
Ichki quyi so'rov har bir brend bo'yicha mahsulotlar sonini jamlaydi, tashqi so'rov esa hosil bo'lgan jadval asosida AVG() ni hisoblaydi.
JOIN bandida ham butun boshli virtual jadval qaytaruvchi quyi so'rovdan foydalanish mumkin.
Masalan, ombordagi soni 300 dan oshiq bo'lgan mahsulotlarni birlashtirib olish:
SELECT
product_name,
quantity
FROM
products
JOIN (
SELECT
product_id,
quantity
FROM
inventories
WHERE
quantity > 300
) USING (product_id);
Natija:
product_name | quantity
---------------------------+----------
Lenovo ThinkPad X1 Carbon | 310
Apple iMac 24" | 320
Dell Inspiron 27 | 330
subquery) — boshqa bir so'rovning ichida joylashgan ichki so'rovdir.outer query) deb ataladi.SELECT, FROM, JOIN va WHERE bandlarida mos ravishda ishlatish mumkin.