Python SQLite — To'liq o'quv qo'llanma
Mundarija
- MBBT nima va relyatsion ma'lumotlar bazalari
- Ma'lumotlar bazasiga ulanish, jadval yaratish va o'chirish
- SELECT va INSERT buyruqlari
- UPDATE va DELETE buyruqlari
- Agregirlash va GROUP BY bilan guruhlash
- JOIN operatori — svodka hisobot yaratish
- UNION operatori — jadvallarni birlashtirish
- Ichki SQL so'rovlar
- execute, executemany, executescript, commit, rollback metodlari
- fetchall, fetchmany, fetchone, iterdump metodlari
1. MBBT nima va relyatsion ma'lumotlar bazalari
Ma'lumotlar bazasi nima?
Ma'lumotlar bazasi (MB) — bu ma'lumotlarni tartibli, xavfsiz va tezkor saqlash, boshqarish va qidirish imkonini beradigan tizim. Oddiy qilib aytganda, bu kompyuter xotirasidagi "aqlli daftar" — lekin oddiy daftardan ming marta kuchli va tezkor.
Keling, hayotiy misol bilan tushunaylik. Tasavvur qiling, siz "Mina qidiruvchi" (Saper) o'yinini yaratyapsiz. O'yinda o'yinchilarning natijalari va profillarini saqlash kerak. Har bir o'yinchining ismi, yoshi, jinsi, o'yinlardagi natijalari — bularning barchasini biror joyda saqlash va kerak bo'lganda tezda topish kerak bo'ladi.
Odatda, bu maqsadda ma'lumotlar bazasi yaratiladi va unda jadvallar to'plami saqlanadi. Jadval — bu xuddi Excel dagi kataklarga o'xshash tuzilma: ustunlar (maydonlar) va satrlar (yozuvlar) dan iborat.
Bizning misolda ikkita jadval bo'lsin: "O'yinchilar" (users) va "O'yinlar" (games). Har bir jadval belgilangan tuzilmaga (ustunlar to'plami) va ma'lum miqdordagi yozuvlarga (satrlar) ega bo'ladi.
Bu yerda diqqatga sazovor narsa bor: games jadvalidagi user_id maydoni. Bu maydon o'yinchi identifikatorini saqlaydi va u orqali "bu o'yinni KIM o'ynagan?" degan savolga javob topish mumkin. Shu kalit orqali keyinchalik ikkala jadvalni bog'lab, svodka (yig'ma) ma'lumotlar olish mumkin bo'ladi.
Bunday bog'lanish ingliz tilida relation (munosabat) deb ataladi. Shu so'zdan relyatsion ma'lumotlar bazasi nomi kelib chiqqan — ya'ni, jadvallar o'zaro bog'lanish imkoniyatiga ega bazalar. Keyingi darslarda biz faqat shu turdagi ma'lumotlar bazalari haqida gaplashamiz.
Ahamiyatli nuqta: jadvallarning tuzilmasi — qanday ustunlar bo'lishi, ularning turlari va nomlari — dasturchi tomonidan belgilanadi va loyihaga qarab har xil bo'lishi mumkin. Yuqoridagi jadvallar faqat misol, sizning loyihangizda butunlay boshqacha tuzilma bo'lishi tabiiy.
Nima uchun oddiy faylga yozmaslik kerak?
Yaxshi savol! Ko'pchilik boshlovchi dasturchilarda shunday savol tug'iladi: "Nima uchun shunchaki fayl yaratib, ma'lumotlarni u yerga yozib qo'ymaslik kerak?"
Darhaqiqat, oddiy faylga yozish ham mumkin. Lekin bu yo'lda bir qator jiddiy muammolar yuzaga keladi:
1. Xavfsizlik muammosi: Dastur ma'lumotni faylga yozayotgan paytda elektr toki o'chib qolsa yoki dastur xatolikka uchrasa nima bo'ladi? Ma'lumotlar yarim yozilgan holatda qolishi va buzilishi mumkin. Ma'lumotlar bazasi esa maxsus mexanizmlar orqali bunday holatlardan himoyalangan — u yoki ma'lumotni to'liq yozadi, yoki umuman yozmaydi.
2. Format muammosi: Ma'lumotni faylda qanday formatda saqlash kerak? Vergul bilan ajratib yozamizmi? Har bir ma'lumotni yangi qatorga yozamizmi? Agar format to'g'ri tanlanmasa, keyinchalik ma'lumotni o'qish va tahlil qilish juda qiyinlashadi. Ma'lumotlar bazasida esa format avtomatik boshqariladi.
3. Qidirish muammosi: Faylda 100 000 ta yozuv bor deylik. Ichidan bitta aniq yozuvni qanday topasiz? Butun faylni boshidan oxirigacha o'qib chiqishdan boshqa iloj yo'q. Bu juda sekin. Ma'lumotlar bazasi esa maxsus indekslar yordamida yozuvni deyarli bir zumda topadi.
4. Bir nechta jadval muammosi: Agar ma'lumotlar bir nechta jadvallarga bo'lingan bo'lsa (masalan, o'yinchilar va o'yinlar alohida), ularni faylda qanday bog'laysiz? Bu uchun murakkab kod yozish kerak. Ma'lumotlar bazasida esa bu bitta SQL buyrug'i bilan hal bo'ladi.
5. Bir vaqtda foydalanish: Agar bir nechta dastur yoki foydalanuvchi bir vaqtda bitta faylga yozmoqchi bo'lsa nima bo'ladi? Ma'lumotlar aralashib ketishi yoki yo'qolib qolishi mumkin. Ma'lumotlar bazasi esa bunday holatlarni avtomatik boshqaradi.
Bularning barchasi — oddiy masalalar emas. Shu sababli, dasturchilar turli xil MBBT (Ma'lumotlar Bazasini Boshqarish Tizimi) dan foydalanishadi. MBBT — bu maxsus dasturiy ta'minot bo'lib, u ma'lumotlarni saqlash, qidirish, o'zgartirish va himoya qilish bilan shug'ullanadi. Dasturchi esa faqat "nima kerak" deb aytadi, MBBT "qanday qilish kerak" ni o'zi hal qiladi.
MBBT qanday ishlaydi?
Ma'lum bir MBBT tanlagach, dasturchi uning API (Application Programming Interface — Ilovalar Dasturlash Interfeysi) ga kirish huquqini oladi. API — bu MBBT bilan muloqot qilish uchun tayyor funksiyalar to'plami. Dasturchi bu funksiyalar orqali ma'lumotlar bazasiga buyruqlar yuboradi: "jadval yarat", "yozuv qo'sh", "ma'lumot top" va hokazo.
Sodda qilib aytganda, API — bu MBBT ning "eshigi". Siz bu eshikdan kirib, o'z so'rovlaringizni aytasiz va javob olasiz. Ichkarida nima sodir bo'layotganini bilishingiz shart emas — MBBT o'zi boshqaradi.
Python uchun mashhur MBBT'lar
Python dasturlash tilida quyidagi MBBT'lar eng mashhur:
- PyMySQL — MySQL bilan ishlash uchun mo'ljallangan. MySQL — bu asosan veb-saytlar va onlayn tizimlar uchun ishlatiladigan kuchli MBBT.
- Python SQLite — yengil va tezkor baza. Alohida server o'rnatish talab qilinmaydi, butun baza bitta faylda saqlanadi. Kichik va o'rta loyihalar uchun ideal.
- Python PostgreSQL — kuchli korporativ baza. Katta va murakkab loyihalar uchun ishlatiladi.
Biz SQLite paketini o'rganamiz. Buning bir nechta muhim sababi bor:
- Eng sodda — o'rganish uchun eng qulay MBBT
- Standart ta'minotda — Python'ning standart kutubxonasiga kiritilgan, alohida o'rnatish shart emas
- Keng tarqalgan — juda ko'p ilovalarda ishlatiladi (masalan, Android telefonlardagi ko'plab ilovalar SQLite dan foydalanadi)
- SQL tilini o'rgatadi — bu yerda o'rgangan SQL bilimlaringiz MySQL, PostgreSQL va boshqa MBBT'larda ham ishlaydi
SQLite xususiyatlari
SQLite yengil diskli MB yaratish uchun ishlatiladi. Butun ma'lumotlar bazasi bitta .db faylida saqlanadi. Uning ba'zi muhim xususiyatlarini bilish kerak:
- Alohida server o'rnatish kerak emas (MySQL yoki PostgreSQL'dan farqli o'laroq)
- Butun baza bitta faylda — ko'chirish, zaxira olish oson
- Python'ning standart ta'minotida bor
- Juda tez ishlaydi (ayniqsa o'qish operatsiyalarida)
- Kichik hajmli ilovalar uchun ideal
- Tarmoq aloqasini qo'llab-quvvatlamaydi (faqat lokal fayl bilan ishlaydi). Ya'ni, boshqa kompyuterdan ulanib ishlab bo'lmaydi (faqat faylni ulashish orqali)
- Yozish cheklovi: bir vaqtda faqat bitta oqim (thread) yoki jarayon (process) yozishi mumkin. Ikkinchi dastur yozmoqchi bo'lsa, birinchisi tugashini kutishi kerak
- O'qish cheklovi yo'q: bir vaqtda ko'plab foydalanuvchilar o'qishi mumkin
- "Bir yozadi — ko'plari o'qiydi" tamoyili bo'yicha ishlaydi
SQLite turli ilovalar uchun ma'lumot saqlashda ideal yechim — o'yinlar, mobil ilovalar, kichik veb-saytlar, shaxsiy loyihalar uchun juda mos keladi. MBBT bilan barcha aloqa bir nechta metod orqali amalga oshiriladi, ularning eng asosiysi:
execute(SQL)
Bu metod MBBT'ga SQL (Structured Query Language — Tuzilmali So'rovlar Tili) tilida yozilgan so'rovni bajarish ko'rsatmasini beradi. Amalda, MB bilan barcha muloqot shu til orqali amalga oshiriladi.
SQL tili haqida
Ehtimol, sizga "ma'lumotlar bazasi bilan ishlash uchun yana bitta tilni o'rganish kerakmi?" deb tuyulishi mumkin. Lekin bu bunga arziydi, chunki:
- SQL juda keng tarqalgan — dunyodagi deyarli barcha MBBT'lar SQL tilini ishlatadi
- SQL oddiy — u faqat bir nechta asosiy buyruqdan iborat va o'rganish oson
- SQL universal — bir MBBT'da o'rgangan bilimlaringiz boshqasida ham ishlaydi
- SQL kuchli — bir necha so'z bilan millionlab yozuvlardan kerakligini topish mumkin
SQL — juda keng tarqalgan til va ko'plab MBBT'lar uni interfeys sifatida ishlatadi. Masalan, saytlar yaratishda mashhur bo'lgan MySQL ham SQL tilini ishlatadi. Turli MBBT'larda bu tilning biroz farqli dialektlari (lahjalar) mavjud — ayrim buyruqlar biroz boshqacha yozilishi mumkin. Lekin eng ko'p ishlatiladigan elementlari barcha MBBT'larda bir xilligicha qoladi.
Shunday qilib, SQLite bilan ishlashni o'rganish uchun asosan SQL tilini o'zlashtirish kerak.
DB Browser for SQLite dasturi
SQLite bilan ishlashni o'rganishda DB Browser for SQLite dasturi juda qo'l keladi. Bu bepul dastur bo'lib, u orqali:
- Ma'lumotlar bazasini vizual (ko'z bilan ko'rinadigan) ko'rinishda ochish mumkin
- Jadvallarni ko'rish, yozuvlarni qo'shish va tahrirlash mumkin
- SQL so'rovlarni yozib bajarish va natijalarni darhol ko'rish mumkin
- Jadval tuzilmasini ko'rib chiqish mumkin
Dasturni rasmiy saytdan yuklab olish mumkin: https://sqlitebrowser.org
Saytga kirib, "Download" tugmasini bosing va o'z operatsion tizimingiz (Windows, macOS yoki Linux) uchun o'rnatgichni tanlang. O'rnatib ishga tushirganingizdan so'ng, dastur oynasini ko'rasiz — u yerda MB fayllarini ochish va boshqarish mumkin.
Bu dastur bizga SQL so'rovlarni sinab ko'rishda juda yordam beradi — Python dasturida yozmasdan oldin, avval DB Browser'da sinab ko'rish va natijani ko'rish qulayroq.
2. Ma'lumotlar bazasiga ulanish, jadval yaratish va o'chirish
SQLite modulini ulash
Python dasturida SQLite MBBT'dan foydalanish uchun avvalo modulni import qilish kerak:
import sqlite3
Bu bitta qatorni dasturingizning boshiga yozsangiz bas — SQLite'ning barcha funksiyalari mavjud bo'ladi. Hech qanday qo'shimcha o'rnatish kerak emas, chunki sqlite3 moduli Python bilan birga keladi.
Ko'p dasturchilar modulga qisqa nom berishadi, shunda har safar sqlite3 deb to'liq yozish shart bo'lmaydi:
import sqlite3 as sq
Endi sqlite3 o'rniga qisqacha sq deb yozish mumkin.
Bazaga ulanish — oddiy shablon
Ma'lumotlar bazasi bilan ishlash uchun avval unga ulanish (connect) kerak. Bu xuddi telefon qilish uchun avval raqamni terish kabi — avval aloqa o'rnatiladi, keyin gaplashiladi:
import sqlite3 as sq
con = sq.connect("saper.db")
cur = con.cursor()
cur.execute("""
""")
con.close()
Bu kodda nima bo'layotganini bosqichma-bosqich tushuntiramiz:
1-qadam: sq.connect("saper.db") — bu metod saper.db nomli fayl bilan aloqa o'rnatadi. Agar bu fayl mavjud bo'lsa — ochiladi. Agar mavjud bo'lmasa — yangi fayl yaratiladi. Ya'ni, siz birinchi marta dasturni ishga tushirganingizda, MB fayli avtomatik yaratiladi! Fayl kengaytmalari odatda quyidagicha bo'ladi: .db, .db3, .sqlite, .sqlite3. Bu kengaytmalarning barchasi bir xil ma'noga ega, lekin .db eng qisqa va qulay.
2-qadam: con.cursor() — "kursor" yaratiladi. Kursor — bu MB bilan muloqot qilish uchun "vositachi" ob'ekt. Barcha SQL so'rovlar kursor orqali yuboriladi. Kursorni MB ning "qo'li" deb tasavvur qilish mumkin — u sizning buyruqlaringizni bajaradi.
3-qadam: cur.execute("...") — kursor orqali SQL so'rov yuboriladi. Bu metod MBBT'ga "mana bu buyruqni bajaring" deb aytadi. Hozircha biz hech qanday buyruq yozmaymiz (bo'sh qoldiramiz).
4-qadam: con.close() — ish tugagach, ulanish yopiladi. Bu muhim qadam! Agar ulanishni yopmasangiz, fayl "band" holatida qolib ketishi mumkin.
Kontekst menejeri bilan ishlash (tavsiya etiladi)
Yuqoridagi usulda bir muammo bor: agar dastur o'rtasida xatolik yuz bersa, con.close() qatoriga yetib bormasligi mumkin va ulanish ochiq qolib ketadi. Bu muammoni hal qilish uchun Python'ning kontekst menejeri (with kalit so'zi) dan foydalaniladi:
with sq.connect("saper.db") as con:
cur = con.cursor()
cur.execute("""
""")
Kontekst menejeri avtomatik ravishda ikkita muhim amalni bajaradi:
Eng muhimi: kontekst menejeri bu amallarni hatto xatolik yuz berganda ham bajaradi. Shuning uchun bu usul ancha xavfsiz va ishonchli. Biz keyingi barcha misollarda aynan shu usuldan foydalanamiz.
commit() metodini tushuntirish: Siz MB'ga o'zgartirishlar kiritganingizda (yozuv qo'shish, o'zgartirish, o'chirish), bu o'zgarishlar darhol diskka yozilmaydi — ular xotirada (RAM) saqlanadi. Faqat commit() chaqirilganda barcha o'zgarishlar diskdagi faylga yoziladi. Bu samaradorlik uchun qilingan — diskka yozish sekin operatsiya, shuning uchun ko'plab o'zgarishlarni to'plab, bir marta yozish tezroq ishlaydi.
Jadval yaratish
Ma'lumotlar bazasida ma'lumotlar jadvallar ko'rinishida saqlanadi. Har bir MB ko'plab jadvallarni o'z ichiga olishi mumkin. Har bir jadval bitta mavzuga tegishli ma'lumotlarni saqlaydi: masalan, "O'yinchilar" jadvali faqat o'yinchilar haqida, "O'yinlar" jadvali faqat o'yinlar haqida.
Jadval yaratishdan oldin uning tuzilmasini aniqlash kerak — qanday ustunlar bo'ladi va ular qanday turdagi ma'lumotlarni saqlaydi.
Birinchi jadvalimizni quyidagi tuzilma bilan yaratamiz:
SQLite ma'lumot turlari
Har bir ustunning ma'lumot turini to'g'ri tanlash juda muhim. SQLite'da quyidagi asosiy turlar mavjud:
TEXT — eng ko'p ishlatiladigan tur. Ismlar, manzillar, tavsiflar — barchasi TEXT turiga kiradi.
INTEGER — butun sonlar uchun. Yosh, ochkolar soni, miqdor — barchasi INTEGER.
REAL — o'nlik sonlar uchun. Narxlar, harorat, koordinatalar.
BLOB — ikkilik ma'lumotlar uchun. Bu maxsus tur bo'lib, rasmlar yoki boshqa fayllarni to'g'ridan-to'g'ri bazada saqlash uchun ishlatiladi. Bu haqda 10-darsda batafsil gaplashamiz.
NULL — bu "hech narsa" yoki "noma'lum" ma'nosini bildiradi. Masalan, agar o'yinchining telefon raqami kiritilmagan bo'lsa, u yerda NULL bo'ladi.
SQL so'rov bilan jadval yaratish
Endi jadval yaratish uchun SQL buyrug'ini yozamiz:
cur.execute("""CREATE TABLE users (
name TEXT,
jins INTEGER,
old INTEGER,
score INTEGER
)""")
Bu yerda nima bo'layotganini tushuntiramiz:
CREATE TABLE— "jadval yarat" degan SQL buyrug'iusers— jadval nomi (biz tanlagan nom)- Qavslar ichida — ustunlar ro'yxati: har bir ustunning nomi va turi vergul bilan ajratiladi
Yozish qoidasi: SQL buyruqlar va turlar nomlari KATTA HARFDA (masalan, CREATE TABLE, TEXT, INTEGER), jadval va ustun nomlari esa kichik harfda (masalan, users, name, score) yoziladi. Bu majburiy emas — SQLite katta-kichik harfni farqlamaydi — lekin bu umume'tirof etilgan qoida va kodni o'qishni osonlashtiradi.
IF NOT EXISTS — mavjud bo'lsa yaratmaslik
Dasturni ikkinchi marta ishga tushirsangiz, users jadvali allaqachon mavjud bo'lgani uchun xatolik yuzaga keladi: "jadval allaqachon bor!" Buni oldini olish uchun IF NOT EXISTS iborasini qo'shamiz:
cur.execute("""CREATE TABLE IF NOT EXISTS users (
name TEXT,
jins INTEGER,
old INTEGER,
score INTEGER
)""")
Bu "agar jadval mavjud bo'lmasa yarat" degan ma'noni bildiradi. Agar jadval allaqachon bor bo'lsa — hech narsa qilmaydi, xatolik ham bermaydi. Endi dasturni necha marta ishga tushirsangiz ham muammo bo'lmaydi.
DB Browser orqali ma'lumot qo'shish
Dasturni ishga tushirib, jadval yaratgandan so'ng, DB Browser dasturida MB faylini ochib, jadvalga qo'lda yozuvlar qo'shish mumkin. "Yozuv qo'shish" tugmasini bosib, quyidagi ma'lumotlarni kiritamiz:
Ali 1 22 1000 Mirzo 1 19 800 Farhod 1 26 1100 Mohinur 2 18 1500
Kiritgandan so'ng albatta "O'zgarishlarni saqlash" tugmasini bosish kerak — aks holda ma'lumotlar saqlanmaydi.
DB Browser'da "SQL" bo'limiga o'tib, SQL so'rovlarni yozish va bajarish ham mumkin. Masalan, barcha yozuvlarni ko'rish uchun:
SELECT * FROM users
rowid — yashirin maydon
Har bir SQLite jadvali yashirin rowid maydoniga ega. Bu maydon har bir yozuvga avtomatik beriladigan noyob raqam. Siz uni yaratmaysiz — MBBT o'zi boshqaradi. Uni ko'rish uchun:
SELECT rowid, * FROM users
Bu so'rov natijasida har bir yozuv oldida uning rowid raqamini ko'rasiz:
1 Ali 1 22 1000 2 Mirzo 1 19 800 3 Farhod 1 26 1100 4 Mohinur 2 18 1500
rowid ning ahamiyati shundaki, u orqali har bir yozuvni aniq aniqlash mumkin. Agar jadvalda ikki Ali bo'lsa ham, ularning rowid lari har xil bo'ladi. Keyinchalik bu raqam orqali jadvallarni bog'lash ham mumkin.
Jadvalni o'chirish
Agar jadval umuman kerak bo'lmay qolsa, uni butunlay o'chirish mumkin:
cur.execute("DROP TABLE users")
DIQQAT: Bu buyruq jadvalni va undagi barcha ma'lumotlarni qaytarib bo'lmas tarzda o'chiradi! Ehtiyotkorlik bilan ishlating.
PRIMARY KEY va AUTOINCREMENT
rowid ga o'xshash maydonni o'zingiz ham yaratishingiz mumkin. Buning uchun PRIMARY KEY kalit so'zi ishlatiladi:
cur.execute("""CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
jins INTEGER,
old INTEGER,
score INTEGER
)""")
- PRIMARY KEY (birlamchi kalit) — bu maydon faqat noyob (takrorlanmas) qiymatlarni saqlashi kerakligini bildiradi. Ikkita yozuvda bir xil
user_idbo'lishi mumkin emas. - AUTOINCREMENT — yangi yozuv qo'shilganda qiymat avtomatik 1 ga oshadi. Birinchi yozuvda 1, ikkinchisida 2, uchinchisida 3 va hokazo. Siz yangi yozuv qo'shayotganda
user_idni ko'rsatishingiz shart emas — MBBT uni o'zi belgilaydi.
NOT NULL — bo'sh bo'lmasin
Ba'zan siz xohlaysizki, ma'lum bir maydon albatta to'ldirilgan bo'lsin. Masalan, o'yinchining ismi albatta bo'lishi kerak. Buning uchun NOT NULL cheklovi qo'yiladi:
name TEXT NOT NULL
Endi agar kimdir ism ko'rsatmasdan yozuv qo'shmoqchi bo'lsa, MBBT xatolik beradi.
DEFAULT — standart qiymat
Maydon uchun "agar hech narsa ko'rsatilmasa, shu qiymatni qo'y" degan standart qiymat belgilash:
jins INTEGER DEFAULT 1
cur.execute("""CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
jins INTEGER NOT NULL DEFAULT 1,
old INTEGER,
score INTEGER
)""")
Endi jins maydoni albatta qiymatga ega bo'ladi va ko'rsatilmasa sukut bo'yicha 1 ga teng bo'ladi.
3. SELECT va INSERT buyruqlari
INSERT — yozuv qo'shish
INSERT buyrug'i jadvalga yangi yozuv qo'shadi. Ikkita asosiy sintaksisi bor:
-- 1-variant: Ustunlarni ko'rsatib (tavsiya etiladi) INSERT INTO jadval_nomi (ustun1, ustun2) VALUES (qiymat1, qiymat2) -- 2-variant: Ustunlarni ko'rsatmasdan (barcha ustunlar uchun qiymat kerak) INSERT INTO jadval_nomi VALUES (qiymat1, qiymat2, ...)
INSERT INTO users VALUES('Mirzo', 1, 19, 1000)
-- jins ko'rsatilmagan — DEFAULT 1 ishlatiladi
INSERT INTO users (name, old, score) VALUES('Farhod', 32, 200)
SELECT — ma'lumot tanlash
SELECT — SQL'da eng ko'p ishlatiladigan buyruq:
SELECT name, old, score FROM users -- Ba'zi ustunlar SELECT * FROM users -- Barcha ustunlar
WHERE — filtr
SELECT * FROM users WHERE score < 1000 SELECT * FROM users WHERE score BETWEEN 500 AND 1000 SELECT * FROM users WHERE old = 32
Solishtirish operatorlari: =, ==, >, <, >=, <=, !=, BETWEEN
Murakkab shartlar
SELECT * FROM users WHERE old > 20 AND score < 1000 SELECT * FROM users WHERE old IN(19, 32) AND score < 1000
Ustuvorlik: AND ning ustuvorligi OR dan yuqori. Qavslar bilan o'zgartirish mumkin:
SELECT * FROM users WHERE (old IN(19, 32) OR jins = 1) AND score > 300
ORDER BY — saralash
SELECT * FROM users ORDER BY old -- O'sish (standart) SELECT * FROM users ORDER BY old DESC -- Kamayish SELECT * FROM users ORDER BY old ASC -- O'sish (aniq ko'rsatish)
LIMIT va OFFSET — cheklash
SELECT * FROM users ORDER BY score DESC LIMIT 5 -- Eng yaxshi 5 ta SELECT * FROM users ORDER BY score DESC LIMIT 5 OFFSET 2 -- 2 tasini o'tkazib, 5 ta SELECT * FROM users ORDER BY score DESC LIMIT 2, 5 -- Shu narsa
Python'da natijalarni olish
with sq.connect("saper.db") as con:
cur = con.cursor()
cur.execute("SELECT * FROM users ORDER BY score DESC LIMIT 5")
result = cur.fetchall() # Barcha natijalar — ro'yxat
result = cur.fetchone() # Birinchi yozuv — kortej
result = cur.fetchmany(2) # Ko'pi bilan 2 ta — ro'yxat
# Iterator (xotirani tejaydi)
for row in cur:
print(row)
4. UPDATE va DELETE buyruqlari
UPDATE — yozuvlarni o'zgartirish
UPDATE jadval_nomi SET ustun = yangi_qiymat WHERE shart
UPDATE users SET score = 0 -- BARCHA yozuvlar! UPDATE users SET score = 1000 WHERE rowid = 1 -- Faqat bitta UPDATE users SET score = score + 500 WHERE jins = 2 -- Hisob bilan UPDATE users SET score = 700, old = 45 WHERE old > 40 -- Bir nechta ustun
⚠️ WHERE yo'q bo'lsa barcha yozuvlar o'zgaradi!
LIKE — shablon solishtirish
UPDATE users SET score = 1500 WHERE name LIKE 'Farhod' UPDATE users SET score = score + 100 WHERE name LIKE 'M%' -- M bilan boshlanadiganlar UPDATE users SET score = score + 100 WHERE name LIKE 'S_rd%' -- Sardor, Sirdor...
DELETE — yozuvlarni o'chirish
DELETE FROM jadval_nomi WHERE shart
DELETE FROM users WHERE rowid IN(2, 5) -- rowid 2 va 5 o'chiriladi
⚠️ WHERE yo'q bo'lsa BARCHA yozuvlar o'chadi!
O'chirilgan rowid lar qayta ishlatilmaydi. Yangi yozuv keyingi raqamni oladi.
5. Agregirlash va GROUP BY bilan guruhlash
SELECT count() AS soni FROM games WHERE user_id = 1 SELECT sum(score) AS yigindi FROM games WHERE user_id = 1 SELECT avg(score) AS ortacha FROM games SELECT max(score) FROM games WHERE user_id = 1 SELECT min(score) FROM games WHERE user_id = 1
DISTINCT — faqat noyob qiymatlarni tanlash:
SELECT count(DISTINCT user_id) AS soni FROM games SELECT DISTINCT user_id FROM games
AS (alias/taxallus) — natija ustuniga nom berish:
SELECT count() AS soni FROM games -- Ustun nomi "soni" bo'ladi
GROUP BY — guruhlash
Yozuvlarni ustun bo'yicha guruhlaydi, agregirlash funksiyalari har guruhda alohida ishlaydi:
SELECT user_id, sum(score) AS yigindi FROM games GROUP BY user_id ORDER BY yigindi DESC
Ishlash tartibi: WHERE → GROUP BY → Agregirlash → ORDER BY → LIMIT
SELECT user_id, sum(score) AS yigindi FROM games WHERE score > 300 GROUP BY user_id ORDER BY yigindi DESC LIMIT 1
6. JOIN operatori — svodka hisobot yaratish
INNER JOIN (standart JOIN)
Ikki jadvalni bog'lab, svodka ma'lumot olish:
SELECT name, jins, games.score FROM games JOIN users ON games.user_id = users.rowid
Muhim: games.score — qaysi jadvaldan olishni aniq ko'rsatadi (chunki ikkala jadvalda ham score bor).
INNER JOIN faqat ikkala jadvalda ham mos kelish topilgan yozuvlarni qaytaradi.
LEFT JOIN
Asosiy jadvalning barcha yozuvlarini saqlaydi, mos topilmasa NULL qo'yadi:
SELECT name, jins, games.score FROM games LEFT JOIN users ON games.user_id = users.rowid
JOIN + agregirlash
SELECT name, jins, sum(games.score) AS ochko FROM games JOIN users ON games.user_id = users.rowid GROUP BY user_id ORDER BY ochko DESC
Bir nechta JOIN
SELECT maydonlar FROM jadval1 JOIN jadval2 ON shart1 JOIN jadval3 ON shart2
7. UNION operatori — jadvallarni birlashtirish
JOIN ustunlar bo'yicha (gorizontal), UNION satrlar bo'yicha (vertikal) birlashtiradi.
SELECT score, `from` FROM tab1 UNION SELECT val, type FROM tab2
Muhim: UNION faqat noyob yozuvlarni qoldiradi.
SELECT score, '1-jadval' AS jadval FROM tab1 UNION SELECT val, '2-jadval' FROM tab2 ORDER BY score DESC LIMIT 3
8. Ichki SQL so'rovlar
Ichki so'rov — SQL buyrug'i ichidagi yana bir SQL buyrug'i. Qavslar ichida yoziladi:
-- Moshaning bahosidan yuqori olganlar SELECT name, subject, mark FROM marks JOIN students ON students.rowid = marks.id WHERE mark > (SELECT mark FROM marks WHERE id = 2 AND subject LIKE 'Si') AND subject LIKE 'Si'
INSERT ichida
INSERT INTO ayollar SELECT * FROM students WHERE jins = 2
UPDATE ichida
UPDATE marks SET mark = 0 WHERE mark <= (SELECT min(mark) FROM marks WHERE id = 1)
DELETE ichida
DELETE FROM students WHERE old < (SELECT old FROM students WHERE id = 2)
Maslahat: Ichki so'rovlardan faqat boshqa yo'l bo'lmaganda foydalaning — ular qo'shimcha resurslarga tushadi.
9. execute, executemany, executescript, commit, rollback metodlari
execute — bitta so'rov
cur.execute("INSERT INTO cars VALUES(1,'Audi',52642)")
Shablonli so'rovlar (? belgisi)
cars = [('Audi', 52642), ('Mercedes', 57127), ('Skoda', 9000)]
cur.execute("INSERT INTO cars VALUES(NULL, ?, ?)", cars[0])
? belgisi SQL injection hujumlaridan himoya qiladi.
executemany — ko'p yozuv birdan
cur.executemany("INSERT INTO cars VALUES(NULL, ?, ?)", cars)
Nomlangan parametrlar
cur.execute("UPDATE cars SET price = :Narx WHERE model LIKE 'A%'", {'Narx': 0})
executescript — bir nechta buyruq
cur.executescript("""DELETE FROM cars WHERE model LIKE 'A%';
UPDATE cars SET price = price + 1000
""")
Buyruqlar ; bilan ajratiladi. ? shablonlar ishlatib bo'lmaydi.
commit va rollback — tranzaksiyalar
con = None
try:
con = sq.connect("mashinalar.db")
cur = con.cursor()
cur.executescript("""BEGIN;
INSERT INTO cars VALUES(NULL,'Audi',52642);
INSERT INTO cars VALUES(NULL,'Mercedes',57127);
UPDATE cars SET price = price + 1000
""")
con.commit() # Muvaffaqiyat — saqlash
except sq.Error as e:
if con: con.rollback() # Xatolik — bekor qilish
print("Xatolik yuz berdi")
finally:
if con: con.close()
rollback — MB holatini BEGIN nuqtasiga qaytaradi.
lastrowid
cur.execute("INSERT INTO cars VALUES(NULL,'Damas', 5000)")
last_id = cur.lastrowid # Oxirgi qo'shilgan yozuv ID'si
10. fetchall, fetchmany, fetchone, iterdump metodlari
Ma'lumot olish
row_factory — lug'at sifatida olish
con.row_factory = sq.Row
cur.execute("SELECT * FROM cars")
for row in cur:
print(row['model'], row['price'])
BLOB — rasmlarni saqlash
# Bazaga yozish
img = open("rasm.png", "rb").read()
binary = sq.Binary(img)
cur.execute("INSERT INTO users VALUES ('Sardor', ?, 1000)", (binary,))
# Bazadan o'qish
cur.execute("SELECT ava FROM users LIMIT 1")
img = cur.fetchone()['ava']
open("natija.png", "wb").write(img)
iterdump — zaxira nusxa
# Zaxira yaratish
with open("zaxira.sql", "w") as f:
for sql in con.iterdump():
f.write(sql)
# Zaxiradan tiklash
with open("zaxira.sql", "r") as f:
cur.executescript(f.read())
Xotirada MB
con = sq.connect(':memory:')
with con:
cur = con.cursor()
cur.execute("CREATE TABLE lugat(eng TEXT, rus TEXT)")
cur.executemany("INSERT INTO lugat VALUES(?,?)",
[("car","mashina"), ("house","uy")])
cur.execute("SELECT rus FROM lugat WHERE eng LIKE 'c%'")
print(cur.fetchall()) # [('mashina',)]
Dastur yopilganda xotiradagi ma'lumotlar yo'qoladi.
Umumiy xulosa
Bu material sizga ko'plab ilovalar uchun yetarli bo'ladi. Asosiysi — amaliyot! Har bir buyruqni o'zingiz yozib sinab ko'ring.