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
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
πŸ“Š Kogorta tahlili: bosqichma-bosqich

1-qadam: har foydalanuvchining kogortasi (ro'yxatdan o'tgan oyi)
WITH kogorta AS (
SELECT id AS user_id,
DATE_TRUNC('month', signup_date) AS kogorta_oy
FROM users
),


2-qadam: har buyurtmani oyga bog'lash
faollik AS (
SELECT k.user_id, k.kogorta_oy,
DATE_TRUNC('month', o.order_date) AS faol_oy
FROM kogorta k
JOIN orders o ON o.user_id = k.user_id
)


3-qadam: farqni oyda hisoblash va sanash
SELECT kogorta_oy,
EXTRACT(YEAR FROM AGE(faol_oy, kogorta_oy)) * 12
+ EXTRACT(MONTH FROM AGE(faol_oy, kogorta_oy)) AS oy_raqami,
COUNT(DISTINCT user_id) AS foydalanuvchi
FROM faollik
GROUP BY 1, 2
ORDER BY 1, 2;


Uch muhim nuqta:
πŸ”Ή COUNT(DISTINCT user_id) β€” bitta odam oyda 10 marta xarid qilsa ham, bir marta sanaladi.
πŸ”Ή Foizga o'tkazish uchun har kogortaning 0-oyidagi soniga bo'linadi (window: FIRST_VALUE).
πŸ”Ή Oxirgi kogortalarda bo'sh kataklar bo'ladi β€” bu xato emas, hali vaqt o'tmagan.

πŸ’‘ Shu jadvalni ko'rib, biznes bitta savolga javob oladi: yangi mijoz olish kerakmi yoki borlarini ushlab qolishmi?

🎯 Endi amaliyot: Kogorta bo'yicha ushlab qolish
Saytda to'liq masala sifatida bor β€” yeching πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
πŸ’Ό Intervyuda Β«qanday yechgan bo'lardingiz?Β» deb so'rashadi

Bugungi kogorta masalasi β€” data analitik vakansiyalarida test topshirig'i sifatida beriladigan klassik misol. Uni bir marta yechgan odam suhbatda ishonch bilan gapiradi.

Muammo shundaki, bunday masalalarni o'z-o'zidan topib mashq qilish qiyin: real jadval kerak, ma'lumot kerak, javobni tekshiradigan kimdir kerak.

sqlmaster.uz da shu uchalasi ham bor:

πŸ”Ή 195 ta masala β€” bugungi kabi real biznes vaziyatlari: Uzum, Click, Payme, taksi, banklar
πŸ”Ή Yozasiz β€” tizim darrov tekshiradi. Bir nechta namuna ma'lumot to'plamida sinaladi, chekka holatlar ham
πŸ”Ή Muhokama bo'limi β€” boshqalarning yechimini ko'rasiz

Premium'da qo'shimcha (29 000 so'm/oy):
πŸ”Ή Har masalada 2-3 ta yechim: oddiydan optimalgacha, nega biri tezroq ekani tushuntirilgan
πŸ”Ή Query plan tahlili va index tavsiyalari
πŸ”Ή Kompaniya track'lari: Click, Payme, Uzum, EPAM va banklar uchun intervyu to'plamlari
πŸ”Ή 4 dialekt: PostgreSQL, MySQL, SQL Server, Oracle

πŸ’‘ Avval 50 ta masala bepul β€” karta kerak emas, 30 soniyada boshlaysiz.

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
β˜• Ertalabki savol: o'rtacha aldayaptimi?

Bo'limda 5 xodim. Maoshlari:
4 000 000
4 500 000
5 000 000
5 500 000
40 000 000 ← rahbar


O'rtacha maosh: 11 800 000
Xodimlarning 80% i esa 5 500 000 dan kam oladi.

Hisobotda qaysi raqamni ko'rsatish to'g'ri?

A) O'rtacha (AVG)
B) Median
C) Ikkalasi ham

✍️ Javobingizni izohda yozing. 13:00 da medianni SQL da qanday hisoblashni ko'rsataman πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
πŸ“ Median va persentil: AVG dan ko'ra halolroq raqam

AVG bitta chetdagi qiymatdan buziladi. Median esa Β«o'rtadagi odamΒ» ni ko'rsatadi va chetki qiymatlarga befarq.

PostgreSQL:
SELECT department,
AVG(salary) AS ortacha,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS median,
PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY salary) AS p90
FROM employees
GROUP BY department;


PERCENTILE_CONT β€” oraliq qiymatni interpolyatsiya qiladi.
PERCENTILE_DISC β€” mavjud qiymatlardan birini qaytaradi.

