Barcha savollar

Eng muhim 30 ta SQL intervyu savoli va javoblari (test bilan)

Ko'p beriladigan 30 ta SQL intervyu savolini amaliy misollar, flashcard'lar hamda jonli intervyularda autocomplete'siz query yozish bo'yicha maslahatlar yordamida puxta o'zlashtiring.

1 / 30Bilaman: 0Bilmayman: 0O'tkazildi: 0

SQL boshqa dasturlash tillaridan nimasi bilan farq qiladi?

SQL intervyu savollari va javoblari

Ushbu qo'llanmada sizni oddiy join'lardan tortib murakkab window function'largacha bo'lgan 30 ta muhim savol bilan tanishtirib chiqaman hamda query'larni joyida yozish va debugging qilish bo'yicha amaliy maslahatlar beraman. Har bir javobda oddiy, amaliy misollar (masalan, mijozlar tahlili va ombordagi tovarlarni hisobga olish) keltirilgan, shuning uchun siz sintaksisni o'rganibgina qolmay, uni qachon va nima uchun ishlatish kerakligini ham bilib olasiz. Qo'llanma oxiriga kelib, har qanday jonli SQL testini yengishga ishonchingiz va bu pattern'larni amalda qo'llash uchun bilimingiz bo'ladi.

Samaraliroq tayyorlanishingiz va mashq qilishingiz uchun o'zingizni sinab ko'rishni osonlashtiradigan flashcard'lar to'plamini ham qo'shdim. Ushbu qo'llanmada yoritilgan mavzularni yanada chuqurroq o'rganish uchun SQL roadmap'ini ko'rib chiqing.

SQL intervyusiga tayyorgarlik

Ehtimol, “Tayyorlanmaslik — muvaffaqiyatsizlikka tayyorlanish demakdir” degan gapni eshitgansiz. Intervyular haqida gap ketganda bu gap ayniqsa to'g'ri. Savollarni mashq qilishdan oldin asoslarni yaxshi bilishingizga ishonch hosil qiling. Intervyuga borishdan oldin takrorlab olishingiz kerak bo'lgan bir nechta asosiy yo'nalishlar:

  • Ma'lumot tiplari, statement'lar va clause'lar kabi asosiy SQL tushunchalarini o'qib chiqing.
  • Jadvallar bilan ishlashni mashq qiling. Jadvallarni turli join turlari hamda ON va USING kabi clause'lar yordamida birlashtirish ma'lumotlarni olish va aggregate qilishning kalitidir.
  • Yozuvlarni qo'shish, yangilash va o'chirish kabi data manipulation vazifalarini erkin bajara oladigan bo'ling.
  • Normalization, constraint'lar va performance tuning'ni o'z ichiga olgan ma'lumotlar bazasini loyihalash asoslarini o'rganing.
  • Sintaksisdan tashqari muammolarni hal qilish, mantiqiy fikrlash va muloqot ko'nikmalaringizni ham charxlang. Intervyularda ko'pincha kodni qanchalik yaxshi yozishingizgina emas, balki fikrlash jarayoningizni qanchalik aniq tushuntira olishingiz ham sinaladi.

Suhbatni boshlash uchun SQL savollari

Texnik savollarga o'tishdan oldin ba'zi intervyu oluvchilar “SQL bilan qancha vaqtdan beri ishlaysiz?”, “SQL bo'yicha bilim darajangizni shkala bo'yicha qanday baholaysiz?” yoki “Data manipulation uchun qanday keng tarqalgan SQL sintaksisidan foydalaniladi?” kabi umumiy savollardan boshlashi mumkin. Bunday savollar odatda suhbatni boshlab olishga va o'zingizni erkinroq his qilishingizga yordam beradi.

Bu ma'lumotlar CV yoki rezyumeingizda allaqachon bo'lsa ham, ular haqida gapirib berishga tayyor bo'ling. SQL tajribangizni aks ettiradigan lo'nda va samimiy javoblar berishni mashq qiling.

Shular bilan tanishib chiqqach, intervyuga tayyorlanish jarayonida bilishingiz kerak bo'lgan savollarni ko'rib chiqamiz.

Barcha savollar va javoblar

Boshlang'ich

