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
Ko'pchilik SQL'ni "bilaman" deb o'ylaydi. Lekin ish suhbatida oddiy JOIN yoki Window funksiya so'ralganda qotib qoladi.

Sababi oddiy β€” video ko'rish bilan SQL o'rganilmaydi. SQL faqat yozib, xato qilib, tuzatib o'rganiladi.

Bunda sizga sqlmaster.uz yordam beradi.

Bu β€” sof amaliyot platformasi. Dars yo'q, faqat masalalar:

πŸ”Ή 200+ masala (60+ saytga joylangan) β€” Uzum, Click, taksi kabi real biznes mavzularida
πŸ”Ή SQL yozasiz, tizim darrov tekshiradi
πŸ”Ή JOIN, Subquery, Window, CTE, Agregatsiya β€” mavzu bo'yicha mashq qiling
πŸ”Ό Oson'dan Qiyin'gacha bosqichma-bosqich

Data analitikaga kirmoqchi bo'lsangiz β€” bu yerdan boshlang.

πŸ–₯ sqlmaster.uz β€” bepul, hoziroq sinab ko'ring.

Rasmiy kanal: @sqlmasteruz
Please open Telegram to view this post
VIEW IN TELEGRAM
SQL Master πŸ‡ΊπŸ‡Ώ: Ish suhbatida "JOIN yozib bering" deyishsa β€” ko'pchilik shu yerda to'xtaydi. Nazariya yetarli emas; SQL'ni masala yechib, xato qilib, tuzatib o'rganasiz.

Shuning uchun sqlmaster.uz da 200+ masala yig'ilgan πŸ‘‡:
πŸ”Ή Real biznes vaziyatlari: Uzum, Click, taksi
πŸ”Ή Yozasiz β€” tizim darrov tekshiradi
πŸ”Ή Mavzular: JOIN, Subquery, Window, CTE, Agregatsiya
πŸ”Ή Bosqichma-bosqich: Oson β†’ O'rtacha β†’ Qiyin

Bugun 10 ta masala yeching β€” ertaga suhbatda qotmaysiz.
πŸ’Ύ sqlmaster.uz β€” bepul, hozir sinab ko'ring.

Rasmiy kanal: @sqlmasteruz
⚑1πŸ”₯1πŸ•Š1πŸ†1πŸ†’1
Endi masalani yechish bilan cheklanib qolmaysiz β€” Muhokama bo'limini qo'shdik πŸ’¬; chunki "Ikki odamning birga yurgani bir odamdan yaxshiroqdir" degan hikmatdayin, o'rganish ham birgalikda bo'lganda ma'no topadi.

Har bir masalada endi:
πŸ”Ή O'z yondashuvingizni boshqalar bilan bo'lishasiz;
πŸ”Ή Qotib qolgan joyingizda savol berasiz;
πŸ”Ή Boshqalarga yordam berib, o'zingiz ham mustahkamlaysiz; chunki "Berish olishdan yaxshiroqdir" degan so'z bo'ldi.

Bitta masalaning 5 xil yechimi bo'ladi β€” birov subquery bilan, birov window funksiya bilan. Ana shu farqni ko'rish orqali chinakam o'rganiladi; chunki "Ishoning, ko'ring, va o'zingiz qiling".

Masalani yeching β†’ Muhokama bo'limiga o'ting β†’ birinchi izohni siz qoldiring πŸ‘‡

🌐 sqlmaster.uz β€” bepul, hoziroq sinab ko'ring.

Rasmiy kanal: @sqlmasteruz
Please open Telegram to view this post
VIEW IN TELEGRAM
✍1😒1🀩1πŸ†’1
Please open Telegram to view this post
VIEW IN TELEGRAM
❀1
LEFT JOIN yozdingiz, lekin u INNER JOIN bo'lib qoldi πŸ€¦β€β™‚οΈ
Bu β€” SQL suhbatlarida eng ko'p "yiqitadigan" xato.
Vazifa: har bir mijozni va uning yanvardagi buyurtmalari sonini chiqaring. Buyurtma bermaganlar ham ro'yxatda 0 bilan turishi kerak.

