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
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
Data analitikaga kirmoqchi bo'lsangiz β bu yerdan boshlang.
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
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
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 π
Rasmiy kanal: @sqlmasteruz
Please open Telegram to view this post
VIEW IN TELEGRAM
β1π’1π€©1π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 π
Natija: yanvarda buyurtma bermagan mijozlar umuman yo'qoladi.
Sababi oddiy:
LEFT JOIN avval o'ng jadvaldan mos qator topmasa,
To'g'ri variant β filtrni
π Yodda tuting:
ON β join qilishdan oldin o'ng jadvalni filtrlaydi
WHERE β join tugagandan keyin butun natijani filtrlaydi
Va yana bir tuzoq: bu yerda
Shunga o'xshash 200+ masala π sqlmaster.uz
Rasmiy kanal: @sqlmasteruz
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 π
Muammo: bitta buyurtmada 3 ta mahsulot bo'lsa, JOIN o'sha buyurtmani 3 marta takrorlaydi. Demak
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 π
π Tekshirish usuli: JOIN dan oldin va keyin
β οΈ
Amaliyot π sqlmaster.uz
Rasmiy kanal: @sqlmasteruz
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
Shu so'rov nima qaytaradi? π
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
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 π
Natija: bo'sh jadval. Bitta ham mijoz chiqmaydi, holbuki ular bor.
Sabab.
To'g'ri variant π
Yoki
π Qoida:
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
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
Bu farq hisobotlarda jimgina xato keltirib chiqaradi.
π Yodda tuting:
β οΈ Xuddi shu mantiq
Maoshi kiritilmagan (NULL) xodimlar o'rtachaga umuman qo'shilmaydi. Ularni nol deb hisoblamoqchi bo'lsangiz:
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
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 soniCOUNT(ustun) β NULL bo'lmagan qiymatlar soniCOUNT(1) β COUNT(*) bilan bir xil, tezligi ham bir xilCOUNT(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
1οΈβ£
2οΈβ£
3οΈβ£
4οΈβ£
5οΈβ£
6οΈβ£
7οΈβ£
Shundan kelib chiqadigan uchta amaliy xulosa:
β
β To'g'risi:
β
β
π Qoida:
π― Endi amaliyot: HAVING ichida subquery
O'qib tushundingiz β endi o'zingiz yozib ko'ring π
ββββββββ
πΎ Amaliyot: sqlmaster.uz
π’ @sqlmasteruz
Siz
SELECT dan boshlab yozasiz, baza esa boshqa tartibda ishlaydi:1οΈβ£
FROM va JOIN β jadvallar birlashtiriladi2οΈβ£
WHERE β qatorlar filtrlanadi3οΈβ£
GROUP BY β guruhlanadi4οΈβ£
HAVING β guruhlar filtrlanadi5οΈβ£
SELECT β ustunlar tanlanadi, alias shu yerda paydo bo'ladi6οΈβ£
ORDER BY β saralanadi7οΈβ£
LIMIT β kesiladiShundan 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:
Yechimlar:
Uchinchisi eng toza:
β οΈ 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
SQL ikki qiymatli emas, uch qiymatli mantiq bilan ishlaydi:
TRUE, FALSE va UNKNOWN.NULL <> 'active' β UNKNOWNNULL = 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:
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.
π― 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
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
Har qatorga noyob raqam. Teng bo'lsa ham farqlaydi (qaysi biri 2, qaysi biri 3 β tasodifiy, agar
Tenglar bir xil o'rin oladi, keyingi o'rin sakraydi. Sport natijalari shunday.
Tenglar bir xil o'rin oladi, sakrash yo'q.
PARTITION BY β guruh ichida sanash uchun:
Bu Β«har bo'lim ichida maosh bo'yicha tartiblab, 1 dan sanashΒ» degani.
π Qaysi birini tanlash:
β’ dublikat o'chirish, Β«har guruhdan bittasiΒ» β
β’ Β«top 3Β», tenglar ham kirsin β
β’ haqiqiy reyting, o'rin sakrasin β
π― Endi amaliyot: RANK va DENSE_RANK farqi
O'qib tushundingiz β endi o'zingiz yozib ko'ring π
ββββββββ
πΎ Amaliyot: sqlmaster.uz
π’ @sqlmasteruz
Uchalasi ham qatorlarga raqam beradi, lekin teng qiymatlarda boshqacha yo'l tutadi.
Misol: ballar 100, 90, 90, 80
ROW_NUMBER() β 1, 2, 3, 4Har 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, 4Tenglar bir xil o'rin oladi, keyingi o'rin sakraydi. Sport natijalari shunday.
DENSE_RANK() β 1, 2, 2, 3Tenglar 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)
Bu yerda
2-usul: korrelyatsion subquery (eski bazalarda ham ishlaydi)
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:
Bu yerda
π¬ Siz qaysi usulni yozgan edingiz?
π― Endi amaliyot: Ikkinchi eng yuqori maosh
Shu mantiqning davomi β intervyu klassikasi π
ββββββββ
πΎ Amaliyot: sqlmaster.uz
π’ @sqlmasteruz
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
Ballar: 100, 90, 90, 80. RANK() OVER (ORDER BY score DESC) bo'yicha 80 ballning o'rni nechchi bo'ladi?
Anonymous Quiz
20%
3
60%
4
20%
2
π DISTINCT bilan Β«tuzatishΒ» β eng qimmat odat
So'rov dublikat qaytardi. Ko'pchilik shu zahoti
Muammo:
Avval dublikat borligini tekshiring:
Dublikat qatorlarni o'chirish (eng ishonchli usul β
Bu har bir
β οΈ
π
π― Endi amaliyot: Takrorlangan email larni topish
O'qib tushundingiz β endi o'zingiz yozib ko'ring π
ββββββββ
πΎ Amaliyot: sqlmaster.uz
π’ @sqlmasteruz
So'rov dublikat qaytardi. Ko'pchilik shu zahoti
DISTINCT qo'shadi va davom etadi.SELECT DISTINCT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id;
Muammo:
DISTINCT sababni emas, alomatni yashiradi. Dublikat paydo bo'lgan bo'lsa, demak JOIN kaliti o'ng jadvalda unikal emas. Va agar ikki mijozning summasi tasodifan teng bo'lsa β DISTINCT ulardan birini o'chirib tashlaydi. Hisobot jimgina noto'g'ri bo'ladi.Avval dublikat borligini tekshiring:
SELECT email, COUNT(*)
FROM users
GROUP BY email
HAVING COUNT(*) > 1;
Dublikat qatorlarni o'chirish (eng ishonchli usul β
ROW_NUMBER):WITH d AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email
ORDER BY created_at) AS rn
FROM users
)
DELETE FROM users
WHERE id IN (SELECT id FROM d WHERE rn > 1);
Bu har bir
email uchun eng eskisini qoldiradi, qolganini o'chiradi.β οΈ
DELETE yozishdan oldin doim shu so'rovni SELECT bilan bir marta ishga tushiring β nima o'chishini ko'ring.π
DISTINCT yozgingiz kelsa, avval bitta savol bering: bu dublikat qayerdan keldi?π― Endi amaliyot: Takrorlangan email larni topish
O'qib tushundingiz β endi o'zingiz yozib ko'ring π
ββββββββ
πΎ Amaliyot: sqlmaster.uz
π’ @sqlmasteruz
β
Ertalabki test javobi: 4-o'rin
Amalda bu qayerda muhim?
Vazifa: Β«top 3 mahsulotΒ» ro'yxatini chiqaring.
Agar boshliq Β«menga aniq 3 qator kerakΒ» desa β
Bu texnik emas, biznes savoli. Shuning uchun analitik so'rov yozishdan oldin aniqlab oladi.
π¬ Sizning ishingizda Β«top NΒ» qanday hisoblanadi?
π― Endi amaliyot: Takroriy yozuvlarni tozalash
O'qib tushundingiz β endi o'zingiz yozib ko'ring π
ββββββββ
πΎ Amaliyot: sqlmaster.uz
π’ @sqlmasteruz
RANK() tenglardan keyin o'rinni sakratadi: 1, 2, 2, 4. Uchinchi o'rin umuman bo'lmaydi.DENSE_RANK() esa sakratmaydi: 1, 2, 2, 3.Amalda bu qayerda muhim?
Vazifa: Β«top 3 mahsulotΒ» ro'yxatini chiqaring.
-- DENSE_RANK: teng natijalar ham kiradi
WHERE drnk <= 3 -- 3 ta o'rin, lekin 4-5 qator bo'lishi mumkin
-- ROW_NUMBER: qat'iy 3 qator
WHERE rn <= 3
Agar boshliq Β«menga aniq 3 qator kerakΒ» desa β
ROW_NUMBER. Agar Β«uchinchi o'rinni bo'lishganlar ham chiqsinΒ» desa β DENSE_RANK.Bu texnik emas, biznes savoli. Shuning uchun analitik so'rov yozishdan oldin aniqlab oladi.
π¬ Sizning ishingizda Β«top NΒ» qanday hisoblanadi?
π― Endi amaliyot: Takroriy yozuvlarni tozalash
O'qib tushundingiz β endi o'zingiz yozib ko'ring π
ββββββββ
πΎ Amaliyot: sqlmaster.uz
π’ @sqlmasteruz
β Ertalabki masala: ketma-ket kunlar
Jadval:
Vazifa: kamida 3 kun ketma-ket tizimga kirgan foydalanuvchilarni toping.
Masalan:
β’ user 1 β 5, 6, 7-oktabr β
β’ user 2 β 5, 6, 8-oktabr β
β οΈ Ogohlantirish: bu masala
π― Bu Β«gaps and islandsΒ» deb ataladigan klassik masala. Uni bilgan odam intervyuda darrov ajralib turadi.
βοΈ Fikringizni izohda yozing, 13:00 da to'liq tahlil qilamiz π
π― Endi amaliyot: 3+ ketma-ket kun kirgan foydalanuvchilar
Masala saytda tayyor turibdi β urinib ko'ring π
ββββββββ
πΎ Amaliyot: sqlmaster.uz
π’ @sqlmasteruz
Jadval:
logins(user_id, login_date) β har bir kirish bitta qator.Vazifa: kamida 3 kun ketma-ket tizimga kirgan foydalanuvchilarni toping.
Masalan:
β’ user 1 β 5, 6, 7-oktabr β
β’ user 2 β 5, 6, 8-oktabr β
SELECT user_id
FROM logins
???
β οΈ Ogohlantirish: bu masala
GROUP BY bilan yechilmaydi. Bu yerda boshqa usul kerak.π― Bu Β«gaps and islandsΒ» deb ataladigan klassik masala. Uni bilgan odam intervyuda darrov ajralib turadi.
βοΈ Fikringizni izohda yozing, 13:00 da to'liq tahlil qilamiz π
π― Endi amaliyot: 3+ ketma-ket kun kirgan foydalanuvchilar
Masala saytda tayyor turibdi β urinib ko'ring π
ββββββββ
πΎ Amaliyot: sqlmaster.uz
π’ @sqlmasteruz
π Gaps and islands: ketma-ketlikni qanday topish kerak
Ertalabki masalaning yechimi. Butun sir bitta hiylada.
Hiyla: agar sanalar ketma-ket bo'lsa, ularning tartib raqami ham ketma-ket o'sadi. Demak
Nima bo'lyapti?
5, 6, 7-oktabr β raqamlari 1, 2, 3 β ayirma har uchalasida bir xil β bitta guruh, 3 qator β shart bajarildi.
5, 6, 8-oktabr β 8 da ayirma o'zgaradi β yangi guruh boshlanadi β hech qaysi guruhda 3 ta yo'q.
β οΈ
π Xuddi shu usul boshqa joylarda ham ishlaydi:
β’ streak hisoblash (ketma-ket kunlar)
β’ uzluksiz ishlagan davrlar
β’ sensor ma'lumotlaridagi uzilishlar
β’ abonement to'lovlaridagi bo'shliqlar
π¬ Bu usulni bilarmidingiz? Boshqa yechim taklif qila olasizmi?
π― Endi amaliyot: Eng uzun g'alabalar seriyasi
Xuddi shu usul bilan yechiladi β mustahkamlab oling π
ββββββββ
πΎ Amaliyot: sqlmaster.uz
π’ @sqlmasteruz
Ertalabki masalaning yechimi. Butun sir bitta hiylada.
Hiyla: agar sanalar ketma-ket bo'lsa, ularning tartib raqami ham ketma-ket o'sadi. Demak
sana β tartib_raqami ayirmasi bitta Β«orolchaΒ» ichida o'zgarmaydi.WITH t AS (
SELECT user_id, login_date,
login_date - (ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY login_date
) * INTERVAL '1 day') AS grp
FROM (SELECT DISTINCT user_id, login_date FROM logins) x
)
SELECT user_id
FROM t
GROUP BY user_id, grp
HAVING COUNT(*) >= 3;
Nima bo'lyapti?
5, 6, 7-oktabr β raqamlari 1, 2, 3 β ayirma har uchalasida bir xil β bitta guruh, 3 qator β shart bajarildi.
5, 6, 8-oktabr β 8 da ayirma o'zgaradi β yangi guruh boshlanadi β hech qaysi guruhda 3 ta yo'q.
β οΈ
SELECT DISTINCT shart: bitta kunda ikki marta kirgan bo'lsa, raqamlar siljib ketadi va natija buziladi.π Xuddi shu usul boshqa joylarda ham ishlaydi:
β’ streak hisoblash (ketma-ket kunlar)
β’ uzluksiz ishlagan davrlar
β’ sensor ma'lumotlaridagi uzilishlar
β’ abonement to'lovlaridagi bo'shliqlar
π¬ Bu usulni bilarmidingiz? Boshqa yechim taklif qila olasizmi?
π― Endi amaliyot: Eng uzun g'alabalar seriyasi
Xuddi shu usul bilan yechiladi β mustahkamlab oling π
ββββββββ
πΎ Amaliyot: sqlmaster.uz
π’ @sqlmasteruz
π1