SQL boshqa dasturlash tillaridan nimasi bilan farq qiladi?

SQL — deklarativ til. Siz ma'lumotlar bazasiga nima kerakligini aytasiz (masalan, "Menga barcha faol mijozlar ro'yxatini ber"), lekin uni olishning bosqichma-bosqich mantiqini yozmaysiz. So'rovingizni qanday bajarishni database engine'ning o'zi aniqlaydi.

Java yoki Python kabi tillar esa, aksincha, imperativ tillardir: ularda biror ishni qanday bajarish kerakligini tushuntiradigan kod yozasiz, jumladan, sikllar, shartlar va xotirani boshqarishni ham.

SQL va boshqa dasturlash tillari

-- Declarative: I want all active customers
SELECT * 
FROM customers 
WHERE status = 'active';
SQL dialect'lari nima?

SQL dialect'lari — turli ma'lumotlar bazasi tizimlari taqdim etadigan SQL'ning turli implementatsiyalari. Ularning barchasi bir nechta jadvalda saqlanadigan ma'lumotlar bilan ishlash uchun qo'llaniladigan SQL standartiga amal qiladi, lekin qo'shimcha imkoniyatlarga yoki biroz farqli sintaksisga ega bo'lishi mumkin.

Keng tarqalgan SQL dialect'lari:

  • MySQL: veb-ilovalarda mashhur.
  • PostgreSQL: ilg'or imkoniyatlari va standartlarga muvofiqligi bilan tanilgan.
  • Microsoft SQL Server: korporativ muhitlarda keng qo'llaniladi.
  • SQLite: yengil bo'lib, mobil yoki embedded ilovalarda ishlatiladi.

SQL dialect'lari

Asosiy sintaksis o'xshash bo'lsa-da, aggregate va scalar function'lar, JSON bilan ishlash yoki full-text search kabi imkoniyatlar biroz farq qilishi mumkin.

Savolga javob bergach, kompaniya qaysi dialect'dan foydalanishini so'rashdan tortinmang: bu ularning stack'i va qanday ishlashi haqida ko'proq bilib olishning ajoyib usuli.

SQL qanday subset'larga bo'linadi va ular bir-biridan qanday farq qiladi?

SQL bir nechta funksional subset'larga bo'linadi:

  • Data Definition Language (DDL): ma'lumotlar bazasi tuzilmasini aniqlash yoki o'zgartirish uchun ishlatiladi. Bunga CREATE, ALTER va DROP kabi buyruqlar kiradi. Masalan, ALTER table statement'i yordamida jadvalga ustun qo'shish, ustun nomini o'zgartirish va ustunni olib tashlash mumkin.
  • Data Manipulation Language (DML): ma'lumotlarni qo'shish, yangilash, o'chirish yoki olish uchun ishlatiladi. Bunga SELECT, INSERT, UPDATE va DELETE kabi buyruqlar kiradi. Masalan, UPDATE statement'i yordamida foydalanuvchining email manzilini uning ID'si bo'yicha o'zgartirish mumkin
  • Data Control Language (DCL): ruxsatlar berish yoki bekor qilish orqali ma'lumotlarga kirishni boshqaradi. Bunga GRANT va REVOKE kabi buyruqlar kiradi. Masalan, GRANT statement'i yordamida foydalanuvchiga jadvaldan ma'lumotlarni select qilish ruxsatini berish mumkin.

SQL subset'lari

Bu subset'lar o'rtasidagi asosiy farq ularning vazifasida:

  • DDL ma'lumotlar bazasining tuzilmasiga ta'sir qiladi.
  • DML ma'lumotlarning o'zi bilan ishlaydi.
  • DCL ma'lumotlar bazasi tizimida kim nima qila olishini belgilaydi.
Primary key nima?

Primary key jadvaldagi har bir satrni yagona tarzda aniqlaydi va primary key constraint'i orqali belgilanadi. U noyob bo'lishi shart va NULL qiymatlarni o'z ichiga ololmaydi. Har bir yozuvni aniqlash mumkin bo'lishi uchun har bir jadvalda bitta primary key bo'lishi kerak.

Relational database management system'dagi primary key

Masalan, foydalanuvchilar jadvalida primary key vazifasini bajaradigan noyob id bo'lishi mumkin:

