AXV

SQL JOIN turlari

INNER, LEFT, RIGHT, FULL: jadvallarni kalit orqali bog'laymiz

10-sinfBI & ML4-hafta · 11-dars

Avvalgi darsdan

Agregatsiya

COUNT, SUM, AVG, MIN, MAX

GROUP BY

Guruhlab hisoblash

HAVING

Guruhlarni filtrlash

Savol: WHERE va HAVING qaysi biri oldin bajariladi?

01

Nega JOIN kerak?

Ma'lumot bo'laklarga bo'lingan

Ikki jadval, bitta kalit

hududlar hudud_id (PK) · nomi 1 · Toshkent shahri 2 · Samarqand viloyati 6 · Xorazm viloyati yillik_kpi hudud_id (FK) · yil · soni 1 · 2024 · 485000 2 · 2024 · 620000 (6 uchun yozuv yo'q) ON k.hudud_id = h.hudud_id

Hayotiy o'xshatish

Sinf jurnali va telefon daftari: jurnalda faqat o'quvchi raqami, daftarda raqam bo'yicha ism. Ikkalasini raqam orqali tutashtirsangiz, to'liq ro'yxat chiqadi.
  1. Umumiy ustun topiladi (PK = FK)
  2. ON shartida yoziladi
  3. Mos satrlar bir qatorga yig'iladi
02

INNER JOIN

Faqat mos kelganlar

INNER JOIN sintaksisi


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;
  
h = hududlark = yillik_kpi
Natija 5 qator: Xorazm chiqmaydi, chunki KPI si yo'q.
03

LEFT, RIGHT, FULL

Mos kelmaganlar taqdiri

To'rt JOIN bir ko'rinishda

INNER JOIN faqat mos kelganlar LEFT JOIN chap to'liq + mosi RIGHT JOIN o'ng to'liq + mosi FULL JOIN ikkala tomon to'liq

Chap doira = FROM dagi jadval, o'ng doira = JOIN dagi jadval. Yashil = natijaga kiradi.

LEFT JOIN natijasi

nomioquvchilar_soni
Toshkent shahri485000
Samarqand viloyati620000
Buxoro viloyati312000
Xorazm viloyatiNULL

Chap jadval (hududlar) to'liq saqlandi; mosi yo'q joyga NULL qo'yildi.

LEFT JOIN yozuvi


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

RIGHT va FULL JOIN

RIGHT JOIN

LEFT ning ko'zgusi. Amalda jadvallar o'rnini almashtirib LEFT yoziladi.

SQLite

RIGHT va FULL JOIN 3.39 versiyadan: sqlite3.sqlite_version ni tekshiring.

Anti-join: bog'lanmaganlarni toping


SELECT h.nomi
FROM hududlar h
LEFT JOIN yillik_kpi k ON k.hudud_id = h.hudud_id
WHERE k.kpi_id IS NULL;
  
Natija: Xorazm viloyati. "Nima yetishmayapti?" savoliga javob.

Mini-test

Barcha hududlar, KPI si bo'lmasa ham ko'rinsin. Qaysi JOIN?

Hududlar chapda bo'lib, LEFT JOIN uni to'liq saqlaydi. Teskari yozilsa, KPI satrlari saqlanadi.
04

JOIN + hisobot

Ko'p jadval, agregatsiya

Uch jadvalli zanjir

maktablar hudud_id (FK) hududlar hudud_id (PK) yillik_kpi hudud_id (FK) hududlar markaziy jadval: ikkala FK unga qaytadi

Uch jadval bitta so'rovda


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.

JOIN + GROUP BY


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;
  
COUNT(*) emas, COUNT(m.maktab_id): bo'sh hudud 1 emas, 0 bo'ladi.

Xavf: ON yo'q = Cartesian product

A B C 1 2 3 x 2 = 6 juft

ON ni unutsangiz, har satr har satr bilan juftlanadi. 1000 x 1000 = million qator!

ON yoki WHERE?


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!

Bizning ma'lumotda

0
hudud
0
INNER JOIN qatori (2024)
0
KPI siz hudud (LEFT JOIN)

O'quv ma'lumoti: sonlar o'ylab topilgan.

Mini-test: nega 0 emas?

LEFT JOIN da COUNT(*) bo'sh hudud uchun nega 1 beradi?

LEFT JOIN bitta NULL li satr hosil qiladi. COUNT(m.maktab_id) NULL ni sanamaydi va 0 beradi.

Amaliyot 20 daqiqa

Oson2023-yil uchun hudud nomi va o'qituvchilar sonini chiqaring (INNER JOIN).
O'rtaKPI si bor-yo'qligini anti-join bilan tekshiring; maktabi yo'q hududni ham toping.
QiyinHar hudud: maktablar soni va 2024-yil o'quvchilar soni (Xorazm uchun 0).

Xulosa

Bugun o'rgandik

  • JOIN va ON (PK = FK)
  • INNER, LEFT, RIGHT, FULL
  • Anti-join, COALESCE
  • JOIN + GROUP BY

Uyga vazifa

Hududlar va qabul_reja jadvallarini LEFT JOIN qiling, anti-join bilan rejasizlarni toping.

Keyingi dars: Subquery, CTE va CASE WHEN.