Murakkab savolni bosqichlarga bo'lib yechamiz
10-sinfBI & ML4-hafta · 12-darsGuruhlab hisoblash va filtrlash
INNER, LEFT, RIGHT, FULL
So'rovni qismlarga bo'lish
Savol ichida savol
SELECT hudud_id, oquvchilar_soni
FROM yillik_kpi
WHERE yil = 2024
AND oquvchilar_soni >
(SELECT AVG(oquvchilar_soni) FROM yillik_kpi WHERE yil = 2024);
SELECT nomi FROM hududlar
WHERE hudud_id IN (
SELECT hudud_id FROM yillik_kpi
WHERE yil = 2024 AND oquvchilar_soni > 500000);
NOT IN haqida pastga
Xavfsiz yo'l: LEFT JOIN ... WHERE ... IS NULL (anti-join).
SELECT t.hudud_id, t.ortacha
FROM (SELECT hudud_id, AVG(oquvchilar_soni) AS ortacha
FROM yillik_kpi GROUP BY hudud_id) AS t
WHERE t.ortacha > 500000;
AS t) majburiy.Skalyar subquery nechta qiymat qaytarishi kerak?
Nomlangan vaqtinchalik natija
Qutilarni bosing. CTE: tepadan pastga o'qiladi.
SELECT yil, jami
FROM (SELECT yil, SUM(oquvchilar_soni) AS jami
FROM yillik_kpi GROUP BY yil) AS t;
Ichma-ich: ichkaridan o'qiladi.
WITH t AS (
SELECT yil, SUM(oquvchilar_soni) AS jami
FROM yillik_kpi GROUP BY yil
)
SELECT yil, jami FROM t;
Bir xil natija, lekin tepadan pastga o'qiladi.
WITH t AS (
SELECT yil, SUM(oquvchilar_soni) AS jami
FROM yillik_kpi GROUP BY yil
)
SELECT yil, jami,
jami - LAG(jami) OVER (ORDER BY yil) AS yoy_change
FROM t
ORDER BY yil;
WITH jami AS (
SELECT hudud_id, SUM(oquvchilar_soni) AS s
FROM yillik_kpi GROUP BY hudud_id
), ort AS (
SELECT AVG(s) AS a FROM jami
)
SELECT j.hudud_id, j.s FROM jami j, ort
WHERE j.s > ort.a;
Vergul bilan ajratiladi; ikkinchi CTE birinchisini ishlatishi mumkin.
Bir joyda bitta oddiy qiymat yoki ro'yxat kerak bo'lganda.
Ko'p bosqichli hisob, qayta ishlatish va o'qish osonligi kerak bo'lganda.
SQL dagi if / elif / else
Yuqoridan pastga tekshiriladi. Birinchi to'g'ri shart ishlaydi.
SELECT h.nomi, k.oquvchilar_soni,
CASE
WHEN k.oquvchilar_soni >= 600000 THEN 'Katta'
WHEN k.oquvchilar_soni >= 400000 THEN 'O''rta'
ELSE 'Kichik'
END AS toifa
FROM yillik_kpi k
JOIN hududlar h ON h.hudud_id = k.hudud_id
WHERE k.yil = 2024;
'O''rta'
SELECT hudud_id,
SUM(CASE WHEN yil = 2022 THEN oquvchilar_soni END) AS y2022,
SUM(CASE WHEN yil = 2023 THEN oquvchilar_soni END) AS y2023,
SUM(CASE WHEN yil = 2024 THEN oquvchilar_soni END) AS y2024
FROM yillik_kpi
GROUP BY hudud_id;
Shartga mos kelmasa CASE NULL qaytaradi, SUM esa NULL ni o'tkazib yuboradi.
Farg'ona viloyati, 2024.
Yo'q, keyingi shartga o'tamiz.
Ha: natija "O'rta", qolgani tekshirilmaydi.
CASE ni END bilan yoping.
Kichik shart oldin tursa, kattasini "yutadi".
CTE lar orasida vergul bor, oxirida yo'q.
WHEN x > 0 THEN 'A' WHEN x >= 400000 THEN 'B'. x = 500000 uchun natija?
CTE + CASE WHEN hisoboti: hududlarni nisbat bo'yicha toifalash.
Hafta oxiridagi test: 4-hafta testi (20 savol).