14-bo‘lim

MySQL funksiyalari

Matn, son, sana, shartli va agregat funksiyalar hamda ularning amaliy qo'llanishi.

🕑 11 daqiqa o‘qish 📄 578 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Matn funksiyalari
  2. Amaliy misollar
  3. Son funksiyalari
  4. Sana va vaqt funksiyalari
  5. Sana bilan amallar
  6. Sanani formatlash
  7. Shartli funksiyalar
  8. Agregat funksiyalar (takrorlash)
  9. Oyna funksiyalari
  10. Boshqa foydali funksiyalar
  11. Amaliy hisobot
  12. Xulosa

MySQL yuzlab o'rnatilgan funksiyaga ega. Bu bo'limda eng ko'p kerak bo'ladiganlarini ko'rib chiqamiz.

Matn funksiyalari #

SQL
SELECT
    CONCAT(ism, ' ', familiya)          AS toliq_ism,
    CONCAT_WS(', ', shahar, 'O''zbekiston') AS manzil,
    UPPER(ism)                          AS katta,
    LOWER(email)                        AS kichik,
    LENGTH(ism)                         AS baytlar,
    CHAR_LENGTH(ism)                    AS belgilar,
    SUBSTRING(ism, 1, 3)                AS qisqartma,
    LEFT(familiya, 1)                   AS bosh_harf,
    RIGHT(telefon, 4)                   AS oxirgi_4,
    TRIM(ism)                           AS tozalangan,
    REPLACE(telefon, '+998', '')        AS raqamsiz,
    REVERSE(ism)                        AS teskari,
    LPAD(id, 6, '0')                    AS kod,
    LOCATE('@', email)                  AS at_joyi
FROM talabalar
LIMIT 1;
FunksiyaVazifasiMisol
CONCAT(a, b)Birlashtiradi'Dil' + 'noza'
CONCAT_WS(sep, ...)Ajratgich bilan'a, b, c'
UPPER / LOWERRegistrSALOM / salom
CHAR_LENGTHBelgilar soni7
LENGTHBaytlar soniUTF-8 da farq qiladi
SUBSTRING(s, p, n)QismSUBSTRING('salom',1,3)sal
LEFT / RIGHTBoshidan/oxiridan
TRIMBo'shliqlarni olib tashlaydi
REPLACE(s, a, b)Almashtiradi
LPAD / RPADTo'ldiradiLPAD(7,3,'0')007
LOCATE(a, s)Joyini topadi
LENGTH va CHAR_LENGTH farqi
SQL
SELECT LENGTH('salom'), CHAR_LENGTH('salom');       -- 5, 5
SELECT LENGTH('o''zbek'), CHAR_LENGTH('o''zbek');   -- 7, 6

UTF-8 da o'zbekcha o' va g' belgilari bir necha bayt egallaydi. Belgilar sonini bilish uchun har doim CHAR_LENGTH ishlating.

Amaliy misollar #

SQL
-- Email dan domenni ajratish
SELECT
    email,
    SUBSTRING_INDEX(email, '@', -1)  AS domen,
    SUBSTRING_INDEX(email, '@', 1)   AS foydalanuvchi
FROM talabalar;

-- Bosh harflar (initsiallar)
SELECT
    CONCAT(LEFT(ism, 1), '.', LEFT(familiya, 1), '.') AS initsiallar
FROM talabalar;

-- Telefonni formatlash
SELECT
    CONCAT('+998 ', SUBSTRING(telefon, 5, 2), ' ',
           SUBSTRING(telefon, 7, 3), '-',
           SUBSTRING(telefon, 10, 2), '-',
           SUBSTRING(telefon, 12, 2)) AS formatli
FROM talabalar
WHERE telefon IS NOT NULL;

-- Matnni qisqartirish
SELECT
    CASE
        WHEN CHAR_LENGTH(tavsif) > 50
        THEN CONCAT(SUBSTRING(tavsif, 1, 50), '...')
        ELSE tavsif
    END AS qisqa_tavsif
FROM mahsulotlar;

Son funksiyalari #

