INSERT, SELECT — WHERE, AND, OR, BETWEEN, IN, LIKE, IS NULL

~20 daq · PostgreSQL · DDL va DML

Jadval yaratildi. Endi unga ma'lumot kiritish va o'qish kerak. Bu ikki operatsiya dasturda eng ko'p ishlatiladi — har so'rovda, har sahifada.


INSERT — ma'lumot kiritish

INSERT INTO foydalanuvchilar (ism, email, yosh)
VALUES ('Ali', 'ali@mail.com', 25);

Bir vaqtda bir nechta qator:

INSERT INTO foydalanuvchilar (ism, email, yosh)
VALUES
    ('Ali',  'ali@mail.com',  25),
    ('Vali', 'vali@mail.com', 30),
    ('Soli', 'soli@mail.com', 22);

Kiritilgan qatorni darhol ko'rish — RETURNING:

INSERT INTO foydalanuvchilar (ism, email)
VALUES ('Jasur', 'jasur@mail.com')
RETURNING id, ism;
--  id |  ism
-- ----+-------
--   4 | Jasur

RETURNING ayniqsa foydali — SERIAL bilan yaratilgan id ni bilish uchun qo'shimcha so'rov yozish shart emas.


SELECT — ma'lumot o'qish

SELECT * FROM foydalanuvchilar;

* — barcha ustunlar. Faqat keraklilarini tanlash:

SELECT ism, email FROM foydalanuvchilar;

WHERE — shart bilan filtrlash

SELECT * FROM foydalanuvchilar WHERE yosh = 25;
SELECT * FROM foydalanuvchilar WHERE ism = 'Ali';

AND, OR — bir nechta shart

-- Ikkalasi bajarilishi kerak
SELECT * FROM foydalanuvchilar
WHERE yosh > 20 AND faol = TRUE;

-- Bittasi bajarilsa yetarli
SELECT * FROM foydalanuvchilar
WHERE ism = 'Ali' OR ism = 'Vali';

BETWEEN — oraliqda

SELECT * FROM foydalanuvchilar
WHERE yosh BETWEEN 20 AND 30;
-- 20 va 30 ham kiradi (≥ 20 AND ≤ 30)

Sana oralig'i:

SELECT * FROM buyurtmalar
WHERE sana BETWEEN '2024-01-01' AND '2024-12-31';

IN — ro'yxatdan birida

SELECT * FROM foydalanuvchilar
WHERE yosh IN (20, 25, 30);

SELECT * FROM mahsulotlar
WHERE kategoriya IN ('elektronika', 'kiyim', 'oziq-ovqat');

NOT IN — ro'yxatda bo'lmagan:

SELECT * FROM foydalanuvchilar
WHERE rol NOT IN ('admin', 'moderator');

LIKE — qisman moslik

-- 'A' bilan boshlanuvchilar
SELECT * FROM foydalanuvchilar WHERE ism LIKE 'A%';

-- 'li' bilan tugaydigan
SELECT * FROM foydalanuvchilar WHERE ism LIKE '%li';

-- Ichida 'ali' bo'lganlar
SELECT * FROM foydalanuvchilar WHERE ism LIKE '%ali%';
%  — istalgan uzunlikdagi istalgan belgilar
_  — bitta istalgan belgi
-- Ikki harfli ismlar
SELECT * FROM foydalanuvchilar WHERE ism LIKE '__';

-- 'A' bilan boshlanib 3 harfli
SELECT * FROM foydalanuvchilar WHERE ism LIKE 'A__';

ILIKE — katta-kichik harfni farqlamasdan:

SELECT * FROM foydalanuvchilar WHERE ism ILIKE 'ali';
-- 'Ali', 'ALI', 'ali' — hammasi topiladi

IS NULL — bo'sh qiymat

NULL ni = bilan tekshirib bo'lmaydi:

-- ❌ — hech qachon mos kelmaydi
SELECT * FROM foydalanuvchilar WHERE telefon = NULL;

-- ✅
SELECT * FROM foydalanuvchilar WHERE telefon IS NULL;
SELECT * FROM foydalanuvchilar WHERE telefon IS NOT NULL;

Nima uchun = NULL ishlamaydi? NULL — "qiymat yo'q" degani. "Qiymat yo'q" bilan "qiymat yo'q" ni solishtirish — mantiqan noaniq. PostgreSQL bu holda TRUE ham, FALSE ham emas — NULL qaytaradi.


ORDER BY — tartiblash

SELECT * FROM foydalanuvchilar ORDER BY yosh;          -- o'sish tartibida
SELECT * FROM foydalanuvchilar ORDER BY yosh DESC;     -- kamayish tartibida
SELECT * FROM foydalanuvchilar ORDER BY ism, yosh DESC; -- avval ism, keyin yosh

LIMIT va OFFSET — sahifalash

SELECT * FROM foydalanuvchilar LIMIT 10;           -- faqat 10 ta
SELECT * FROM foydalanuvchilar LIMIT 10 OFFSET 20; -- 21-30 chi qatorlar
Sahifa 1: LIMIT 10 OFFSET 0
Sahifa 2: LIMIT 10 OFFSET 10
Sahifa 3: LIMIT 10 OFFSET 20

Hammasini birga

SELECT ism, email, yosh
FROM foydalanuvchilar
WHERE faol = TRUE
  AND yosh BETWEEN 18 AND 35
  AND ism ILIKE 'a%'
ORDER BY yosh DESC
LIMIT 5;

Tez-tez uchraydigan xatolar

NULL ni = bilan tekshirish

-- ❌ — natija har doim bo'sh
WHERE telefon = NULL

-- ✅
WHERE telefon IS NULL

LIKE da % unutish

-- ❌ — faqat aynan 'Ali' topiladi, LIKE bo'lmasa = bilan bir xil
WHERE ism LIKE 'Ali'

-- ✅ — 'Ali' bilan boshlanganlar
WHERE ism LIKE 'Ali%'

NOT IN da NULL bo'lsa

SELECT * FROM foydalanuvchilar
WHERE rol NOT IN ('admin', NULL);
-- Bu so'rov hech narsa qaytarmaydi!

NOT IN ro'yxatida NULL bo'lsa — PostgreSQL hech bir qatorni moslab bera olmaydi. Ro'yxatda faqat aniq qiymatlar bo'lishi kerak.

Katta jadvalda LIKE '%matn%'

%matn% — boshida % bo'lgani uchun index ishlamaydi, jadval boshidan oxirigacha skanlanadi. Millionlab qatorda bu sekin. Buning yechimi — pg_trgm extension yoki Full-text Search (keyingi darslarda ko'riladi).


Xulosa

INSERT — ma'lumot kiritish. RETURNING — kiritilgan qatorni darhol qaytaradi.

SELECT — ma'lumot o'qish. WHERE bilan filtrlash:

=, !=, <, >, <=, >=   — taqqoslash
AND, OR               — bir nechta shart
BETWEEN a AND b       — oraliq (a va b kiradi)
IN (...)              — ro'yxatdan biri
LIKE / ILIKE          — qisman moslik, % va _ wildcardlar
IS NULL / IS NOT NULL — bo'sh qiymat tekshirish

Tartiblash va sahifalash: ORDER BY, LIMIT, OFFSET.


Keyingi dars

9-dars: UPDATE, DELETE — RETURNING, xavfli holatlar