# SQL WHERE — shart bo'yicha filtrlash

> SQL WHERE bilan qatorlarni filtrlash: taqqoslash amallari, matn qiymatini tekshirish va AND hamda OR bilan bir nechta shartni birlashtirish.

Manba: https://learncode.uz/sql/where/
Sana: 2026-06-11

[O'tgan darsda](https://learncode.uz/sql/select) `SELECT` bilan ustunlarni tanladik, lekin har
safar **barcha** qatorlar qaytardi. Amalda esa ko'pincha ma'lum shartga
javob beradigan qatorlar kerak: "narxi 10000 dan qimmatlari" yoki "soni
tugaganlari". Buni **`WHERE`** bajaradi.

Misollarda namuna bazadagi `mahsulotlar` jadvalidan foydalanamiz:

| id | nom | narx | soni | turi |
|---|---|---|---|---|
| 1 | Olma | 8000 | 50 | meva |
| 2 | Non | 3000 | 120 | non |
| 3 | Sut | 12000 | 30 | sut mahsuloti |
| 4 | Choy | 15000 | 40 | ichimlik |
| 5 | Banan | 14000 | 25 | meva |
| 6 | Qatiq | 9000 | 0 | sut mahsuloti |
| 7 | Suv | 4000 | 200 | ichimlik |
| 8 | Guruch | 18000 | 60 | don |

## WHERE — asosiy filtr

`WHERE` `FROM` dan keyin yoziladi va shart qo'yadi. Faqat shart **rost**
bo'lgan qatorlar qaytadi:

```sql
SELECT nom, narx FROM mahsulotlar WHERE narx > 10000;
```

O'zingiz ishga tushirib ko'ring — so'rovni tahrirlashingiz ham mumkin:

```sql
SELECT nom, narx FROM mahsulotlar WHERE narx > 10000;
```

Natija — narxi 10000 dan katta bo'lganlar:

| nom | narx |
|---|---|
| Sut | 12000 |
| Choy | 15000 |
| Banan | 14000 |
| Guruch | 18000 |

Boshqa qatorlar tushib qoldi, chunki ularning narxi shartga mos kelmadi.

## Taqqoslash amallari

`WHERE` da quyidagi amallar ishlatiladi:

| Amal | Ma'nosi |
|---|---|
| `=` | teng |
| `<>` yoki `!=` | teng emas |
| `>` | katta |
| `<` | kichik |
| `>=` | katta yoki teng |
| `<=` | kichik yoki teng |

> **Boshlovchilar tez-tez yanglishadigan joy**
>
> SQL'da tenglikni tekshirish uchun **bitta** teng belgisi (`=`) ishlatiladi,
> Python'dagi kabi `==` emas: `WHERE nom = 'Olma'`. Matn qiymati esa **bitta
> tirnoq** (`'...'`) ichida yoziladi, qo'shtirnoq emas.

Matn bo'yicha filtrlash misoli:

```sql
SELECT * FROM mahsulotlar WHERE nom = 'Non';
```

Natija — faqat Non qatori:

| id | nom | narx | soni | turi |
|---|---|---|---|---|
| 2 | Non | 3000 | 120 | non |

## AND va OR — bir nechta shart

Bir nechta shartni birlashtirish uchun **`AND`** (ikkalasi ham) va
**`OR`** (kamida bittasi) ishlatiladi:

```sql
SELECT nom FROM mahsulotlar WHERE narx > 5000 AND soni > 40;
```

Bu — narxi 5000 dan qimmat **va** soni 40 dan ko'p bo'lganlar. Ikkala shart
ham bajarilishi kerak:

| nom |
|---|
| Olma |
| Guruch |

Olma (8000, 50) va Guruch (18000, 60) ikkala shartga mos. Sut narxi
mos, lekin soni 30 — `AND` uchun ikkalasi kerak, shuning uchun tushib qoldi.

`OR` bilan yetarli bitta shart:

```sql
SELECT nom FROM mahsulotlar WHERE narx < 5000 OR soni > 100;
```

Natija — narxi arzon **yoki** soni ko'p bo'lganlar:

| nom |
|---|
| Non |
| Suv |

Non (narxi 3000) va Suv (soni 200 va narxi 4000) — har biri kamida bitta
shartga mos.

> **Atama**
>
> **`NOT`** — shartni teskarisiga o'giradi: `WHERE NOT turi = 'meva'` — turi
> meva bo'lmaganlarni beradi. `AND`, `OR`, `NOT` — mantiqiy amallar, xuddi
> [Python'dagi kabi](https://learncode.uz/python/shart-operatorlari), faqat yozilishi so'z bilan.

<Callout type="example" title="O'zingizni sinab ko'ring">
Namuna bazangizda quyidagilarni sinang:

```sql
SELECT nom, soni FROM mahsulotlar WHERE soni = 0;
SELECT nom, narx FROM mahsulotlar WHERE narx >= 9000 AND narx <= 15000;
```

Birinchisi ombori tugagan mahsulotni (Qatiq) topadi. Ikkinchisi narxi
9000 dan 15000 gacha bo'lganlarni beradi. Endi `AND` ni `OR` ga
almashtiring — natija nega kengayadi?
</Callout>

## Amaliy mashq

Qatorlarni filtrlang:

1. Narxi 10000 dan arzon mahsulotlarni toping;
2. `turi` ustuni `'meva'` bo'lganlarini chiqaring;
3. `AND` bilan ikki shartni birlashtiring: meva va narxi 10000 dan qimmat;
4. `OR` bilan yozing: narxi juda arzon (< 4000) yoki juda qimmat (> 15000);
5. `soni = 0` bo'lgan mahsulotni toping;
6. Uch shartni birlashtiring: `turi = 'ichimlik' AND soni > 50` — natijada
   nechta qator qoldi?

3-qadamdagi `AND` ni `OR` ga almashtiring — natija nechta qatorga o'zgardi?

## Qisqacha xulosa

- `WHERE shart` — faqat shartga mos **qatorlarni** qaytaradi; `FROM` dan keyin.
- Taqqoslash: `=` (teng, bitta belgi), `<>`, `>`, `<`, `>=`, `<=`.
- Matn qiymati **bitta tirnoq** ichida: `'Olma'`.
- `AND` — ikkala shart ham, `OR` — kamida bittasi, `NOT` — teskari.
- Bir nechta shartni birlashtirib murakkab filtr yasash mumkin.

Keyingi darsda [`ORDER BY` va `LIMIT`](https://learncode.uz/sql/order-by-limit) bilan natijani
**tartiblash** va **cheklash**ni ko'ramiz — masalan "eng qimmat 3 mahsulot".