SQL
SELECT
    ROUND(3.14159, 2)      AS yaxlitlangan,   -- 3.14
    ROUND(2.5)             AS yaxlit,         -- 3
    FLOOR(3.9)             AS pastga,         -- 3
    CEIL(3.1)              AS yuqoriga,       -- 4
    TRUNCATE(3.999, 2)     AS kesilgan,       -- 3.99
    ABS(-42)               AS modul,          -- 42
    MOD(17, 5)             AS qoldiq,         -- 2
    POWER(2, 10)           AS daraja,         -- 1024
    SQRT(144)              AS ildiz,          -- 12
    GREATEST(3, 7, 2)      AS eng_katta,      -- 7
    LEAST(3, 7, 2)         AS eng_kichik,     -- 2
    RAND()                 AS tasodifiy,
    FORMAT(1234567.891, 2) AS formatli;       -- 1,234,567.89
SQL
-- Foizni hisoblash
SELECT
    nomi,
    narx,
    ROUND(narx * 0.12)                AS qqs,
    ROUND(narx * 1.12)                AS qqs_bilan,
    ROUND(narx * 0.85)                AS chegirmali,
    FORMAT(narx, 0)                   AS chiroyli_narx
FROM mahsulotlar;

-- Ulushni hisoblash
SELECT
    shahar,
    COUNT(*)                                                     AS soni,
    ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 1)          AS foiz
FROM talabalar
GROUP BY shahar;

Sana va vaqt funksiyalari #

SQL
SELECT
    NOW()                    AS hozir,           -- 2026-09-09 15:30:00
    CURDATE()                AS bugun,           -- 2026-09-09
    CURTIME()                AS vaqt,            -- 15:30:00
    YEAR(NOW())              AS yil,
    MONTH(NOW())             AS oy,
    DAY(NOW())               AS kun,
    HOUR(NOW())              AS soat,
    DAYOFWEEK(NOW())         AS hafta_kuni,      -- 1 = yakshanba
    DAYNAME(NOW())           AS kun_nomi,
    MONTHNAME(NOW())         AS oy_nomi,
    WEEK(NOW())              AS hafta,
    QUARTER(NOW())           AS chorak,
    LAST_DAY(NOW())          AS oy_oxiri;

Sana bilan amallar #

SQL
SELECT
    DATE_ADD(NOW(), INTERVAL 7 DAY)      AS bir_hafta,
    DATE_SUB(NOW(), INTERVAL 1 MONTH)    AS oy_oldin,
    DATE_ADD(NOW(), INTERVAL 2 YEAR)     AS ikki_yil,
    DATEDIFF('2026-12-31', CURDATE())    AS qolgan_kunlar,
    TIMESTAMPDIFF(YEAR, '2004-05-15', CURDATE()) AS yosh,
    TIMESTAMPDIFF(HOUR, boshlanish, tugash)      AS davomiylik;
IntervalMisol
SECOND, MINUTE, HOURINTERVAL 30 MINUTE
DAY, WEEK, MONTHINTERVAL 3 MONTH
QUARTER, YEARINTERVAL 1 YEAR

Sanani formatlash #

SQL
SELECT
    DATE_FORMAT(NOW(), '%d.%m.%Y')            AS uz_format,   -- 09.09.2026
    DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i')      AS toliq,
    DATE_FORMAT(NOW(), '%d %M %Y')            AS matnli,
    DATE_FORMAT(NOW(), '%W')                  AS hafta_kuni,
    STR_TO_DATE('09.09.2026', '%d.%m.%Y')     AS sanaga;
KodMa'nosi
%Y / %yYil (2026 / 26)
%m / %cOy (09 / 9)
%d / %eKun (09 / 9)
%H:%i:%sSoat:daqiqa:soniya
%W / %aHafta kuni (Tuesday / Tue)
%M / %bOy nomi (September / Sep)
Hisobotlar uchun guruhlash
SQL
-- Kunlik
GROUP BY DATE(yaratilgan)

-- Oylik
GROUP BY DATE_FORMAT(yaratilgan, '%Y-%m')

-- Haftalik
GROUP BY YEARWEEK(yaratilgan)

-- Choraklik
GROUP BY YEAR(yaratilgan), QUARTER(yaratilgan)

-- Soatlik (yuklama tahlili uchun)
GROUP BY HOUR(yaratilgan)

Shartli funksiyalar #