CREATE TABLE users (
  id   INT PRIMARY KEY,
  name VARCHAR(100)
);
-- 'id' must be unique and non-null for every row.
NOT NULL, UNIQUE va CHECK kabi SQL constraint'larini tushuntiring.

SQL constraint'lari — ma'lumotlarni aniq va izchil saqlashga yordam beradigan qoidalar.

  • NOT NULL: ustunda bo'sh qiymatlar bo'lishiga yo'l qo'ymaydi.
  • UNIQUE: ustundagi barcha qiymatlar bir-biridan farq qilishini ta'minlaydi.
  • CHECK: ustundagi qiymatlar bajarishi shart bo'lgan shartni qo'shadi.

Qo'llanish holati: agar mahsulot narxlarini saqlayotgan bo'lsangiz, quyidagi kod parchasida ko'rsatilganidek, manfiy qiymatlarning oldini olish uchun CHECK constraint'idan foydalanishingiz mumkin:

CREATE TABLE products (
  id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  price DECIMAL(10, 2) CHECK (price >= 0)
);
WHERE va HAVING o'rtasida qanday farq bor?

WHERE har qanday guruhlash yoki aggregation qo'llanishidan oldin satrlarni filtrlash uchun ishlatiladi. Quyidagi kod parchasi WHERE'dan qanday foydalanishni ko'rsatadi. U Users jadvalidan Age qiymati 18 dan katta bo'lgan satrlarni ajratib oladi.

SELECT * FROM Users
WHERE Age > 18;

Query natijasi quyidagi jadvalga o'xshaydi.

userId firstName lastName age
1 John Doe 30
2 Jane Don 31
3 Will Liam 25
4 Wade Great 32
5 Peter Smith 27

HAVING esa guruhlash va aggregation bajarilgandan keyin guruhlarni filtrlash uchun ishlatiladi. U aggregate function'lar natijasiga qo'llanadi va asosan GROUP BY clause'i bilan birga ishlatiladi.

SELECT FirstName, Age FROM Users
GROUP BY FirstName, Age
HAVING Age > 30;

Yuqoridagi kod FirstName va Age ustunlarini tanlaydi, so'ng satrlarni FirstName va Age bo'yicha guruhlaydi va nihoyat yoshi 30 dan katta bo'lgan yozuvlarni oladi. Query natijasi quyidagicha ko'rinadi:

firstName age
Wade 32
Jane 31
Foreign key nima?

Foreign key — boshqa jadvalning primary key'iga murojaat qiladigan ustun (yoki ustunlar kombinatsiyasi). U ikki jadval o'rtasida bog'lanish o'rnatish uchun ishlatiladi: bog'langan ma'lumotlar ikkala jadvalda ham izchil qolishini ta'minlab, referential integrity va data integrity'ni saqlashga yordam beradi.

SQL foreign key

Foreign key constraint'iga ega jadval mos kelmaydigan yozuvlar paydo bo'lishining oldini oladi va o'zaro bog'liq jadvallarda ma'lumotlarni izchil saqlaydi.

O'rta

SQL'da JOIN'larning qanday turlari bor?

JOIN'lar ikki yoki undan ortiq jadvaldagi satrlarni o'zaro bog'liq ustun asosida birlashtirish imkonini beradi. Eng keng tarqalgan turlari:

  • INNER JOIN: faqat ikkala jadvalda ham mos keladigan satrlarni qaytaradi.
  • LEFT JOIN: chap jadvaldagi barcha satrlarni va o'ng jadvaldagi mos satrlarni qaytaradi.
  • RIGHT JOIN: o'ng jadvaldagi barcha satrlarni va chap jadvaldagi mos satrlarni qaytaradi.
  • FULL JOIN: jadvallarning istalgan birida moslik bo'lsa, barcha satrlarni qaytaradi.

LEFT JOIN'dan foydalanishga misol:

-- Get users and their orders (even if they have none)  
SELECT users.name, orders.amount  
FROM users  
LEFT JOIN orders ON users.id = orders.user_id;

JOIN amallarini o'zaro bog'liq ma'lumotlar asosida elektron jadvallarni birlashtirishga o'xshatish mumkin.

