WHERE нөхцөл
Өгөгдлийн санд мянга мянган бичлэг байхад бүгдийг нэг дор унших хэрэггүй — зөвхөн хэрэгтэйгээ шүүж авах хэрэгтэй. WHERE нь яг тэр үүргийг гүйцэтгэдэг. SELECT, UPDATE, DELETE командуудтай хамт ашиглагддаг PostgreSQL-ийн хамгийн чухал хэрэгсэлүүдийн нэг юм.
Үндсэн WHERE хэлбэр
SELECT багана1, багана2
FROM хүснэгт
WHERE нөхцөл;
Жишээ — 25-аас дээш настай хэрэглэгчдийг унших:
SELECT нэр, нас FROM users WHERE нас > 25;
нэр | нас
---------------+-----
Ганбаяр Лхам | 30
Оюунаа Энх | 27
Харьцуулах операторууд
| Оператор | Утга |
|----------|------|
| = | тэнцүү |
| <> эсвэл != | тэнцүү биш |
| > | их |
| < | бага |
| >= | их буюу тэнцүү |
| <= | бага буюу тэнцүү |
-- Яг тохирох утга
SELECT * FROM users WHERE нас = 25;
-- Тэнцүү биш
SELECT * FROM users WHERE нас <> 25;
-- Хоосон биш
SELECT * FROM users WHERE тайлбар IS NOT NULL;
-- Хоосон
SELECT * FROM posts WHERE агуулга IS NULL;
AND, OR, NOT — логик операторууд
Олон нөхцөлийг хослуулахад AND, OR, NOT ашиглана:
-- AND — хоёр нөхцөл хоёулаа биелэх ёстой
SELECT * FROM users
WHERE нас >= 20 AND нас <= 30;
-- OR — аль нэг нөхцөл биелэх ёстой
SELECT * FROM users
WHERE нас < 20 OR нас > 40;
-- NOT — нөхцөлийг эсрэгээр нь хялгах
SELECT * FROM users
WHERE NOT (нас = 25);
Олон нөхцөл хослуулахад хаалт ашиглах нь тодорхой ойлгомжтой:
SELECT * FROM orders
WHERE (статус = 'pending' OR статус = 'processing')
AND нийт_үнэ > 50000;
BETWEEN — хүрээний нөхцөл
Тоо, огноо хоёрын хооронд шүүхэд BETWEEN ашиглана:
-- 20-30 насны хэрэглэгчид (20 ба 30-г оролцуулан)
SELECT * FROM users WHERE нас BETWEEN 20 AND 30;
-- Тодорхой огнооны мужид
SELECT * FROM orders
WHERE үүсгэсэн BETWEEN '2024-01-01' AND '2024-12-31';
BETWEEN a AND b нь a <= утга AND утга <= b-тэй адилхан — хоёр хязгаарыг хоёуланг нь оролцуулдаг.
IN — жагсаалтаас шүүх
Олон OR бичихийн оронд IN ашиглавал товч, ойлгомжтой:
-- Урт хувилбар
SELECT * FROM users
WHERE нас = 20 OR нас = 25 OR нас = 30;
-- IN ашигласан товч хувилбар
SELECT * FROM users
WHERE нас IN (20, 25, 30);
-- Текст утгуудад
SELECT * FROM products
WHERE ангилал IN ('электроник', 'хувцас', 'гэр ахуй');
-- NOT IN — жагсаалтад байхгүй
SELECT * FROM users
WHERE статус NOT IN ('хаагдсан', 'устгагдсан');
LIKE — текст хайх
Текст доторх хэсгийг хайхад LIKE ашиглана:
| Тэмдэг | Утга |
|--------|------|
| % | Ямар ч тооны тэмдэгт (тэр дундаа тэг) |
| _ | Яг нэг тэмдэгт |
-- "Bold" гэсэн үгээр эхэлсэн нэрүүд
SELECT * FROM users WHERE нэр LIKE 'Болд%';
-- "@gmail.com"-ээр төгсөх имэйлүүд
SELECT * FROM users WHERE имэйл LIKE '%@gmail.com';
-- Дунд нь "аяр" агуулсан
SELECT * FROM users WHERE нэр LIKE '%аяр%';
-- Яг 4 тэмдэгттэй нэр
SELECT * FROM users WHERE нэр LIKE '____';
Жижиг/том үсгийг ялгахгүй хайхад ILIKE ашиглана (PostgreSQL-д онцгой):
SELECT * FROM users WHERE имэйл ILIKE '%GMAIL%';
Огноогоор шүүх
-- Өнөөдрийн бичлэгүүд
SELECT * FROM posts
WHERE DATE(нийтлэгдсэн) = CURRENT_DATE;
-- Сүүлийн 7 хоногт үүссэн
SELECT * FROM orders
WHERE үүсгэсэн >= NOW() - INTERVAL '7 days';
-- Тодорхой сар
SELECT * FROM orders
WHERE EXTRACT(MONTH FROM үүсгэсэн) = 3
AND EXTRACT(YEAR FROM үүсгэсэн) = 2024;
Жишээ: нийлмэл нөхцөл
Дараах хүснэгтэд практик хийе:
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
нэр TEXT NOT NULL,
ангилал TEXT NOT NULL,
үнэ NUMERIC(10,2) NOT NULL,
нөөц INTEGER DEFAULT 0,
идэвхтэй BOOLEAN DEFAULT TRUE
);
-- Идэвхтэй, нөөцтэй, 10000-100000₮ хооронд байгаа бараа
SELECT нэр, ангилал, үнэ
FROM products
WHERE идэвхтэй = TRUE
AND нөөц > 0
AND үнэ BETWEEN 10000 AND 100000
AND ангилал NOT IN ('устгагдсан', 'архив');
Дараагийн хичээлд:
ORDER BY ашиглан үр дүнг эрэмбэлэх, LIMIT ба OFFSET-ээр хуудасчлал хийж сурна.