Ma'lumotlar bazalari

SQL asoslari

SQL (Structured Query Language) โ€” relatsion bazalar bilan gaplashish tili. U bilan siz jadval yaratasiz, ma'lumot qo'shasiz, o'qiysiz, o'zgartirasiz va o'chirasiz. Ushbu darsda eng muhim SQL buyruqlarini o'rganamiz. Barcha misollar PostgreSQL/MySQL uslubida yozilgan (ular deyarli bir xil).

SQL buyruqlari odatda BOSH HARFLAR bilan yoziladi (SELECT, FROM, WHERE), lekin bu majburiy emas โ€” SQL katta-kichik harfga sezgir emas (kalit so'zlar uchun). An'ana bo'yicha kalit so'zlar bosh harfda, jadval va ustun nomlari kichik harfda yoziladi. Har bir buyruq oxirida nuqta-vergul ; qo'yiladi.

CREATE TABLE โ€” jadval yaratish

Har qanday ish jadval yaratishdan boshlanadi. CREATE TABLE buyrug'i jadval nomi va ustunlar ro'yxatini oladi. Har bir ustun uchun nom va tur ko'rsatiladi:

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  email VARCHAR(255) UNIQUE,
  age INT,
  is_active BOOLEAN DEFAULT true,
  created_at TIMESTAMP DEFAULT NOW()
);

Bu yerda nima yuz berdi? users nomli jadval yaratildi va unda 6 ta ustun belgilandi. Endi turlarni va cheklovlarni ko'rib chiqamiz.

Asosiy ma'lumot turlari

Cheklovlar (constraints)

NULL โ€” bu "qiymat yo'q", "noma'lum" degani. U 0 yoki bo'sh matndan farq qiladi. Masalan, foydalanuvchi yoshini ko'rsatmasa, age ustuni NULL bo'lishi mumkin.

INSERT INTO โ€” ma'lumot qo'shish

Jadval tayyor bo'lgach, unga qator qo'shamiz. INSERT INTO buyrug'i jadval nomini, ustunlarni va qiymatlarni oladi:

INSERT INTO users (name, email, age)
VALUES ('Ali', 'ali@mail.com', 25);

E'tibor bering: matn qiymatlar bitta tirnoq ('Ali') ichida yoziladi, sonlar esa tirnoqsiz (25). Biz id, is_active va created_atni ko'rsatmadik โ€” ular avtomatik (SERIAL va DEFAULT) to'ldiriladi.

Bir necha qatorni bir vaqtda qo'shish uchun vergul bilan ajratiladi:

INSERT INTO users (name, email, age) VALUES
  ('Vali', 'vali@mail.com', 30),
  ('Guli', 'guli@mail.com', 22),
  ('Hasan', 'hasan@mail.com', 28);

SELECT โ€” ma'lumot o'qish

SELECT โ€” eng ko'p ishlatiladigan buyruq. U jadvaldan ma'lumot o'qiydi. Barcha ustunlarni olish uchun yulduzcha * ishlatiladi:

SELECT * FROM users;

Faqat kerakli ustunlarni olish uchun ularning nomlarini sanab o'tamiz (bu tezroq va toza):

SELECT name, email FROM users;
Amaliyotda SELECT * emas, balki aniq kerakli ustunlarni sanab o'tish yaxshi odat. Bu tarmoqdan kamroq ma'lumot uzatadi va kod nima olayotgani aniq ko'rinadi.

WHERE โ€” shart bo'yicha filtrlash

Ko'pincha bizga hamma qator emas, faqat ma'lum shartga mos qatorlar kerak. WHERE shu uchun ishlatiladi:

SELECT * FROM users WHERE age > 25;

Solishtirish operatorlari: = (teng), <> yoki != (teng emas), <, >, <=, >=. Matn bilan solishtirish:

SELECT * FROM users WHERE name = 'Ali';

AND va OR โ€” bir necha shart

Bir necha shartni birlashtirish uchun AND (va) hamda OR (yoki) ishlatiladi:

-- yoshi 25 dan katta VA faol bo'lganlar
SELECT * FROM users WHERE age > 25 AND is_active = true;

