SQL CTE — WITH bilan nomlangan so'rov
Murakkab so’rov tez o’qib bo’lmaydigan bo’lib ketishi mumkin — ayniqsa ichida
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:
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:
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.
CTE va subquery farqi
Xuddi shu natijani 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.
Amaliy mashq
WITH bilan so’rovni bo’laklang:
- Arzon mahsulotlarni
WITH arzonlar AS (...)ichiga oling; - asosiy so’rovda
arzonlardan tanlang; - CTE ichiga
GROUP BYqo’shib, toifalar bo’yicha o’rtacha narx hisoblang; - ikkita CTE yozing va ularni
JOINqiling; - xuddi shu natijani CTE’siz, ichki so’rov bilan yozing.
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.
VIEWdan farqi: saqlanmaydi, faqat shu so’rovda yashaydi.- Subquery bilan bir ishni qiladi, lekin ravonroq va bosqichli.
- Bir necha
WITHni ketma-ket ishlatib, mantiqni bosqichma-bosqich qurish mumkin.
Keyingi darsda zaxira va tiklash — bazani yo’qotib qo’ymaslik uchun nusxa olishni ko’ramiz.