# SQL CTE — WITH bilan nomlangan so'rov

> SQL CTE (Common Table Expression): WITH bilan vaqtinchalik nomlangan natija yaratish. Murakkab so'rovni o'qishga qulay bo'laklarga bo'lish usuli.

Manba: https://learncode.uz/sql/cte/
Sana: 2026-06-20

Murakkab so'rov tez o'qib bo'lmaydigan bo'lib ketishi mumkin — ayniqsa ichida
[subquery](https://learncode.uz/sql/subquery) bo'lsa. **CTE** (`WITH`) shu muammoni yechadi:
so'rovning bir qismiga **nom** berib, uni alohida, o'qishga qulay blokka
chiqaradi.

## WITH — nomlangan vaqtinchalik natija

`WITH` bilan so'rov boshida nomlangan natija e'lon qilinadi, keyin asosiy
so'rov undan foydalanadi:

```sql
WITH qimmat AS (
  SELECT nom, narx FROM mahsulotlar WHERE narx > 10000
)
SELECT nom, narx
FROM qimmat
ORDER BY narx DESC;
```

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

```sql
WITH arzonlar AS (
  SELECT nom, narx FROM mahsulotlar WHERE narx < 10000
)
SELECT * FROM arzonlar ORDER BY narx;
```

Natija:

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

`qimmat` — vaqtinchalik nom: u faqat shu so'rov davomida yashaydi.
Avval `WITH` ichidagi so'rov hisoblanadi, keyin asosiy so'rov undan oladi.

> **Atama**
>
> **CTE** (Common Table Expression) — `WITH` bilan yaratilgan, so'rov ichidagi
> vaqtinchalik nomlangan natija. U [`VIEW`](https://learncode.uz/sql/view) ga o'xshaydi, lekin
> saqlanmaydi — faqat o'sha bitta so'rov davomida mavjud bo'ladi.

## CTE va subquery farqi

Xuddi shu natijani [subquery](https://learncode.uz/sql/subquery) bilan ham olsa bo'lardi, lekin
CTE **o'qishga qulayroq**: mantiq yuqorida, nom bilan turadi. Uzun so'rovda
bir necha `WITH` ni ketma-ket e'lon qilib, murakkab ishni bosqichma-bosqich
qurish mumkin — har bosqich o'z nomiga ega bo'ladi.

> **Yodda tuting**
>
> Qoida oddiy: bir marta ishlatiladigan, kichik ichki so'rov — subquery
> yetarli. So'rov murakkablashsa yoki bir natija bir necha joyda kerak bo'lsa —
> CTE tanlang. CTE kodni yuqoridan pastga, mantiqiy ketma-ketlikda o'qishga
> imkon beradi.

## Amaliy mashq

`WITH` bilan so'rovni bo'laklang:

1. Arzon mahsulotlarni `WITH arzonlar AS (...)` ichiga oling;
2. asosiy so'rovda `arzonlar` dan tanlang;
3. CTE ichiga `GROUP BY` qo'shib, toifalar bo'yicha o'rtacha narx hisoblang;
4. ikkita CTE yozing va ularni `JOIN` qiling;
5. xuddi shu natijani CTE'siz, ichki so'rov bilan yozing;
6. CTE natijasini `ORDER BY` va `LIMIT` bilan cheklab, eng arzon uchta
   mahsulotni chiqaring.

5-qadamdan keyin ikki variantni solishtiring — qaysi biri o'qishga qulay?

## Qisqacha xulosa

- **CTE** (`WITH nom AS (...)`) — so'rov ichidagi vaqtinchalik nomlangan natija.
- Murakkab so'rovni o'qishga qulay bo'laklarga bo'ladi.
- `VIEW` dan farqi: saqlanmaydi, faqat shu so'rovda yashaydi.
- Subquery bilan bir ishni qiladi, lekin ravonroq va bosqichli.
- Bir necha `WITH` ni ketma-ket ishlatib, mantiqni bosqichma-bosqich qurish mumkin.

Keyingi darsda [zaxira va tiklash](https://learncode.uz/sql/zaxira) — bazani yo'qotib qo'ymaslik
uchun nusxa olishni ko'ramiz.
