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:

SQL · namuna baza

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:

  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.

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 — bazani yo’qotib qo’ymaslik uchun nusxa olishni ko’ramiz.

Bu dars foydali bo'ldimi?

marta ko'rildi