SQL Master πŸ‡ΊπŸ‡Ώ
22 subscribers
1 photo
1 video
55 links
SQL'ni video ko'rib emas, yozib o'rganing. 200+ real masala β€” Uzum, Click, taksi mavzularida. Yozasiz, tizim tekshiradi.

πŸ‘‰ sqlmaster.uz

Admin: @fast_support_admin
Download Telegram
βœ… Yechim: har kategoriyada top 3

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)
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.
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(*) > 1

7. 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 β€” 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: 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Β»:
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)
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
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
⚑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:

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

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: 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
πŸ“ˆ Foiz va nisbatni to'g'ri hisoblash

Ertalabki masalaning yechimi:
SELECT
source,
COUNT(*) AS tashrif,
ROUND(100.0 * COUNT(*) FILTER (WHERE converted)
/ NULLIF(COUNT(*), 0), 1) AS konversiya
FROM visits
GROUP BY source
ORDER BY konversiya DESC;


Uchta detal butun natijani hal qiladi:

1️⃣ 100.0 β€” nuqta bilan. 100 * 5 / 200 butun sonlar bo'linishida 0 beradi, 100.0 esa 2.5. Bu eng ko'p uchraydigan Β«nega hamma yerda nol?Β» sababi.

2️⃣ NULLIF(x, 0) β€” nolga bo'lishdan himoya. Bo'luvchi 0 bo'lsa, so'rov xato bermay NULL qaytaradi.

3️⃣ FILTER (WHERE ...) β€” PostgreSQL usuli. Boshqa bazalarda CASE bilan:
SUM(CASE WHEN converted THEN 1 ELSE 0 END)


⚠️ Yana bir tuzoq: COUNT(converted) yozsangiz β€” false qiymatlar ham sanaladi, chunki ular NULL emas. Shart bo'yicha sanash uchun doim FILTER yoki CASE.

πŸ“Œ Shu qolip bilan istalgan ko'rsatkich hisoblanadi: qaytarilgan buyurtmalar ulushi, faol foydalanuvchilar foizi, xato tranzaksiyalar nisbati.

🎯 Endi amaliyot: Manba bo'yicha konversiya
Aynan shu masala saytda bor β€” yozib tekshiring πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
🎯 O'rtacha foiz β€” o'rtachalarning o'rtachasi emas

Bugungi mavzuning davomi. Mana klassik xato:

Uch manba: konversiyasi 10%, 20% va 30%.
Umumiy konversiya qancha? Β«(10+20+30)/3 = 20%Β» β€” noto'g'ri.

Agar birinchi manbadan 10 000 tashrif, qolganidan 100 tadan bo'lsa, umumiy konversiya 10% ga juda yaqin bo'ladi. Foizlarning o'rtachasini olish β€” og'irlikni e'tiborsiz qoldirish demakdir.

βœ… To'g'ri yo'l β€” avval yig'ing, keyin bo'ling:
SELECT ROUND(100.0 * SUM(converted::int) / COUNT(*), 2)
FROM visits;


❌ Noto'g'ri:
SELECT AVG(konversiya) FROM (...) t;


πŸ“Œ Qoida: nisbatlarni o'rtachalamang β€” sanoqchi va maxrajni alohida yig'ing.

Xuddi shu xato bu yerlarda ham uchraydi: o'rtacha chek, konversiya, xatolik foizi, CTR. Hisobotingizdagi raqam dashboarddagi raqamga to'g'ri kelmayotgan bo'lsa β€” birinchi navbatda shuni tekshiring.

πŸ’¬ Sizda shunday holat bo'lganmi?

🎯 Endi amaliyot: Mijozlarni balans bo'yicha 4 guruhga bo'lish
Segmentatsiya mashqi β€” NTILE bilan πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
UNION va UNION ALL: qaysi biri odatda tezroq ishlaydi va nima uchun?
Anonymous Quiz
0%
UNION β€” kamroq qator qaytaradi
71%
UNION ALL β€” dublikatlarni tekshirmaydi
29%
Ikkalasi bir xil tezlikda
βž• To'plamlar: UNION, INTERSECT, EXCEPT