-- ismi Ali YOKI Vali bo'lganlar
SELECT * FROM users WHERE name = 'Ali' OR name = 'Vali';

LIKE โ€” matn ichida qidirish

LIKE operatori matn namunasi (pattern) bo'yicha qidiradi. Ikki maxsus belgi ishlatiladi: % โ€” istalgan (nol yoki ko'p) belgilar, _ โ€” aniq bitta belgi:

-- ismi 'A' harfi bilan boshlanadiganlar
SELECT * FROM users WHERE name LIKE 'A%';

-- emailida 'mail' so'zi qatnashadiganlar
SELECT * FROM users WHERE email LIKE '%mail%';

-- ismi aynan 4 harfli va 'A' bilan boshlananuvchi
SELECT * FROM users WHERE name LIKE 'A___';

Boshqa foydali shartlar

-- ma'lum ro'yxatdagi qiymatlar
SELECT * FROM users WHERE age IN (22, 25, 30);

-- oraliqda (chegaralar kiradi)
SELECT * FROM users WHERE age BETWEEN 20 AND 30;

-- qiymati yo'q (NULL) bo'lganlar
SELECT * FROM users WHERE age IS NULL;
NULL bilan solishtirishda = ishlatilmaydi! age = NULL hech qachon true bermaydi. To'g'ri usul โ€” IS NULL yoki IS NOT NULL.

ORDER BY โ€” saralash

Natijani tartiblash uchun ORDER BY ishlatiladi. ASC โ€” o'sish bo'yicha (standart), DESC โ€” kamayish bo'yicha:

-- yosh bo'yicha o'sish tartibida
SELECT * FROM users ORDER BY age ASC;

-- yosh bo'yicha kamayish (kattadan kichikka)
SELECT * FROM users ORDER BY age DESC;

-- avval yosh bo'yicha, keyin ism bo'yicha
SELECT * FROM users ORDER BY age DESC, name ASC;

LIMIT โ€” natijani cheklash

LIMIT qaytariladigan qatorlar sonini cheklaydi. Bu "eng katta 5 ta" kabi so'rovlar uchun juda foydali:

-- eng yosh 3 ta foydalanuvchi
SELECT * FROM users ORDER BY age ASC LIMIT 3;

-- 5-qatordan boshlab 10 ta olish (sahifalash uchun)
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 5;
LIMIT va OFFSET birgalikda "sahifalash" (pagination) uchun ishlatiladi. Masalan, har sahifada 10 ta natija ko'rsatsangiz: 1-sahifa LIMIT 10 OFFSET 0, 2-sahifa LIMIT 10 OFFSET 10 va hokazo.

UPDATE โ€” ma'lumotni o'zgartirish

UPDATE mavjud qatorlarni o'zgartiradi. SET qaysi ustunni qanday qiymatga o'zgartirishni, WHERE esa qaysi qatorlarni belgilaydi:

-- id = 1 bo'lgan foydalanuvchining yoshini o'zgartirish
UPDATE users SET age = 26 WHERE id = 1;

-- bir vaqtda bir necha ustun
UPDATE users SET age = 26, is_active = false WHERE id = 1;
Juda muhim: UPDATEda WHEREni unutmang! Agar WHEREsiz yozsangiz โ€” UPDATE users SET age = 0; โ€” bu barcha qatorlarning yoshini o'zgartiradi. Bu ko'p yangi boshlovchilarning eng katta xatosi.

DELETE โ€” ma'lumotni o'chirish

DELETE qatorlarni o'chiradi. Bu ham WHERE bilan ishlatiladi:

-- id = 3 bo'lgan foydalanuvchini o'chirish
DELETE FROM users WHERE id = 3;

-- 18 yoshdan kichiklarni o'chirish
DELETE FROM users WHERE age < 18;
DELETE FROM users; โ€” WHEREsiz yozilsa, jadvaldagi BARCHA qatorlarni o'chiradi! Har doim avval SELECT bilan qaysi qatorlar o'chishini tekshirib ko'ring, keyin xuddi shu WHERE bilan DELETE qiling.

Xulosa