SQL
SELECT
    ism,
    -- IF: uch argumentli shart
    IF(ortacha_baho >= 4.0, 'yaxshi', 'oddiy')          AS daraja,

    -- IFNULL: NULL ni almashtirish
    IFNULL(telefon, 'kiritilmagan')                     AS telefon,

    -- NULLIF: teng bo'lsa NULL qaytaradi
    NULLIF(ortacha_baho, 0)                             AS baho,

    -- COALESCE: birinchi NULL bo'lmagan
    COALESCE(telefon, email, 'aloqa yo''q')             AS aloqa,

    -- CASE: to'liq shart
    CASE
        WHEN ortacha_baho >= 4.5 THEN 'A''lo'
        WHEN ortacha_baho >= 3.5 THEN 'Yaxshi'
        WHEN ortacha_baho >= 3.0 THEN 'Qoniqarli'
        ELSE 'Qoniqarsiz'
    END                                                  AS harfli_baho
FROM talabalar;
NULLIF qachon foydali?

Nolga bo'lishning oldini olish uchun:

SQL
SELECT tushum / NULLIF(buyurtmalar_soni, 0) AS ortacha_chek
FROM statistika;

buyurtmalar_soni nol bo'lsa, NULLIF NULL qaytaradi va bo'lish xato bermaydi - natija NULL bo'ladi.

Agregat funksiyalar (takrorlash) #

SQL
SELECT
    COUNT(*)                            AS jami,
    COUNT(telefon)                      AS telefoni_borlar,
    COUNT(DISTINCT shahar)              AS shaharlar,
    SUM(ortacha_baho)                   AS yigindi,
    AVG(ortacha_baho)                   AS ortacha,
    MIN(ortacha_baho)                   AS eng_past,
    MAX(ortacha_baho)                   AS eng_yuqori,
    STDDEV(ortacha_baho)                AS ogish,
    GROUP_CONCAT(ism ORDER BY ism SEPARATOR ', ') AS ismlar
FROM talabalar;

Oyna funksiyalari #

MySQL 8.0 / MariaDB 10.2 dan boshlab:

SQL
SELECT
    ism,
    shahar,
    ortacha_baho,

    -- Umumiy reyting
    ROW_NUMBER() OVER (ORDER BY ortacha_baho DESC)          AS umumiy_orin,

    -- Shahar ichidagi reyting
    ROW_NUMBER() OVER (PARTITION BY shahar
                       ORDER BY ortacha_baho DESC)          AS shahar_orin,

    -- Teng qiymatlarni bir xil raqamlash
    RANK()       OVER (ORDER BY ortacha_baho DESC)          AS rank_,
    DENSE_RANK() OVER (ORDER BY ortacha_baho DESC)          AS zich_rank,

    -- Shahar bo'yicha o'rtacha (guruhlamasdan!)
    ROUND(AVG(ortacha_baho) OVER (PARTITION BY shahar), 2)  AS shahar_ortacha,

    -- Umumiy yig'indi
    SUM(ortacha_baho) OVER ()                               AS umumiy_yigindi,

    -- Oldingi va keyingi qator
    LAG(ortacha_baho)  OVER (ORDER BY ortacha_baho DESC)    AS oldingi,
    LEAD(ortacha_baho) OVER (ORDER BY ortacha_baho DESC)    AS keyingi
FROM talabalar
ORDER BY ortacha_baho DESC;
Oyna funksiyalarining kuchi

Odatiy GROUP BY qatorlarni birlashtiradi. Oyna funksiyalari esa har bir qatorni saqlab qolib, unga guruh bo'yicha hisoblangan qiymat qo'shadi.

"Har bir talabaning bahosi va uning shahri bo'yicha o'rtacha" degan savolga GROUP BY bilan javob berish uchun ichki so'rov yoki JOIN kerak edi. Oyna funksiyasi bilan - bitta qator.

SQL
-- To'plangan yig'indi (running total)
SELECT
    sana,
    summa,
    SUM(summa) OVER (ORDER BY sana) AS toplangan
FROM kunlik_savdo;

-- Oldingi kun bilan solishtirish
SELECT
    sana,
    summa,
    LAG(summa) OVER (ORDER BY sana)                         AS kecha,
    summa - LAG(summa) OVER (ORDER BY sana)                 AS farq,
    ROUND((summa - LAG(summa) OVER (ORDER BY sana)) * 100.0
          / LAG(summa) OVER (ORDER BY sana), 1)             AS foiz_ozgarish
