# SQL'da NULL va DISTINCT

> SQL'da NULL — qiymat yo'qligi: uni IS NULL va IS NOT NULL bilan tekshirish, hamda DISTINCT bilan ustundagi takror qiymatlarni olib tashlash.

Manba: https://learncode.uz/sql/null-va-distinct/
Sana: 2026-06-13

Bazada ba'zi katakchalar **bo'sh** bo'lishi mumkin — ma'lumot hali noma'lum
yoki kiritilmagan. SQL buni **`NULL`** deb ataydi va u bilan ishlash o'ziga
xos. Shu darsda `NULL` ni va takror qiymatlarni olib tashlaydigan
`DISTINCT` ni ko'ramiz. Endi `mijozlar` jadvalidan foydalanamiz:

| id | ism | shahar | yosh |
|---|---|---|---|
| 1 | Aziz | Toshkent | 28 |
| 2 | Dilnoza | Samarqand | 34 |
| 3 | Bobur | Toshkent | 22 |
| 4 | Malika | Buxoro | *(bo'sh)* |

Malikaning yoshi kiritilmagan — o'sha katak `NULL`.

## NULL nima

`NULL` — "**qiymat yo'q**" degani. Bu 0 ham, bo'sh matn (`''`) ham emas —
u shunchaki "noma'lum". Aziz yoshi 28, Malikaniki esa `NULL`: biz uni
bilmaymiz.

> **Atama**
>
> **`NULL`** — qiymatning yo'qligi yoki noma'lumligi. 0 son bo'lsa "qiymat
> bor va u nol" degani; `NULL` esa "qiymatning o'zi yo'q" degani. Masalan
> "yoshi 0" (yangi tug'ilgan) bilan "yoshi noma'lum" — butunlay boshqa narsa.

## NULL ni tekshirish: IS NULL

`NULL` ni to'g'ridan-to'g'ri `=` bilan tekshirib bo'lmaydi — `WHERE yosh = NULL` **ishlamaydi**
(hech narsa qaytarmaydi). Buning o'rniga **`IS NULL`** ishlatiladi:

```sql
SELECT ism FROM mijozlar WHERE yosh IS NULL;
```

Natija — yoshi kiritilmaganlar:

| ism |
|---|
| Malika |

Aksincha, qiymati bor qatorlar uchun **`IS NOT NULL`**:

```sql
SELECT ism FROM mijozlar WHERE yosh IS NOT NULL;
```

Natija — Aziz, Dilnoza, Bobur (Malika tushib qoldi).

> **Boshlovchilar tez-tez yanglishadigan joy**
>
> `NULL` bilan taqqoslash har doim "noma'lum" beradi, shuning uchun
> `= NULL`, `<> NULL`, `> NULL` — hech biri ishlamaydi. Faqat `IS NULL` va
> `IS NOT NULL`. Bundan tashqari, `WHERE yosh > 30` so'rovi Malikani **olmaydi**
> — chunki uning yoshi noma'lum, shart rostmi yo'qmi aniqlanmaydi.

## DISTINCT — takrorlarni olib tashlash

Ustunda bir xil qiymat bir necha marta uchrashi mumkin. Faqat **noyob**
qiymatlar kerak bo'lsa, `SELECT` dan keyin **`DISTINCT`** yoziladi. Mijozlar
qaysi shaharlardan ekanini bilaylik:

```sql
SELECT DISTINCT shahar FROM mijozlar;
```

Natija — har shahar bir marta (Toshkent ikki mijozda bor edi, bir marta
chiqadi):

| shahar |
|---|
| Toshkent |
| Samarqand |
| Buxoro |

`DISTINCT` siz bu so'rov to'rt qator (Toshkent ikki marta) qaytarardi.
Bu "bazada qanday shaharlar bor?" degan savolga toza javob.

## mahsulotlarda DISTINCT

Xuddi shunday, [mahsulotlar](https://learncode.uz/sql/select) jadvalida qanday turlar borligini
bilish:

```sql
SELECT DISTINCT turi FROM mahsulotlar;
```

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

```sql
SELECT DISTINCT turi FROM mahsulotlar;
```

Natija — har turdan bittadan: meva, non, sut mahsuloti, ichimlik, don.
Sakkiz mahsulot ichida beshta har xil tur bor ekan.

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

```sql
SELECT ism, yosh FROM mijozlar WHERE yosh IS NOT NULL ORDER BY yosh;
SELECT DISTINCT turi FROM mahsulotlar;
```

Birinchisi yoshi ma'lum mijozlarni yosh bo'yicha tartibda beradi (Malika
chiqmaydi). Endi Malikaning yoshini [UPDATE](https://learncode.uz/sql/update) bilan kiritsangiz,
u ham `IS NOT NULL` natijasiga qo'shiladi.
</Callout>

## Amaliy mashq

NULL va takrorlar bilan ishlang:

1. `mijozlar` dan barcha `yosh` qiymatlarini chiqaring — NULL ni toping;
2. `WHERE yosh IS NULL` bilan faqat o'shani ajrating;
3. `WHERE yosh = NULL` deb yozib ko'ring — natija nima?
4. `DISTINCT turi` bilan takrorsiz toifalarni oling;
5. `COUNT(*)` va `COUNT(yosh)` ni solishtiring;
6. `SELECT DISTINCT shahar FROM mijozlar;` ni bajaring — to'rt mijozdan
   nechta shahar qoldi va qaysi biri takrorlangan edi?

3-qadam nega ishlamadi va 5-qadamdagi ikki son nega har xil?

## Qisqacha xulosa

- `NULL` — "qiymat yo'q/noma'lum"; 0 yoki bo'sh matn emas.
- `NULL` ni `=` bilan tekshirib bo'lmaydi — `IS NULL` va `IS NOT NULL`
  ishlatiladi.
- `NULL` qatnashgan taqqoslash "noma'lum" bo'ladi: `WHERE yosh > 30`
  noma'lum yoshlarni olmaydi.
- `SELECT DISTINCT ustun` — takror qiymatlarni olib tashlab, faqat
  noyoblarini beradi.
- `DISTINCT` "bazada qanday qiymatlar bor?" degan savolga qulay.

Keyingi darsda [ma'lumot tiplari](https://learncode.uz/sql/malumot-tiplari) — jadval ustunlari
qanday turdagi ma'lumot (son, matn, sana) saqlashini ko'ramiz.
