Məzmuna keç
Educora
İrəli20 dəq16 / 22

Mətn, tarix və riyazi funksiyalar

SQLite-da mətni kəs, birləşdir və axtar, tarixlərlə hesabla və ədədləri yuvarlaqlaşdır; hər funksiyanın MySQL və PostgreSQL qarşılığını öyrən.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • SUBSTR, INSTR, REPLACE, UPPER, LENGTH ilə mətni emal etmək
  • date, strftime və julianday ilə tarixləri parçalamaq, dəyişmək və aralarındakı günləri saymaq
  • Tam ədəd bölməsini, qalığı və yuvarlaqlaşdırmanı düzgün işlətmək və funksiyaları başqa dialektlərə keçirmək

Məlumat nadir hallarda bizə lazım olan formada saxlanılır. E-poçtdan domeni ayırmaq, «A. Məmmədova» kimi qısa ad düzəltmək, ödəniş üçün son tarixi hesablamaq, qiymətə ƏDV əlavə edib yuvarlaqlaşdırmaq — bunları proqram kodunda da etmək olar, amma çox vaxt birbaşa sorğuda etmək daha sadə və sürətlidir. Bu dərsdə üç qrup funksiyanı öyrənəcəyik. Diqqət: funksiyalar SQL-in dialektlərə görə ən çox fərqlənən hissəsidir, ona görə hər birinin MySQL və PostgreSQL qarşılığını da verəcəyik.

Mətn funksiyaları

  • LENGTH(s) — simvolların sayı; UPPER(s), LOWER(s) — böyük və kiçik hərflər.
  • SUBSTR(s, başlanğıc, uzunluq) — mətnin bir hissəsi; nömrələmə 1-dən başlayır, uzunluq yazılmasa, sona qədər götürülür.
  • INSTR(s, alt) — alt mətnin ilk mövqeyi (yoxdursa, 0); REPLACE(s, köhnə, yeni) — əvəzləmə; TRIM(s) — kənar boşluqları silir.
SQL
SELECT UPPER(last_name) AS upper_name,
       LENGTH(last_name) AS len,
       SUBSTR(first_name, 1, 1) || '. ' || last_name AS short_name,
       SUBSTR(email, INSTR(email, '@') + 1) AS domain
FROM students
WHERE id IN (1, 3, 4)
ORDER BY id;
▸ Gözlənilən nəticə
upper_name | len | short_name | domain
MəMMəDOVA | 9 | A. Məmmədova | example.com
HüSEYNOVA | 9 | L. Hüseynova | example.com
QULIYEV | 7 | E. Quliyev | NULL
Elvinin e-poçtu yoxdur: NULL üzərindəki istənilən funksiya yenə NULL verir.

Tarix funksiyaları

SQLite-da ayrıca tarix tipi yoxdur: tarixlər YYYY-MM-DD formatında mətn kimi saxlanılır. strftime(format, tarix) tarixin hissələrini çıxarır (%Y — il, %m — ay, %w — həftənin günü, 0 = bazar), date(tarix, dəyişdirici...) isə tarixi sürüşdürür: '+30 days', '-1 month', 'start of month'.

SQL
SELECT id, order_date,
       strftime('%Y', order_date) AS year,
       strftime('%m', order_date) AS month,
       strftime('%w', order_date) AS weekday,
       date(order_date, '+30 days') AS pay_until
FROM orders
WHERE id <= 4
ORDER BY id;
▸ Gözlənilən nəticə
id | order_date | year | month | weekday | pay_until
1 | 2025-01-15 | 2025 | 01 | 3 | 2025-02-14
2 | 2025-01-15 | 2025 | 01 | 3 | 2025-02-14
3 | 2025-02-02 | 2025 | 02 | 0 | 2025-03-04
4 | 2025-02-10 | 2025 | 02 | 1 | 2025-03-12

İki tarix arasındakı günləri saymaq üçün onları julianday ilə ədədə — müəyyən başlanğıcdan keçən günlərin sayına çeviririk və çıxırıq. Aşağıda hər müştərinin qeydiyyatdan ilk sifarişinə qədər neçə gün gözlədiyini tapırıq.

SQL
SELECT c.name, c.joined_on,
       MIN(o.order_date) AS first_order,
       CAST(julianday(MIN(o.order_date)) - julianday(c.joined_on) AS INTEGER)
         AS days_to_first_order
FROM customers AS c
JOIN orders AS o ON o.customer_id = c.id
GROUP BY c.id, c.name, c.joined_on
ORDER BY days_to_first_order, c.name;
▸ Gözlənilən nəticə
name | joined_on | first_order | days_to_first_order
Zəhra Hüseynli | 2025-02-14 | 2025-04-09 | 54
Mehmet Kaya | 2025-04-01 | 2025-06-12 | 72
John Carter | 2024-08-30 | 2025-03-18 | 200
Olga Ivanova | 2024-06-18 | 2025-03-05 | 260
Emre Yılmaz | 2024-05-05 | 2025-02-10 | 281
Lalə Əhmədova | 2024-03-22 | 2025-02-02 | 317
Anar Mustafayev | 2024-01-10 | 2025-01-15 | 371

Riyazi funksiyalar və yuvarlaqlaşdırma

