9-dars · 3-hafta
SELECT · WHERE · ORDER BY · LIMIT · TOP-N tahlili
10-sinf BI · Ma'lumotlar muhandisligi va Machine Learning
PRAGMA foreign_keys = ONmaktab.db sxemahududlar(id, nomi)maktablar(id, nomi, turi, hudud_id)yillik_kpi(id, hudud_id, yil, oquvchilar_soni, ...)Data Definition Language
CREATE · ALTER · DROP
Jadval tuzilmasini boshqarish
Data Manipulation Language
INSERT · UPDATE · DELETE
Ma'lumotlarni o'zgartirish
Data Query Language
SELECT
Ma'lumotlarni o'qish va tahlil qilish
Biz yozgan tartib ≠ kompyuter bajaradigan tartib
WHERE SELECT dan OLDIN bajariladi — alias ni WHERE ichida ishlatib bo'lmaydi!
-- Barcha ustunlar
SELECT * FROM yillik_kpi;
-- Aniq ustunlar
SELECT hudud_id, yil, oquvchilar_soni
FROM yillik_kpi;
-- Arifmetika va AS taxallus
SELECT
hudud_id,
yil,
ROUND(oquvchilar_soni * 1.0
/ maktablar_soni, 1) AS maktab_yuklamasi
FROM yillik_kpi;
= != > < >= <=
WHERE yil = 2024
AND oquvchilar_soni > 300000
AND OR NOT
WHERE yil = 2024
OR yil = 2023
-- yoki qisqaroq:
WHERE yil IN (2023, 2024)
WHERE yil
BETWEEN 2022
AND 2024
Ikkala chegara kiradi
WHERE hudud_id
IN (1, 3, 5)
OR zanjirini qisqartiradi
WHERE nomi
LIKE 'Toshkent%'
% = ixtiyoriy belgilar_ = aynan 1 belgi
-- Bu DOIM FALSE qaytaradi!
WHERE turi = NULL
NULL == NULL — matematik jihatdan noto'g'ri. NULL = "noma'lum"
-- Bo'sh qiymatlar
WHERE turi IS NULL
-- Bo'sh emas
WHERE turi IS NOT NULL
Noma'lumni noma'lum bilan taqqoslab bo'lmaydi — IS NULL ishlatamiz!
-- Bir ustun bo'yicha kamayish tartibi
SELECT hudud_id, yil, oquvchilar_soni
FROM yillik_kpi
WHERE yil = 2024
ORDER BY oquvchilar_soni DESC;
-- Ko'p ustunli saralash
SELECT hudud_id, yil, oquvchilar_soni
FROM yillik_kpi
ORDER BY yil DESC, -- avval yangi yillar
oquvchilar_soni DESC; -- teng yillarda ko'proq birinchi
Kattadan kichikka (kamayish)
Kichikdan kattaga (o'sish) — standart
-- TOP-5 hudud (2024-yil)
SELECT h.nomi, k.oquvchilar_soni
FROM yillik_kpi k
JOIN hududlar h ON h.id = k.hudud_id
WHERE k.yil = 2024
ORDER BY k.oquvchilar_soni DESC
LIMIT 5;
-- 1-sahifa (1-3 yozuv)
LIMIT 3 OFFSET 0
-- 2-sahifa (4-6 yozuv)
LIMIT 3 OFFSET 3
-- N-sahifa formulasi:
LIMIT size OFFSET (page-1)*size
import sqlite3
conn = sqlite3.connect("data/maktab.db")
conn.execute("PRAGMA foreign_keys = ON")
cur = conn.cursor()
# TOP-10 hudud — 2024-yil bo'yicha
sql = """
SELECT h.nomi, k.oquvchilar_soni
FROM yillik_kpi k
JOIN hududlar h ON h.id = k.hudud_id
WHERE k.yil = 2024
ORDER BY k.oquvchilar_soni DESC
LIMIT 10;
"""
cur.execute(sql)
print(f"{'Hudud':<25} {'O\'quvchilar soni':>18}")
print("-" * 45)
for nomi, son in cur.fetchall():
print(f"{nomi:<25} {son:>18,}")
conn.close()
-- 2022-2024 da, o'quvchisi 400 000 dan ortiq hududlar,
-- maktab yuklamasi bilan, eng ko'p yuklamali birinchi
SELECT
h.nomi AS hudud,
k.yil,
k.oquvchilar_soni,
ROUND(k.oquvchilar_soni * 1.0
/ k.maktablar_soni, 1) AS maktab_yuklamasi
FROM yillik_kpi k
JOIN hududlar h ON h.id = k.hudud_id
WHERE k.yil BETWEEN 2022 AND 2024
AND k.oquvchilar_soni > 400000
ORDER BY k.yil DESC, maktab_yuklamasi DESC
LIMIT 6;
ORDER BY da alias (maktab_yuklamasi) ishlatish mumkin, lekin WHERE da emas — mantiqiy ijro tartibini eslang!
-- XATOLAR MAVJUD — Toping!
SELECT nomi, oquvchilar_soni
FROM yillik_kpi, hududlar
WHERE hudud_id = NULL
AND yil = 2024
ORDERBY oquvchilar_soni DESC
LIMIT 10;
= NULL → IS NULL yoki IS NOT NULL
FROM tbl1, tbl2 — JOIN aniq yozilmagan
ORDERBY → ORDER BY (bo'sh joy yetishmayapti)
SQL 1974-yilda IBM muhandislari tomonidan yaratilgan. Dastlab SEQUEL (Structured English Query Language) deb atalgan. Bugun dunyoda eng ko'p ishlatiladigan ma'lumotlar bazasi tili!
2024-yilgi statistikaga ko'ra O'zbekiston umumta'lim maktablarida 6,5 milliondan ortiq o'quvchi ta'lim olmoqda. SQL TOP-N orqali hududiy tahlil qilish mumkin.
SQL da SELECT va WHERE qaysi tartibda bajariladi?
BETWEEN 10 AND 20 va >=10 AND <=20 bir xilmi?
LIKE 'A_or' qanday so'zlarga mos keladi?
= NULL o'rniga nima yozish kerak va nima uchun?
4-sahifada LIMIT 10 OFFSET ? qancha bo'ladi?
Ko'p ustunli ORDER BY da ustunlar qanday ajratiladi?
Keyingi hafta: SQL agregat funksiyalari — COUNT, SUM, AVG, GROUP BY, HAVING