MySQL / WHERE нөхцөл

WHERE нөхцөл

WHERE нь SELECT, UPDATE, DELETE командуудад нөхцөл тавьж, шүүх өгөгдлийг тодорхойлно. Зөв WHERE бичих нь MySQL-ийн хамгийн чухал ур чадваруудын нэг.

Харьцуулах операторууд

sql
SELECT * FROM products WHERE price = 4990.00;   -- тэнцүү
SELECT * FROM products WHERE price != 4990.00;  -- тэнцүү биш
SELECT * FROM products WHERE price <> 4990.00;  -- тэнцүү биш (ижил утга)
SELECT * FROM products WHERE price >  10000;    -- их
SELECT * FROM products WHERE price <  10000;    -- бага
SELECT * FROM products WHERE price >= 4990.00;  -- их буюу тэнцүү
SELECT * FROM products WHERE price <= 29900.00; -- бага буюу тэнцүү

Текст утгатай харьцуулах:

sql
SELECT * FROM users WHERE name = 'Болд Батбаяр';

MySQL-д текст харьцуулалт анхдагчаар case-insensitive — жижиг/том үсгийг ялгахгүй:

sql
SELECT * FROM users WHERE name = 'болд батбаяр';  -- ижил үр дүн

BETWEEN — хүрээнд байгаа эсэх

sql
SELECT * FROM products
WHERE price BETWEEN 5000 AND 50000;
код
+----+--------------------+----------+
| id | name               | price    |
+----+--------------------+----------+
|  2 | Bluetooth чихэвч   | 29900.00 |
+----+--------------------+----------+

BETWEEN a AND b нь >= a AND <= b-тэй яг адил — хязгаарын утгуудыг оруулна.

Огноотой ашиглах:

sql
SELECT * FROM orders
WHERE created_at BETWEEN '2024-01-01' AND '2024-12-31';

IN — жагсаалтаас нэг нь байгаа эсэх

sql
SELECT * FROM products
WHERE id IN (1, 3, 4);
код
+----+--------------------+----------+------+
| id | name               | price    | stock|
+----+--------------------+----------+------+
|  1 | Утасны дэр         |  4990.00 |   50 |
|  3 | Цэнэглэгч кабель   |  1990.00 |  100 |
|  4 | Ухаалаг цаг        | 89900.00 |   10 |
+----+--------------------+----------+------+

Текстийн жагсаалт:

sql
SELECT * FROM users
WHERE name IN ('Болд Батбаяр', 'Мөнх Эрдэнэ');

NOT IN — жагсаалтад байхгүй мөрүүдийг авах:

sql
SELECT * FROM products
WHERE id NOT IN (2, 4);

LIKE — загвараар хайх

LIKE нь текст хайхад ашиглагдах бөгөөд хоёр тусгай тэмдэгт ашиглана.

% — ямар ч тооны тэмдэгт

sql
-- "Б"-ээр эхэлдэг
SELECT * FROM users WHERE name LIKE 'Б%';

-- "@example.com"-р төгсдөг
SELECT * FROM users WHERE email LIKE '%@example.com';

-- Дунд нь "чихэ" агуулсан
SELECT * FROM products WHERE name LIKE '%чихэ%';

_ — яг нэг тэмдэгт

sql
-- "Б" + яг нэг тэмдэгт + "лд": "Болд", "Булд"
SELECT * FROM users WHERE name LIKE 'Б_лд';

-- 4 тэмдэгттэй нэр
SELECT * FROM users WHERE name LIKE '____';

Хослуулан ашиглах

sql
-- "gmail.com" имэйлтэй хэрэглэгчид
SELECT * FROM users WHERE email LIKE '%@gmail.com';

-- "001"-ээр дуусдаг SKU
SELECT * FROM products WHERE sku LIKE '%001';

NOT LIKE — загварт таарахгүй мөрүүд:

sql
SELECT * FROM users WHERE email NOT LIKE '%@example.com';

Гүйцэтгэлийн тэмдэглэл: % эхэнд байвал (LIKE '%утга') индексийг ашиглахгүй тул том хүснэгтэд удаан ажиллана.


NULL шалгах

NULL бол "утга байхгүй" гэсэн тусгай төлөв — 0 эсвэл хоосон мөр биш. NULL-тэй = харьцуулалт хийж болохгүй.

sql
-- Буруу — үр дүн гарахгүй
SELECT * FROM users WHERE phone = NULL;

-- Зөв
SELECT * FROM users WHERE phone IS NULL;
SELECT * FROM users WHERE phone IS NOT NULL;

IS NULL жишээ

sql
-- Утасны дугаар оруулаагүй хэрэглэгчид
SELECT name, email
FROM users
WHERE phone IS NULL;

IS NOT NULL жишээ

sql
-- Утасны дугаартай хэрэглэгчид
SELECT name, phone
FROM users
WHERE phone IS NOT NULL;

AND, OR, NOT — логик операторууд

AND — хоёр нөхцөл хоёулаа биелэх ёстой

sql
SELECT * FROM products
WHERE price > 5000
  AND stock > 0;

OR — аль нэг нөхцөл биелэхэд хангалттай

sql
SELECT * FROM products
WHERE price < 2000
   OR price > 80000;

NOT — нөхцөлийг эсэргүүцэх

sql
SELECT * FROM products
WHERE NOT is_active = TRUE;

-- эсвэл
SELECT * FROM products
WHERE is_active = FALSE;

Хосолсон нөхцөл

AND нь OR-оос өндөр давуу эрхтэй — буруу үр дүн гарахаас сэргийлж хаалт ашиглах нь зүйтэй.

sql
-- Анхааруулга: AND эхэлж биелнэ
SELECT * FROM products
WHERE price < 2000 OR price > 50000 AND stock > 5;
--   ↑ (price > 50000 AND stock > 5) OR (price < 2000) гэж ажиллана

-- Зөв хаалт ашигласан
SELECT * FROM products
WHERE (price < 2000 OR price > 50000) AND stock > 5;

Нарийн нөхцөлтэй жишээ

sql
-- 5,000-аас 30,000 хүртэл үнэтэй, нөөцтэй барааны нэр ба үнэ
SELECT name, price, stock
FROM products
WHERE price BETWEEN 5000 AND 30000
  AND stock > 0
  AND is_active = TRUE;
sql
-- "gmail" эсвэл "yahoo" имэйлтэй хэрэглэгчид
SELECT name, email
FROM users
WHERE email LIKE '%@gmail.com'
   OR email LIKE '%@yahoo.com';
sql
-- Утасны дугааргүй, 2024 оноос хойш нэгдсэн хэрэглэгчид
SELECT name, email, created_at
FROM users
WHERE phone IS NULL
  AND created_at >= '2024-01-01';

Дараагийн хичээлд:

ORDER BY болон LIMIT — үр дүнг эрэмбэлэх, тоог хязгаарлах, pagination хийх аргуудыг үзнэ.