created_at ustuni timestamp. ยซWHERE created_at BETWEEN '2026-01-01' AND '2026-01-31'ยป โ 31-yanvar soat 14:00 dagi yozuv natijaga tushadimi?
Anonymous Quiz
25%
Ha, tushadi
75%
Yo'q, tushmaydi
0%
Bazaga bog'liq
โป๏ธ CTE: uzun so'rovni o'qiladigan qilish
Bir xil natijani subquery bilan ham olish mumkin, lekin CTE ni yuqoridan pastga o'qiysiz โ xuddi retsept kabi.
RECURSIVE CTE โ o'ziga murojaat qiladi. Ierarxiya uchun ideal: kim kimga bo'ysunadi?
๐ Qayerda kerak: tashkilot tuzilmasi, kategoriya daraxti, kommentlar ostidagi javoblar, yo'nalishlar zanjiri.
โ ๏ธ Rekursiyada doim to'xtash sharti bo'lsin. Ma'lumotda halqa bo'lsa (A โ B โ A), so'rov cheksiz aylanadi.
๐ฏ Endi amaliyot: Uch bosqichli CTE zanjiri
O'qib tushundingiz โ endi o'zingiz yozib ko'ring ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
WITH โ so'rov ichidagi vaqtinchalik nom. Uch qavat ichma-ich subquery o'rniga bosqichma-bosqich mantiq:WITH faol AS (
SELECT id, name FROM customers
WHERE status = 'active'
),
buyurtma AS (
SELECT customer_id, SUM(amount) AS jami
FROM orders
WHERE created_at >= '2026-01-01'
GROUP BY customer_id
)
SELECT f.name, COALESCE(b.jami, 0) AS jami
FROM faol f
LEFT JOIN buyurtma b ON b.customer_id = f.id
ORDER BY jami DESC;
Bir xil natijani subquery bilan ham olish mumkin, lekin CTE ni yuqoridan pastga o'qiysiz โ xuddi retsept kabi.
RECURSIVE CTE โ o'ziga murojaat qiladi. Ierarxiya uchun ideal: kim kimga bo'ysunadi?
WITH RECURSIVE zanjir AS (
-- 1. Boshlang'ich: rahbari yo'q xodim
SELECT id, name, manager_id, 1 AS daraja
FROM employees
WHERE manager_id IS NULL
UNION ALL
-- 2. Har qadamda bir pog'ona pastga
SELECT e.id, e.name, e.manager_id, z.daraja + 1
FROM employees e
JOIN zanjir z ON e.manager_id = z.id
)
SELECT * FROM zanjir ORDER BY daraja;
๐ Qayerda kerak: tashkilot tuzilmasi, kategoriya daraxti, kommentlar ostidagi javoblar, yo'nalishlar zanjiri.
โ ๏ธ Rekursiyada doim to'xtash sharti bo'lsin. Ma'lumotda halqa bo'lsa (A โ B โ A), so'rov cheksiz aylanadi.
๐ฏ Endi amaliyot: Uch bosqichli CTE zanjiri
O'qib tushundingiz โ endi o'zingiz yozib ko'ring ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
โ
Ertalabki test javobi: yo'q, tushmaydi
Ya'ni 31-yanvarning butun kuni โ 00:00:01 dan 23:59:59 gacha โ tushib qoladi.
Oyiga bir kun. Yiliga 12 kun. Hisobotda esa hech qanday xato belgisi yo'q: so'rov ishlaydi, raqam chiqadi, shunchaki kamroq.
Yodda tuting:
โ
โ
โ
๐ก Amaliy maslahat: hisobot yozgach, natijani boshqa manba bilan solishtiring. Raqam 1โ3% ga farq qilsa, birinchi gumondor โ sana chegarasi.
๐ฌ Shu xato tufayli hisobotingiz noto'g'ri chiqqanmi? Izohda bo'lishing ๐
๐ฏ Endi amaliyot: Rekursiv: sotuvsiz kunlarni to'ldirish
Sana bilan ishlashning keyingi bosqichi ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
BETWEEN '2026-01-01' AND '2026-01-31' aslida shu degani:created_at >= 2026-01-01 00:00:00
created_at <= 2026-01-31 00:00:00
Ya'ni 31-yanvarning butun kuni โ 00:00:01 dan 23:59:59 gacha โ tushib qoladi.
Oyiga bir kun. Yiliga 12 kun. Hisobotda esa hech qanday xato belgisi yo'q: so'rov ishlaydi, raqam chiqadi, shunchaki kamroq.
Yodda tuting:
โ
>= boshi AND < keyingi_boshi โ har doim to'g'riโ
BETWEEN faqat date tipida xavfsizโ
<= '2026-01-31 23:59:59' โ deyarli to'g'ri, lekin millisekundlar yo'qoladi๐ก Amaliy maslahat: hisobot yozgach, natijani boshqa manba bilan solishtiring. Raqam 1โ3% ga farq qilsa, birinchi gumondor โ sana chegarasi.
๐ฌ Shu xato tufayli hisobotingiz noto'g'ri chiqqanmi? Izohda bo'lishing ๐
๐ฏ Endi amaliyot: Rekursiv: sotuvsiz kunlarni to'ldirish
Sana bilan ishlashning keyingi bosqichi ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
โ Ertalabki masala: har kategoriyada top 3
Jadval:
Vazifa: har bir kategoriya bo'yicha eng ko'p sotilgan 3 ta mahsulotni chiqaring.
โ ๏ธ Diqqat:
๐ฏ Bu masala ยซtop N per groupยป deb ataladi va intervyularda doim uchraydi.
โ๏ธ Yechimingizni izohda yozing โ kechqurun tahlil qilamiz ๐
๐ฏ Endi amaliyot: Har kategoriyada top 3 mahsulot
Masala saytda ham bor โ yeching, tizim tekshiradi ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
Jadval:
products(id, name, category, sales_count)Vazifa: har bir kategoriya bo'yicha eng ko'p sotilgan 3 ta mahsulotni chiqaring.
SELECT category, name, sales_count
FROM products
???
โ ๏ธ Diqqat:
ORDER BY sales_count DESC LIMIT 3 ishlamaydi. U butun jadvaldan 3 ta qator beradi, har kategoriyadan emas.๐ฏ Bu masala ยซtop N per groupยป deb ataladi va intervyularda doim uchraydi.
โ๏ธ Yechimingizni izohda yozing โ kechqurun tahlil qilamiz ๐
๐ฏ Endi amaliyot: Har kategoriyada top 3 mahsulot
Masala saytda ham bor โ yeching, tizim tekshiradi ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
๐ Qatorlarni ustunga aylantirish (pivot)
Boshliq so'radi: ยซHar bir mijoz bo'yicha oylar ustun bo'lib tursinยป.
Bazada esa ma'lumot qator ko'rinishida. Yechim โ
PostgreSQL da qisqaroq usul โ FILTER:
O'qilishi ancha oson va tezroq ishlaydi.
๐ Xuddi shu usul bilan bitta so'rovda bir nechta ko'rsatkich hisoblanadi: konversiya, foiz nisbat, holatlar bo'yicha taqsimot. Har biri uchun alohida so'rov yozib, keyin qo'lda birlashtirish shart emas.
๐ก Ustunlar soni oldindan ma'lum bo'lmasa (masalan, kategoriyalar o'zgarib tursa), SQL o'zi dinamik ustun yasay olmaydi โ bu kod tomonida qilinadi.
๐ฏ Endi amaliyot: To'lov holatlari bo'yicha pivot
O'qib tushundingiz โ endi o'zingiz yozib ko'ring ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
Boshliq so'radi: ยซHar bir mijoz bo'yicha oylar ustun bo'lib tursinยป.
Bazada esa ma'lumot qator ko'rinishida. Yechim โ
CASE ni agregat ichiga qo'yish:SELECT
customer_id,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 1
THEN amount ELSE 0 END) AS yanvar,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 2
THEN amount ELSE 0 END) AS fevral,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 3
THEN amount ELSE 0 END) AS mart,
SUM(amount) AS jami
FROM sales
GROUP BY customer_id;
PostgreSQL da qisqaroq usul โ FILTER:
SELECT
customer_id,
SUM(amount) FILTER (WHERE status = 'paid') AS tolangan,
SUM(amount) FILTER (WHERE status = 'pending') AS kutilmoqda,
COUNT(*) FILTER (WHERE amount > 1000000) AS yirik_buyurtma
FROM orders
GROUP BY customer_id;
O'qilishi ancha oson va tezroq ishlaydi.
๐ Xuddi shu usul bilan bitta so'rovda bir nechta ko'rsatkich hisoblanadi: konversiya, foiz nisbat, holatlar bo'yicha taqsimot. Har biri uchun alohida so'rov yozib, keyin qo'lda birlashtirish shart emas.
๐ก Ustunlar soni oldindan ma'lum bo'lmasa (masalan, kategoriyalar o'zgarib tursa), SQL o'zi dinamik ustun yasay olmaydi โ bu kod tomonida qilinadi.
๐ฏ Endi amaliyot: To'lov holatlari bo'yicha pivot
O'qib tushundingiz โ endi o'zingiz yozib ko'ring ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
โ
Yechim: har kategoriyada top 3
Nega LIMIT ishlamaydi? Chunki
Teng natijalar bo'lsa-chi? Ikki mahsulot bir xil sotilgan bo'lsa,
โ ๏ธ Barqarorlik uchun
Aks holda bir xil so'rov har safar boshqa natija berishi mumkin โ va buni tushuntirish qiyin bo'ladi.
๐ฌ Siz
๐ฏ Endi amaliyot: Har guruhdan 2 ta (windowsiz)
Bu safar window funksiyasiz โ qiyinroq variant ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
WITH r AS (
SELECT category, name, sales_count,
ROW_NUMBER() OVER (
PARTITION BY category
ORDER BY sales_count DESC
) AS rn
FROM products
)
SELECT category, name, sales_count
FROM r
WHERE rn <= 3
ORDER BY category, rn;
Nega LIMIT ishlamaydi? Chunki
LIMIT butun natijaga qo'llanadi, guruhga emas. SQL da ยซhar guruhdan N taยป degan to'g'ridan-to'g'ri konstruksiya yo'q โ shuning uchun avval raqamlaymiz, keyin filtrlaymiz.Teng natijalar bo'lsa-chi? Ikki mahsulot bir xil sotilgan bo'lsa,
ROW_NUMBER ulardan birini tanlaydi (qaysi birini โ aniq emas). Ikkalasi ham kerak bo'lsa DENSE_RANK ishlating.โ ๏ธ Barqarorlik uchun
ORDER BY ga ikkinchi ustun qo'shing:ORDER BY sales_count DESC, id
Aks holda bir xil so'rov har safar boshqa natija berishi mumkin โ va buni tushuntirish qiyin bo'ladi.
๐ฌ Siz
ROW_NUMBER ni ishlatdingizmi yoki boshqa yo'l topdingizmi?๐ฏ Endi amaliyot: Har guruhdan 2 ta (windowsiz)
Bu safar window funksiyasiz โ qiyinroq variant ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
Qaysi so'rov ยซbuyurtma bermagan mijozlarยป uchun eng xavfsiz?
Anonymous Quiz
0%
WHERE id NOT IN (SELECT customer_id FROM orders)
100%
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id)
0%
Ikkalasi ham bir xil xavfsiz
๐ผ SQL suhbatida eng ko'p beriladigan 7 savol
1. INNER va LEFT JOIN farqi?
INNER โ faqat mos kelganlar. LEFT โ chap jadvalning hammasi, mos kelmasa NULL.
2. WHERE va HAVING?
WHERE guruhlashdan oldin qatorlarni, HAVING guruhlashdan keyin guruhlarni filtrlaydi.
3. COUNT(*) va COUNT(ustun)?
Birinchisi qatorlarni, ikkinchisi NULL bo'lmagan qiymatlarni sanaydi.
4. UNION va UNION ALL?
UNION dublikatlarni olib tashlaydi (saralash kerak โ sekinroq), UNION ALL hammasini qo'shadi.
5. Ikkinchi eng yuqori maoshni toping.
Yoki
6. Dublikatlarni qanday topasiz?
7. Index nima va qachon ishlamaydi?
Qidiruvni tezlashtiradigan tuzilma. Ustunga funksiya qo'llansa,
๐ก Maslahat: suhbatda javobni aytib qo'ya qolmang โ ovoz chiqarib fikrlang. ยซAvval NULL bormi deb tekshirardim, keyin...ยป degan gap to'g'ri javobdan ko'ra kuchliroq taassurot qoldiradi.
๐ฌ Sizdan suhbatda qanday SQL savoli so'ralgan? Izohda yozing โ keyingi postlarda tahlil qilamiz ๐
๐ฏ Endi amaliyot: Click: to'lovlar holati bo'yicha hisobot
O'qib tushundingiz โ endi o'zingiz yozib ko'ring ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
1. INNER va LEFT JOIN farqi?
INNER โ faqat mos kelganlar. LEFT โ chap jadvalning hammasi, mos kelmasa NULL.
2. WHERE va HAVING?
WHERE guruhlashdan oldin qatorlarni, HAVING guruhlashdan keyin guruhlarni filtrlaydi.
3. COUNT(*) va COUNT(ustun)?
Birinchisi qatorlarni, ikkinchisi NULL bo'lmagan qiymatlarni sanaydi.
4. UNION va UNION ALL?
UNION dublikatlarni olib tashlaydi (saralash kerak โ sekinroq), UNION ALL hammasini qo'shadi.
5. Ikkinchi eng yuqori maoshni toping.
SELECT MAX(salary) FROM employees
WHERE salary < (SELECT MAX(salary) FROM employees);
Yoki
DENSE_RANK() = 2 bilan โ teng maoshlar bo'lsa shu to'g'riroq.6. Dublikatlarni qanday topasiz?
GROUP BY ustun HAVING COUNT(*) > 17. Index nima va qachon ishlamaydi?
Qidiruvni tezlashtiradigan tuzilma. Ustunga funksiya qo'llansa,
LIKE '%...' bo'lsa yoki tip mos kelmasa ishlamaydi.๐ก Maslahat: suhbatda javobni aytib qo'ya qolmang โ ovoz chiqarib fikrlang. ยซAvval NULL bormi deb tekshirardim, keyin...ยป degan gap to'g'ri javobdan ko'ra kuchliroq taassurot qoldiradi.
๐ฌ Sizdan suhbatda qanday SQL savoli so'ralgan? Izohda yozing โ keyingi postlarda tahlil qilamiz ๐
๐ฏ Endi amaliyot: Click: to'lovlar holati bo'yicha hisobot
O'qib tushundingiz โ endi o'zingiz yozib ko'ring ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
๐ 10 kun: nimalarni ko'rib chiqdik
โ NULL tuzoqlari โ
โ So'rovning haqiqiy bajarilish tartibi,
โ Window funksiyalar:
โ Dublikatlarni topish va o'chirish,
โ Gaps and islands โ ketma-ket kunlar
โ Index qachon ishlamaydi,
โ Sana tuzoqlari,
โ CTE va rekursiya, pivot, top N per group
Bu โ bir oylik kurs hajmidagi material. Lekin o'qish bilan tugamaydi.
Premium nima beradi (29 000 so'm/oy):
๐น Barcha 195 ta masala (bepul rejada โ 50 ta)
๐น 4 ta dialekt: PostgreSQL, MySQL, SQL Server, Oracle. Ishingizda qaysi biri bo'lsa โ shunda mashq qilasiz
๐น Har masalada 2-3 ta yechim: oddiydan optimalgacha, index tavsiyalari va query plan tahlili bilan
๐น Kompaniya track'lari: Click, Payme, Uzum, EPAM, banklar uchun intervyu to'plamlari
๐น Yillik obunada 2 oy bepul
๐ก Avval bepul 50 masalani yeching. Yoqsa โ Premium'ga o'tasiz, yoqmasa hech narsa yo'qotmaysiz.
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
โ NULL tuzoqlari โ
NOT IN, COUNT, uch qiymatli mantiqโ So'rovning haqiqiy bajarilish tartibi,
WHERE va HAVINGโ Window funksiyalar:
ROW_NUMBER, RANK, DENSE_RANK, LAGโ Dublikatlarni topish va o'chirish,
DISTINCT antipatterniโ Gaps and islands โ ketma-ket kunlar
โ Index qachon ishlamaydi,
EXPLAIN ANALYZEโ Sana tuzoqlari,
BETWEEN va vaqt zonasiโ CTE va rekursiya, pivot, top N per group
Bu โ bir oylik kurs hajmidagi material. Lekin o'qish bilan tugamaydi.
Premium nima beradi (29 000 so'm/oy):
๐น Barcha 195 ta masala (bepul rejada โ 50 ta)
๐น 4 ta dialekt: PostgreSQL, MySQL, SQL Server, Oracle. Ishingizda qaysi biri bo'lsa โ shunda mashq qilasiz
๐น Har masalada 2-3 ta yechim: oddiydan optimalgacha, index tavsiyalari va query plan tahlili bilan
๐น Kompaniya track'lari: Click, Payme, Uzum, EPAM, banklar uchun intervyu to'plamlari
๐น Yillik obunada 2 oy bepul
๐ก Avval bepul 50 masalani yeching. Yoqsa โ Premium'ga o'tasiz, yoqmasa hech narsa yo'qotmaysiz.
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
โ Ertalabki masala: oxirgi yozuv
Jadval:
Vazifa: har bir mijozning eng oxirgi to'lovini chiqaring โ mijoz, sana va summa.
โ ๏ธ
๐ฏ ยซHar guruhdan oxirgi qatorยป โ amaliy ishda haftada bir marta kerak bo'ladigan naqsh.
โ๏ธ Yechimingizni izohda yozing, 20:00 da uch xil usulni ko'rsataman ๐
๐ฏ Endi amaliyot: Har mijozning oxirgi to'lovi
Masala saytda tayyor โ yeching, tizim javobingizni tekshiradi ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
Jadval:
payments(id, client_id, paid_at, amount)Vazifa: har bir mijozning eng oxirgi to'lovini chiqaring โ mijoz, sana va summa.
SELECT client_id, paid_at, amount
FROM payments
???
โ ๏ธ
MAX(paid_at) bilan GROUP BY qilsangiz, summa qaysi to'lovniki ekani yo'qoladi. Bu โ eng ko'p uchraydigan tuzoq.๐ฏ ยซHar guruhdan oxirgi qatorยป โ amaliy ishda haftada bir marta kerak bo'ladigan naqsh.
โ๏ธ Yechimingizni izohda yozing, 20:00 da uch xil usulni ko'rsataman ๐
๐ฏ Endi amaliyot: Har mijozning oxirgi to'lovi
Masala saytda tayyor โ yeching, tizim javobingizni tekshiradi ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
๐ JOIN turlari: qachon qaysi biri
INNER JOIN โ faqat ikkala jadvalda ham mos keladigan qatorlar.
Buyurtma bergan mijozlar.
LEFT JOIN โ chap jadvalning hammasi, mos kelmasa NULL.
Barcha mijozlar, buyurtmasi bor-yo'qligidan qat'i nazar.
RIGHT JOIN โ LEFT ning teskarisi. Amalda kam ishlatiladi: jadvallar o'rnini almashtirib LEFT yozish o'qilishi osonroq.
FULL OUTER JOIN โ ikkala tomonning hammasi. Ikki tizim ma'lumotini solishtirganda foydali: qaysi biri qayerda yo'q.
CROSS JOIN โ har qator har qator bilan. 5 ร 4 = 20 qator. Kalendar ร filial kabi to'liq matritsa yasashda kerak.
Eng ko'p uchraydigan ehtiyoj โ ยซmos kelmaganlarni topishยป:
Bu โ ยซanti-joinยป naqshi.
โ ๏ธ Venn diagrammalarini unuting. JOIN to'plamlarni kesishtirmaydi โ u qatorlarni juftlashtiradi. Shuning uchun 1:N bog'lanishda qatorlar soni oshadi.
๐ฏ Endi amaliyot: A da bor, B da yo'q
Anti-join naqshini mustahkamlang ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
INNER JOIN โ faqat ikkala jadvalda ham mos keladigan qatorlar.
Buyurtma bergan mijozlar.
LEFT JOIN โ chap jadvalning hammasi, mos kelmasa NULL.
Barcha mijozlar, buyurtmasi bor-yo'qligidan qat'i nazar.
RIGHT JOIN โ LEFT ning teskarisi. Amalda kam ishlatiladi: jadvallar o'rnini almashtirib LEFT yozish o'qilishi osonroq.
FULL OUTER JOIN โ ikkala tomonning hammasi. Ikki tizim ma'lumotini solishtirganda foydali: qaysi biri qayerda yo'q.
CROSS JOIN โ har qator har qator bilan. 5 ร 4 = 20 qator. Kalendar ร filial kabi to'liq matritsa yasashda kerak.
Eng ko'p uchraydigan ehtiyoj โ ยซmos kelmaganlarni topishยป:
SELECT c.*
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;
Bu โ ยซanti-joinยป naqshi.
LEFT JOIN qilib, keyin NULL qolganlarni olasiz.โ ๏ธ Venn diagrammalarini unuting. JOIN to'plamlarni kesishtirmaydi โ u qatorlarni juftlashtiradi. Shuning uchun 1:N bog'lanishda qatorlar soni oshadi.
๐ฏ Endi amaliyot: A da bor, B da yo'q
Anti-join naqshini mustahkamlang ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
โ
Yechim: har guruhdan oxirgi qator โ 3 usul
1. ROW_NUMBER (universal, hamma bazada ishlaydi)
2. DISTINCT ON (faqat PostgreSQL, eng qisqasi)
3. Korrelyatsion subquery (eski bazalar uchun)
โ Nega GROUP BY bilan bo'lmaydi?
โ ๏ธ Bir mijozda ikki to'lov bir xil vaqtda bo'lsa, 1 va 2-usul bittasini tanlaydi, 3-usul esa ikkalasini qaytaradi. Shuni hisobga oling.
๐ฏ Endi amaliyot: Mijozning birinchi va oxirgi buyurtmasi
Endi ikkalasini bitta so'rovda chiqaring ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
1. ROW_NUMBER (universal, hamma bazada ishlaydi)
WITH r AS (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY client_id ORDER BY paid_at DESC
) AS rn
FROM payments
)
SELECT client_id, paid_at, amount FROM r WHERE rn = 1;
2. DISTINCT ON (faqat PostgreSQL, eng qisqasi)
SELECT DISTINCT ON (client_id) client_id, paid_at, amount
FROM payments
ORDER BY client_id, paid_at DESC;
3. Korrelyatsion subquery (eski bazalar uchun)
SELECT p.*
FROM payments p
WHERE p.paid_at = (
SELECT MAX(paid_at) FROM payments
WHERE client_id = p.client_id
);
โ Nega GROUP BY bilan bo'lmaydi?
SELECT client_id, MAX(paid_at), amount -- xato
FROM payments GROUP BY client_id;
amount qaysi qatorniki? Baza bilmaydi. PostgreSQL xato beradi, MySQL esa tasodifiy qiymat qaytaradi โ bu yomonroq, chunki so'rov ยซishlaydiยป va xato sezilmaydi.โ ๏ธ Bir mijozda ikki to'lov bir xil vaqtda bo'lsa, 1 va 2-usul bittasini tanlaydi, 3-usul esa ikkalasini qaytaradi. Shuni hisobga oling.
๐ฏ Endi amaliyot: Mijozning birinchi va oxirgi buyurtmasi
Endi ikkalasini bitta so'rovda chiqaring ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
SQL Masterโda eng birinchi nima paydo boโlishini xohlaysiz?
Anonymous Poll
50%
๐ Saytda mavzular boโyicha darslar (qidiruv bilan)
75%
๐ Advanced: query plan, index dizayni, optimizatsiya
25%
๐งฉ Koโproq masalalar
25%
๐ผ Kompaniya intervyu tayyorgarligi
50%
๐ฅ Video tushuntirishlar
25%
๐ Haftalik contest va reyting
Qaysi biri uchun oyiga ~29 000 soโm toโlagan boโlardingiz?
Anonymous Poll
60%
Advanced darslar + masalalar
20%
Intervyu tayyorgarlik trackโi
40%
Hech biri, bepul yetadi
๐ SQL Masterโda katta yangilanish tayyorlanyapti
Yaqin orada sqlmaster.uzโga mavzular boโyicha darslar, yangi masalalar va yana bir nechta yangiliklar qoโshiladi. Nimani birinchi qilishimizni esa siz hal qilasiz. Yuqoridagi soโrovnomada ovoz bering ๐
๐ Bitta iltimos:
SQL oโrganayotgan yoki intervyuga tayyorlanayotgan bitta doโstingizga shu kanalni yuboring. Sizga 10 soniya, unga esa haqiqatan foydali manba.
Biz qanchalik koโp boโlsak, oโzbek tilida shuncha sifatli SQL kontent chiqara olamiz.
๐พ sqlmaster.uz
๐ข @sqlmasteruz
Yaqin orada sqlmaster.uzโga mavzular boโyicha darslar, yangi masalalar va yana bir nechta yangiliklar qoโshiladi. Nimani birinchi qilishimizni esa siz hal qilasiz. Yuqoridagi soโrovnomada ovoz bering ๐
๐ Bitta iltimos:
SQL oโrganayotgan yoki intervyuga tayyorlanayotgan bitta doโstingizga shu kanalni yuboring. Sizga 10 soniya, unga esa haqiqatan foydali manba.
Biz qanchalik koโp boโlsak, oโzbek tilida shuncha sifatli SQL kontent chiqara olamiz.
๐พ sqlmaster.uz
๐ข @sqlmasteruz
SQLMaster.uz
SQLMaster.uz โ SQL masalalar va amaliyot platformasi
SQL o'rganish va amaliyot platformasi: real jadvallar asosidagi PostgreSQL masalalarini yeching, yechimni onlayn tekshiring, musobaqalarda qatnashing.
โก1๐1๐1๐1
products jadvalida 5 qator, colors jadvalida 4 qator bor. ยซSELECT * FROM products CROSS JOIN colorsยป nechta qator qaytaradi?
Anonymous Quiz
43%
9
43%
20
14%
5
๐ช Self-join: jadvalni o'ziga qo'shish
Ba'zan kerakli ma'lumot bitta jadval ichida bo'ladi. Masalan, xodim va uning rahbari bir jadvalda:
Rahbarning ismini chiqarish uchun jadvalni o'ziga qo'shamiz:
Bu yerda
Klassik intervyu savoli: rahbaridan ko'p maosh oladigan xodimlar.
๐ก LEFT yoki INNER? Rahbari yo'q xodim (direktor) ham ro'yxatda kerak bo'lsa โ
๐ Self-join yana qayerda: takrorlangan yozuvlarni juftlab topish, ketma-ket qatorlarni solishtirish (window bo'lmagan bazalarda), bir guruhdagi elementlar juftligi.
๐ฏ Endi amaliyot: Rahbaridan ko'p maosh oladigan xodimlar
Klassik intervyu masalasi โ o'zingiz yozib ko'ring ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
Ba'zan kerakli ma'lumot bitta jadval ichida bo'ladi. Masalan, xodim va uning rahbari bir jadvalda:
employees(id, name, salary, manager_id)Rahbarning ismini chiqarish uchun jadvalni o'ziga qo'shamiz:
SELECT e.name AS xodim,
m.name AS rahbar
FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;
Bu yerda
e va m โ bir jadvalning ikki ยซnusxasiยป. Alias'siz bunday so'rov yozib bo'lmaydi, chunki baza qaysi name haqida gapirayotganingizni tushunmaydi.Klassik intervyu savoli: rahbaridan ko'p maosh oladigan xodimlar.
SELECT e.name, e.salary, m.salary AS rahbar_maoshi
FROM employees e
JOIN employees m ON m.id = e.manager_id
WHERE e.salary > m.salary;
๐ก LEFT yoki INNER? Rahbari yo'q xodim (direktor) ham ro'yxatda kerak bo'lsa โ
LEFT JOIN. Yuqoridagi taqqoslashda esa INNER to'g'ri: rahbari yo'q odamni solishtirib bo'lmaydi.๐ Self-join yana qayerda: takrorlangan yozuvlarni juftlab topish, ketma-ket qatorlarni solishtirish (window bo'lmagan bazalarda), bir guruhdagi elementlar juftligi.
๐ฏ Endi amaliyot: Rahbaridan ko'p maosh oladigan xodimlar
Klassik intervyu masalasi โ o'zingiz yozib ko'ring ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
๐1
โ
Javob: 20 qator
Lekin CROSS JOIN ataylab ham kerak bo'ladi.
Vazifa: har bir filialning har bir kun bo'yicha savdosini chiqaring โ savdo bo'lmagan kunlar ham 0 bilan ko'rinsin.
Oddiy
๐ Naqsh: CROSS JOIN bilan ยซbo'lishi kerakยป ni yasang, LEFT JOIN bilan ยซborยป ni ustiga qo'ying. Grafiklar va hisobotlarda bo'shliq qolmaydi.
๐ฏ Endi amaliyot: Kalendar generatsiyasi
Xuddi shu naqsh โ kalendar yasash ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
CROSS JOIN shartsiz ishlaydi: 5 ร 4 = 20. Shart yozmasdan oddiy vergul bilan FROM a, b deb yozsangiz ham xuddi shu natija chiqadi โ bu ยซtasodifiy CROSS JOINยป, eng qimmat xatolardan biri. Million qatorli ikki jadvalni shunday qo'shsangiz, server qotadi.Lekin CROSS JOIN ataylab ham kerak bo'ladi.
Vazifa: har bir filialning har bir kun bo'yicha savdosini chiqaring โ savdo bo'lmagan kunlar ham 0 bilan ko'rinsin.
Oddiy
GROUP BY bunday qila olmaydi: bazada yozuv yo'q bo'lsa, natijada ham qator bo'lmaydi. Yechim โ avval to'liq matritsa yasash:SELECT b.name, d.day, COALESCE(SUM(s.amount), 0) AS jami
FROM branches b
CROSS JOIN generate_series(
'2026-10-01'::date, '2026-10-31'::date, '1 day'
) AS d(day)
LEFT JOIN sales s
ON s.branch_id = b.id
AND s.sale_date = d.day
GROUP BY b.name, d.day
ORDER BY b.name, d.day;
๐ Naqsh: CROSS JOIN bilan ยซbo'lishi kerakยป ni yasang, LEFT JOIN bilan ยซborยป ni ustiga qo'ying. Grafiklar va hisobotlarda bo'shliq qolmaydi.
๐ฏ Endi amaliyot: Kalendar generatsiyasi
Xuddi shu naqsh โ kalendar yasash ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
โ Ertalabki masala: konversiya foizi
Jadval:
Vazifa: har bir manba bo'yicha tashriflar soni va konversiya foizini chiqaring.
Kutilgan natija:
โ ๏ธ Ikkita tuzoq bor: butun sonlar bo'linishi va nolga bo'lish. Ikkalasi ham jimgina noto'g'ri natija beradi.
โ๏ธ Qanday yozgan bo'lardingiz? Izohda yozing โ 13:00 da tahlil qilamiz ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz
Jadval:
visits(id, source, converted) โ source trafik manbasi, converted qiymati true yoki false.Vazifa: har bir manba bo'yicha tashriflar soni va konversiya foizini chiqaring.
Kutilgan natija:
source tashrif konversiya_%
telegram 1200 4.5
instagram 800 2.1
โ ๏ธ Ikkita tuzoq bor: butun sonlar bo'linishi va nolga bo'lish. Ikkalasi ham jimgina noto'g'ri natija beradi.
โ๏ธ Qanday yozgan bo'lardingiz? Izohda yozing โ 13:00 da tahlil qilamiz ๐
โโโโโโโโ
๐พ Amaliyot: sqlmaster.uz
๐ข @sqlmasteruz