Window funksiyalar yo'q bazada β€” ROW_NUMBER hiylasi:
WITH t AS (
SELECT salary,
ROW_NUMBER() OVER (ORDER BY salary) AS rn,
COUNT(*) OVER () AS jami
FROM employees
)
SELECT AVG(salary) AS median
FROM t
WHERE rn IN ((jami + 1) / 2, (jami + 2) / 2);

Bu qator soni juft ham, toq ham bo'lsa to'g'ri ishlaydi.

πŸ“Œ Qachon nima:
β€’ Maosh, chek, kutish vaqti β†’ median (chetki qiymatlar ko'p)
β€’ Umumiy summa muhim bo'lsa β†’ AVG
β€’ Xizmat sifati β†’ p90 yoki p95 (eng yomon holatlar qanchalik yomon)

πŸ’‘ Β«Sahifa 0.3 soniyada ochiladiΒ» degani ko'pincha o'rtacha. p95 esa 4 soniya bo'lishi mumkin β€” foydalanuvchi shuni his qiladi.

🎯 Endi amaliyot: Bo'lim bo'yicha median maosh
Medianni o'zingiz hisoblang πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
βœ… Javob: C β€” ikkalasi ham, lekin medianga urg'u bilan

Yaxshi hisobot bitta raqam bermaydi. To'g'ri javob β€” ikkalasini yonma-yon ko'rsatish va farqni izohlash. Ular orasidagi katta tafovutning o'zi muhim signal: taqsimot notekis.

SELECT
department,
COUNT(*) AS xodim,
ROUND(AVG(salary)) AS ortacha,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) AS median,
MAX(salary) AS eng_yuqori
FROM employees
GROUP BY department
ORDER BY median DESC;


Analitikning kuchi shu yerda ko'rinadi: so'rov yozish β€” texnika. Qaysi ko'rsatkichni tanlash va uni qanday tushuntirish β€” kasb.

πŸ’‘ Amaliy maslahat: hisobotga COUNT(*) ni doim qo'shing. 3 ta xodimli bo'limning Β«o'rtacha maoshiΒ» haqida xulosa chiqarib bo'lmaydi, lekin sonini ko'rsatmasangiz, buni hech kim bilmaydi.

πŸ’¬ Sizning hisobotlaringizda median ishlatiladimi yoki faqat o'rtacha?

🎯 Endi amaliyot: Window bilan median
Ikkinchi usul β€” window orqali πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
COALESCE(NULL, NULL, 'Aziz', 'Bekzod') nima qaytaradi?
Anonymous Quiz
0%
NULL
80%
'Aziz'
20%
'Aziz Bekzod'
πŸ”€ Shartli mantiq: CASE, COALESCE, NULLIF

CASE β€” SQL dagi Β«agarΒ»:
SELECT name,
CASE
WHEN amount >= 10000000 THEN 'VIP'
WHEN amount >= 1000000 THEN 'Doimiy'
ELSE 'Yangi'
END AS daraja
FROM customers;

⚠️ Shartlar yuqoridan pastga tekshiriladi, birinchi mos kelgani g'olib. Shuning uchun tartib muhim: eng qattiq shart yuqorida bo'lsin. ELSE yozilmasa, mos kelmagan qatorlar NULL oladi.

COALESCE β€” birinchi NULL bo'lmagan qiymat:
SELECT COALESCE(nickname, first_name, 'Mehmon') AS ism
FROM users;

Zaxira qiymatlar zanjiri: taxallus bo'lmasa ism, u ham bo'lmasa Β«MehmonΒ».

NULLIF β€” ikki qiymat teng bo'lsa NULL qaytaradi. Asosan nolga bo'lishdan himoya uchun:
SELECT summa / NULLIF(soni, 0) AS ortacha_chek FROM orders;


GREATEST / LEAST β€” bir necha ustundan eng katta yoki eng kichigi:
SELECT GREATEST(updated_at, created_at) AS oxirgi_ozgarish FROM docs;


πŸ’‘ CASE ni SUM yoki COUNT ichiga qo'ysangiz β€” bitta so'rovda bir nechta shartli ko'rsatkich chiqaradi. Kecha ko'rgan pivot shu tamoyilga qurilgan.

🎯 Endi amaliyot: Zaxira qiymatlar zanjiri
COALESCE zanjirini amalda yozing πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
βœ… Javob: 'Aziz'

COALESCE ro'yxatni chapdan o'ngga tekshiradi va birinchi NULL bo'lmagan qiymatni qaytaradi. Qolganlari hisoblanmaydi ham β€” bu muhim, chunki ichida og'ir subquery bo'lsa, u bajarilmaydi.

Eng ko'p ishlatiladigan uch holat:

1️⃣ Hisobotda bo'sh katak o'rniga nol
SELECT c.name, COALESCE(SUM(o.amount), 0) AS jami
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

