SQL gotchas va intervyu
Bu bob — takrorlash varag'i. Indamay noto'g'ri javob beradigan hamma narsa bitta joyda; klassik intervyu masalalari ishlab chiqilgan holda; va qisqa uslub qo'llanmasi, chunki o'qishli SQL yozish o'zi professional ko'nikma.
Gotcha lar katalogi
Real ishda qancha zarar keltirishi bo'yicha tartiblangan. Ularning har biri muvaffaqiyatli bajariladi — ularni xavfli qiladigan narsa aynan shu.
| # | Gotcha | Aslida nima bo'ladi | Yechim | Bob |
|---|---|---|---|---|
| 1 | Ro'yxatda NULL bor NOT IN |
Nol row qaytaradi, xato yo'q | NOT EXISTS |
3 |
| 2 | LEFT JOIN dan keyin COUNT(*) |
Nol birga aylanadi | COUNT(o'ng.pk) |
5 |
| 3 | JOIN dagi fan-out | SUM bir necha barobar shishadi |
Join dan oldin aggregate | 5 |
| 4 | LEFT JOIN ning WHERE ida o'ng table sharti |
Indamay INNER JOIN ga aylanadi | Uni ON ga qo'ying |
5 |
| 5 | NULL li column da col <> 'x' |
NULL row lar indamay tashlanadi | OR col IS NULL |
2 |
| 6 | Butun bo'lish | 12/20*100 = 0 |
* 100.0 |
2 |
| 7 | Boshida NULL shoxi yo'q CASE |
Baholanmagan F deb ko'rsatiladi | Avval WHEN x IS NULL |
8 |
| 8 | GROUP BY row i yo'q guruhlarni yashiradi |
Bo'sh kategoriyalar hisobotdan yo'qoladi | O'lchov table idan LEFT JOIN |
4/5 |
| 9 | Davrlari yetishmaydigan qator ustida LAG |
Noto'g'ri oylarni solishtiradi | To'liq sana qatorini yarating | 6/7 |
| 10 | Timestamp da ikki sana orasida BETWEEN |
Oxirgi kunni yo'qotadi | Yarim ochiq >= a AND < b |
3 |
| 11 | AVG(CASE ...) ichida ELSE 0 |
O'rtacha soxta nol lar bilan pasayadi | ELSE ni yozmang |
8 |
| 12 | AVG NULL larni indamay tashlaydi |
Maxraj siz o'ylagandek emas | AVG yoniga COUNT chiqaring |
4 |
| 13 | Nol row ustida SUM |
0 emas, NULL qaytaradi | COALESCE(SUM(x), 0) |
4 |
| 14 | Guruhlanmagan column tanlash | SQLite/MySQL qiymat o'ylab topadi | Guruhlang yoki aggregate qiling | 4 |
| 15 | ORDER BY siz LIMIT |
Tasodifiy, beqaror row lar | Doim avval saralang | 2 |
| 16 | Qavssiz AND / OR |
AND kuchliroq bog'laydi — noto'g'ri row lar |
Qavs qo'ying | 2 |
| 17 | WHERE da alias |
"no such column" | Takrorlang yoki CTE ishlating | 2 |
| 18 | WHERE da window function |
Xato — keyinroq hisoblanadi | CTE, keyin filtr | 7 |
| 19 | Filtrlanayotgan column ga o'ralgan function | Index ishlamaydi — to'liq scan | Oraliq ko'rinishida qayta yozing | 3/11 |
| 20 | WHERE siz UPDATE/DELETE |
Butun table o'zgaradi | Avval SELECT; transaction ishlating |
10 |
| 21 | Python da conn.commit() yo'qligi |
O'zgarish indamay yo'qoladi | with conn: |
12 |
| 22 | f-string bilan query qurish | SQL injection; O'Brien da buziladi |
Parametrlar (?) |
12 |
| 23 | SQLite da foreign key lar o'chiq | Noto'g'ri havolalar qabul qilinadi | PRAGMA foreign_keys = ON |
10 |
| 24 | Join shartida type mos kelmasligi | To'g'ri, lekin 1000× sekin | Column type larini moslang | 11 |
Row sonini aql bilan tekshiring. Har bir JOIN dan oldin va keyin, har bir filtr qo'shishdan oldin va keyin so'rang: bu son men kutgan sonmi? Yuqoridagi jadvaldagi deyarli har bir gotcha birinchi navbatda jimgina noto'g'ri row soni bo'lib ko'rinadi — 0 ta row, yoki juda ko'p, yoki nol turishi kerak joyda bitta.
Query topshirig'iga qanday yondashish
Intervyu bosimida talabalar qotib qoladi va yozishni boshlaydi. Ularga buning o'rniga tartib bering.
- Savolni bitta jumlada qayta ayting. "Har bir course uchun eng yuqori bahoga ega student." Aytolmasangiz, yozolmaysiz.
- Natijani nomlang. Nechta row qaytishi kerak — har bir course ga bittami? Har bir student ga? Qaysi column lar?
- Table lar va kalitlarni toping. O'sha column lar qaysi table larda va ularni nima bog'laydi?
- Uni SQL tartibida ovoz chiqarib ayting: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. Ingliz jumlasi odatda to'g'ridan-to'g'ri shunga tushadi.
- Qatlamlab quring.
FROM+JOINni yozing, ishga tushiring.WHEREni qo'shing, ishga tushiring. Keyin guruhlang. Hech narsani ishga tushirmasdan 30 qator yozmang. - Har qadamda row sonini tekshiring. JOIN dan keyin sakrasa — bu fan-out.
- NULL va tenglik haqida so'rang. "Baholanmagan student lar sanalsinmi?" "Ikkitasi birinchi o'rin uchun teng chiqsa, ikkalasi ham keraklimi?" Intervyu oluvchilar so'raganingiz uchun ball qo'yadi — bu sizni ilgari bir marta chaqilgan ekaningizni ko'rsatadi.
| Savolda shunday deyilsa… | Sizga kerak bo'ladigan narsa… |
|---|---|
| "har bir … uchun" | GROUP BY yoki PARTITION BY |
| "har bir … dan top N" | ROW_NUMBER() OVER (PARTITION BY …) |
| "hech narsasi yo'qlarni ham qo'shib" | LEFT JOIN |
| "hech qachon … qilmagan" | NOT EXISTS yoki anti-join |
| "o'rtachaga nisbatan" | Scalar subquery yoki AVG() OVER () |
| "oydan-oyga / oldingisiga nisbatan" | LAG |
| "to'planuvchi / running" | SUM() OVER (ORDER BY …) |
| "N martadan ko'p" | HAVING COUNT(*) > N |
| "dublikatlar" | GROUP BY … HAVING COUNT(*) > 1 |
| "umumiy natijadagi foizi" | 100.0 * x / SUM(x) OVER () |
Klassik intervyu masalalari
Bular qayta-qayta uchraydi. Har biri school.db ustida ishlangan, ya'ni javoblarni tekshirish mumkin.
1. Ikkinchi eng yuqori qiymat
Dunyodagi eng ko'p so'raladigan SQL savoli. Uchta yechim, har biri boshqa narsani o'rgatadi:
-- (a) DENSE_RANK — darrov N-chiga umumlashadi, tenglikni to'g'ri hal qiladi WITH ranked AS ( SELECT grade, DENSE_RANK() OVER (ORDER BY grade DESC) AS rnk FROM enrollments WHERE grade IS NOT NULL ) SELECT DISTINCT grade FROM ranked WHERE rnk = 2; -- 95 -- (b) LIMIT/OFFSET — sodda, lekin tenglik bo'lsa noto'g'ri SELECT DISTINCT grade FROM enrollments WHERE grade IS NOT NULL ORDER BY grade DESC LIMIT 1 OFFSET 1; -- (c) "maksimumdan pastdagi maksimum" — window function lardan oldingi klassik javob SELECT MAX(grade) FROM enrollments WHERE grade < (SELECT MAX(grade) FROM enrollments);
1-natija
| grade |
|---|
| 99 |
1 qator
2-natija
| grade |
|---|
| 99 |
1 qator
3-natija
| MAX(grade) |
|---|
| 99 |
1 qator
2 ms
Nega (a) eng yaxshi javob ekanini ayting: rnk = 2 ni rnk = 5 ga o'zgartirsangiz ham ishlayveradi, va tenglik mantiqiy ishlaydi.
2. Guruh bo'yicha Top-N
WITH ranked AS ( SELECT course_id, student_id, grade, ROW_NUMBER() OVER (PARTITION BY course_id ORDER BY grade DESC) AS rn FROM enrollments WHERE grade IS NOT NULL ) SELECT * FROM ranked WHERE rn <= 2 ORDER BY course_id, rn;
| course_id | student_id | grade | rn |
|---|---|---|---|
| 1 | 24 | 100 | 1 |
| 1 | 292 | 100 | 2 |
| 2 | 24 | 96 | 1 |
| 2 | 3 | 95 | 2 |
| 3 | 232 | 86 | 1 |
| 3 | 260 | 85 | 2 |
| 4 | 129 | 100 | 1 |
| 4 | 250 | 98 | 2 |
| 5 | 136 | 94 | 1 |
| 5 | 168 | 92 | 2 |
| 6 | 206 | 94 | 1 |
| 6 | 108 | 94 | 2 |
| 7 | 247 | 100 | 1 |
| 7 | 125 | 100 | 2 |
| 8 | 197 | 100 | 1 |
… 28 qatordan birinchi 15 tasi
28 qator
1 ms
- Dublikatlarni topish
SELECT student_id, course_id, COUNT(*) AS times FROM enrollments GROUP BY student_id, course_id HAVING COUNT(*) > 1; -- (bizning toza data da yo'q) -- va ularni o'chirish, har guruhdan eng kichik id ni qoldirib DELETE FROM enrollments WHERE enrollment_id NOT IN ( SELECT MIN(enrollment_id) FROM enrollments GROUP BY student_id, course_id );
| student_id | course_id | times |
|---|---|---|
| 1 | 3 | 2 |
| 1 | 11 | 2 |
| 2 | 11 | 2 |
| 3 | 6 | 2 |
| 3 | 11 | 2 |
| 4 | 7 | 2 |
| 4 | 15 | 2 |
| 5 | 2 | 2 |
| 5 | 5 | 2 |
| 6 | 4 | 2 |
| 6 | 14 | 2 |
| 7 | 9 | 2 |
| 8 | 1 | 2 |
| 10 | 14 | 2 |
| 11 | 7 | 2 |
… 514 qatordan birinchi 15 tasi
514 qator
2 ms
- A da bor, B da mos kelmaydigan row lar
SELECT c.title FROM courses c WHERE NOT EXISTS (SELECT 1 FROM enrollments e WHERE e.course_id = c.course_id); -- Deep Learning
| title |
|---|
| Deep Learning |
1 qator
0 ms
- Running total
SELECT enrolled_at, COUNT(*) AS n, SUM(COUNT(*)) OVER (ORDER BY enrolled_at) AS running_total FROM enrollments GROUP BY enrolled_at ORDER BY enrolled_at;
| enrolled_at | n | running_total |
|---|---|---|
| 2025-02-03 | 4 | 4 |
| 2025-02-04 | 14 | 18 |
| 2025-02-05 | 27 | 45 |
| 2025-02-06 | 25 | 70 |
| 2025-02-07 | 32 | 102 |
| 2025-02-08 | 40 | 142 |
| 2025-02-09 | 41 | 183 |
| 2025-02-10 | 38 | 221 |
| 2025-02-11 | 44 | 265 |
| 2025-02-12 | 37 | 302 |
| 2025-02-13 | 46 | 348 |
| 2025-02-14 | 46 | 394 |
| 2025-02-15 | 46 | 440 |
| 2025-02-16 | 44 | 484 |
| 2025-02-17 | 37 | 521 |
… 91 qatordan birinchi 15 tasi
91 qator
1 ms
- Median — ko'ringanidan qiyinroq
Standart SQL da
MEDIAN()yo'q, shuning uchun bu sizning fikrlay olishingizni sinaydi:
WITH ordered AS ( SELECT grade, ROW_NUMBER() OVER (ORDER BY grade) AS rn, COUNT(*) OVER () AS n FROM enrollments WHERE grade IS NOT NULL ) SELECT AVG(grade) AS median FROM ordered WHERE rn IN ((n + 1) / 2, (n + 2) / 2); -- 14 ta baho → 7 va 8-row lar → (81 + 83) / 2 = 82.0
| median |
|---|
| 73 |
1 qator
1 ms
(n+1)/2, (n+2)/2 usuli ikkala holatni birdan hal qiladi: toq sonda ikkala ifoda bir xil row ni, juft sonda esa o'rtadagi ikkitasini beradi.
7. Umumiy natijadagi foiz
SELECT course_id, COUNT(*) AS n, ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS pct FROM enrollments GROUP BY course_id ORDER BY pct DESC;
| course_id | n | pct |
|---|---|---|
| 11 | 152 | 8.1 |
| 14 | 148 | 7.9 |
| 10 | 137 | 7.3 |
| 13 | 136 | 7.3 |
| 1 | 134 | 7.2 |
| 2 | 134 | 7.2 |
| 6 | 133 | 7.1 |
| 15 | 132 | 7.1 |
| 5 | 130 | 7 |
| 7 | 129 | 6.9 |
| 9 | 129 | 6.9 |
| 8 | 127 | 6.8 |
| 3 | 124 | 6.6 |
| 4 | 121 | 6.5 |
14 qator
1 ms
- Ketma-ketlik / oraliq tahlili
-- Bir kunda ikkita course ga yozilgan student lar SELECT student_id, enrolled_at, COUNT(*) AS same_day FROM enrollments GROUP BY student_id, enrolled_at HAVING COUNT(*) > 1; -- 1, 3, 5, 6, 7, 8-student lar — har biri bir kunda ikki marta yozilgan -- Student ning ketma-ket enrollment lari orasidagi kunlar SELECT student_id, enrolled_at, CAST(JULIANDAY(enrolled_at) - JULIANDAY( LAG(enrolled_at) OVER (PARTITION BY student_id ORDER BY enrolled_at) ) AS INTEGER) AS gap_days FROM enrollments ORDER BY student_id, enrolled_at;
1-natija
| student_id | enrolled_at | same_day |
|---|---|---|
| 3 | 2025-02-19 | 2 |
| 4 | 2025-02-08 | 2 |
| 8 | 2025-02-11 | 2 |
| 11 | 2025-09-09 | 2 |
| 15 | 2025-02-15 | 2 |
| 19 | 2025-02-22 | 2 |
| 20 | 2025-09-17 | 2 |
| 21 | 2025-02-18 | 2 |
| 22 | 2025-02-11 | 3 |
| 24 | 2025-09-12 | 2 |
| 24 | 2025-09-13 | 2 |
| 25 | 2025-02-11 | 2 |
| 26 | 2025-02-16 | 2 |
| 26 | 2025-02-17 | 2 |
| 26 | 2025-02-21 | 2 |
… 184 qatordan birinchi 15 tasi
184 qator
2-natija
| student_id | enrolled_at | gap_days |
|---|---|---|
| 1 | 2025-09-06 | NaN |
| 1 | 2025-09-07 | 1 |
| 1 | 2025-09-09 | 2 |
| 1 | 2025-09-17 | 8 |
| 1 | 2025-09-26 | 9 |
| 2 | 2025-02-13 | NaN |
| 2 | 2025-02-14 | 1 |
| 2 | 2025-02-15 | 1 |
| 2 | 2025-02-19 | 4 |
| 2 | 2025-02-25 | 6 |
| 2 | 2025-02-27 | 2 |
| 2 | 2025-03-02 | 3 |
| 3 | 2025-02-17 | NaN |
| 3 | 2025-02-19 | 2 |
| 3 | 2025-02-19 | 0 |
… 1866 qatordan birinchi 15 tasi
1866 qator
4 ms
- PIVOT keyword isiz pivot
SELECT course_id, SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed, SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) AS active, SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS failed FROM enrollments GROUP BY course_id;
| course_id | completed | active | failed |
|---|---|---|---|
| 1 | 89 | 29 | 2 |
| 2 | 99 | 16 | 8 |
| 3 | 60 | 29 | 29 |
| 4 | 77 | 29 | 5 |
| 5 | 83 | 29 | 12 |
| 6 | 96 | 21 | 3 |
| 7 | 95 | 21 | 2 |
| 8 | 90 | 19 | 9 |
| 9 | 92 | 23 | 5 |
| 10 | 108 | 16 | 7 |
| 11 | 91 | 35 | 16 |
| 13 | 92 | 22 | 1 |
| 14 | 96 | 31 | 7 |
| 15 | 71 | 27 | 26 |
14 qator
1 ms
- Har bir guruhning o'rtachadan yuqori a'zolari
SELECT enrollment_id, course_id, grade FROM ( SELECT *, AVG(grade) OVER (PARTITION BY course_id) AS course_avg FROM enrollments WHERE grade IS NOT NULL ) WHERE grade > course_avg ORDER BY course_id;
| enrollment_id | course_id | grade |
|---|---|---|
| 96 | 1 | 95 |
| 101 | 1 | 82 |
| 118 | 1 | 82 |
| 142 | 1 | 98 |
| 194 | 1 | 93 |
| 210 | 1 | 95 |
| 235 | 1 | 88 |
| 272 | 1 | 80 |
| 302 | 1 | 83 |
| 321 | 1 | 96 |
| 369 | 1 | 91 |
| 374 | 1 | 87 |
| 411 | 1 | 80 |
| 412 | 1 | 87 |
| 483 | 1 | 99 |
… 687 qatordan birinchi 15 tasi
687 qator
2 ms
O'qishli SQL yozish Intervyu oluvchilar uslubni baholaydi, hamkasblar esa uni saqlab turishga majbur. Oltita qoida yetarli:
- Keyword lar katta harfda, o'z nomlaringiz kichik harfda. Tuzilma bir qarashda ko'rinadi.
- Har bir clause alohida qatorda, uchtadan ko'p bo'lganda har bir column ham alohida qatorda.
- Ma'noli table alias lari —
s,e,c— hech qachont1,t2emas. - Hisoblangan column larga doim
AS. Nomsiz ifodani na natijada, na pandas da o'qib bo'ladi. - Query ~15 qatordan oshsa, ichma-ich subquery emas, CTE. Har bir qadamga nom bering.
- Izohda nima emas, nega ni yozing.
-- test akkauntlarni chiqarib tashlash (ticket #412)foydali;-- ismni tanlashshovqin.
-- ❌ o'qish qiyin select s.first_name,c.title,e.grade from enrollments e join students s on e.student_id=s.student_id join courses c on e.course_id=c.course_id where e.grade>80 order by e.grade desc; -- ✅ o'sha query SELECT s.first_name, c.title, e.grade FROM enrollments e JOIN students s ON e.student_id = s.student_id JOIN courses c ON e.course_id = c.course_id WHERE e.grade > 80 ORDER BY e.grade DESC;
1-natija
| first_name | title | grade |
|---|---|---|
| Nilufar | Excel for Business | 100 |
| Kamola | Excel for Business | 100 |
| Otabek | Project Management | 100 |
| Madina | Financial Analysis | 100 |
| Bekzod | Project Management | 100 |
| Dilnoza | Excel for Business | 100 |
| Rustam | Graphic Design | 100 |
| Gulnora | Python Basics | 100 |
| Malika | Excel for Business | 100 |
| Zulfiya | Project Management | 100 |
| Shahnoza | Python Basics | 99 |
| Jasur | Python Basics | 98 |
| Zulfiya | Project Management | 98 |
| Nilufar | Data Visualization | 98 |
| Kamola | Excel for Business | 98 |
… 338 qatordan birinchi 15 tasi
338 qator
2-natija
| first_name | title | grade |
|---|---|---|
| Nilufar | Excel for Business | 100 |
| Kamola | Excel for Business | 100 |
| Otabek | Project Management | 100 |
| Madina | Financial Analysis | 100 |
| Bekzod | Project Management | 100 |
| Dilnoza | Excel for Business | 100 |
| Rustam | Graphic Design | 100 |
| Gulnora | Python Basics | 100 |
| Malika | Excel for Business | 100 |
| Zulfiya | Project Management | 100 |
| Shahnoza | Python Basics | 99 |
| Jasur | Python Basics | 98 |
| Zulfiya | Project Management | 98 |
| Nilufar | Data Visualization | 98 |
| Kamola | Excel for Business | 98 |
… 338 qatordan birinchi 15 tasi
338 qator
1 ms
To'liq savollar bankasi Mavzular bo'yicha guruhlangan — takrorlash yoki imtihon uchun. Javoblar ko'rsatilgan boblarda.
Asoslar (1-bob)
- SQL, database va DBMS orasidagi farq nima?
- Primary key, unique key va foreign key.
- NULL 0 yoki bo'sh string bilan bir xilmi? Uni qanday tekshirasiz?
SELECTaslida qanday tartibda bajariladi?DELETE,TRUNCATEvaDROP.- Nega production kodda
SELECT *dan qochish kerak?
Query yozish (2–4-boblar)
- Nega
WHEREda column alias ini ishlatib bo'lmaydi? WHEREvaHAVING.COUNT(*),COUNT(col)vaCOUNT(DISTINCT col).AVGNULL larni hisobga oladimi? Nol row ustidaSUMnima qaytaradi?- Nega
SELECT 7/23 qaytaradi? DISTINCTvaGROUP BY.WHERE city != 'X'city si NULL bo'lgan row larni qaytaradimi?
Join va subquery (5–6-boblar)
- INNER, LEFT va FULL OUTER JOIN.
- Nega LEFT JOIN dan keyin
COUNT(*)0 emas, 1 beradi? - Shart
ONda vaWHEREda — nima o'zgaradi? - A da bor, B da mos kelmaydigan row larni qanday topasiz?
- Self join nima va nega
a.id < b.id? - JOIN qo'shgandan keyin
SUMikki barobar oshdi — nega? IN,EXISTSvaJOIN.- CTE va subquery — qachon CTE ishlatish shart?
- Recursive CTE ning ikkita qismi qaysilar?
Window function lar (7-bob)
- Window function va aggregate.
ROW_NUMBER,RANKvaDENSE_RANK.- Har bir guruhdan top 3 ni qanday olasiz?
- Nega window function ni
WHEREda filtrlab bo'lmaydi? OVER()ichidagiORDER BYnimani o'zgartiradi?- Oydan-oyga o'sishni qanday hisoblaysiz?
ROWSvaRANGE.
Function lar va to'plamlar (8–9-boblar)
CASEshoxni qanday tanlaydi? Pivot ni qanday quriladi?- Nega
AVG(CASE ...)ichidaELSE 0noto'g'ri? - Oyning oxirgi kunini qanday olasiz?
UNION,UNION ALLvaJOIN.UNIONuchun qanday talablar bor?- Nega
EXCEPTNOT INdan xavfsizroq?
Dizayn, performance va Python (10–12-boblar)
- 1NF, 2NF, 3NF ni tushuntiring. Qachon denormalize qilasiz?
- Transaction nima? ACID nimani anglatadi?
- View nima? U data saqlaydimi?
- Index query ni qanday tezlashtiradi va u nima turadi?
- Composite index da column tartibi muhimmi?
- "Sargable" nimani anglatadi?
- Sekin query ni qanday tashxis qilasiz?
- SQL injection nima va undan qanday himoyalanasiz?
- Filtrlashni SQL da qilish kerakmi yoki pandas da, va nega?
Xulosa — SQL qismi
O'n uchta bob, bitta kichik database va analitik SQL bo'yicha to'liq amaliy bilim. I qismni tugatgan student nima qila oladi:
- Data o'qish:
SELECT,WHERE,ORDER BY,LIMIT,DISTINCTva barcha filtrlash operatorlari, jumladan NULL tuzoqlari. - Xulosalash: beshta aggregate,
GROUP BY,HAVINGva row larni filtrlash bilan guruhlarni filtrlash orasidagi farq. - Birlashtirish: barcha join turlari, anti-join lar va — eng muhimi — fan-out ni hisobotni buzishidan oldin payqash.
- Qurish: subquery,
EXISTS, CTE va recursive CTE bilan o'qishli qoladigan ko'p qadamli tahlillar. - Tahlil: window function lar bilan ranking, guruh bo'yicha top-N, running total, moving average va davrlararo o'zgarish.
- Qayta shakllantirish:
CASE WHENpivot lari, string va sana bilan ishlash, to'plam amallari va long format ga unpivot. - Qurish va himoyalash: table lar, constraint lar, transaction lar, normalization va view lar.
- Tezlashtirish: index lar, sargable shartlar va
EXPLAIN QUERY PLAN. - Python ga ulash: parametrli query lardan toza DataFrame ga, chizishga tayyor holda.
- SQL siz yozgan tartibda bajarilmaydi — FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. Bu alias larni ham,
HAVINGni ham, window function lar negaWHEREga tushmasligini ham tushuntiradi. - NULL "noma'lum" degani, shuning uchun u bilan har qanday solishtirish UNKNOWN va
WHEREfaqat TRUE ni qoldiradi. Deyarli har bir jimjit noto'g'ri javob shu yerdan kelib chiqadi. - SQL da qisqartiring, Python da tahlil qiling. Database noutbukingizdan tez va data uniki.
Keyingi — II qism: 14-bob Seaborn ni boshlaydi. Bundan keyin chizadigan har bir DataFrame siz endi yozishni o'rgangan query lardan chiqadi.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.