INNER, LEFT, RIGHT, FULL: jadvallarni kalit orqali bog'laymiz
10-sinfBI & ML4-hafta · 11-darsCOUNT, SUM, AVG, MIN, MAX
Guruhlab hisoblash
Guruhlarni filtrlash
Savol: WHERE va HAVING qaysi biri oldin bajariladi?
Ma'lumot bo'laklarga bo'lingan
Faqat mos kelganlar
SELECT h.nomi, k.yil, k.oquvchilar_soni
FROM hududlar h
INNER JOIN yillik_kpi k ON k.hudud_id = h.hudud_id
WHERE k.yil = 2024
ORDER BY k.oquvchilar_soni DESC;
Mos kelmaganlar taqdiri
Chap doira = FROM dagi jadval, o'ng doira = JOIN dagi jadval. Yashil = natijaga kiradi.
| nomi | oquvchilar_soni |
|---|---|
| Toshkent shahri | 485000 |
| Samarqand viloyati | 620000 |
| Buxoro viloyati | 312000 |
| Xorazm viloyati | NULL |
Chap jadval (hududlar) to'liq saqlandi; mosi yo'q joyga NULL qo'yildi.
SELECT h.nomi, k.oquvchilar_soni
FROM hududlar h
LEFT JOIN yillik_kpi k ON k.hudud_id = h.hudud_id AND k.yil = 2024
ORDER BY h.hudud_id;
RIGHT va FULL haqida pastga bosing
LEFT ning ko'zgusi. Amalda jadvallar o'rnini almashtirib LEFT yoziladi.
RIGHT va FULL JOIN 3.39 versiyadan: sqlite3.sqlite_version ni tekshiring.
SELECT h.nomi
FROM hududlar h
LEFT JOIN yillik_kpi k ON k.hudud_id = h.hudud_id
WHERE k.kpi_id IS NULL;
Barcha hududlar, KPI si bo'lmasa ham ko'rinsin. Qaysi JOIN?
Ko'p jadval, agregatsiya
SELECT h.nomi, m.raqam, k.oquvchilar_soni
FROM maktablar m
JOIN hududlar h ON h.hudud_id = m.hudud_id
JOIN yillik_kpi k ON k.hudud_id = h.hudud_id
AND k.yil = 2024
ORDER BY h.nomi, m.raqam;
10 maktab = 10 qator. Har qator hudud nomi va KPI bilan boyitildi.
SELECT h.nomi,
COUNT(m.maktab_id) AS maktablar,
COALESCE(SUM(m.sigim), 0) AS sigim
FROM hududlar h
LEFT JOIN maktablar m ON m.hudud_id = h.hudud_id
GROUP BY h.hudud_id, h.nomi
ORDER BY sigim DESC;
ON ni unutsangiz, har satr har satr bilan juftlanadi. 1000 x 1000 = million qator!
LEFT JOIN yillik_kpi k
ON k.hudud_id = h.hudud_id
WHERE k.yil = 2024
NULL satrlar tushib qoladi: Xorazm yo'qoladi!
LEFT JOIN yillik_kpi k
ON k.hudud_id = h.hudud_id
AND k.yil = 2024
Chap jadval to'liq saqlanadi. To'g'ri!
O'quv ma'lumoti: sonlar o'ylab topilgan.
LEFT JOIN da COUNT(*) bo'sh hudud uchun nega 1 beradi?
Hududlar va qabul_reja jadvallarini LEFT JOIN qiling, anti-join bilan rejasizlarni toping.
Keyingi dars: Subquery, CTE va CASE WHEN.