SELECT, WHERE, ORDER BY
Analyst SQL da qiladigan hamma ish bitta ifodaning turli ko'rinishlaridan iborat. Hatto oltita JOIN va uchta window function bor 200 qatorli hisobot query si ham tuzilishiga ko'ra baribir SELECT ... FROM ... WHERE ... ORDER BY .... Shuning uchun ustiga biror narsa qo'shishdan oldin bu to'rtta clause ni juda yaxshi bilib olish foydali.
Quyidagi har bir query 1-bobdagi school.db ustida ishlaydi.
Column larni tanlash
SELECT "qaysi column larni ko'rmoqchisiz?" degan savolga javob beradi — va column lar table dagi tartibda emas, siz nomlagan tartibda chiqadi.
-- barcha column lar (faqat o'rganish uchun) SELECT * FROM students; -- nomlangan column lar, SIZ tanlagan tartibda SELECT last_name, first_name, city FROM students; -- bitta column bir necha marta kelishi mumkin, konstanta ham mumkin SELECT first_name, first_name, 'student' FROM students;
1-natija
| student_id | first_name | last_name | gender | city | birth_date | enrolled_date |
|---|---|---|---|---|---|---|
| 1 | Shahnoza | Alimova | F | Bukhara | 1998-10-10 | 2025-09-03 |
| 2 | Doston | Umarov | M | Fergana | 1999-11-23 | 2025-02-13 |
| 3 | Zulfiya | Yusupova | F | Samarkand | 2002-07-30 | 2025-02-13 |
| 4 | Kamola | Karimova | F | Samarkand | 2002-08-14 | 2025-02-05 |
| 5 | Gulnora | Saidova | F | Namangan | 1998-03-21 | 2025-09-07 |
| 6 | Bekzod | Yusupov | M | Samarkand | 2002-02-21 | 2025-09-07 |
| 7 | Doston | Alimov | M | Karshi | 2004-02-08 | 2025-09-10 |
| 8 | Madina | Rahimova | F | Tashkent | 2000-05-29 | 2025-02-09 |
| 9 | Sardor | Alimov | M | Bukhara | 2003-05-08 | 2025-02-04 |
| 10 | Dilnoza | Alimova | F | Andijan | 2000-08-26 | 2025-09-08 |
| 11 | Jasur | Ergashev | M | Karshi | 1999-08-05 | 2025-09-07 |
| 12 | Rustam | Toshev | M | Tashkent | 2001-02-12 | 2025-09-08 |
| 13 | Bekzod | Qodirov | M | Namangan | 2002-05-05 | 2025-02-08 |
| 14 | Otabek | Saidov | M | Andijan | 2000-10-28 | 2025-02-09 |
| 15 | Madina | Umarova | F | Namangan | 2001-12-26 | 2025-02-05 |
… 300 qatordan birinchi 15 tasi
300 qator
2-natija
| last_name | first_name | city |
|---|---|---|
| Alimova | Shahnoza | Bukhara |
| Umarov | Doston | Fergana |
| Yusupova | Zulfiya | Samarkand |
| Karimova | Kamola | Samarkand |
| Saidova | Gulnora | Namangan |
| Yusupov | Bekzod | Samarkand |
| Alimov | Doston | Karshi |
| Rahimova | Madina | Tashkent |
| Alimov | Sardor | Bukhara |
| Alimova | Dilnoza | Andijan |
| Ergashev | Jasur | Karshi |
| Toshev | Rustam | Tashkent |
| Qodirov | Bekzod | Namangan |
| Saidov | Otabek | Andijan |
| Umarova | Madina | Namangan |
… 300 qatordan birinchi 15 tasi
300 qator
3-natija
| first_name | first_name | 'student' |
|---|---|---|
| Shahnoza | Shahnoza | student |
| Doston | Doston | student |
| Zulfiya | Zulfiya | student |
| Kamola | Kamola | student |
| Gulnora | Gulnora | student |
| Bekzod | Bekzod | student |
| Doston | Doston | student |
| Madina | Madina | student |
| Sardor | Sardor | student |
| Dilnoza | Dilnoza | student |
| Jasur | Jasur | student |
| Rustam | Rustam | student |
| Bekzod | Bekzod | student |
| Otabek | Otabek | student |
| Madina | Madina | student |
… 300 qatordan birinchi 15 tasi
300 qator
2 ms
Oxirgisi ma'nosizdek ko'rinadi, lekin u muhim g'oyani o'rgatadi: SELECT yangi natija table ini quradi. U sizga table ni "ko'rsatmaydi" — siz yozgan ifodalardan column-ma-column yangi table yasaydi.
Kirish — table, chiqish — table. Aynan shu bitta fakt tufayli query ni boshqa query ichiga joylash mumkin (6-bob) va query ni boshqa query bilan JOIN qilish mumkin (5-bob). Buni erta ayting va tez-tez takrorlang.
Hisoblanadigan column lar (expressions)
Hisoblab bo'ladigan har qanday narsani SELECT ichiga yozish mumkin. Natija faqat chiqishda mavjud bo'lgan yangi column ga aylanadi — table ga hech narsa yozilmaydi.
SELECT title, price, price * 0.9 AS discounted_price, price / credits AS price_per_credit, credits * 30 AS total_hours FROM courses;
| title | price | discounted_price | price_per_credit | total_hours |
|---|---|---|---|---|
| Python Basics | 1 200 000 | 1 080 000 | 300 000 | 120 |
| SQL for Analytics | 800 000 | 720 000 | 266 666 | 90 |
| Statistics 101 | 1 200 000 | 1 080 000 | 300 000 | 120 |
| Data Visualization | 900 000 | 810 000 | 300 000 | 90 |
| Machine Learning | 1 450 000 | 1 305 000 | 290 000 | 150 |
| Web Development | 1 150 000 | 1 035 000 | 287 500 | 120 |
| Excel for Business | 1 100 000 | 990 000 | 550 000 | 60 |
| Project Management | 1 500 000 | 1 350 000 | 500 000 | 90 |
| UX Design | 850 000 | 765 000 | 283 333 | 90 |
| Graphic Design | 950 000 | 855 000 | 316 666 | 90 |
| Linear Algebra | 1 200 000 | 1 080 000 | 300 000 | 120 |
| Deep Learning | 1 550 000 | 1 395 000 | 310 000 | 150 |
| Java Basics | 1 150 000 | 1 035 000 | 287 500 | 120 |
| Financial Analysis | 1 500 000 | 1 350 000 | 500 000 | 90 |
| Probability | 1 250 000 | 1 125 000 | 312 500 | 120 |
15 qator
0 ms
:::gotcha ⚠️ Data Visualization ga qarang: 316666.67 emas, 316666
950000 / 3 natijasi 316666 chiqadi, chunki SQL da butun son ÷ butun son = butun son — kasr qismi yaxlitlanmaydi, shunchaki tashlab yuboriladi. Bu o'rtacha qiymatlar va foizlarni indamay buzadi. 1.0 ga ko'paytirib kasrga majburlang: price * 1.0 / credits, yoki cast qiling: CAST(price AS REAL) / credits. 4-bobda bunga qaytamiz — u yerda bu foiz hisobini butunlay buzadi.
:::
Matnlarni birlashtirish
SQLite va PostgreSQL da || string larni yopishtiradi:
SELECT first_name || ' ' || last_name AS full_name, last_name || ', ' || first_name AS sorted_name, UPPER(city) AS city_upper, LENGTH(first_name) AS name_length FROM students LIMIT 4;
| full_name | sorted_name | city_upper | name_length |
|---|---|---|---|
| Shahnoza Alimova | Alimova, Shahnoza | BUKHARA | 8 |
| Doston Umarov | Umarov, Doston | FERGANA | 6 |
| Zulfiya Yusupova | Yusupova, Zulfiya | SAMARKAND | 7 |
| Kamola Karimova | Karimova, Kamola | SAMARKAND | 6 |
4 qator
0 ms
:::gotcha ⚠️ NULL butun string ni yutib yuboradi
Sevara da city NULL, shuning uchun UPPER(city) ham NULL — va agar city || ', Uzbekistan' deb yozsangiz, natija ', Uzbekistan' emas, butunlay NULL bo'ladi. O'rang: COALESCE(city, 'unknown') || ', Uzbekistan'. COALESCE ni 3-bobda batafsil ko'ramiz.
:::
Alias lar (AS)
Alias — chiqishda column (yoki table) ga yangi nom berish. Alias siz hisoblangan column ning sarlavhasi xom ifodaning o'zi bo'lib qoladi — hisobotda o'qib bo'lmaydi.
-- sarlavha: price * 0.9 ← xunuk SELECT title, price * 0.9 FROM courses; -- sarlavha: discounted_price ← o'qish oson SELECT title, price * 0.9 AS discounted_price FROM courses; -- AS ixtiyoriy, lekin baribir yozing — o'qish ancha oson bo'ladi SELECT title, price * 0.9 discounted_price FROM courses; -- bo'sh joyi bor nom uchun ikkitali qo'shtirnoq kerak (identifier quoting) SELECT title AS "Course Title", price AS "Price (UZS)" FROM courses;
1-natija
| title | price * 0.9 |
|---|---|
| Python Basics | 1 080 000 |
| SQL for Analytics | 720 000 |
| Statistics 101 | 1 080 000 |
| Data Visualization | 810 000 |
| Machine Learning | 1 305 000 |
| Web Development | 1 035 000 |
| Excel for Business | 990 000 |
| Project Management | 1 350 000 |
| UX Design | 765 000 |
| Graphic Design | 855 000 |
| Linear Algebra | 1 080 000 |
| Deep Learning | 1 395 000 |
| Java Basics | 1 035 000 |
| Financial Analysis | 1 350 000 |
| Probability | 1 125 000 |
15 qator
2-natija
| title | discounted_price |
|---|---|
| Python Basics | 1 080 000 |
| SQL for Analytics | 720 000 |
| Statistics 101 | 1 080 000 |
| Data Visualization | 810 000 |
| Machine Learning | 1 305 000 |
| Web Development | 1 035 000 |
| Excel for Business | 990 000 |
| Project Management | 1 350 000 |
| UX Design | 765 000 |
| Graphic Design | 855 000 |
| Linear Algebra | 1 080 000 |
| Deep Learning | 1 395 000 |
| Java Basics | 1 035 000 |
| Financial Analysis | 1 350 000 |
| Probability | 1 125 000 |
15 qator
3-natija
| title | discounted_price |
|---|---|
| Python Basics | 1 080 000 |
| SQL for Analytics | 720 000 |
| Statistics 101 | 1 080 000 |
| Data Visualization | 810 000 |
| Machine Learning | 1 305 000 |
| Web Development | 1 035 000 |
| Excel for Business | 990 000 |
| Project Management | 1 350 000 |
| UX Design | 765 000 |
| Graphic Design | 855 000 |
| Linear Algebra | 1 080 000 |
| Deep Learning | 1 395 000 |
| Java Basics | 1 035 000 |
| Financial Analysis | 1 350 000 |
| Probability | 1 125 000 |
15 qator
4-natija
| Course Title | Price (UZS) |
|---|---|
| Python Basics | 1 200 000 |
| SQL for Analytics | 800 000 |
| Statistics 101 | 1 200 000 |
| Data Visualization | 900 000 |
| Machine Learning | 1 450 000 |
| Web Development | 1 150 000 |
| Excel for Business | 1 100 000 |
| Project Management | 1 500 000 |
| UX Design | 850 000 |
| Graphic Design | 950 000 |
| Linear Algebra | 1 200 000 |
| Deep Learning | 1 550 000 |
| Java Basics | 1 150 000 |
| Financial Analysis | 1 500 000 |
| Probability | 1 250 000 |
15 qator
1 ms
Table alias lari
Table larga ham alias beriladi. 5-bobdan boshlab ular zarur bo'lib qoladi — ikkita table da ham student_id column i bo'lganda qaysi birini nazarda tutayotganingizni aytishingiz kerak.
SELECT s.first_name, s.city FROM students AS s WHERE s.city = 'Tashkent';
| first_name | city |
|---|---|
| Madina | Tashkent |
| Rustam | Tashkent |
| Aziza | Tashkent |
| Aziza | Tashkent |
| Zulfiya | Tashkent |
| Gulnora | Tashkent |
| Dilnoza | Tashkent |
| Aziz | Tashkent |
| Aziza | Tashkent |
| Malika | Tashkent |
| Shohrux | Tashkent |
| Nilufar | Tashkent |
| Otabek | Tashkent |
| Sardor | Tashkent |
| Gulnora | Tashkent |
… 82 qatordan birinchi 15 tasi
82 qator
0 ms
:::tip 💡 Alias ni nomlash
Qisqa, lekin ma'noli: students uchun s, enrollments uchun e, courses uchun c. a, b, t1, t2 dan qoching — olti oydan keyin t2 nima ekanini hech kim bilmaydi.
:::
Alias 5-qadamda (SELECT) yaratiladi, shuning uchun ORDER BY (7-qadam) uni ishlata oladi, WHERE (2-qadam) esa yo'q. Bu boshlovchilar duch keladigan eng ko'p uchraydigan "no such column" xatosi.
WHERE va solishtirish operatorlari
WHERE row ni faqat shart TRUE bo'lgandagina qoldiradi. FALSE row lar tashlanadi — UNKNOWN row lar ham tashlanadi, bu esa 1-bobdagi NULL muammosi.
| Operator | Ma'nosi | Misol |
|---|---|---|
= |
Teng | WHERE city = 'Tashkent' |
<> yoki != |
Teng emas | WHERE status <> 'active' |
> < >= <= |
Solishtirish | WHERE grade >= 80 |
BETWEEN a AND b |
Oraliq, ikkala chekka ham kiradi | WHERE grade BETWEEN 80 AND 90 |
IN (...) |
Ro'yxatdagi biror qiymatga mos keladi | WHERE city IN ('Tashkent','Bukhara') |
LIKE |
Matn bo'yicha pattern qidirish | WHERE last_name LIKE '%ova' |
IS NULL / IS NOT NULL |
Qiymat yo'qligini tekshiradi | WHERE grade IS NULL |
-- "Qaysi enrollment lar 60 dan past ball oldi?" SELECT enrollment_id, student_id, course_id, grade, status FROM enrollments WHERE grade < 60;
| enrollment_id | student_id | course_id | grade | status |
|---|---|---|---|---|
| 17 | 75 | 15 | 52 | failed |
| 20 | 274 | 10 | 55 | failed |
| 26 | 33 | 8 | 56 | failed |
| 47 | 179 | 4 | 59 | failed |
| 53 | 93 | 3 | 46 | failed |
| 79 | 211 | 14 | 53 | failed |
| 82 | 212 | 5 | 58 | failed |
| 89 | 217 | 5 | 56 | failed |
| 116 | 235 | 8 | 57 | failed |
| 150 | 30 | 3 | 52 | failed |
| 153 | 56 | 3 | 51 | failed |
| 172 | 122 | 15 | 55 | failed |
| 179 | 27 | 3 | 48 | failed |
| 205 | 84 | 15 | 52 | failed |
| 222 | 68 | 15 | 57 | failed |
… 192 qatordan birinchi 15 tasi
192 qator
1 ms
SELECT * FROM students WHERE city <> 'Tashkent'; 7 emas, 6 ta row qaytaradi. Shahri NULL bo'lgan Sevara yo'qoladi — chunki NULL <> 'Tashkent' TRUE emas, UNKNOWN. Uni ham qo'shmoqchi bo'lsangiz, buni aniq aytishingiz kerak:
WHERE city <> 'Tashkent' OR city IS NULL;
Bu indamay noto'g'ri chiqadigan hisobotlarning eng keng tarqalgan sabablaridan biri, va talabalarga ikkala holatda row sonini ko'rsatib berishga arziydi.
AND, OR, NOT — va ustunlik tartibi
-- ikkala shart ham bajarilishi kerak SELECT first_name, city, gender FROM students WHERE city = 'Tashkent' AND gender = 'M'; -- Jasur, Otabek -- shartlardan bittasi yetarli SELECT first_name, city FROM students WHERE city = 'Bukhara' OR city = 'Fergana'; -- Dilnoza, Ulugbek -- inkor SELECT first_name, status FROM enrollments WHERE NOT status = 'completed'; -- ehtiyot: NULL status lar yo'qolardi
:::gotcha ⚠️ AND, OR dan kuchliroq bog'laydi
Xuddi arifmetikada × + dan kuchliroq bog'langani kabi. Bu ikkita query bir xil emas:
-- shunday o'qiladi: Tashkent, YOKI (Samarkand VA ayol) -- natija: 3 ta Toshkentlik (ikkala jins) + Zarina = 4 ta row WHERE city = 'Tashkent' OR city = 'Samarkand' AND gender = 'F'; -- aslida nazarda tutilgani: (Tashkent YOKI Samarkand) VA ayol -- natija: Aziza + Zarina = 2 ta row WHERE (city = 'Tashkent' OR city = 'Samarkand') AND gender = 'F';
Talabalar uchun qoida: shart ichida AND va OR aralashgan zahoti qavs qo'ying. Qavs ortiqcha bo'lgan joyda ham u hech narsa turmaydi va hamma shubhani yo'q qiladi.
:::
ORDER BY
Table dagi row larning tartibi yo'q, shuning uchun chiqish tartibi muhim bo'lsa, uni so'rashingiz kerak. ASC (o'sish bo'yicha) — standart; DESC teskarisiga saralaydi.
-- bitta column SELECT first_name, enrolled_date FROM students ORDER BY enrolled_date DESC; -- bir nechta column: avval city, keyin har bir city ichida ism SELECT city, first_name FROM students ORDER BY city ASC, first_name DESC; -- ifoda bo'yicha yoki alias bo'yicha saralash mumkin SELECT title, price / credits AS per_credit FROM courses ORDER BY per_credit DESC; -- hatto SELECT qilmagan column bo'yicha ham saralash mumkin SELECT first_name FROM students ORDER BY birth_date;
1-natija
| first_name | enrolled_date |
|---|---|
| Zulfiya | 2025-09-24 |
| Sardor | 2025-09-22 |
| Nilufar | 2025-09-21 |
| Otabek | 2025-09-19 |
| Shohrux | 2025-09-19 |
| Bekzod | 2025-09-17 |
| Sevara | 2025-09-16 |
| Bekzod | 2025-09-16 |
| Doston | 2025-09-15 |
| Doston | 2025-09-14 |
| Jasur | 2025-09-13 |
| Shahnoza | 2025-09-13 |
| Dilnoza | 2025-09-13 |
| Shohrux | 2025-09-12 |
| Bekzod | 2025-09-12 |
… 300 qatordan birinchi 15 tasi
300 qator
2-natija
| city | first_name |
|---|---|
| None | Zulfiya |
| None | Ulug'bek |
| None | Shohrux |
| None | Madina |
| None | Jasur |
| None | Jasur |
| None | Doston |
| None | Akmal |
| Andijan | Ulug'bek |
| Andijan | Ulug'bek |
| Andijan | Ulug'bek |
| Andijan | Sevara |
| Andijan | Sevara |
| Andijan | Rustam |
| Andijan | Otabek |
… 300 qatordan birinchi 15 tasi
300 qator
3-natija
| title | per_credit |
|---|---|
| Excel for Business | 550 000 |
| Project Management | 500 000 |
| Financial Analysis | 500 000 |
| Graphic Design | 316 666 |
| Probability | 312 500 |
| Deep Learning | 310 000 |
| Python Basics | 300 000 |
| Statistics 101 | 300 000 |
| Data Visualization | 300 000 |
| Linear Algebra | 300 000 |
| Machine Learning | 290 000 |
| Web Development | 287 500 |
| Java Basics | 287 500 |
| UX Design | 283 333 |
| SQL for Analytics | 266 666 |
15 qator
4-natija
| first_name |
|---|
| Ulug'bek |
| Gulnora |
| Aziz |
| Shohrux |
| Kamola |
| Kamola |
| Zulfiya |
| Doston |
| Doston |
| Aziz |
| Malika |
| Shahnoza |
| Otabek |
| Zulfiya |
| Jasur |
… 300 qatordan birinchi 15 tasi
300 qator
1 ms
:::gotcha ⚠️ NULL lar qayerga saralanadi?
Bizning student lar ustida ORDER BY city SQLite va MySQL da Sevara (NULL) ni birinchi qo'yadi, chunki ular NULL ni hamma narsadan kichik deb hisoblaydi. PostgreSQL va Oracle esa standart holatda NULL larni oxiriga qo'yadi. O'rin muhim bo'lsa, aniq yozing — PostgreSQL da ORDER BY city NULLS LAST bor; hamma joyda ishlaydigan universal usul esa:
ORDER BY (city IS NULL), city; -- 0 dan keyin 1, ya'ni NULL lar oxirida
:::
ORDER BY 2 "tanlangan ikkinchi column bo'yicha sarala" degani. U ishlaydi, lekin kimdir SELECT ro'yxatiga column qo'shgan kuni query indamay boshqa narsa bo'yicha saralay boshlaydi. Column ni nomlab yozing.
LIMIT va OFFSET
LIMIT nechta row qaytishini cheklaydi. U eng oxirgi qadam, shuning uchun saralashdan keyin qo'llanadi.
-- eng yuqori 3 ta baho SELECT enrollment_id, student_id, grade FROM enrollments WHERE grade IS NOT NULL ORDER BY grade DESC LIMIT 3;
| enrollment_id | student_id | grade |
|---|---|---|
| 135 | 247 | 100 |
| 322 | 125 | 100 |
| 500 | 114 | 100 |
3 qator
0 ms
enrollment_idstudent_idgrade
136100 6395 1192
OFFSET avval bir necha row ni tashlab ketadi — pagination shunday ishlaydi:
SELECT first_name FROM students ORDER BY student_id LIMIT 3; -- 1-sahifa SELECT first_name FROM students ORDER BY student_id LIMIT 3 OFFSET 3; -- 2-sahifa SELECT first_name FROM students ORDER BY student_id LIMIT 3 OFFSET 6; -- 3-sahifa
1-natija
| first_name |
|---|
| Shahnoza |
| Doston |
| Zulfiya |
3 qator
2-natija
| first_name |
|---|
| Kamola |
| Gulnora |
| Bekzod |
3 qator
3-natija
| first_name |
|---|
| Doston |
| Madina |
| Sardor |
3 qator
1 ms
:::gotcha ⚠️ ORDER BY siz LIMIT ma'nosiz
Yolg'iz LIMIT 10 "database qaysi 10 ta row ni birinchi bersa, o'shani" degani — va bu to'plam har safar o'zgarishi mumkin. LIMIT faqat ORDER BY bilan birga ma'noga ega. Pagination ga ham shu tegishli: barqaror saralash bo'lmasa, 2-sahifada 1-sahifadagi row lar takrorlanishi mumkin.
:::
Notanish table bilan doim SELECT * FROM big_table LIMIT 5; dan boshlang. Column nomlarini va data ning shaklini bir zumda ko'rasiz, va tasodifan o'n million row ni sessiyangizga tortib olmaysiz.
DISTINCT
DISTINCT natijadagi takrorlanuvchi row larni olib tashlaydi. "Bu column da qanday qiymatlar uchraydi?" degan savolga javob berishning eng tez usuli.
SELECT DISTINCT city FROM students ORDER BY city;
city
NULL Andijan Bukhara Fergana Namangan Samarkand Tashkent
10 ta student dan 7 ta row. E'tibor bering: DISTINCT NULL ni ham qiymatlardan biri sifatida saqlaydi — NULL = NULL UNKNOWN bo'lsa ham, u barcha NULL larni bir-birining takrori deb hisoblaydi. Bu SQL ning o'zidagi nomuvofiqlik; talabalarga buni maxsus holat deb ayting.
Talabalar SELECT DISTINCT city, gender FROM students ni "har xil city lar, ustiga gender" deb o'qiydi. Unday emas. U city va gender ning har bir har xil birikmasini qaytaradi — Tashkent ikki marta chiqadi, biri M, biri F bilan. DISTINCT ni bitta column ga qo'llab, qolganlarini ham qaytarishning imkoni yo'q; bu ish GROUP BY (4-bob) yoki window function (7-bob) niki.
Takrorlarni olib tashlash uchun database butun natijani saralashi yoki hash qilishi kerak. Katta table da bu qimmat. Agar JOIN natijasidagi takroriy row lardan qutulish uchun DISTINCT qo'shayotgan bo'lsangiz, odatda asosiy xato JOIN ning o'zida — 5-bobga qarang.
Mashqlar to'plami
Talabalarga shu tartibda bering; har biri aynan bitta yangi g'oya qo'shadi.
-- 1. Ayol student lar, familiya bo'yicha alifbo tartibida SELECT first_name, last_name FROM students WHERE gender = 'F' ORDER BY last_name; -- 2. 1 300 000 dan qimmat course lar, eng qimmati birinchi SELECT title, price FROM courses WHERE price > 1300000 ORDER BY price DESC; -- 3. To'liq ism + city, noma'lum city 'unknown' bo'lib chiqsin SELECT first_name || ' ' || last_name AS full_name, COALESCE(city, 'unknown') AS city FROM students; -- 4. Haqiqatan qo'yilgan eng past 3 ta baho SELECT enrollment_id, grade FROM enrollments WHERE grade IS NOT NULL ORDER BY grade ASC LIMIT 3; -- 5. enrollments da qanday status lar bor? SELECT DISTINCT status FROM enrollments; -- 6. Data kategoriyasidagi, 4 va undan ko'p credit li course lar SELECT title, credits FROM courses WHERE category = 'Data' AND credits >= 4 ORDER BY credits DESC, title; -- 7. Toshkent yoki Samarqanddan bo'lgan ayol student lar (qavs!) SELECT first_name, city FROM students WHERE (city = 'Tashkent' OR city = 'Samarkand') AND gender = 'F'; -- 8. Har bir credit uchun narx, to'g'ri kasr ko'rinishida SELECT title, ROUND(price * 1.0 / credits, 2) AS per_credit FROM courses ORDER BY per_credit DESC;
1-natija
| first_name | last_name |
|---|---|
| Shahnoza | Alimova |
| Dilnoza | Alimova |
| Aziza | Alimova |
| Gulnora | Alimova |
| Sevara | Alimova |
| Nilufar | Alimova |
| Kamola | Alimova |
| Nilufar | Alimova |
| Zulfiya | Alimova |
| Shahnoza | Alimova |
| Gulnora | Alimova |
| Sevara | Alimova |
| Zulfiya | Alimova |
| Nilufar | Alimova |
| Sevara | Ergasheva |
… 154 qatordan birinchi 15 tasi
154 qator
2-natija
| title | price |
|---|---|
| Deep Learning | 1 550 000 |
| Project Management | 1 500 000 |
| Financial Analysis | 1 500 000 |
| Machine Learning | 1 450 000 |
4 qator
3-natija
| full_name | city |
|---|---|
| Shahnoza Alimova | Bukhara |
| Doston Umarov | Fergana |
| Zulfiya Yusupova | Samarkand |
| Kamola Karimova | Samarkand |
| Gulnora Saidova | Namangan |
| Bekzod Yusupov | Samarkand |
| Doston Alimov | Karshi |
| Madina Rahimova | Tashkent |
| Sardor Alimov | Bukhara |
| Dilnoza Alimova | Andijan |
| Jasur Ergashev | Karshi |
| Rustam Toshev | Tashkent |
| Bekzod Qodirov | Namangan |
| Otabek Saidov | Andijan |
| Madina Umarova | Namangan |
… 300 qatordan birinchi 15 tasi
300 qator
4-natija
| enrollment_id | grade |
|---|---|
| 256 | 38 |
| 550 | 38 |
| 1 430 | 41 |
3 qator
5-natija
| status |
|---|
| completed |
| active |
| failed |
| dropped |
4 qator
6-natija
| title | credits |
|---|---|
| Deep Learning | 5 |
| Machine Learning | 5 |
2 qator
7-natija
| first_name | city |
|---|---|
| Zulfiya | Samarkand |
| Kamola | Samarkand |
| Madina | Tashkent |
| Shahnoza | Samarkand |
| Aziza | Tashkent |
| Aziza | Tashkent |
| Gulnora | Samarkand |
| Zulfiya | Tashkent |
| Gulnora | Tashkent |
| Dilnoza | Tashkent |
| Aziza | Tashkent |
| Gulnora | Samarkand |
| Malika | Tashkent |
| Nilufar | Tashkent |
| Malika | Samarkand |
… 67 qatordan birinchi 15 tasi
67 qator
8-natija
| title | per_credit |
|---|---|
| Excel for Business | 550 000 |
| Project Management | 500 000 |
| Financial Analysis | 500 000 |
| Graphic Design | 316 666.67 |
| Probability | 312 500 |
| Deep Learning | 310 000 |
| Python Basics | 300 000 |
| Statistics 101 | 300 000 |
| Data Visualization | 300 000 |
| Linear Algebra | 300 000 |
| Machine Learning | 290 000 |
| Web Development | 287 500 |
| Java Basics | 287 500 |
| UX Design | 283 333.33 |
| SQL for Analytics | 266 666.67 |
15 qator
2 ms
Intervyu savollari
S: WHERE ichida column alias ini ishlatsa bo'ladimi?
Yo'q. WHERE 2-qadamda ishlaydi, alias yaratiladigan SELECT esa 5-qadamda. Ifodani WHERE ichida takrorlang yoki query ni CTE/subquery ga o'rang. ORDER BY (7-qadam) esa alias ni ishlata oladi.
S: DISTINCT va GROUP BY orasidagi farq nima?
Faqat unique qiymatlarni sanab chiqish uchun ular bir xil javob beradi, va ko'p engine lar ularni bir xil bajaradi. GROUP BY kuchliroq: u har bir guruh uchun aggregate hisoblay oladi (COUNT, AVG) va HAVING bilan filtrlanadi. Faqat unique row lar kerak bo'lsa DISTINCT, guruh bo'yicha biror narsa hisoblash kerak bo'lsa GROUP BY ishlating.
S: DISTINCT bitta column ga qo'llanadimi yoki hammasiga?
Tanlangan barcha column larga birgalikda. SELECT DISTINCT a, b (a, b) ning unique juftliklarini qaytaradi.
S: WHERE city != 'Tashkent' — city si NULL bo'lgan row lar qaytadimi?
Yo'q, va bu klassik tuzoq savol. NULL != 'Tashkent' — UNKNOWN, WHERE esa faqat TRUE ni qoldiradi. WHERE city != 'Tashkent' OR city IS NULL deb yozing.
S: ORDER BY siz LIMIT 10 nima qaytaradi?
Tasodifiy 10 ta row — engine qaysinisini birinchi hosil qilgan bo'lsa, o'shani. Har safar bir xil bo'lishi kafolatlanmaydi, shuning uchun u faqat data ni ko'z bilan ko'rish uchun xavfsiz, hisobot uchun hech qachon emas.
S: Nega SELECT 7/2 3 qaytaradi?
Butun son ÷ butun son = butun son; kasr qismi yaxlitlanmaydi, kesib tashlanadi. 7 * 1.0 / 2 yoki CAST(7 AS REAL) / 2 ishlating.
S: ORDER BY name va ORDER BY 2 farqi nima?
Ikkinchisi SELECT ro'yxatidagi ikkinchi column bo'yicha, ya'ni o'rni bo'yicha saralaydi. Ishlaydi, lekin mo'rt: SELECT ro'yxatini tahrirlash saralashni indamay o'zgartiradi.
Xulosa
SELECTyangi table quradi: column lar siz nomlagan tartibda chiqadi va ular ifoda, konstanta yoki birlashtirilgan matn bo'lishi mumkin.- Butun bo'lish kasrni kesib tashlaydi —
price / creditskasrni yo'qotadi.1.0ga ko'paytiring yokiCASTqiling. - Alias lar (
AS) chiqish column lariga nom beradi; ularORDER BYda ishlaydi,WHEREda hech qachon ishlamaydi. WHEREfaqat TRUE bo'lgan row larni qoldiradi. NULL row lar UNKNOWN, shuning uchun<>ularni indamay tashlaydi — kerak bo'lsaOR col IS NULLqo'shing.ANDORdan kuchliroq bog'laydi. Ularni qavssiz aralashtirish — kutib turgan xato.ORDER BY— row tartibini kafolatlashning yagona yo'li; NULL ning o'rni database ga qarab farq qiladi.ORDER BYsizLIMITma'nosiz;LIMIT ... OFFSET ...— bu pagination.DISTINCTbutun tanlangan row ga qo'llanadi va NULL ni bitta qiymat sifatida saqlaydi.
Keyingi: 3-bob filtrlashga chuqurroq kiradi — IN, BETWEEN, LIKE pattern lari va real hisobotlarni indamay buzadigan NULL tuzoqlari.
Bu bobni bepul o'qidingiz.
Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.