Subquery'dan qanday foydalanasiz?

Subquery — boshqa query ichidagi query. U quyidagi hollarda foydali:

  • Aggregate qilingan ma'lumotlar yordamida filtrlash kerak bo'lganda.
  • Qiymatni dinamik ro'yxat bilan solishtirish kerak bo'lganda.
  • Asosiy query'da foydalanish uchun vaqtinchalik jadval yaratish kerak bo'lganda.

Qo'llanish holatlariga qaysi xodimlar muayyan joyda ishlashini tekshirish yoki hisoblangan o'rtacha qiymatdan yuqori bo'lgan buyurtmalarni aniqlash kiradi.

-- Subquery in WHERE clause
SELECT name
FROM employees
WHERE department_id IN (
    SELECT id 
    FROM departments 
    WHERE location = 'New York'
);
Index nima va u nima uchun foydali?

Index ma'lumotlar bazasiga ma'lumotlarni tezroq topishga yordam beradi. U kitob oxiridagi ko'rsatkich kabi ishlaydi: butun jadvalni skanerlamasdan, query'ga mos keladigan satrlarni ko'rsatib beradi.

Masalan, foydalanuvchilarni familiyasi bo'yicha tezroq olish uchun familiya ustuniga index yaratishingiz mumkin:

-- Create an index on the last_name column
CREATE INDEX idx_employee_last_name
ON employees (last_name);

SQL index

Index'lar qidiruv, ma'lumotlarni olish va JOIN amallarini tezlashtirish uchun juda qulay. Ular tezkor lookup muhim bo'lgan katta SQL ma'lumotlar bazalarida unumdorlikni saqlab qolish uchun ham foydali.

UNION va UNION ALL o'rtasida qanday farq bor?

Ikkalasi ham ikki yoki undan ortiq SELECT query'sining natijalarini birlashtiradi. Asosiy farq:

  • UNION jadvaldagi takroriy satrlarni olib tashlaydi.
  • UNION ALL barcha satrlarni, jumladan, takroriylarini ham saqlab qoladi.

UNION ALL tezroq ishlaydi, chunki u deduplication bosqichini o'tkazib yuboradi. Noyob qiymatlarning toza ro'yxati kerak bo'lganda UNION'dan foydalaning.

RANK(), DENSE_RANK() va ROW_NUMBER() o'rtasida qanday farq bor?

Bu funksiyalar tartiblash mezonlari asosida rank yoki satr raqamlarini beradi. Teng qiymatlar bo'lganda ular o'zini turlicha tutadi:

  • ROW_NUMBER() qiymatlar bir xil bo'lsa ham, har bir satrga noyob raqam beradi.
  • RANK() teng satrlarga bir xil rank beradi va keyingi rank'ni tashlab ketadi.
  • DENSE_RANK() ham teng satrlarga bir xil rank beradi, lekin hech qaysi raqamni tashlab ketmaydi.

Rank, Dense_Rank va Row_Number o'rtasidagi farq

Ular leaderboard yaratish yoki hududlar yoxud kategoriyalar bo'yicha eng yaxshi natija ko'rsatganlarni aniqlash kabi vazifalarda foydali.

Correlated subquery nima?

Correlated subquery outer query'dagi qiymatlardan foydalanadi va outer query'ning har bir satri uchun bir martadan bajariladi. U mustaqil ravishda ishlay olmaydi, chunki o'z scope'idan tashqaridagi qiymatlarga bog'liq.

Undan har bir satrni unga bog'liq qiymat bilan solishtirish kerak bo'lganda foydalaning, masalan, o'z bo'limidagi o'rtacha maoshdan ko'proq maosh oladigan xodimlarni topishda.

Jadvaldagi takroriy yozuvlarni qanday topish mumkin?

Takroriy yozuvlarni topish uchun noyob bo'lishi kerak bo'lgan ustunlar bo'yicha guruhlaysiz, har bir guruh necha marta uchrashini sanaysiz va bir martadan ko'p uchraydiganlarini ajratib olasiz.

Masalan, foydalanuvchilar jadvalidagi takroriy email manzillarini barcha satrlarni email ustuni bo'yicha guruhlash orqali topish mumkin.