Ko'pchilik shunday yozadi πŸ‘‡
SELECT c.name, COUNT(o.id) AS orders
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.created_at >= '2026-01-01'
GROUP BY c.name;

Natija: yanvarda buyurtma bermagan mijozlar umuman yo'qoladi.

Sababi oddiy:
LEFT JOIN avval o'ng jadvaldan mos qator topmasa, o.* ustunlarini NULL qilib qo'yadi. Keyin WHERE o.created_at >= ... ishga tushadi va o'sha NULL qatorlarni o'chirib tashlaydi. Ya'ni siz yozgan LEFT JOIN amalda INNER JOIN.

To'g'ri variant β€” filtrni ON ichiga olish πŸ‘‡
SELECT c.name, COUNT(o.id) AS orders
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id
AND o.created_at >= '2026-01-01'
GROUP BY c.name;

πŸ“Œ Yodda tuting:
ON β€” join qilishdan oldin o'ng jadvalni filtrlaydi
WHERE β€” join tugagandan keyin butun natijani filtrlaydi
Va yana bir tuzoq: bu yerda COUNT(*) emas, COUNT(o.id) yozilgan. COUNT(*) buyurtmasi yo'q mijozga ham 1 deb ko'rsatadi, chunki NULL bo'lsa ham qator mavjud.

Shunga o'xshash 200+ masala πŸ‘‰ sqlmaster.uz

Rasmiy kanal: @sqlmasteruz
Marhamat β€” fan-out (dublikat qatorlar) mavzusidagi post:

JOIN dan keyin summangiz 3 barobar oshib ketdimi? πŸ“ˆ
Hisobot yozdingiz, raqam boshliqqa ketdi, keyin ma'lum bo'ldi β€” savdo hajmi aslida uch barobar kam. Tanish holat.
Vazifa: har bir mijoz bo'yicha umumiy buyurtma summasi va sotib olingan mahsulotlar soni.

Ko'pchilik shunday yozadi πŸ‘‡
SELECT c.name,
SUM(o.amount) AS jami_summa,
SUM(i.quantity) AS mahsulotlar
FROM customers c
JOIN orders o ON o.customer_id = c.id
JOIN order_items i ON i.order_id = o.id
GROUP BY c.name;

Muammo: bitta buyurtmada 3 ta mahsulot bo'lsa, JOIN o'sha buyurtmani 3 marta takrorlaydi. Demak o.amount ham 3 marta qo'shiladi.
SUM(o.amount) = xato. SUM(i.quantity) = to'g'ri.
Ya'ni bitta so'rovda bir ustun to'g'ri, ikkinchisi noto'g'ri β€” shuning uchun ham bu xatoni payqash qiyin.

Sabab: JOIN 1:N munosabatda chap jadvalning qatorini ko'paytiradi (fan-out). Agar ikkita 1:N jadval qo'shsangiz β€” qatorlar ko'payib emas, ko'paytirilib ketadi (3 ta mahsulot Γ— 2 ta to'lov = 6 qator).
Yechim: har bir darajani alohida agregatsiya qilib, keyin join qiling πŸ‘‡
WITH ord AS (
SELECT customer_id, SUM(amount) AS jami_summa
FROM orders
GROUP BY customer_id
),
itm AS (
SELECT o.customer_id, SUM(i.quantity) AS mahsulotlar
FROM orders o
JOIN order_items i ON i.order_id = o.id
GROUP BY o.customer_id
)
SELECT c.name, ord.jami_summa, itm.mahsulotlar
FROM customers c
LEFT JOIN ord ON ord.customer_id = c.id
LEFT JOIN itm ON itm.customer_id = c.id;


πŸ” Tekshirish usuli: JOIN dan oldin va keyin COUNT(*) ni solishtiring. Qatorlar soni oshgan bo'lsa β€” join kaliti o'ng jadvalda unikal emas, demak summalaringizga ishonmang.
⚠️ SUM(DISTINCT o.amount) bilan "tuzatmang" β€” ikki mijozning summasi tasodifan teng bo'lsa, bittasi yo'qoladi.

Amaliyot πŸ‘‰ sqlmaster.uz

Rasmiy kanal: @sqlmasteruz
β˜• Ertalabki savol

users jadvalida 100 ta qator bor. Ulardan 30 tasida phone ustuni NULL.

Shu so'rov nima qaytaradi? πŸ‘‡
SELECT COUNT(*), COUNT(phone)
FROM users;


A) 100 va 100
B) 100 va 70
C) 70 va 70

