SELECT — WHERE, AND, OR, NOT, BETWEEN, IN, LIKE, IS NULL

~20 daq · MySQL · DML — Ma'lumot Boshqarish

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 dokon bazasida. 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 — FULLTEXT indeks (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 sanang
  • AND + OR — doim qavs bilan
  • BETWEEN chegaralarni o'z ichiga oladi; sanalar uchun >= va <
  • IN (...) — ro'yxat; LIKE — % va _ naqshlari
  • NULL ni faqat IS NULL / IS NOT NULL bilan tekshiring
  • WHERE da SELECT taxalluslari ishlamaydi

Keyingi dars

11-dars: ORDER BY, LIMIT, OFFSET — saralash va sahifalash