SELECT email, COUNT(*)
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

Bu ma'lumotlarni tozalashda yoki import qilishdan oldin yozuvlarni tekshirishda foydali.

View nima?

View — query orqali aniqlangan virtual jadval. U murakkab join'larni soddalashtiradi yoki faqat o'qishga ruxsat beriladigan kirishni majburiy qiladi.

CREATE VIEW active_users AS
SELECT * FROM users WHERE status = 'active';

View'lar murakkablikni oxirgi foydalanuvchilardan yashirmoqchi bo'lganingizda yoki ma'lumotlaringizning muayyan qismlariga role-based access yaratmoqchi bo'lganingizda foydali.

SQL injection nima va uning oldini qanday olasiz?

SQL injection — hujumchilar query'ga zararli kod yoki SQL statement'larini kiritadigan xavfsizlik muammosi. Bu ma'lumotlaringizning oshkor bo'lishiga yoki shikastlanishiga olib kelishi mumkin.

Uning oldini olish uchun foydalanuvchi kiritgan ma'lumotlarni xavfsiz qayta ishlaydigan parameterized query'lar yoki ORM vositalaridan foydalaning.

Murakkab

Stored procedure'larning qanday afzalliklari bor?

Stored procedure'lar — SQL kodingizdagi saqlangan funksiyalarga o'xshaydi: ularni bir marta yozasiz va qayta-qayta ishga tushirishingiz mumkin. Ular bevosita ma'lumotlar bazasida saqlanadi va bu ularga bir qancha afzalliklar beradi:

  • Unumdorlik: ular oldindan kompilyatsiya qilingani sababli ko'pincha oddiy SQL query'lariga qaraganda tezroq ishlaydi.
  • Xavfsizlik: ularni kim ishga tushira olishini nazorat qilishingiz va xom query'larni oshkor qilmasligingiz mumkin.
  • Kamroq tarmoq trafigi: ilovangizdan ma'lumotlar bazasiga bir nechta query yuborish o'rniga shunchaki procedure'ni chaqirasiz.
  • Qayta ishlatiladigan mantiq: bitta procedure'ni turli ilovalardan yoki tizimingizning turli qismlaridan chaqirishingiz mumkin.
  • Boshqarish osonroq: biznes mantiq bir joyda joylashadi, bu esa uni qo'llab-quvvatlashni osonlashtiradi.

Stored procedure'ning qo'llanish holati

Masalan, agar ilovangiz xodimlar ma'lumotlarini muntazam ravishda olib tursa, bu jarayonni optimallashtirish uchun stored procedure yaratishingiz mumkin.

-- Create a stored procedure to get employees by department
CREATE PROCEDURE GetEmployeesByDepartment
    @DepartmentID INT
AS
BEGIN
    SELECT name, hire_date, salary
    FROM employees
    WHERE department_id = @DepartmentID
    ORDER BY hire_date DESC;
END;

-- Call the procedure
EXEC GetEmployeesByDepartment @DepartmentID = 3;

Stored procedure'lar ayniqsa unumdorlik, xavfsizlik va izchil mantiq muhim bo'lgan korporativ tizimlarda foydali.

Database normalization nima va u nima uchun muhim?

Normalization — ma'lumotlarni keraksiz takrorlamaslik uchun ma'lumotlar bazasini tartibga solish usuli. U ma'lumotlaringizni toza saqlashga, yangilash bilan bog'liq muammolardan qochishga yordam beradi va ilovangiz o'sib borgani sari tuzilmani boshqarishni osonlashtiradi.

Asosiy maqsadlar:

  • Bir xil ma'lumotlarni turli joylarda takrorlamaslik.
  • Yangilash va qo'shish amallarini ishonchliroq qilish.
  • Query'larni sodda va mantiqiy saqlash.
  • Keyinchalik schema'ni o'zgartirishni osonlashtirish.

Normalization'dan oldin:

CREATE TABLE orders_unnormalized (
    order_id INT,
    product_name VARCHAR(100),
    product_category VARCHAR(50),
    product_price DECIMAL(10,2),
    customer_name VARCHAR(100),
    customer_email VARCHAR(100),
    customer_address VARCHAR(200)
);

Normalization'dan keyin:

CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    address VARCHAR(200)
);

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    name VARCHAR(100),
    category VARCHAR(50),
    price DECIMAL(10,2)
);

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id),
    product_id INT REFERENCES products(product_id),
    order_date DATE
);

Normalization ko'p afzalliklar bersa-da, haddan tashqari normalize qilsangiz, juda ko'p mayda jadvallar va ko'plab join'lar paydo bo'lishi mumkin, bu esa o'qish amallari ko'p bo'lgan tizimlarda unumdorlikni pasaytirishi mumkin.

SQL'da ma'lumotlar bazasi transaction'larini qanday boshqarasiz?

Transaction — bitta yaxlit amal sifatida qaralishi kerak bo'lgan amallar guruhi. Transaction'dagi hamma amallar yo muvaffaqiyatli bajariladi, yo hech biri bajarilmaydi. Bu, ayniqsa, bir vaqtning o'zida bir nechta o'zgarish kiritayotganda ma'lumotlaringizni to'g'ri saqlashga yordam beradi.

-- Basic transaction syntax
BEGIN TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 456;

-- If both updates succeed
COMMIT;

-- If there's a problem
ROLLBACK;

Transaction'lar ACID xususiyatlariga amal qiladi:

ACID xususiyatlari

  • Atomicity: barcha qadamlar muvaffaqiyatli bajariladi yoki hech biri bajarilmaydi.
  • Consistency: ma'lumotlar bazasi transaction'dan oldin ham, keyin ham yaroqli holatda qoladi.
  • Isolation: transaction'lar bir-biriga xalaqit bermaydi.
  • Durability: commit qilingandan so'ng o'zgarishlar doimiy saqlanadi.

Agar pul o'tkazmalari yoki ombordagi qoldiqlarni yangilash kabi ishlar bilan shug'ullanayotgan bo'lsangiz, transaction'lardan foydalanish shart.

Clustered va non-clustered index'lar o'rtasida qanday farq bor?

Bu tushuncha ko'pchilikni chalg'itadi, lekin intervyularda tez-tez so'raladi. Index'lar ma'lumotlar bazasiga ma'lumotlarni tezroq topishga yordam beradi (kitobdagi ko'rsatkichga o'xshab).

  • Clustered index: jadvaldagi satrlarning fizik tartibini belgilaydi va har bir jadvalda faqat bitta clustered index bo'lishi mumkin. Bu kitob sahifalarini bitta muayyan mavzu bo'yicha tartiblab chiqishga o'xshaydi.
  • Non-clustered index: satrlar qanday saqlanishiga ta'sir qilmaydi. U haqiqiy ma'lumotlarga ishora qiluvchi alohida lookup jadvalidir. Bir nechta non-clustered index'ga ega bo'lishingiz mumkin.
-- Creating a clustered index (usually on the primary key)
CREATE CLUSTERED INDEX idx_employees_id ON employees(employee_id);

-- Creating a non-clustered index
CREATE NONCLUSTERED INDEX idx_employees_dept ON employees(department_id);

To'g'ri index turini tanlash ma'lumotlarni qanday query qilishingizga bog'liq: range query'lar ko'pincha clustered index'lardan foyda ko'radi, aniq qiymat bo'yicha lookup'lar esa non-clustered index'lar bilan yaxshi ishlaydi.

Sekin ishlayotgan query'ni qanday optimallashtirasiz?

Tezlik muhim, ayniqsa katta dataset'lar bilan ishlayotganda. Sekin query'ga quyidagicha yondashish mumkin:

  • Query plan'ni tekshiring: vaqt qayerda sarflanayotganini ko'ring.
  • Index'larni ko'rib chiqing: kerakli ustunlarga index qo'yilganmi?
  • Query'ni qayta yozing: turli yondashuvlarni sinab ko'ring yoki query'ni kichikroq qismlarga ajrating.
  • Join'larni soddalashtiring: join mantiqi va tartibini yana bir bor tekshiring.
  • Ma'lumotlarni cheklang: faqat haqiqatan kerak bo'lgan ustun va satrlarni qaytaring.
  • Ma'lumot tiplariga e'tibor bering: solishtirishlar sekinlashuvga sabab bo'lmayotganiga ishonch hosil qiling.
  • Partitioning'dan foydalaning: juda katta jadvallarni bo'laklarga ajratish yordam berishi mumkin.

