# SQL DELETE — ma'lumotni o'chirish

> SQL DELETE bilan jadvaldan qator o'chirish: WHERE bilan aniq qatorni tanlash, WHERE siz o'chirish xavfi va o'chirishdan oldin SELECT bilan tekshirish.

Manba: https://learncode.uz/sql/delete/
Sana: 2026-06-12

[UPDATE](https://learncode.uz/sql/update) mavjud qatorni o'zgartirdi. Ba'zan esa qator butunlay
**keraksiz** bo'ladi: mahsulot sotuvdan olindi, mijoz o'chirilishini so'radi.
Qatorni o'chirish uchun **`DELETE`** ishlatiladi.

## DELETE — qatorni o'chirish

Yozilishi sodda: `DELETE FROM jadval WHERE shart`. [INSERT darsida](https://learncode.uz/sql/insert)
qo'shgan Asalni o'chiramiz:

```sql
DELETE FROM mahsulotlar WHERE nom = 'Asal';
```

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

```sql
DELETE FROM mahsulotlar WHERE soni = 0;
SELECT nom, soni FROM mahsulotlar;
```

Bu shartga mos qatorni butunlay o'chiradi. Tekshirish:

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

Natija — **bo'sh** (hech qanday qator yo'q), chunki Asal o'chirildi.

`DELETE` — **butun qatorni** o'chiradi, ustunni emas. Ustundagi bitta
qiymatni tozalash kerak bo'lsa, o'chirish emas, [UPDATE](https://learncode.uz/sql/update) bilan
uni `NULL` ga o'zgartiriladi.

> **Boshlovchilar tez-tez yanglishadigan joy**
>
> `DELETE FROM mahsulotlar;` — `WHERE` siz **butun jadvalni** bo'shatadi,
> barcha qatorlar yo'qoladi. Bu `UPDATE` dagidan ham xavfliroq, chunki
> o'chirilgan ma'lumotni qaytarish oson emas. Har `DELETE` dan oldin
> `WHERE` borligini tekshiring.

## Avval SELECT bilan tekshiring

`DELETE` ni xavfsiz bajarishning eng yaxshi usuli — **o'sha shartni avval
`SELECT` bilan ishga tushirish**. Shunda nima o'chishini oldin ko'rasiz:

```sql
-- 1-qadam: nima o'chishini ko'rish
SELECT * FROM mahsulotlar WHERE soni = 0;

-- 2-qadam: ishonch hosil qilgach, o'chirish
DELETE FROM mahsulotlar WHERE soni = 0;
```

Birinchi so'rov ombori tugagan mahsulotni (Qatiq) ko'rsatadi. Natija
kutganingizdek bo'lsagina, ikkinchi so'rovni bajarasiz. Bu odat ko'p
xatoning oldini oladi.

> **Atama**
>
> **Zaxira nusxa** (backup) — bazaning saqlangan nusxasi. Muhim ma'lumot
> bilan ishlaganda, ommaviy `DELETE` yoki `UPDATE` dan oldin nusxa olinadi —
> xato bo'lsa, undan tiklanadi. DB Browser'da bu shunchaki `.db` faylning
> nusxasini saqlash.

## DELETE, UPDATE va DROP farqi

Uch tushuncha chalkashtiriladi:

- **`DELETE`** — jadvaldan **qatorlarni** o'chiradi, jadvalning o'zi qoladi.
- **`UPDATE`** — qatorni o'chirmaydi, faqat qiymatini **o'zgartiradi**.
- **`DROP TABLE`** — butun **jadvalni** (tuzilishi bilan) yo'q qiladi.

Ya'ni `DELETE FROM mahsulotlar;` jadvalni bo'shatadi, lekin ustunlar va
jadval o'zi turadi — unga yana `INSERT` qilsa bo'ladi.

<Callout type="example" title="O'zingizni sinab ko'ring">
Namuna bazangizda avval qo'shing, keyin o'chiring:

```sql
INSERT INTO mahsulotlar (nom, narx, soni, turi)
VALUES ('Sinov', 1000, 5, 'test');

SELECT * FROM mahsulotlar WHERE turi = 'test';
DELETE FROM mahsulotlar WHERE turi = 'test';
SELECT * FROM mahsulotlar WHERE turi = 'test';
```

Oxirgi so'rov bo'sh natija qaytaradi — "Sinov" o'chirildi. Qo'shish va
o'chirishni birga ko'rib, `DELETE` qanday ishlashini his qilasiz.
</Callout>

## Amaliy mashq

Qator o'chiring:

1. `soni = 0` bo'lgan mahsulotni o'chiring;
2. `SELECT` bilan tekshiring;
3. narxi 20000 dan qimmat mahsulotlarni o'chiring — nechta o'chdi?
4. `DELETE FROM mahsulotlar;` yozib ishga tushiring;
5. yana `SELECT` qiling — qatorlar qaytib keldimi?
6. Avval `INSERT` bilan yangi mahsulot qo'shing, so'ng uni `id` bo'yicha
   `DELETE` qiling — faqat o'sha bitta qator o'chdimi?

`DELETE` va `WHERE` munosabati `UPDATE` dagiga o'xshaydimi?

## Qisqacha xulosa

- `DELETE FROM jadval WHERE shart` — shartga mos **qatorlarni** o'chiradi.
- `WHERE` siz `DELETE` **butun jadvalni bo'shatadi** — juda ehtiyot bo'ling.
- Xavfsiz yo'l: avval o'sha shartni `SELECT` bilan tekshiring.
- `DELETE` qatorni o'chiradi, `UPDATE` o'zgartiradi, `DROP TABLE` butun
  jadvalni yo'q qiladi.
- Muhim ma'lumot bilan ishlaganda zaxira nusxa oling.

Keyingi darsda [`NULL` va `DISTINCT`](https://learncode.uz/sql/null-va-distinct) — "qiymat yo'q"
holatini va takror qiymatlarni olib tashlashni ko'ramiz.