Busiz buyurtmasi yo'q mijozda NULL turadi va Excel'ga eksport qilganda bo'sh katak bo'lib qoladi.

2️⃣ Matnlarni birlashtirish. NULL qo'shilsa, butun natija NULL bo'ladi:
'Aziz' || NULL β†’ NULL
'Aziz' || COALESCE(NULL, '') β†’ 'Aziz'

3️⃣ Saralashda NULL ni oxiriga surish
ORDER BY COALESCE(rating, 0) DESC yoki PostgreSQL da ORDER BY rating DESC NULLS LAST

⚠️ COALESCE bilan NULL ni yashirishdan oldin bir savol bering: bu NULL nega paydo bo'ldi? Ba'zan u JOIN dagi xatoning belgisi bo'ladi, siz esa uni nol bilan yopib qo'yasiz.

πŸ’¬ Hisobotlaringizda NULL ni qanday ko'rsatasiz β€” 0 mi, chiziqchami?

🎯 Endi amaliyot: Talabaning to'liq ismi
Matn birlashtirish va NULL β€” amalda πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
πŸ†• sqlmaster.uz'da yangi bo'lim β€” Β«O'rganishΒ»

Kanaldagi qisqa postlarning to'liq versiyasi endi saytda: har bir mavzu bo'yicha tushuntirish, misol jadval, so'rov va natija, ko'p uchraydigan xatolar va oxirida shu mavzudagi masalalar.

Hozir 9 ta darslik:
β€’ SQL so'rovi qaysi tartibda bajariladi
β€’ WHERE va HAVING farqi
β€’ GROUP BY asoslari
β€’ INNER JOIN va LEFT JOIN farqi
β€’ NULL bilan ishlash β€” nega = NULL ishlamaydi
β€’ COALESCE va CASE
β€’ Subquery yoki JOIN
β€’ CTE (WITH)
β€’ ROW_NUMBER, RANK va DENSE_RANK

Hammasi bepul. Darslikni o'qib bo'lgach, shu mavzudagi masalani saytning o'zida yechib ko'rasiz β€” tizim darhol tekshiradi.

πŸ‡·πŸ‡Ί πŸ‡¬πŸ‡§ Darsliklar rus va ingliz tillarida ham bor.

πŸ‘‰ sqlmaster.uz/learn

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
β˜• Ertalabki masala: to'planib boruvchi yig'indi

Jadval: daily_sales(sale_date, amount)

Vazifa: har kun uchun o'sha kungi savdo va oy boshidan beri to'plangan jamini chiqaring.

kun       kunlik    jami
01-okt 120 120
02-okt 80 200
03-okt 150 350


⚠️ Bu masalani GROUP BY bilan yechib bo'lmaydi: har qatorda o'zidan oldingi barcha qatorlar yig'indisi kerak.

🎯 Bunday hisobotlar «kumulyativ» yoki «running total» deb ataladi. Moliyaviy hisobotlarning yarmi shu ko'rinishda.

✍️ Qaysi funksiya kerak? Izohda yozing πŸ‘‡

βž–βž–βž–βž–βž–βž–βž–βž–
πŸ’Ύ Amaliyot: sqlmaster.uz
πŸ“’ @sqlmasteruz
πŸͺŸ Window frame: Β«qaysi qatorlargacha hisoblansin?Β»

Window funksiya faqat guruhlamaydi β€” u oyna ichida ishlaydi. Oynaning chegarasini siz belgilaysiz.

Running total (to'planib boruvchi yig'indi):
SELECT sale_date, amount,
SUM(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS jami
FROM daily_sales;

Β«Boshidan to shu qatorgachaΒ» β€” UNBOUNDED PRECEDING dan CURRENT ROW gacha.

Siljuvchi o'rtacha (3 kunlik):
AVG(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
)

Grafikdagi tebranishni tekislaydi, trend ko'rinadi.

⚠️ Katta tuzoq: ORDER BY yozib, frame ko'rsatmasangiz, standart qiymat RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW bo'ladi. RANGE esa teng qiymatlarni bitta deb qaraydi: bir kunda ikki yozuv bo'lsa, ikkalasi ham bir xil jami oladi.

Shuning uchun aniqlik kerak bo'lsa β€” doim ROWS deb yozing.

πŸ’‘ Xuddi shu tuzoq LAST_VALUE da ham bor: frame ko'rsatilmasa, u Β«oxirgi qatorΒ» o'rniga Β«joriy qatorΒ» ni qaytaradi va odamlar buni bug deb o'ylashadi.

🎯 Endi amaliyot: 3 kunlik siljuvchi o'rtacha
Frame bilan ishlashni mustahkamlang πŸ‘‡

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