Optimallashtirishdan oldin:

SELECT c.name, o.order_date, p.product_name, p.price
FROM customers c, orders o, order_items oi, products p
WHERE c.id = o.customer_id
  AND o.id = oi.order_id
  AND oi.product_id = p.id
  AND o.order_date > '2022-01-01';

Optimallashtirishdan keyin:

SELECT c.name, o.order_date, p.product_name, p.price
FROM orders o
JOIN customers c ON o.customer_id = c.id
JOIN order_items oi ON o.id = oi.order_id
JOIN products p ON oi.product_id = p.id
WHERE o.order_date > '2022-01-01';

Aniq optimallashtirish usullari ma'lumotlar bazasi tizimingiz va unumdorlikdagi bottleneck'larga qarab farq qiladi.

SQL'da pagination'ni qanday amalga oshirgan bo'lardingiz?

Ko'p ma'lumot bilan ishlayotganda hammasini birdaniga yuklash amaliy emas. Pagination natijalarni kichikroq bo'laklarga ajratishga yordam beradi.

1-variant: oddiy offset-based pagination

SELECT *
FROM products
ORDER BY name
LIMIT 10 OFFSET 20;  -- Get records 21-30

2-variant: keyset pagination (katta hajmdagi ma'lumotlar uchun samaraliroq)

SELECT *
FROM products
WHERE (price, id) > (100.00, 12345)  -- Based on last record from previous page
ORDER BY price ASC, id ASC
LIMIT 10;

Offset-based pagination'dan foydalanish oson, lekin offset kattalashgani sari u sekinlashib boradi. Keyset pagination chuqur scroll qilish yoki infinite list'lar uchun yaxshiroq.

Chuqurroq o'rganmoqchimisiz? Bizning SQL Mastery kursimiz indexing, transaction'lar va boshqa murakkab xavfsizlik pattern'larini qamrab oladi.

Amaliy query'lar

So'nggi 6 oyda qancha bemor ro'yxatdan o'tgan?
SELECT COUNT(*) AS recent_patients
FROM patients
WHERE registration_date >= CURRENT_DATE - INTERVAL '6 months';

Bemorlar yozuvlarini ularning registration_date qiymati bo'yicha dinamik 6 oylik oraliq yordamida filtrlayotganingizni ayting. Shu tariqa query har doim dolzarb sonni beradi. COUNT(*) yangi bemorlarning umumiy sonini berishini alohida ta'kidlang.

Har bir qabul uchun o'rtacha davolash xarajati qancha?
SELECT 
  appointment_id, 
  AVG(cost) AS avg_treatment_cost
FROM treatments
GROUP BY appointment_id;

Davolash muolajalari qabullarga bog'langanini, shuning uchun appointment_id bo'yicha guruhlash har bir tashrif uchun o'rtacha xarajatni hisoblash imkonini berishini aytib o'ting. Bunday tahlil hisob-kitob ishlarida yoki g'ayrioddiy qimmat seanslarni aniqlashda yordam berishi mumkin.

3 tadan ortiq qabulda bo'lgan bemorlar ro'yxatini chiqaring.
SELECT 
  p.patient_id, 
  p.first_name, 
  p.last_name, 
  COUNT(a.appointment_id) AS total_appointments
FROM patients p
JOIN appointments a ON p.patient_id = a.patient_id
GROUP BY p.patient_id, p.first_name, p.last_name
HAVING COUNT(a.appointment_id) > 3;

Bemorlarni ularning qabullari bilan bog'lash uchun JOIN'dan foydalanayotganingizni, so'ng har bir bemor necha marta qabulda bo'lganini sanash uchun natijalarni guruhlayotganingizni tushuntiring. Uch martadan ko'p qabulda bo'lganlarni ajratib olish uchun HAVING'dan foydalaning. Bunday query faol yoki tez-tez murojaat qiladigan bemorlarni kuzatib borishga yordam beradi.

Qaysi shifokor eng ko'p noyob bemorni davolagan?
SELECT 
  d.full_name, 
  COUNT(DISTINCT a.patient_id) AS unique_patients
FROM doctors d
JOIN appointments a ON d.doctor_id = a.doctor_id
GROUP BY d.full_name
ORDER BY unique_patients DESC
LIMIT 1;

COUNT(DISTINCT patient_id) bitta bemorni ikki marta sanab qo'ymaslikka yordam berishini tushuntiring. Natijani son bo'yicha tartiblab, uni 1 ta bilan cheklash eng ko'p turli bemorni ko'rgan shifokorni beradi.

O'tgan oyda davolash muolajalaridan jami qancha daromad olingan?
SELECT 
  SUM(t.cost) AS total_revenue
FROM treatments t
JOIN appointments a ON t.appointment_id = a.appointment_id
WHERE a.appointment_date >= date_trunc('month', CURRENT_DATE - INTERVAL '1 month')
  AND a.appointment_date < date_trunc('month', CURRENT_DATE);

O'tgan oy uchun aniq sana oralig'ini belgilash maqsadida date_trunc'dan foydalanayotganingizni, so'ng xarajatlarni qo'shib chiqish uchun qabullar va davolash muolajalarini join qilayotganingizni ayting. Bu shifoxonaning o'tgan oydagi davolash bilan bog'liq daromadini ko'rsatadi.

Eng ko'p uchraydigan tashxisni toping.
SELECT 
  diagnosis, 
  COUNT(*) AS diagnosis_count
FROM appointments
WHERE diagnosis IS NOT NULL
GROUP BY diagnosis
ORDER BY diagnosis_count DESC
LIMIT 1;

NULL qiymatlar yaroqli ma'lumotni ifodalamagani uchun ularni chiqarib tashlayotganingizni, so'ng qaysi tashxis eng ko'p uchrashini ko'rish uchun tashxis bo'yicha guruhlayotganingizni aytib o'ting. Kamayish tartibida saralash va natijani 1 ta bilan cheklash eng ko'p uchraydigan kasallikni beradi.

Qaysi qabullar rejalashtirilgan, lekin ularda hech qanday davolash qayd etilmagan?
SELECT 
  a.appointment_id, 
  a.patient_id, 
  a.appointment_date
FROM appointments a
LEFT JOIN treatments t ON a.appointment_id = t.appointment_id
WHERE t.treatment_id IS NULL AND a.status = 'completed';

Mos davolash yozuvi bo'lmagan qabullarni topish uchun LEFT JOIN'dan foydalanayotganingizni ayting. treatment_id IS NULL sharti bo'yicha filtrlash aynan shunday holatlarni ajratib oladi. Qabul statusini tekshirish esa e'tiborni haqiqatan bo'lib o'tgan tashriflarga qaratadi.

Qaysi bemorlar bir yildan ortiq vaqtdan beri tashrif buyurmagan?
SELECT 
  p.patient_id, 
  p.first_name, 
  p.last_name
FROM patients p
LEFT JOIN (
  SELECT patient_id, MAX(appointment_date) AS last_visit
  FROM appointments
  GROUP BY patient_id
) a ON p.patient_id = a.patient_id
WHERE last_visit IS NULL OR last_visit < CURRENT_DATE - INTERVAL '1 year';

Avval har bir bemorning eng so'nggi qabulini topish uchun subquery yaratishingizni bosqichma-bosqich tushuntiring. So'ng uni bemorlar jadvali bilan join qilib, bir yildan ortiq vaqtdan beri tashrif buyurmagan yoki umuman tashrif buyurmagan bemorlarni ajratib olasiz.

Yo'l xaritalariQo'llanmalarFAQYouTube

yo'lxaritaroadmap.shasosida

Hamjamiyat tomonidan yaratilgan yo'l xaritalari, eng yaxshi amaliyotlar, loyihalar, maqolalar, manbalar va yo'nalishlar — o'z yo'lingizni tanlash va kasbingizda o'sish uchun.

© yo'lxarita·Shartlar·Maxfiylik·

roadmap.sh

Barcha kontent roadmap.sh loyihasidan olingan (© Kamran Ahmed) va shaxsiy o'rganish uchun o'zbek tiliga tarjima qilinmoqda.

Qidiruv

Yo'l xaritalari, loyihalar va savollarni qidiring