6-bo‘lim

WHERE - ma'lumotni filtrlash

Taqqoslash va mantiqiy operatorlar, BETWEEN, IN, LIKE, NULL bilan ishlash va shartlar tartibi.

🕑 13 daqiqa o‘qish 📄 606 so‘z 👁 6 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Asosiy shakl
  2. Taqqoslash operatorlari
  3. Mantiqiy operatorlar
  4. BETWEEN
  5. IN
  6. LIKE - naqsh bo'yicha qidiruv
  7. NULL bilan ishlash
  8. Sana bo'yicha filtrlash
  9. Amaliy misollar
  10. Filtr samaradorligi
  11. Xulosa

WHERE - so'rovning eng muhim qismi. U qaysi qatorlar natijaga tushishini belgilaydi.

Asosiy shakl #

SQL
SELECT ism, familiya, ortacha_baho
FROM talabalar
WHERE ortacha_baho > 4.0;
Natija
+----------+-----------+--------------+
| 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 #

OperatorMa'nosiMisol
=Tengshahar = 'Toshkent'
<> yoki !=Teng emasshahar <> 'Toshkent'
> <Katta, kichikyosh > 20
>= <=Katta/kichik yoki tengbaho >= 4.0
BETWEENOraliqdayosh BETWEEN 18 AND 25
INRo'yxatdashahar IN ('Toshkent', 'Buxoro')
LIKENaqshga mosism LIKE 'H%'
IS NULLBo'shmitelefon IS NULL
SQL
SELECT * FROM talabalar WHERE shahar = 'Toshkent';
SELECT * FROM talabalar WHERE ortacha_baho >= 4.5;
SELECT * FROM talabalar WHERE guruh_id <> 1;
Matn qiymatlari tirnoq ichida
SQL
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:

SQL
WHERE shahar = 'O''zbekiston'

Mantiqiy operatorlar #

SQL
-- 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;
Qavslarni unutmang
SQL
-- 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 #

SQL
-- 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;
Sanalar bilan BETWEEN tuzog'i
SQL
-- 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:

SQL
WHERE yaratilgan >= '2026-01-01'
  AND yaratilgan <  '2026-04-01'

IN #

SQL
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 #

BelgiMa'nosi
%Istalgan miqdordagi belgi (0 ta ham)
_Aynan bitta belgi
SQL
-- "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 ishlatmaydi
SQL
WHERE 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.

Registrga sezgirlik

MySQL da utf8mb4_unicode_ci solishtirish bilan LIKE registrga sezgir emas:

SQL
WHERE ism LIKE 'h%'     -- "Husanboy" ni ham topadi

_ci = case insensitive. Agar registr muhim bo'lsa, BINARY ishlating:

SQL
WHERE BINARY ism LIKE 'h%'

NULL bilan ishlash #

SQL
-- Telefon kiritilmaganlar
SELECT * FROM talabalar WHERE telefon IS NULL;

-- Telefon kiritilganlar
SELECT * FROM talabalar WHERE telefon IS NOT NULL;
NULL ni = bilan solishtirib bo'lmaydi
SQL
WHERE 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.

SQL
-- NULL ni almashtirish
SELECT
    ism,
    IFNULL(telefon, 'kiritilmagan')            AS telefon,
    COALESCE(telefon, email, 'aloqa yo''q')    AS aloqa
FROM talabalar;
Natija
+----------+---------------+------------------+
| ism      | telefon       | aloqa            |
+----------+---------------+------------------+
| Husanboy | +998901234567 | +998901234567    |
| Aziza    | kiritilmagan  | [email protected] |
+----------+---------------+------------------+
COALESCE - birinchi bo'sh bo'lmagan qiymat
SQL
COALESCE(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 #

SQL
-- 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';
Ustunga funksiya qo'llash indeksni buzadi
SQL
-- 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 #

SQL
-- 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 #

Shartlarni to'g'ri yozish
YomonYaxshiSabab
WHERE YEAR(sana) = 2026WHERE sana >= '2026-01-01' AND sana < '2027-01-01'Indeks ishlaydi
WHERE narx * 1.12 > 100WHERE narx > 100 / 1.12Ustun 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.

Amaliy topshiriq

kutubxona bazasida quyidagi so'rovlarni yozing:

  1. 2000-yildan keyin chop etilgan kitoblar.
  2. Narxi 50 000 dan 150 000 gacha bo'lgan kitoblar (BETWEEN).
  3. Nomi "A" harfi bilan boshlanadigan kitoblar.
  4. Narxi kiritilmagan kitoblar (IS NULL).
  5. Ma'lum uch janrdagi kitoblar (IN).
  6. 300 sahifadan ko'p va mavjud bo'lgan kitoblar.
  7. 1990-yilgacha yoki 2020-yildan keyingi kitoblar.
  8. COALESCE bilan narx ko'rsatilmaganda "Kelishilgan" deb chiqaring.
  9. WHERE YEAR(...) va sana oralig'i variantlarini EXPLAIN bilan taqqoslang.

Xulosa #

  • WHERE qaysi qatorlar natijaga tushishini belgilaydi.
  • Matn qiymatlari bir tirnoq ichida yoziladi.
  • AND ustunligi OR dan yuqori - aralashtirganda qavs qo'ying.
  • BETWEEN chegaralarni o'z ichiga oladi; DATETIME bilan ehtiyot bo'ling.
  • IN uzun OR zanjirini qisqartiradi.
  • LIKE '%matn%' indeksni ishlatmaydi - katta jadvallarda sekin.
  • NULL faqat IS NULL bilan tekshiriladi, = bilan emas.
  • Ustunga funksiya qo'llash (YEAR(sana)) indeksni buzadi - shartni qayta yozing.

Keyingi bo'limda natijani saralash va cheklashni o'rganamiz.

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.