JOIN qatorlarni yonma-yon qo'shadi, to'plam amallari esa ustma-ust.

UNION ALL β€” ikkala natijani birlashtiradi, hammasini qoldiradi.
UNION β€” birlashtiradi va dublikatlarni olib tashlaydi (shuning uchun sekinroq).
INTERSECT β€” faqat ikkalasida ham bor qatorlar.
EXCEPT β€” birinchisida bor, ikkinchisida yo'q (MySQL da yo'q β€” NOT EXISTS bilan yoziladi).

-- Ikki oyda ham xarid qilganlar
SELECT customer_id FROM orders WHERE month = 9
INTERSECT
SELECT customer_id FROM orders WHERE month = 10;

-- Sentabrda bor, oktabrda yo'q (ketib qolganlar)
SELECT customer_id FROM orders WHERE month = 9
EXCEPT
SELECT customer_id FROM orders WHERE month = 10;


Uchta qoida:
1️⃣ Ustunlar soni va tartibi mos bo'lishi shart, nomlari esa birinchi so'rovdan olinadi.
2️⃣ ORDER BY faqat oxirida, butun natijaga qo'llanadi.
3️⃣ Dublikat bo'lmasligini bilsangiz β€” doim UNION ALL. Bu tekin tezlik.

πŸ’‘ EXCEPT ma'lumotlarni solishtirishda juda qulay: eski va yangi jadvalni ikki tomonlama ayirsangiz, qaysi qatorlar o'zgarganini darrov ko'rasiz.

🎯 Endi amaliyot: UNION va UNION ALL farqi
Farqni amalda ko'ring πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
βœ… Javob: UNION ALL tezroq

UNION dublikatlarni olib tashlashi kerak. Buning uchun baza butun natijani saralaydi yoki hash-jadval quradi β€” bu qo'shimcha xotira va vaqt. Million qatorda farq sezilarli bo'ladi.

UNION ALL esa shunchaki bir natijani ikkinchisiga ulaydi.

πŸ“Œ Amaliy qoida: dublikat bo'lishi mumkin emasligini bilsangiz (masalan, ikki jadvalda turli davrlar yoki turli manbalar), doim UNION ALL yozing.

Yana bir foydali naqsh β€” bir nechta ko'rsatkichni bitta jadvalda chiqarish:
SELECT 'Mijozlar' AS ko_rsatkich, COUNT(*) AS qiymat FROM customers
UNION ALL
SELECT 'Buyurtmalar', COUNT(*) FROM orders
UNION ALL
SELECT 'Faol mahsulotlar', COUNT(*) FROM products WHERE active;


Natija β€” kichik dashboard, bitta so'rovda. Hisobot yozganda juda qo'l keladi.

⚠️ Ustunlar tipi mos kelishi kerak: matn ustuniga son qo'shsangiz, baza xato beradi yoki jimgina tipni o'zgartiradi.

🎯 Endi amaliyot: Faqat birinchi ro'yxatdagilar
EXCEPT ni amalda sinab ko'ring πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
β˜• Ertalabki masala: mijozlar qancha vaqt qoladi?

Jadval: users(id, signup_date) va orders(user_id, order_date)

Vazifa: foydalanuvchilarni ro'yxatdan o'tgan oyi bo'yicha guruhlang va har bir guruhdan keyingi oylarda nechtasi qaytib kelganini hisoblang.

Kogorta    0-oy   1-oy   2-oy
2026-07 100 42 28
2026-08 150 61 β€”
2026-09 210 β€” β€”


Bu β€” kogorta tahlili. Har bir mahsulot menejeri undan boshlaydi, chunki u bitta savolga javob beradi: mijozlar qolyaptimi yoki oqib ketyaptimi?

🎯 Bugun 13:00 da to'liq yechamiz. Bu β€” analitik ishga kirishda eng ko'p so'raladigan amaliy topshiriq.

✍️ Qaysi funksiyalar kerak bo'ladi deb o'ylaysiz? πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz