SELECT — WHERE, AND, OR, NOT, BETWEEN, IN, LIKE, IS NULL
Muammodan boshlaylik
Bazada ma'lumot bor. Endi savollar:
- "Toshkentlik mijozlar kimlar?"
- "1 milliondan arzon telefonlar qaysilar?"
- "Telefon raqamini kiritmagan mijozlar?"
- "Nomida 'Pro' so'zi bor mahsulotlar?"
Ma'lumotni o'qish — SELECT. Kerakli qatorlarni ajratib olish — WHERE. Bu ikkalasi SQL da eng ko'p yoziladigan buyruqlar.
[!INFO] Misollar 5-darsdagi
dokonbazasida. Agar hali yaratmagan bo'lsangiz — o'sha darsdagi skriptni ishga tushiring.
SELECT asoslari
SELECT * FROM mahsulotlar; -- barcha ustunlar
SELECT nom, narx FROM mahsulotlar; -- faqat kerakli ustunlar
* dan qoching
Ilova kodida SELECT * yozmang:
- Keraksiz ustunlar (masalan, katta
TEXT) tarmoq orqali tashiladi - Jadvalga yangi ustun qo'shilsa — natija kutilmaganda o'zgaradi
- Indeksdan to'liq foydalanib bo'lmaydi (34-dars)
* — faqat terminalda tezda qarash uchun.
Taxallus (alias) — AS
SELECT nom AS mahsulot, narx AS "narx (so'm)" FROM mahsulotlar;
Hisoblangan ustunlar
SELECT
nom,
narx,
soni,
narx * soni AS ombordagi_qiymat,
ROUND(narx * 1.12) AS qqs_bilan
FROM mahsulotlar;
Ustun jadvalda yo'q — u har bir qator uchun hisoblanadi.
DISTINCT — takrorlanmaslar
SELECT DISTINCT shahar FROM mijozlar;
-- Toshkent, Samarqand, Buxoro — har biri bir marta
WHERE — filtrlash
SELECT nom, narx FROM mahsulotlar WHERE narx < 1000000;
MySQL har bir qatorni tekshiradi va shart TRUE bo'lganlarini qaytaradi.
Taqqoslash operatorlari
| Operator | Ma'nosi |
|---|---|
= |
Teng (bitta =, dasturlash tillaridagi == emas!) |
<> yoki != |
Teng emas |
<, >, <=, >= |
Kichik, katta |
SELECT * FROM mijozlar WHERE shahar = 'Toshkent';
SELECT * FROM buyurtmalar WHERE holat <> 'bekor';
SELECT * FROM buyurtmalar WHERE yaratilgan >= '2026-10-01';
Matnni solishtirish standart collation da harfga sezgir emas: 'toshkent' ham topadi.
AND, OR, NOT
-- Ikkalasi ham bajarilsin
SELECT nom, narx, soni FROM mahsulotlar
WHERE toifa_id = 1 AND narx < 5000000;
-- Kamida bittasi
SELECT ism, shahar FROM mijozlar
WHERE shahar = 'Samarqand' OR shahar = 'Buxoro';
-- Teskarisi
SELECT * FROM buyurtmalar WHERE NOT holat = 'bekor';
Qavslar — majburiy odat
-- ❌ Kutilgan natija emas
SELECT * FROM mahsulotlar
WHERE toifa_id = 1 OR toifa_id = 2 AND narx < 5000000;
AND ning ustuvorligi OR dan yuqori. MySQL buni shunday o'qiydi:
toifa_id = 1 OR (toifa_id = 2 AND narx < 5000000)
Ya'ni barcha telefonlar (narxidan qat'i nazar) + arzon noutbuklar. To'g'risi:
SELECT * FROM mahsulotlar
WHERE (toifa_id = 1 OR toifa_id = 2) AND narx < 5000000;
Qoida: AND va OR bir shartda bo'lsa — doim qavs qo'ying.
BETWEEN — oraliq
SELECT nom, narx FROM mahsulotlar
WHERE narx BETWEEN 1000000 AND 5000000;
-- narx >= 1000000 AND narx <= 5000000 bilan bir xil (chegaralar kiradi)
Sanalar bilan tuzoq:
-- ❌ 31-oktabr soat 00:00:00 dan keyingi buyurtmalar kirmaydi!
SELECT * FROM buyurtmalar
WHERE yaratilgan BETWEEN '2026-10-01' AND '2026-10-31';
-- ✅ Yarim ochiq oraliq
SELECT * FROM buyurtmalar
WHERE yaratilgan >= '2026-10-01' AND yaratilgan < '2026-11-01';
'2026-10-31' — bu 2026-10-31 00:00:00. Shu kuni soat 15:00 dagi buyurtma chegaradan tashqarida qoladi. DATETIME uchun doim >= va < ishlating.
IN — ro'yxatdan biri
SELECT ism, shahar FROM mijozlar
WHERE shahar IN ('Samarqand', 'Buxoro', 'Xiva');
SELECT * FROM buyurtmalar WHERE holat NOT IN ('bekor', 'yangi');
Uzun OR zanjiridan qisqa va o'qishli.
LIKE — naqsh bo'yicha qidiruv
| Belgi | Ma'nosi |
|---|---|
% |
Istalgan sondagi istalgan belgilar (nol ham) |
_ |
Aynan bitta istalgan belgi |
SELECT nom FROM mahsulotlar WHERE nom LIKE 'Samsung%'; -- "Samsung" bilan boshlanadi
SELECT nom FROM mahsulotlar WHERE nom LIKE '%Pro'; -- "Pro" bilan tugaydi
SELECT nom FROM mahsulotlar WHERE nom LIKE '%Air%'; -- ichida "Air" bor
SELECT email FROM mijozlar WHERE email LIKE '%@mail.uz';
SELECT telefon FROM mijozlar WHERE telefon LIKE '+99890%';
SELECT nom FROM mahsulotlar WHERE nom LIKE '_Phone%'; -- 2-harfdan "Phone"
[!WARNING]
LIKE '%so'z%'(boshida%) indeksdan foydalana olmaydi — MySQL har bir qatorni ko'rib chiqadi. Million qatorda bu sekin. Katta matnlarda qidiruv uchun —FULLTEXTindeks (31-dars).
NULL bilan ishlash — eng katta tuzoq
Telefon raqami kiritilmagan mijozlarni topamiz:
SELECT ism FROM mijozlar WHERE telefon = NULL;
-- Empty set — hech narsa topilmadi!?
NULL — "noma'lum". "Noma'lum narsa noma'lum narsaga tengmi?" — javob ham noma'lum (NULL), TRUE emas. Shuning uchun = NULL hech qachon ishlamaydi.
To'g'risi:
SELECT ism FROM mijozlar WHERE telefon IS NULL; -- Jasur Toshev
SELECT ism FROM mijozlar WHERE telefon IS NOT NULL;
Yana bir tuzoq:
SELECT * FROM mahsulotlar WHERE toifa_id <> 1;
-- "Sovg'a kartasi" (toifa_id = NULL) natijada YO'Q!
NULL <> 1 → NULL → qator tashlab ketiladi. Agar NULL larni ham kerak bo'lsa:
SELECT * FROM mahsulotlar WHERE toifa_id <> 1 OR toifa_id IS NULL;
NULL uchun xavfsiz solishtirish — <=>:
SELECT NULL = NULL; -- NULL
SELECT NULL <=> NULL; -- 1
SQL ning bajarilish tartibi
SQL ni yozish tartibi:
SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...
MySQL bajarish tartibi boshqacha:
1. FROM — qaysi jadval
2. WHERE — qatorlarni filtrlash
3. SELECT — ustunlarni tanlash, hisoblash
4. ORDER BY — saralash
5. LIMIT — kesish
Shuning uchun WHERE da SELECT dagi taxallusni ishlatib bo'lmaydi:
SELECT nom, narx * soni AS qiymat FROM mahsulotlar WHERE qiymat > 10000000;
-- ERROR 1054: Unknown column 'qiymat' in 'where clause'
SELECT nom, narx * soni AS qiymat FROM mahsulotlar WHERE narx * soni > 10000000; -- ✅
WHERE bajarilayotganda SELECT hali ishlamagan — qiymat hali mavjud emas.
Nima uchun shunday?
Nima uchun SQL da NULL bunchalik g'alati ishlaydi — oddiygina "bo'sh" deb hisoblash mumkin emasmi?
Chunki NULL "bo'sh" emas, "noma'lum" degani. Mijozning telefoni NULL — u telefonsiz emas, biz uni bilmaymiz. "Jasurning telefoni Azizning telefoniga tengmi?" — agar ikkalasi ham noma'lum bo'lsa, "ha" deb javob berish yolg'on bo'lardi. SQL "uch qiymatli mantiq" ga asoslangan: TRUE, FALSE va UNKNOWN. Bu matematik jihatdan to'g'ri, lekin amalda ko'p xatolarga sabab bo'ladi — shuning uchun ustunlarni imkon qadar NOT NULL qiling.
Xulosa
Eslab qoling:
SELECT ustunlar FROM jadval WHERE shart*— faqat qo'lda ko'rish uchun; ilovada ustunlarni sanangAND+OR— doim qavs bilanBETWEENchegaralarni o'z ichiga oladi; sanalar uchun>=va<IN (...)— ro'yxat;LIKE—%va_naqshlariNULLni faqatIS NULL/IS NOT NULLbilan tekshiringWHEREdaSELECTtaxalluslari ishlamaydi
Keyingi dars
11-dars: ORDER BY, LIMIT, OFFSET — saralash va sahifalash