6-bo‘lim
WHERE - ma'lumotni filtrlash
Taqqoslash va mantiqiy operatorlar, BETWEEN, IN, LIKE, NULL bilan ishlash va shartlar tartibi.
Ushbu bo‘lim mundarijasi
WHERE - so'rovning eng muhim qismi. U qaysi qatorlar natijaga tushishini belgilaydi.
Asosiy shakl #
SELECT ism, familiya, ortacha_baho
FROM talabalar
WHERE ortacha_baho > 4.0;
+----------+-----------+--------------+
| ism | familiya | ortacha_baho |
+----------+-----------+--------------+
| Husanboy | Qodirov | 4.60 |
| Malika | Yusupova | 4.90 |
| Aziza | Tosheva | 4.10 |
| Nodira | Sobirova | 4.30 |
| Kamola | Ergasheva | 4.75 |
+----------+-----------+--------------+
Taqqoslash operatorlari #
| Operator | Ma'nosi | Misol |
|---|---|---|
= | Teng | shahar = 'Toshkent' |
<> yoki != | Teng emas | shahar <> 'Toshkent' |
> < | Katta, kichik | yosh > 20 |
>= <= | Katta/kichik yoki teng | baho >= 4.0 |
BETWEEN | Oraliqda | yosh BETWEEN 18 AND 25 |
IN | Ro'yxatda | shahar IN ('Toshkent', 'Buxoro') |
LIKE | Naqshga mos | ism LIKE 'H%' |
IS NULL | Bo'shmi | telefon IS NULL |
SELECT * FROM talabalar WHERE shahar = 'Toshkent';
SELECT * FROM talabalar WHERE ortacha_baho >= 4.5;
SELECT * FROM talabalar WHERE guruh_id <> 1;
WHERE shahar = Toshkent -- XATO: ustun deb qabul qilinadi
WHERE shahar = 'Toshkent' -- TO'G'RI
SQL da matn uchun bir tirnoq ishlatiladi. Qo'shtirnoq ham ishlaydi, lekin standart - bir tirnoq.
Matn ichida tirnoq bo'lsa, uni ikkilantiring:
WHERE shahar = 'O''zbekiston'
Mantiqiy operatorlar #
-- AND: ikkalasi ham bajarilsin
SELECT * FROM talabalar
WHERE shahar = 'Toshkent' AND ortacha_baho > 3.5;
-- OR: kamida bittasi
SELECT * FROM talabalar
WHERE shahar = 'Toshkent' OR shahar = 'Samarqand';
-- NOT: inkor
SELECT * FROM talabalar
WHERE NOT shahar = 'Toshkent';
-- Birgalikda - qavslar bilan
SELECT * FROM talabalar
WHERE (shahar = 'Toshkent' OR shahar = 'Samarqand')
AND ortacha_baho >= 4.0;
-- Kutilgan: Toshkent yoki Samarqanddagi a'lochilar
WHERE shahar = 'Toshkent' OR shahar = 'Samarqand' AND ortacha_baho >= 4.0
-- Aslida bajariladi: AND ustunligi yuqori
WHERE shahar = 'Toshkent' OR (shahar = 'Samarqand' AND ortacha_baho >= 4.0)
Natijada Toshkentdagi barcha talabalar tushib qoladi - bahosidan qat'i nazar.
AND ustunligi OR dan yuqori. Shubha bo'lsa - qavs qo'ying.
BETWEEN #
-- Oraliq (chegaralar KIRADI)
SELECT * FROM talabalar WHERE ortacha_baho BETWEEN 3.5 AND 4.5;
-- Bu bilan bir xil
SELECT * FROM talabalar WHERE ortacha_baho >= 3.5 AND ortacha_baho <= 4.5;
-- Sanalar bilan
SELECT * FROM buyurtmalar
WHERE yaratilgan BETWEEN '2026-01-01' AND '2026-03-31';
-- Inkor
SELECT * FROM talabalar WHERE ortacha_baho NOT BETWEEN 3.0 AND 4.0;
BETWEEN tuzog'i-- Bu 31-mart soat 00:00:00 gacha oladi!
WHERE yaratilgan BETWEEN '2026-01-01' AND '2026-03-31'
DATETIME ustunida '2026-03-31' aslida '2026-03-31 00:00:00' degani.
31-mart kunidagi yozuvlar tushib qoladi.
To'g'ri yozuv:
WHERE yaratilgan >= '2026-01-01'
AND yaratilgan < '2026-04-01'
IN #
SELECT * FROM talabalar
WHERE shahar IN ('Toshkent', 'Samarqand', 'Buxoro');
-- Bu bilan bir xil, lekin ancha qisqa
SELECT * FROM talabalar
WHERE shahar = 'Toshkent' OR shahar = 'Samarqand' OR shahar = 'Buxoro';
-- Inkor
SELECT * FROM talabalar WHERE guruh_id NOT IN (1, 2);
-- Ichki so'rov bilan (12-bo'limda batafsil)
SELECT * FROM talabalar
WHERE guruh_id IN (SELECT id FROM guruhlar WHERE yil = 2026);
LIKE - naqsh bo'yicha qidiruv #
| Belgi | Ma'nosi |
|---|---|
% | Istalgan miqdordagi belgi (0 ta ham) |
_ | Aynan bitta belgi |
-- "H" bilan boshlanadi
SELECT * FROM talabalar WHERE ism LIKE 'H%';
-- "ova" bilan tugaydi
SELECT * FROM talabalar WHERE familiya LIKE '%ova';
-- Ichida "qod" bor
SELECT * FROM talabalar WHERE familiya LIKE '%qod%';
-- Aynan 5 ta belgi
SELECT * FROM talabalar WHERE ism LIKE '_____';
-- Ikkinchi harfi "a"
SELECT * FROM talabalar WHERE ism LIKE '_a%';
-- Inkor
SELECT * FROM talabalar WHERE email NOT LIKE '%@example.uz';
LIKE '%matn%' indeksni ishlatmaydiWHERE ism LIKE 'Hus%' -- indeks ISHLAYDI (tez)
WHERE ism LIKE '%boy' -- indeks ISHLAMAYDI (butun jadval o'qiladi)
WHERE ism LIKE '%san%' -- indeks ISHLAMAYDI
Sabab: indeks alifbo tartibida saralangan. "Hus" bilan boshlanadiganlarni topish oson, lekin "ichida san bor" ni topish uchun hammasini tekshirish kerak.
Katta jadvallarda matn qidiruvi uchun FULLTEXT indeks yoki
Elasticsearch kabi maxsus vositalar ishlatiladi.
MySQL da utf8mb4_unicode_ci solishtirish bilan LIKE registrga sezgir emas:
WHERE ism LIKE 'h%' -- "Husanboy" ni ham topadi
_ci = case insensitive. Agar registr muhim bo'lsa, BINARY ishlating:
WHERE BINARY ism LIKE 'h%'
NULL bilan ishlash #
-- Telefon kiritilmaganlar
SELECT * FROM talabalar WHERE telefon IS NULL;
-- Telefon kiritilganlar
SELECT * FROM talabalar WHERE telefon IS NOT NULL;
NULL ni = bilan solishtirib bo'lmaydiWHERE telefon = NULL -- HECH QACHON rost bo'lmaydi
WHERE telefon <> NULL -- bu ham
WHERE telefon IS NULL -- TO'G'RI
Sabab: NULL "noma'lum" degani. "Noma'lum qiymat noma'lum qiymatga tengmi?"
degan savolga javob ham noma'lum - ya'ni NULL, TRUE emas.
-- NULL ni almashtirish
SELECT
ism,
IFNULL(telefon, 'kiritilmagan') AS telefon,
COALESCE(telefon, email, 'aloqa yo''q') AS aloqa
FROM talabalar;
+----------+---------------+------------------+
| ism | telefon | aloqa |
+----------+---------------+------------------+
| Husanboy | +998901234567 | +998901234567 |
| Aziza | kiritilmagan | [email protected] |
+----------+---------------+------------------+
COALESCE - birinchi bo'sh bo'lmagan qiymatCOALESCE(a, b, c, 'standart')
U chapdan o'ngga tekshirib, birinchi NULL bo'lmagan qiymatni qaytaradi.
IFNULL faqat ikkita argument oladi, COALESCE esa cheksiz.
Sana bo'yicha filtrlash #
-- Aniq sana
SELECT * FROM buyurtmalar WHERE DATE(yaratilgan) = '2026-09-09';
-- Bugungi
SELECT * FROM buyurtmalar WHERE DATE(yaratilgan) = CURDATE();
-- Oxirgi 7 kun
SELECT * FROM buyurtmalar
WHERE yaratilgan >= DATE_SUB(NOW(), INTERVAL 7 DAY);
-- Joriy oy
SELECT * FROM buyurtmalar
WHERE YEAR(yaratilgan) = YEAR(CURDATE())
AND MONTH(yaratilgan) = MONTH(CURDATE());
-- 2000-yildan keyin tug'ilganlar
SELECT * FROM talabalar WHERE tugilgan_sana >= '2000-01-01';
-- SEKIN: indeks ishlamaydi
WHERE YEAR(yaratilgan) = 2026
-- TEZ: indeks ishlaydi
WHERE yaratilgan >= '2026-01-01' AND yaratilgan < '2027-01-01'
Ustun ustida funksiya bo'lsa, baza har bir qator uchun uni hisoblashi kerak - indeksdan foydalana olmaydi. Bu eng ko'p uchraydigan sekinlik sababi.
Amaliy misollar #
-- Toshkentdagi a'lochilar
SELECT CONCAT(ism, ' ', familiya) AS talaba, ortacha_baho
FROM talabalar
WHERE shahar = 'Toshkent' AND ortacha_baho >= 4.0;
-- Aloqa ma'lumoti to'liq bo'lmaganlar
SELECT ism, familiya, email
FROM talabalar
WHERE telefon IS NULL OR telefon = '';
-- Ma'lum guruhlardagi faol talabalar
SELECT ism, familiya, guruh_id
FROM talabalar
WHERE guruh_id IN (1, 2) AND faolmi = TRUE
ORDER BY ortacha_baho DESC;
-- "ova" bilan tugaydigan familiyali, 4 dan yuqori baholilar
SELECT ism, familiya, ortacha_baho
FROM talabalar
WHERE familiya LIKE '%ova' AND ortacha_baho > 4.0;
-- Bu oyda ro'yxatdan o'tganlar
SELECT ism, familiya, yaratilgan
FROM talabalar
WHERE yaratilgan >= DATE_FORMAT(CURDATE(), '%Y-%m-01');
-- Murakkab shart
SELECT ism, familiya, shahar, ortacha_baho
FROM talabalar
WHERE (shahar IN ('Toshkent', 'Samarqand') AND ortacha_baho >= 4.0)
OR (shahar NOT IN ('Toshkent', 'Samarqand') AND ortacha_baho >= 3.5)
ORDER BY shahar, ortacha_baho DESC;
Filtr samaradorligi #
| Yomon | Yaxshi | Sabab |
|---|---|---|
WHERE YEAR(sana) = 2026 | WHERE sana >= '2026-01-01' AND sana < '2027-01-01' | Indeks ishlaydi |
WHERE narx * 1.12 > 100 | WHERE narx > 100 / 1.12 | Ustun toza qoladi |
WHERE ism LIKE '%ali%' | WHERE ism LIKE 'ali%' | Indeks ishlaydi |
WHERE UPPER(email) = '[email protected]' | WHERE email = '[email protected]' | _ci solishtirish allaqachon registrga sezgir emas |
Umumiy qoida: ustunni chap tomonda toza qoldiring.
kutubxona bazasida quyidagi so'rovlarni yozing:
- 2000-yildan keyin chop etilgan kitoblar.
- Narxi 50 000 dan 150 000 gacha bo'lgan kitoblar (
BETWEEN). - Nomi "A" harfi bilan boshlanadigan kitoblar.
- Narxi kiritilmagan kitoblar (
IS NULL). - Ma'lum uch janrdagi kitoblar (
IN). - 300 sahifadan ko'p va mavjud bo'lgan kitoblar.
- 1990-yilgacha yoki 2020-yildan keyingi kitoblar.
COALESCEbilan narx ko'rsatilmaganda "Kelishilgan" deb chiqaring.WHERE YEAR(...)va sana oralig'i variantlariniEXPLAINbilan taqqoslang.
Xulosa #
WHEREqaysi qatorlar natijaga tushishini belgilaydi.- Matn qiymatlari bir tirnoq ichida yoziladi.
ANDustunligiORdan yuqori - aralashtirganda qavs qo'ying.BETWEENchegaralarni o'z ichiga oladi;DATETIMEbilan ehtiyot bo'ling.INuzunORzanjirini qisqartiradi.LIKE '%matn%'indeksni ishlatmaydi - katta jadvallarda sekin.NULLfaqatIS NULLbilan tekshiriladi,=bilan emas.- Ustunga funksiya qo'llash (
YEAR(sana)) indeksni buzadi - shartni qayta yozing.
Keyingi bo'limda natijani saralash va cheklashni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.