Javobingizni izohda yozing β€” bugun 20:00 da tahlil qilamiz πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
⚠️ NOT IN sizni jimgina aldaydi

Vazifa: hech qachon buyurtma bermagan mijozlarni toping.

Ko'pchilik shunday yozadi πŸ‘‡
SELECT name
FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);


Natija: bo'sh jadval. Bitta ham mijoz chiqmaydi, holbuki ular bor.

Sabab. orders.customer_id ustunida bitta NULL bo'lsa yetarli. id NOT IN (1, 2, NULL) ifodasi hech qachon TRUE bo'lmaydi β€” u UNKNOWN qaytaradi, chunki SQL Β«bu qiymat NULL ga teng emasmi?Β» degan savolga javob bera olmaydi. WHERE esa faqat TRUE qatorlarni o'tkazadi.

To'g'ri variant πŸ‘‡
SELECT c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id
);


Yoki LEFT JOIN ... IS NULL orqali:
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;


πŸ“Œ Qoida: NOT IN faqat ustun NOT NULL ekaniga ishonchingiz komil bo'lsa. Aks holda doim NOT EXISTS.

Bu tuzoq ish suhbatlarida ataylab so'raladi.

🎯 Endi amaliyot: Qora ro'yxatda bo'lmagan mijozlar (NULL tuzog'i)
Aynan shu tuzoq ustiga qurilgan masala. NOT EXISTS bilan yozib ko'ring πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
βœ… Ertalabki savol javobi: B β€” 100 va 70

COUNT(*) qatorlarni sanaydi β€” 100 ta.
COUNT(phone) esa faqat NULL bo'lmagan qiymatlarni sanaydi β€” 70 ta.

Bu farq hisobotlarda jimgina xato keltirib chiqaradi.

πŸ“Š Yodda tuting:
COUNT(*) β€” qatorlar soni
COUNT(ustun) β€” NULL bo'lmagan qiymatlar soni
COUNT(1) β€” COUNT(*) bilan bir xil, tezligi ham bir xil
COUNT(DISTINCT ustun) β€” takrorlanmaydigan qiymatlar

⚠️ Xuddi shu mantiq AVG va SUM ga ham tegishli:
SELECT AVG(salary) FROM employees;

Maoshi kiritilmagan (NULL) xodimlar o'rtachaga umuman qo'shilmaydi. Ularni nol deb hisoblamoqchi bo'lsangiz:
SELECT AVG(COALESCE(salary, 0)) FROM employees;

Ikki so'rov ikki xil raqam qaytaradi β€” qaysi biri to'g'ri ekanini siz hal qilasiz, baza emas.

πŸ’¬ Shu xatoga duch kelganmisiz? Izohda yozing.

🎯 Endi amaliyot: O'rtacha: NULL larni hisobga olish
O'qib tushundingiz β€” endi o'zingiz yozib ko'ring πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
status ustunida NULL qatorlar bor. Β«SELECT * FROM tasks WHERE status <> 'active'Β» β€” o'sha NULL qatorlar natijaga chiqadimi?
Anonymous Quiz
0%
Ha, chiqadi
100%
Yo'q, chiqmaydi
0%
Bazaga bog'liq
πŸ”₯1
πŸ”’ SQL so'rovi siz yozgan tartibda bajarilmaydi

Siz SELECT dan boshlab yozasiz, baza esa boshqa tartibda ishlaydi:

1️⃣ FROM va JOIN β€” jadvallar birlashtiriladi
2️⃣ WHERE β€” qatorlar filtrlanadi
3️⃣ GROUP BY β€” guruhlanadi
4️⃣ HAVING β€” guruhlar filtrlanadi
5️⃣ SELECT β€” ustunlar tanlanadi, alias shu yerda paydo bo'ladi
6️⃣ ORDER BY β€” saralanadi
7️⃣ LIMIT β€” kesiladi

Shundan kelib chiqadigan uchta amaliy xulosa:

❌ WHERE da alias ishlatib bo'lmaydi β€” u hali mavjud emas:
SELECT price * 1.12 AS total
FROM products
WHERE total > 100; -- xato!

βœ… To'g'risi: WHERE price * 1.12 > 100

βœ… ORDER BY da esa alias ishlaydi β€” u SELECT dan keyin bajariladi.

❌ WHERE ichida SUM() yozib bo'lmaydi β€” guruhlash hali bo'lmagan. Agregat bo'yicha filtr faqat HAVING da:
SELECT customer_id, SUM(amount) AS jami
FROM orders
WHERE status = 'paid' -- qatorlarni filtrlaydi
GROUP BY customer_id
HAVING SUM(amount) > 1000000; -- guruhlarni filtrlaydi


πŸ“Œ Qoida: WHERE β€” guruhlashdan oldin, HAVING β€” keyin. Filtrni iloji boricha WHERE ga qo'ying: kamroq qator guruhlanadi, so'rov tezroq ishlaydi.

🎯 Endi amaliyot: HAVING ichida subquery
O'qib tushundingiz β€” endi o'zingiz yozib ko'ring πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
πŸ‘1
βœ… Ertalabki test javobi: NULL qatorlar chiqmaydi

SQL ikki qiymatli emas, uch qiymatli mantiq bilan ishlaydi: TRUE, FALSE va UNKNOWN.

NULL <> 'active' β†’ UNKNOWN
NULL = NULL β†’ UNKNOWN (ha, NULL o'ziga ham teng emas!)

WHERE esa faqat TRUE bo'lgan qatorlarni o'tkazadi. UNKNOWN β€” tashlab yuboriladi.

Yechimlar:
-- 1. Ochiq-oydin qo'shish
WHERE status <> 'active' OR status IS NULL

-- 2. NULL ni qiymatga aylantirish
WHERE COALESCE(status, 'none') <> 'active'

-- 3. PostgreSQL usuli
WHERE status IS DISTINCT FROM 'active'


Uchinchisi eng toza: IS DISTINCT FROM NULL ni oddiy qiymat kabi solishtiradi.

⚠️ Eng xavflisi shundaki, bunday so'rov xato bermaydi. Shunchaki qatorlar yo'qoladi β€” hisobotdagi raqam kamayadi, siz esa sezmaysiz.

πŸ’¬ Sizning bazangizda qaysi ustunlar NULL bo'lishi mumkin? Bir tekshirib ko'ring πŸ‘‡

🎯 Endi amaliyot: NULL: uch qiymatli mantiq tuzog'i
O'qib tushundingiz β€” endi o'zingiz yozib ko'ring πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
β˜• Ertalabki masala: klassik intervyu savoli

Jadval: employees(id, name, department, salary)

Vazifa: har bir bo'limdagi eng yuqori maosh oladigan xodimni chiqaring. Bitta bo'limda bir xil maosh bilan ikki kishi bo'lsa β€” ikkalasi ham ro'yxatda bo'lsin.

SELECT ???
FROM employees
???


🎯 Bu savol ish suhbatlarida eng ko'p beriladigan uchlikdan biri. Kamida ikki xil yechimi bor.

✍️ O'z variantingizni izohda yozing β€” 20:00 da ikkala yechimni ham tahlil qilamiz πŸ‘‡

🎯 Endi amaliyot: Har bo'limdagi eng yuqori maosh
Masala saytda ham bor β€” yozing, tizim javobingizni darhol tekshiradi πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
πŸͺŸ ROW_NUMBER, RANK, DENSE_RANK β€” farqi nimada?

Uchalasi ham qatorlarga raqam beradi, lekin teng qiymatlarda boshqacha yo'l tutadi.

Misol: ballar 100, 90, 90, 80

ROW_NUMBER() β†’ 1, 2, 3, 4
Har qatorga noyob raqam. Teng bo'lsa ham farqlaydi (qaysi biri 2, qaysi biri 3 β€” tasodifiy, agar ORDER BY aniq bo'lmasa).

RANK() β†’ 1, 2, 2, 4
Tenglar bir xil o'rin oladi, keyingi o'rin sakraydi. Sport natijalari shunday.

DENSE_RANK() β†’ 1, 2, 2, 3
Tenglar bir xil o'rin oladi, sakrash yo'q.

SELECT
name,
score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS rn,
RANK() OVER (ORDER BY score DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY score DESC) AS drnk
FROM results;


PARTITION BY β€” guruh ichida sanash uchun:
ROW_NUMBER() OVER (
PARTITION BY department
ORDER BY salary DESC
)

Bu Β«har bo'lim ichida maosh bo'yicha tartiblab, 1 dan sanashΒ» degani.

πŸ“Œ Qaysi birini tanlash:
β€’ dublikat o'chirish, Β«har guruhdan bittasiΒ» β†’ ROW_NUMBER
β€’ Β«top 3Β», tenglar ham kirsin β†’ DENSE_RANK
β€’ haqiqiy reyting, o'rin sakrasin β†’ RANK

🎯 Endi amaliyot: RANK va DENSE_RANK farqi
O'qib tushundingiz β€” endi o'zingiz yozib ko'ring πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
βœ… Ertalabki masala yechimi: har bo'limdagi eng yuqori maosh

1-usul: window funksiya (zamonaviy, tavsiya etiladi)
WITH ranked AS (
SELECT name, department, salary,
RANK() OVER (PARTITION BY department
ORDER BY salary DESC) AS r
FROM employees
)
SELECT name, department, salary
FROM ranked
WHERE r = 1;

Bu yerda RANK ishlatildi, chunki shartda Β«bir xil maosh bo'lsa ikkalasi hamΒ» deyilgan. ROW_NUMBER bo'lsa faqat bittasi chiqardi.

2-usul: korrelyatsion subquery (eski bazalarda ham ishlaydi)
SELECT name, department, salary
FROM employees e
WHERE salary = (
SELECT MAX(salary)
FROM employees
WHERE department = e.department
);


Qaysi biri yaxshi? Odatda window β€” jadval bir marta o'qiladi. Subquery esa har qator uchun ichki so'rovni qayta bajarishi mumkin (index bo'lmasa ayniqsa og'ir).

❌ Eng ko'p uchraydigan xato:
SELECT name, department, MAX(salary)
FROM employees
GROUP BY department; -- xato!

Bu yerda name qaysi xodimniki ekani noma'lum. PostgreSQL xato beradi, MySQL esa tasodifiy ism qaytaradi β€” bu yanada yomon, chunki so'rov Β«ishlaydiΒ».

πŸ’¬ Siz qaysi usulni yozgan edingiz?

🎯 Endi amaliyot: Ikkinchi eng yuqori maosh
Shu mantiqning davomi β€” intervyu klassikasi πŸ‘‡

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