İki tam ədədin bölməsi SQLite, PostgreSQL və SQL Server-də yenə tam ədəddir: 7 / 2 = 3, % isə qalığı verir. Bu, qablaşdırma kimi məsələlərdə faydalıdır: 500 dəftəri 24-lük qutulara yığsaq, 20 tam qutu olur və 20 dəftər artıq qalır. Qiymətə 18% ƏDV əlavə edəndə nəticəni ROUND(x, 2) ilə qəpiyə qədər yuvarlaqlaşdırırıq.

SQL
SELECT name, stock,
       stock / 24 AS full_boxes,
       stock % 24 AS left_over,
       ROUND(price * 1.18, 2) AS price_with_vat
FROM products
WHERE category IN ('Stationery', 'Accessories')
ORDER BY id;
▸ Gözlənilən nəticə
name | stock | full_boxes | left_over | price_with_vat
Notebook | 500 | 20 | 20 | 3.78
Pen set | 300 | 12 | 12 | 9.32
Backpack | 60 | 2 | 12 | 64.9
Water bottle | 120 | 5 | 0 | 14.16
SQL
SELECT 7 / 2               AS int_div,
       7 / 2.0             AS real_div,
       ROUND(2.5)          AS half_up,
       ROUND(-2.5)         AS half_down,
       CAST(-12.9 AS INTEGER) AS truncated;
▸ Gözlənilən nəticə
int_div | real_div | half_up | half_down | truncated
3 | 3.5 | 3 | -3 | -12
ROUND yarımları sıfırdan uzağa yuvarlaqlaşdırır, CAST(... AS INTEGER) isə kəsr hissəni sadəcə atır.

SQRT, POWER, FLOOR, CEIL, LN kimi riyazi funksiyalar PostgreSQL və MySQL-də həmişə var. SQLite-a onlar 3.35 versiyasında əlavə olunub, amma yalnız xüsusi seçimlə yığılmış proqramlarda mövcuddur, ona görə SQLite üçün yazılan portativ sorğularda ROUND, ABS, CAST və % ilə kifayətlənmək daha etibarlıdır.

Dialektlər arasında «lüğət»

Nə edirikSQLiteMySQLPostgreSQL
Simvolların sayıLENGTH(s)CHAR_LENGTH(s)LENGTH(s)
Mətnin hissəsiSUBSTR(s, 2, 3)SUBSTRING(s, 2, 3)SUBSTRING(s FROM 2 FOR 3)
Alt mətnin yeriINSTR(s, '@')LOCATE('@', s)POSITION('@' IN s)
Birləşdirməa || bCONCAT(a, b)a || b
Tarixin ilistrftime('%Y', d)YEAR(d)EXTRACT(YEAR FROM d)
30 gün əlavə etdate(d, '+30 days')DATE_ADD(d, INTERVAL 30 DAY)d + INTERVAL '30 days'
Tarixlər arasında günlərjulianday(b) - julianday(a)DATEDIFF(b, a)b - a
Ayın başlanğıcıdate(d, 'start of month')DATE_FORMAT(d, '%Y-%m-01')date_trunc('month', d)
Bu günün tarixidate('now')CURDATE()CURRENT_DATE
MySQL-də LENGTH simvolları yox, baytları sayır: LENGTH('ə') 2 verir. PostgreSQL-də b - a yalnız DATE tipli sütunlar üçün gün sayı qaytarır.
Tapşırıq

E-poçtu olan hər şagird üçün e-poçtun @ işarəsindən əvvəlki hissəsini (login) və adını (first_name) göstər. Nəticəni login-ə görə düz.

Tapşırıq · SQL
SELECT email, first_name
FROM students
WHERE email IS NOT NULL
ORDER BY email;
▸ Gözlənilən nəticə
login | first_name
aysel | Aysel
fidan | Fidan
gunay | Günay
kamran | Kamran
leyla | Leyla
murad | Murad
nigar | Nigar
orxan | Orxan
rashad | Rəşad
sabina | Səbinə
Tapşırıq

Hər ay üçün (month, məsələn, 2025-02) sifarişlərin sayını (orders) və həmin ayın son gününü (month_end) göstər. Nəticəni aya görə düz.

Tapşırıq · SQL
SELECT SUBSTR(order_date, 1, 7) AS month,
       COUNT(*) AS orders
       -- add month_end
FROM orders
GROUP BY month
ORDER BY month;
▸ Gözlənilən nəticə
month | orders | month_end
2025-01 | 2 | 2025-01-31
2025-02 | 2 | 2025-02-28
2025-03 | 2 | 2025-03-31
2025-04 | 2 | 2025-04-30
2025-05 | 1 | 2025-05-31
2025-06 | 2 | 2025-06-30
2025-07 | 1 | 2025-07-31

Əsas fikirlər

  • SUBSTR, INSTR, REPLACE, TRIM, || mətni kəsir, axtarır və birləşdirir; SQLite-da mövqelər 1-dən sayılır.
  • SQLite-ın UPPER/LOWER funksiyaları yalnız A–Z hərflərini dəyişir; MySQL-də LENGTH baytları sayır.
  • strftime tarixi hissələrə ayırır, date(d, '+30 days') sürüşdürür, julianday fərqi günləri sayır.
  • Tam ədədlərin bölməsi tam ədəddir (7 / 2 = 3), % qalığı verir, ROUND(x, 2) qəpiyə qədər yuvarlaqlaşdırır.
  • Funksiyalar dialektlərdə ən çox fərqlənən hissədir — başqa VBİS-ə keçəndə qarşılıq cədvəlini yoxla.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
SUBSTR('Bakı', 2, 2) nə qaytarır?