PostgreSQL / WHERE нөхцөл

WHERE нөхцөл

Өгөгдлийн санд мянга мянган бичлэг байхад бүгдийг нэг дор унших хэрэггүй — зөвхөн хэрэгтэйгээ шүүж авах хэрэгтэй. WHERE нь яг тэр үүргийг гүйцэтгэдэг. SELECT, UPDATE, DELETE командуудтай хамт ашиглагддаг PostgreSQL-ийн хамгийн чухал хэрэгсэлүүдийн нэг юм.

Үндсэн WHERE хэлбэр

sql
SELECT багана1, багана2
FROM хүснэгт
WHERE нөхцөл;

Жишээ — 25-аас дээш настай хэрэглэгчдийг унших:

sql
SELECT нэр, нас FROM users WHERE нас > 25;
код
      нэр      | нас
---------------+-----
 Ганбаяр Лхам  |  30
 Оюунаа Энх    |  27

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

| Оператор | Утга | |----------|------| | = | тэнцүү | | <> эсвэл != | тэнцүү биш | | > | их | | < | бага | | >= | их буюу тэнцүү | | <= | бага буюу тэнцүү |

sql
-- Яг тохирох утга
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 ашиглана:

sql
-- AND — хоёр нөхцөл хоёулаа биелэх ёстой
SELECT * FROM users
WHERE нас >= 20 AND нас <= 30;

-- OR — аль нэг нөхцөл биелэх ёстой
SELECT * FROM users
WHERE нас < 20 OR нас > 40;

-- NOT — нөхцөлийг эсрэгээр нь хялгах
SELECT * FROM users
WHERE NOT (нас = 25);

Олон нөхцөл хослуулахад хаалт ашиглах нь тодорхой ойлгомжтой:

sql
SELECT * FROM orders
WHERE (статус = 'pending' OR статус = 'processing')
  AND нийт_үнэ > 50000;

BETWEEN — хүрээний нөхцөл

Тоо, огноо хоёрын хооронд шүүхэд BETWEEN ашиглана:

sql
-- 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 ашиглавал товч, ойлгомжтой:

sql
-- Урт хувилбар
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 ашиглана:

| Тэмдэг | Утга | |--------|------| | % | Ямар ч тооны тэмдэгт (тэр дундаа тэг) | | _ | Яг нэг тэмдэгт |

sql
-- "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-д онцгой):

sql
SELECT * FROM users WHERE имэйл ILIKE '%GMAIL%';

Огноогоор шүүх

sql
-- Өнөөдрийн бичлэгүүд
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;

Жишээ: нийлмэл нөхцөл

Дараах хүснэгтэд практик хийе:

sql
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-ээр хуудасчлал хийж сурна.