FROM kunlik_savdo
ORDER BY sana;

Boshqa foydali funksiyalar #

SQL
-- JSON bilan ishlash
SELECT
    JSON_EXTRACT(sozlamalar, '$.til')          AS til,
    sozlamalar ->> '$.mavzu'                   AS mavzu
FROM foydalanuvchilar;

-- Xesh va shifrlash
SELECT
    MD5('parol'),
    SHA2('parol', 256),
    UUID()                                     AS noyob_id;

-- Tur o'zgartirish
SELECT
    CAST('123' AS UNSIGNED)                    AS songa,
    CAST(123 AS CHAR)                          AS matnga,
    CAST('2026-09-09' AS DATE)                 AS sanaga;

-- Tizim ma'lumotlari
SELECT DATABASE(), USER(), VERSION(), CONNECTION_ID();
Parolni MD5 bilan saqlamang
SQL
-- XAVFLI
INSERT INTO users (parol) VALUES (MD5('parol123'));

MD5 va SHA1 buzilgan algoritmlar - ularni zamonaviy kompyuterda soniyalar ichida ochish mumkin.

Parollarni bazada emas, dasturlash tilida xeshlang:

  • PHP: password_hash($parol, PASSWORD_DEFAULT)
  • Python: bcrypt yoki argon2

Bu funksiyalar "tuz" qo'shadi va ataylab sekin ishlaydi.

Amaliy hisobot #

SQL
SELECT
    DATE_FORMAT(b.yaratilgan, '%Y-%m')                    AS oy,
    DATE_FORMAT(b.yaratilgan, '%M %Y')                    AS oy_nomi,
    COUNT(DISTINCT b.id)                                  AS buyurtmalar,
    COUNT(DISTINCT b.mijoz_id)                            AS mijozlar,
    FORMAT(SUM(be.soni * be.narx), 0)                     AS tushum,
    FORMAT(AVG(be.soni * be.narx), 0)                     AS ortacha_chek,
    CONCAT(ROUND(
        SUM(be.soni * be.narx) * 100.0 /
        SUM(SUM(be.soni * be.narx)) OVER (), 1), '%')     AS ulush
FROM buyurtmalar b
JOIN buyurtma_elementlari be ON be.buyurtma_id = b.id
WHERE b.holat <> 'bekor'
  AND b.yaratilgan >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
GROUP BY oy, oy_nomi
ORDER BY oy;
Amaliy topshiriq

kutubxona bazasida:

  1. CONCAT bilan "Kitob nomi - Muallif (yil)" ustunini hosil qiling.
  2. UPPER va LEFT bilan muallif initsiallarini chiqaring.
  3. DATE_FORMAT bilan ijara sanasini dd.mm.yyyy ko'rinishida chiqaring.
  4. DATEDIFF bilan kitob necha kun ushlab turilganini hisoblang.
  5. CASE bilan kitoblarni "yangi / o'rta / eski" deb tasniflang.
  6. IFNULL bilan narx ko'rsatilmaganda "Kelishilgan" deb yozing.
  7. ROW_NUMBER() OVER (PARTITION BY janr ...) bilan har bir janrdagi eng qimmat 3 ta kitobni toping.
  8. LAG bilan yillik kitob sonini o'tgan yil bilan solishtiring.

Xulosa #

  • Matn uchun CONCAT, SUBSTRING, REPLACE, TRIM; o'zbekcha matnda CHAR_LENGTH.
  • Son uchun ROUND, FLOOR, CEIL, FORMAT.
  • Sana uchun NOW(), DATE_ADD, DATEDIFF, DATE_FORMAT.
  • Hisobotlarda GROUP BY DATE_FORMAT(sana, '%Y-%m') naqshi juda ko'p ishlatiladi.
  • Shartlar uchun IF, IFNULL, COALESCE, NULLIF va CASE.
  • Oyna funksiyalari qatorlarni saqlab qolib, guruh bo'yicha hisob qo'shadi.
  • Parollarni bazada MD5 bilan xeshlamang - dasturlash tilida bcrypt ishlating.

Keyingi bo'limda ma'lumotlar bazasini to'g'ri loyihalashni - normalizatsiyani o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.