Mundarija (30)
- Bu darsda
- 1. Nega bu kerak?
- 2. SELECT: qaysi ustunlar
- 2.1 Ustunlar ro'yxati va *
- 2.2 Taxallus (alias)
- 3. WHERE: qaysi qatorlar
- 3.1 Taqqoslash
- 3.2 AND, OR, NOT va ustuvorlik
- 3.3 IN: ro'yxatdan biri
- 3.4 BETWEEN va vaqt tuzog'i
- 4. LIKE va ILIKE: matn namunasi
- 4.1 % va _
- 4.2 ILIKE — registrga befarq
- 4.3 Namunadagi maxsus belgilar
- 4.4 Undan kuchliroq: ~
- 5. So'rov qaysi tartibda bajariladi
- 5.1 Yozilish tartibi ≠ bajarilish tartibi
- 5.2 Nega WHERE taxallusni bilmaydi
- 6. DISTINCT va DISTINCT ON
- 6.1 DISTINCT — takrorlarsiz
- 6.2 DISTINCT ON — har guruhdan bitta qator
- 7. SQL qadami: ilova so'rovlari (holat 15, commit yo'q)
- 8. Ko'p uchraydigan xatolar
- 9. Mashqlar
- 1-mashq (oson): natijani toping
- 2-mashq (o'rta): Madinaning o'qish vazifalari
- 3-mashq (qiyin): ikki so'rov
- 10. Real ishda
- Xulosa
- Manbalar
SQL SELECT va WHERE: PostgreSQL'da kerakli qatorlarni tanlash
Qisqacha:
SELECT ustunlar FROM jadval WHERE shart— jadvaldan shartga mos qatorlarni va kerakli ustunlarni oladi. ShartlarAND,OR,NOTbilan birlashadi.ANDORdan kuchli — aralashganda qavs qo'ying.IN— ro'yxatdan biri,BETWEEN— ikki chegara ham kiradi,LIKE/ILIKE— matn namunasi (%— istalgan,_— bitta belgi).DISTINCTtakrorlarni olib tashlaydi, PostgreSQL'ningDISTINCT ONi esa har guruhdan bitta qatorni qoldiradi.
Bu darsda
SELECTda kerakli ustunlarni tanlaysiz, ularga taxallus berasiz.WHEREda taqqoslash,AND/OR/NOTva qavslar bilan to'g'ri shart yozasiz.IN,BETWEEN,LIKE,ILIKEni ishlatasiz va ularning tuzoqlarini bilasiz.- Bajarilish tartibiga
DISTINCTning o'rnini qo'shasiz. DISTINCTvaDISTINCT ONbilan "har foydalanuvchining oxirgi vazifasi" kabi savollarga javob berasiz.
Oldin bilishingiz kerak: INSERT va RETURNING, SQL tili va buyruq turlari, Relatsion model.
1. Nega bu kerak?
INSERT va RETURNING darsida bazaga 8 foydalanuvchi va 40 vazifa yozdik. Endi ilova savollar beradi:
- Azizning bajarilmagan vazifalari qaysilar?
- Matnida "bozor" bor vazifalar?
- 10–12 oktabr orasida nima yozilgan?
- Har foydalanuvchining eng oxirgi vazifasi?
Har savol — bitta SELECT. Bazaga yozish kam bo'ladi, o'qish esa ko'p: oddiy ilovada so'rovlarning ko'pchiligi — o'qish. Shuning uchun SELECT ni yaxshi bilish — SQL ishining katta qismi.
JavaScript'da siz bunga o'xshash ishni massiv bilan qilgansiz: vazifalar.filter(v => v.egasi_id === 1 && !v.bajarildi).map(v => v.matn). SQL'da xuddi shu fikr boshqacha yoziladi va bitta katta farq bor: ma'lumot ilovaga ko'chirilmaydi. Baza 2 million qatordan faqat kerakli 5 tasini qaytaradi.
| JavaScript (massiv) | SQL |
|---|---|
vazifalar |
FROM vazifalar |
.filter(v => …) |
WHERE … |
.map(v => ({ id: v.id, matn: v.matn })) |
SELECT id, matn |
O'xshatish: kutubxonadagi katalog. "Menga 2020-yildan keyin chiqqan, muallifi Abdulla Qodiriy bo'lgan kitoblarning nomi kerak" deysiz. Kutubxonachi butun omborni olib chiqmaydi — faqat mos kartochkalarni beradi.
2. SELECT: qaysi ustunlar
2.1 Ustunlar ro'yxati va *
Bu darsdagi hamma misol holat 15 bazasida. * — "hamma ustunlar". Biz ishga tushirdik (PG 17.6, Windows 11):
SELECT * FROM foydalanuvchilar WHERE id <= 2;Natija:
id | email | ism | yaratilgan_vaqt
----+---------------------+------------------+------------------------
1 | aziz@example.com | Aziz Karimov | 2026-09-01 04:00:00+00
2 | dilnoza@example.com | Dilnoza Rahimova | 2026-09-03 09:20:00+00
(2 rows)Vaqtlar UTC'da (+00): Azizning 09:00+05 i — 04:00+00. Bu bir xil lahza, faqat boshqa soatda ko'rsatilgan.
* psql'da tez ko'rish uchun qulay. Ilova kodida esa ustunlarni aniq yozing:
- jadvalga yangi katta ustun qo'shilsa, u tarmoq bo'ylab bekorga yuboriladi;
- maxfiy ustun (keyinchalik parol hash'i) tasodifan API javobiga tushishi mumkin;
- ustunlar tartibi o'zgarsa, ustun raqamiga tayangan kod buziladi.
2.2 Taxallus (alias)
Taxallusni (alias, AS) SQL tili va buyruq turlari darsida ko'rgansiz — natijadagi ustunga boshqa nom. Endi uning ikki shakli. Kanon (PostgreSQL 18.6):
SELECT id, matn AS vazifa, bajarildi AS "Bajarildimi?"
FROM vazifalar
WHERE id IN (1, 2, 3);Natija:
id | vazifa | Bajarildimi?
----+--------------------------------------------------+--------------
1 | JavaScript kursining 26-qismini boshlash #o'qish | f
2 | Postgres'ni Docker'da ko'tarish #o'qish #docker | t
3 | Mijozga taklifnoma yuborish #ish | t
(3 rows)Ikki xil yozuvga qarang:
vazifa— oddiy nom, qo'shtirnoqsiz. PostgreSQL uni kichik harfga aylantiradi."Bajarildimi?"— qo'shtirnoq ichida. Unda katta harf, bo'shliq,?saqlanadi.
SQL tili va buyruq turlari darsidagi qoida shu yerda ham: '...' — qiymat (matn), "..." — nom (ustun, jadval, taxallus).
f va t — psql boolean ni shunday ko'rsatadi: false va true.
Maslahat: Ilova kodida taxallusni JSON kaliti uchun ishlatish qulay:
SELECT yaratilgan_vaqt AS "yaratildi". Bazadagi nom o'zbekchasnake_case, API'dagi nom esa boshqa bo'lishi mumkin.
3. WHERE: qaysi qatorlar
3.1 Taqqoslash
WHERE dan keyin shart yoziladi. Har qator uchun shart tekshiriladi: true bo'lsa — qator natijaga kiradi, aks holda — yo'q.
| Operator | Ma'nosi | Misol |
|---|---|---|
= |
teng | egasi_id = 1 |
<> yoki != |
teng emas | egasi_id <> 1 |
<, <=, >, >= |
kichik, katta | id <= 3 |
JavaScript'dan farqi: tenglik — bitta = (=== emas). Matn solishtirish registrga sezgir: 'Aziz' = 'aziz' — false.
boolean ustunni to'g'ridan-to'g'ri shart qilsa bo'ladi: WHERE bajarildi (= true shart emas), WHERE NOT bajarildi. Biz ishga tushirdik (PG 17.6):
SELECT id, matn FROM vazifalar
WHERE bajarildi AND egasi_id = 4;Natija:
id | matn
----+-------------------------------------
13 | Kutubxonaga kitob qaytarish #o'qish
18 | Yotoqxona to'lovi #to'lov
37 | Uyga qo'ng'iroq qilish #oila
(3 rows)3.2 AND, OR, NOT va ustuvorlik
Uch mantiqiy operator bor: AND (va), OR (yoki), NOT (emas). Kanon misoli (PostgreSQL 18.6) — Azizning bajarilmagan vazifalari:
SELECT id, matn FROM vazifalar
WHERE egasi_id = 1 AND NOT bajarildi
ORDER BY id;Natija:
id | matn
----+--------------------------------------------------
1 | JavaScript kursining 26-qismini boshlash #o'qish
17 | Portfolio saytiga blog yozish #portfolio
23 | Oshxonadagi jo'mrakni almashtirish #ta'mir #uy
34 | SQL JOIN mashqlarini yechish #o'qish
38 | Velosiped zanjirini moylash
(5 rows)ORDER BY id — natijani id bo'yicha tartiblaydi. Usiz tartib kafolatlanmaydi. Uni keyingi darsda — ORDER BY, LIMIT va OFFSET — to'liq o'rganamiz.
Endi tuzoq. Savol: "Aziz yoki Dilnozaning bajarilgan vazifalari nechta?" Kanon (PostgreSQL 18.6):
SELECT count(*) FROM vazifalar
WHERE egasi_id = 1 OR egasi_id = 2 AND bajarildi;
SELECT count(*) FROM vazifalar
WHERE (egasi_id = 1 OR egasi_id = 2) AND bajarildi;Natija:
count
-------
12
(1 row)
count
-------
7
(1 row)Ikki xil javob. Qaysi biri to'g'ri? Ikkinchisi — 7. Birinchisida nima bo'ldi?
AND OR dan kuchliroq bog'laydi — xuddi arifmetikada × + dan kuchliroq bo'lgani kabi (2 + 3 × 4 = 14). Birinchi so'rovni PostgreSQL shunday o'qidi:
WHERE egasi_id = 1 OR (egasi_id = 2 AND bajarildi)Ya'ni "Azizning hamma vazifalari (9 ta) yoki Dilnozaning bajarilganlari (3 ta)" = 12. Biz esa "ikkalasining bajarilganlari" (4 + 3 = 7) ni so'ragan edik.
Ustuvorlik tartibi: NOT → AND → OR. Qoida oddiy: AND va OR aralashsa — qavs qo'ying. Qavs o'qishni ham osonlashtiradi.
Tekshirib ko'ring:
WHERE NOT bajarildi AND egasi_id = 1qanday o'qiladi:NOT (bajarildi AND egasi_id = 1)mi yoki(NOT bajarildi) AND egasi_id = 1mi?
Javob
Ikkinchisi: NOT eng kuchli, u faqat yonidagi bajarildi ga tegishli. Natija — Azizning bajarilmagan vazifalari. Birinchisi butunlay boshqa ma'no: "Azizning bajarilgan vazifasi bo'lmagan hamma qatorlar" — bu boshqa foydalanuvchilarning hamma vazifalarini ham o'z ichiga oladi.
3.3 IN: ro'yxatdan biri
egasi_id = 1 OR egasi_id = 2 OR egasi_id = 5 — uzun. Qisqasi: egasi_id IN (1, 2, 5). Biz ishga tushirdik (PG 17.6):
SELECT ism FROM foydalanuvchilar
WHERE email IN ('aziz@example.com', 'bekzod@example.com');Natija:
ism
----------------
Aziz Karimov
Bekzod Nazarov
(2 rows)Teskarisi — NOT IN. Biz ishga tushirdik (PG 17.6) — Aziz va Dilnozadan boshqalarning vazifalari soni:
SELECT count(*) FROM vazifalar WHERE egasi_id NOT IN (1, 2);Natija:
count
-------
25
(1 row)40 − 9 − 6 = 25. To'g'ri.
Diqqat:
NOT INro'yxatidaNULLbo'lsa, natija doim bo'sh bo'ladi. Bu SQL'ning eng mashhur tuzoqlaridan biri — sababini NULL mantiqi darsida ko'ramiz.
3.4 BETWEEN va vaqt tuzog'i
x BETWEEN a AND b — x >= a AND x <= b ning qisqasi. Ikkala chegara ham kiradi. Sonlar uchun qulay: id BETWEEN 1 AND 10.
Vaqt bilan esa ehtiyot bo'ling. Savol: "10, 11 va 12 oktabr kunlari yozilgan vazifalar". Kanon (PostgreSQL 18.6, sessiya zonasi UTC):
SELECT id, matn, yaratilgan_vaqt FROM vazifalar
WHERE yaratilgan_vaqt BETWEEN '2026-10-10' AND '2026-10-12'
ORDER BY id;Natija:
id | matn | yaratilgan_vaqt
----+----------------------------------------------+------------------------
28 | Elektr to'lovini Click orqali qilish #to'lov | 2026-10-10 07:00:00+00
29 | Gaz to'lovi #to'lov | 2026-10-11 04:30:00+00
(2 rows)12 oktabr qani? '2026-10-12' vaqt ustuni bilan solishtirilganda kun boshi — 2026-10-12 00:00:00 ga aylanadi. 12-kun soat 00:00 dan keyin yozilgan hamma narsa chegaradan tashqarida qoldi.
To'g'ri yo'l — yarim ochiq oraliq: boshi kiradi (>=), oxiri kirmaydi (<), oxiri — keyingi kunning boshi. Biz ishga tushirdik (PG 17.6, zona UTC):
SELECT id, matn FROM vazifalar
WHERE yaratilgan_vaqt >= '2026-10-10'
AND yaratilgan_vaqt < '2026-10-13'
ORDER BY id;Natija:
id | matn
----+----------------------------------------------
28 | Elektr to'lovini Click orqali qilish #to'lov
29 | Gaz to'lovi #to'lov
30 | Instagram uchun surat olish #ish
31 | Python laboratoriya ishi #o'qish
(4 rows)Endi 12-oktabrning ikkala vazifasi ham bor. Bu shakl har qanday aniqlikda ishlaydi — kun, soat, mikrosekund. Uni odat qiling.
Yana bir nozik joy: '2026-10-10' — qaysi zonaning yarim tuni? Sessiya zonasiniki (bizda UTC). Toshkentning 10-oktabri esa UTC'dagidan 5 soat oldin boshlanadi. Bu farqni SQL'da sana va vaqt zonalari darsida to'liq hal qilamiz.
Tekshirib ko'ring:
WHERE id BETWEEN 5 AND 3nechta qator qaytaradi?
Javob
Nol. BETWEEN a AND b — x >= a AND x <= b; 5 dan katta va 3 dan kichik son yo'q. Chegaralar tartibi muhim. (BETWEEN SYMMETRIC 5 AND 3 chegaralarni o'zi almashtiradi, lekin u kam ishlatiladi.)
4. LIKE va ILIKE: matn namunasi
4.1 % va _
LIKE — matnni namuna bilan solishtiradi. Namunada ikki maxsus belgi bor:
| Belgi | Ma'nosi | Misol | Mos keladi |
|---|---|---|---|
% |
istalgan sondagi belgi (0 ham) | '%bozor%' |
"...bozor..." |
_ |
aynan bitta belgi | '_oz%' |
"Bozordan", "yoz..." |
Kanon (PostgreSQL 18.6):
SELECT matn FROM vazifalar
WHERE matn LIKE '%bozor%' ORDER BY id;Natija:
matn
------------------------------------------
Bozordan kartoshka va piyoz olish #bozor
Bozordan meva olish #bozor
Un va yog' xarid qilish #bozor #oshxona
(3 rows)Birinchi ikki qator "Bozordan" so'zi tufayli emas, #bozor tegi tufayli topildi. LIKE registrga sezgir: '%bozor%' katta harfli "Bozor" ni topmaydi.
_ bilan — biz ishga tushirdik (PG 17.6):
SELECT matn FROM vazifalar WHERE matn LIKE '_oz%';Natija:
matn
------------------------------------------
Bozordan kartoshka va piyoz olish #bozor
Bozordan meva olish #bozor
(2 rows)"Birinchi belgi — istalgan bitta, keyin oz, keyin istalgan narsa".
4.2 ILIKE — registrga befarq
ILIKE — PostgreSQL'ning registrga befarq LIKE i. Kanon (PostgreSQL 18.6):
SELECT matn FROM vazifalar
WHERE matn ILIKE 'bozor%' ORDER BY id;Natija:
matn
------------------------------------------
Bozordan kartoshka va piyoz olish #bozor
Bozordan meva olish #bozor
(2 rows)Namuna % bilan boshlanmagan: matn aynan "bozor" (har qanday registrda) bilan boshlanishi kerak. Uchinchi qator ("Un va yog'…") shuning uchun tushib qoldi.
Farqni sonda ko'ramiz — biz ishga tushirdik (PG 17.6):
SELECT count(*) FROM vazifalar WHERE matn LIKE '%#O''qish%';
SELECT count(*) FROM vazifalar WHERE matn ILIKE '%#O''qish%';Natija:
count
-------
0
(1 row)
count
-------
8
(1 row)Qidiruv maydoni uchun (foydalanuvchi "Bozor" ham, "bozor" ham yozishi mumkin) — ILIKE. ILIKE standart SQL emas: MySQL va SQLite'da yo'q, ular lower(matn) LIKE lower(...) bilan qilinadi.
4.3 Namunadagi maxsus belgilar
Matnning o'zida % yoki _ qidirish kerak bo'lsa-chi? Masalan "chegirma 50%". Ularni teskari chiziq (\) bilan ekranlaysiz: '%50\%%' — "istalgan narsa, 50%, istalgan narsa". Biz ishga tushirdik (PG 17.6):
SELECT 'chegirma 50%' LIKE '%50\%%' AS foiz,
'chegirma 500' LIKE '%50\%%' AS besh_yuz;Natija:
foiz | besh_yuz
------+----------
t | f
(1 row)Bu ilova uchun ham muhim. Foydalanuvchi qidiruvga % yozsa va siz uni namunaga to'g'ridan-to'g'ri qo'ysangiz, % "hammasi" bo'lib ishlaydi. Buni Parametrli so'rovlar darsida ko'ramiz.
4.4 Undan kuchliroq: ~
Murakkab namuna uchun PostgreSQL'da muntazam ifoda (regex) operatori bor: ~ (registrga sezgir) va ~* (befarq). Siz regex'ni JavaScript'dan bilasiz (RegExp asoslari). Biz ishga tushirdik (PG 17.6) — matnida raqam bor vazifalar:
SELECT matn FROM vazifalar WHERE matn ~ '\d+' ORDER BY id;Natija:
matn
--------------------------------------------------
JavaScript kursining 26-qismini boshlash #o'qish
Ingliz tili: 20 ta yangi so'z #o'qish #ingliz
IELTS writing task 2 mashqi #ingliz
Algoritmlar: 5 ta masala #o'qish
Futbol: payshanba 20:00 #sport
(5 rows)Regex funksiyalarini (regexp_replace va boshqalar) Ifodalar va o'rnatilgan funksiyalar darsida davom ettiramiz.
Diqqat:
LIKE '%so''z%'kabi boshida%bor qidiruv oddiy indeksdan foydalana olmaydi — har safar butun jadval o'qiladi. Kichik jadvalda sezilmaydi, 2 mln qatorda esa sekin. Yechimi —pg_trgmindeksi (Indeks turlari: GIN, GiST, BRIN va pg_trgm).
5. So'rov qaysi tartibda bajariladi
5.1 Yozilish tartibi ≠ bajarilish tartibi
Bajarilish tartibini SQL tili va buyruq turlari darsida ko'rgansiz. Bu darsdagi qismlar uchun qisqa ko'rinishi — yangi narsa faqat DISTINCT ning o'rni (SELECT dan keyin, ORDER BY dan oldin):
flowchart LR
A["FROM<br/>qaysi jadval"] --> B["WHERE<br/>qaysi qatorlar"]
B --> C["SELECT<br/>qaysi ustunlar"]
C --> D["DISTINCT<br/>takrorlar"]
D --> E["ORDER BY<br/>tartib"]
E --> F["LIMIT<br/>nechta"]Chapdan o'ngga o'qing: avval jadval, keyin qatorlar filtri, keyin ustunlar, takrorlar, tartib. (GROUP BY va HAVING WHERE dan keyin turadi — Agregatlar darsida.)
5.2 Nega WHERE taxallusni bilmaydi
Eslatma uchun bitta misol — bu darsning taxallusi bilan. Biz ishga tushirdik (PG 17.6):
SELECT id, matn AS vazifa FROM vazifalar
WHERE vazifa LIKE 'Gaz%';Natija:
ERROR: column "vazifa" does not exist
LINE 2: WHERE vazifa LIKE 'Gaz%';
^Taxallus SELECT da tug'iladi, WHERE esa undan oldin ishlaydi. To'g'risi — asl nom: WHERE matn LIKE 'Gaz%'. ORDER BY esa SELECT dan keyin keladi va taxallusni biladi.
6. DISTINCT va DISTINCT ON
6.1 DISTINCT — takrorlarsiz
"Kimlarning vazifasi bor?" — egasi_id ustuni kerak, lekin har biri bir marta. Kanon (PostgreSQL 18.6):
SELECT DISTINCT egasi_id FROM vazifalar ORDER BY egasi_id;Natija:
egasi_id
----------
1
2
3
4
5
6
7
(7 rows)40 qator o'rniga 7. 8 yo'q — Shahnozaning vazifasi yo'q. DISTINCT SELECT dagi hamma ustunlar birikmasi bo'yicha takrorni olib tashlaydi: SELECT DISTINCT egasi_id, bajarildi — har (ega, holat) juftligi bir marta.
6.2 DISTINCT ON — har guruhdan bitta qator
"Har foydalanuvchining eng oxirgi vazifasi" — bu boshqa savol. Bizga butun qator kerak (matn, vaqt), lekin har egadan faqat bittasi. PostgreSQL'da buning uchun DISTINCT ON bor. Kanon (PostgreSQL 18.6):
SELECT DISTINCT ON (egasi_id) egasi_id, matn, yaratilgan_vaqt
FROM vazifalar
ORDER BY egasi_id, yaratilgan_vaqt DESC;Natija:
egasi_id | matn | yaratilgan_vaqt
----------+----------------------------------+------------------------
1 | Velosiped zanjirini moylash | 2026-10-18 12:20:00+00
2 | Rezyume yangilash #ish | 2026-10-16 17:00:00+00
3 | Futbol: payshanba 20:00 #sport | 2026-10-15 14:00:00+00
4 | Uyga qo'ng'iroq qilish #oila | 2026-10-17 16:10:00+00
5 | Sport zalga yozilish #sport | 2026-10-19 02:30:00+00
6 | Instagram uchun surat olish #ish | 2026-10-12 10:30:00+00
7 | Do'stlar bilan choyxona #dam | 2026-10-18 14:00:00+00
(7 rows)Qanday ishlaydi:
ORDER BY egasi_id, yaratilgan_vaqt DESC— avval ega bo'yicha, har ega ichida eng yangisi birinchi (DESC— kamayish tartibi).DISTINCT ON (egasi_id)— har yangiegasi_idning birinchi qatorini oladi, qolganlarini tashlaydi.
ORDER BY siz DISTINCT ON "birinchi" qatorni tasodifiy tanlaydi. Shuning uchun ular doim juft yuradi va ORDER BY DISTINCT ON dagi ustun(lar) bilan boshlanishi shart.
DISTINCT ON faqat PostgreSQL'da bor. Boshqa bazalarda xuddi shu ish window funksiyasi bilan qilinadi (Window funksiyalar 1).
Tekshirib ko'ring: So'rovdagi
DESCni olib tashlasak, nima chiqadi?
Javob
Har foydalanuvchining eng birinchi (eng eski) vazifasi. O'sish tartibida birinchi qator — eng kichik vaqt. "Oxirgi" va "birinchi" faqat tartib yo'nalishi bilan farq qiladi.
7. SQL qadami: ilova so'rovlari (holat 15, commit yo'q)
Bu darsda sxema o'zgarmaydi — holat 15 qoladi, commit yo'q. Lekin 25-qism dagi GET /vazifalar filtrlari bazada aynan shu darsdagi so'rovlarga aylanadi. Masalan "Azizning faol vazifalari, matnida «o'qish» bor" so'rovi:
SELECT id, matn, bajarildi, yaratilgan_vaqt
FROM vazifalar
WHERE egasi_id = 1
AND NOT bajarildi
AND matn ILIKE '%o''qish%'
ORDER BY id;Bu yerda 1 va '%o''qish%' qo'lda yozilgan. Ilovada esa ular foydalanuvchidan keladi va parametr ($1, $2) bo'lib uzatiladi — matnga yopishtirilmaydi. Buni Parametrli so'rovlar va SQL injection darsida qilamiz. Repository kodi ham o'sha yerda.
8. Ko'p uchraydigan xatolar
| Xato yoki belgi | Sabab | Davosi |
|---|---|---|
| Natija kutilgandan ko'p | AND/OR qavssiz aralashgan |
Qavs qo'ying |
column "Non olish" does not exist |
Qiymat "…" da yozilgan |
Qiymat — '…', nom — "…" |
column "vazifa" does not exist (WHERE da) |
SELECT taxallusi WHERE da |
Asl ustun nomini yozing |
| Oxirgi kun natijada yo'q | BETWEEN vaqt bilan, kun boshi |
>= boshi AND < keyingi_kun |
| "Bozor" topilmadi | LIKE registrga sezgir |
ILIKE |
% qidiruvi hammasini qaytardi |
Namunadagi % ekranlanmagan |
\% |
DISTINCT ON har safar boshqa qator beradi |
ORDER BY yo'q yoki to'liq emas |
ORDER BY ni qo'shing |
SELECT DISTINCT ON expressions must match initial ORDER BY expressions |
ORDER BY boshqa ustundan boshlangan |
ORDER BY ni DISTINCT ON ustunidan boshlang |
9. Mashqlar
1-mashq (oson): natijani toping
Holat 15 bazasi (Azizda 9 vazifa, 4 tasi bajarilgan; Dilnozada 6, 3 tasi bajarilgan).
WHERE egasi_id = 1 AND bajarildi— nechta qator:WHERE egasi_id = 1 OR egasi_id = 2— nechta qator:'Toshkent' LIKE 'tosh%'natijasi:'Toshkent' ILIKE 'tosh%'natijasi:'a_b' LIKE 'a_b'va'axb' LIKE 'a_b'— ikkinchisi:
Yechim
- 4 — Azizning bajarilganlari.
- 15 — 9 + 6,
ORikkalasining hamma vazifalarini oladi. - false —
LIKEregistrga sezgir,T≠t. - true —
ILIKEregistrga befarq. - true —
_istalgan bitta belgi,xham. Pastki chiziqning o'zini qidirish uchun —'a\_b'.
2-mashq (o'rta): Madinaning o'qish vazifalari
Madina'ning (egasi_id 4) bajarilmagan va matnida #o'qish tegi bor vazifalarini toping. Teg katta harf bilan yozilgan bo'lsa ham topilsin. id va matn, id bo'yicha tartibda.
Yechim
Yechimni biz ishga tushirdik (PG 17.6):
SELECT id, matn
FROM vazifalar
WHERE egasi_id = 4
AND NOT bajarildi
AND matn ILIKE '%#o''qish%'
ORDER BY id;Natija:
id | matn
----+-----------------------------------------------
7 | Kurs ishi: ma'lumotlar bazasi bo'limi #o'qish
31 | Python laboratoriya ishi #o'qish
(2 rows)Madina'ning "Kutubxonaga kitob qaytarish #o'qish" vazifasi ham bor, lekin u bajarilgan — NOT bajarildi uni chiqarib tashladi.
3-mashq (qiyin): ikki so'rov
(a) 1–7 oktabr (UTC bo'yicha, 7-oktabr ham kirsin) orasida yaratilgan, #to'lov yoki #bozor tegi bor vazifalar: id, egasi_id, matn. Vaqt chegarasini yarim ochiq oraliq bilan yozing va qavslarni unutmang.
(b) Har foydalanuvchining eng birinchi bajarilgan vazifasi: egasi_id, id, matn.
Yechim
Ikkala so'rovni biz ishga tushirdik (PG 17.6):
-- (a)
SELECT id, egasi_id, matn
FROM vazifalar
WHERE yaratilgan_vaqt >= '2026-10-01'
AND yaratilgan_vaqt < '2026-10-08'
AND (matn LIKE '%#to''lov%' OR matn LIKE '%#bozor%')
ORDER BY id;
-- (b)
SELECT DISTINCT ON (egasi_id) egasi_id, id, matn
FROM vazifalar
WHERE bajarildi
ORDER BY egasi_id, yaratilgan_vaqt;Natija:
id | egasi_id | matn
----+----------+------------------------------------------
8 | 1 | Bozordan kartoshka va piyoz olish #bozor
16 | 2 | Bozordan meva olish #bozor
18 | 4 | Yotoqxona to'lovi #to'lov
19 | 7 | Universitet kontrakti #to'lov
22 | 6 | Un va yog' xarid qilish #bozor #oshxona
(5 rows)
egasi_id | id | matn
----------+----+-------------------------------------------------
1 | 2 | Postgres'ni Docker'da ko'tarish #o'qish #docker
2 | 5 | Ingliz tili: 20 ta yangi so'z #o'qish #ingliz
3 | 11 | Moy almashtirish #mashina
4 | 13 | Kutubxonaga kitob qaytarish #o'qish
5 | 3 | Mijozga taklifnoma yuborish #ish
6 | 4 | Somsa uchun xamir tayyorlash #oshxona
7 | 25 | Algoritmlar: 5 ta masala #o'qish
(7 rows)(a) da qavssiz yozsangiz, #bozor tegli hamma vazifalar (sanadan qat'i nazar) qo'shilib ketadi. (b) da WHERE bajarildi DISTINCT ON dan oldin ishlaydi (bajarilish tartibini eslang) — avval bajarilmaganlar tashlanadi, keyin har egadan birinchisi olinadi. Sardor (3) uchun "Mashinani texnik ko'rikka…" 08:00 da, "Moy almashtirish" 08:05 da yozilgan — lekin birinchisi bajarilmagan.
10. Real ishda
- Ro'yxat va qidiruv API'lari —
GET /vazifalar?bajarildi=false&q=bozor→WHERE egasi_id = $1 AND NOT bajarildi AND matn ILIKE $2. Filtrlarni dinamik yig'ish 25-qism va Parametrli so'rovlar darslarida. - Hisobot va tahlil — analitik, menejer, dasturchi har kuni
SELECT … WHEREyozadi; "SQL bilasizmi?" intervyu savolining birinchi qadami shu. DISTINCT ON— "har mijozning oxirgi buyurtmasi", "har qurilmaning oxirgi signali" kabi so'rovlarda PostgreSQL dasturchilarining sevimli usuli.- Intervyu savoli: "
WHERE a OR b AND cqanday bajariladi?" va "NegaWHEREda taxallus ishlamaydi?" — ikkalasiga ham javob bu darsda.
Xulosa
SELECT ustunlar FROM jadval WHERE shart— ilovada*emas, aniq ustunlar; taxallus —AS,"…"— nom,'…'— qiymat.ANDORdan kuchli — aralashsa qavs qo'ying;booleanustun o'zi shart bo'la oladi.IN— ro'yxatdan biri;NOT IN+NULL— tuzoq (keyingi darslar).BETWEENikkala chegarani oladi; vaqt uchun yarim ochiq oraliq:>= boshi AND < keyingi.LIKE(sezgir),ILIKE(befarq),%va_, ekranlash\; murakkab namuna —~.- Bajarilish tartibi: FROM → WHERE → SELECT → DISTINCT → ORDER BY → LIMIT;
DISTINCT ON+ORDER BY— har guruhdan bitta qator.
Keyingi dars: ORDER BY, LIMIT va OFFSET — natijani bir necha ustun bo'yicha tartiblash, NULLS FIRST/LAST, sahifalash va o'zbek alifbosi bo'yicha to'g'ri saralash.
Manbalar
- PostgreSQL 18 hujjati — SELECT (
DISTINCT ON, bajarilish tartibi) - PostgreSQL 18 hujjati — Pattern Matching (
LIKE,ILIKE, ekranlash,~) - PostgreSQL 18 hujjati — Comparison Functions and Operators (
BETWEEN,BETWEEN SYMMETRIC) - PostgreSQL 18 hujjati — Operator Precedence
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!