PostgreSQL-də massivlərlə işləmək
Artıq əsasları bildiyimizə görə, gəlin SQL-sorğularda massivlərin praktik yaradılmasına daha dərindən baxaq. Ən maraqlı hissə buradan başlayır!
ARRAY[] konstruktorundan SELECT-də istifadə
ARRAY[] konstruktoru xüsusilə SELECT sorğularında massiv yaratmaq lazım olanda çox rahatdır. Bu, sanki PostgreSQL-ə deyirsən: “Ay PostgreSQL, bax bu massivdir!”
-- Rəqəmlər massivinin yaradılması
SELECT ARRAY[1, 2, 3, 4, 5] AS numbers;
-- Sətirlər massivinin yaradılması
SELECT ARRAY['Bazar ertəsi', 'Çərşənbə axşamı', 'Çərşənbə'] AS weekdays;
ARRAY[]-in {} sintaksisindən üstünlükləri
- Aydın tip çevrilməsi:
-- ARRAY[] ilə tipi açıq şəkildə göstərə bilərsən
SELECT ARRAY['2023-01-01'::DATE, '2023-12-31'::DATE] AS dates;
-- {} ilə ehtiyatlı olmaq lazımdır
SELECT '{"2023-01-01", "2023-12-31"}'::DATE[] AS dates;
- Daha oxunaqlı mürəkkəb sorğularda:
SELECT
product_name,
ARRAY[category, subcategory, brand] AS product_hierarchy
FROM products;
Nümunə: rəqəmlər massivinin yaradılması
Gəlin klassikadan başlayaq. Tutaq ki, sənə rəqəmlərdən ibarət massiv lazımdır:
SELECT ARRAY[1, 2, 3, 4, 5] AS my_array;
Nəticə belə olacaq:
| my_array |
|---|
| {1,2,3,4,5} |
Diqqət et: PostgreSQL massivləri {} formatında qaytarır — bu sadəcə onun massiv göstərmə tərzidir. Stil spesifikdir, amma tez öyrəşirsən.
Nümunə: sətirlər massivinin yaradılması
Əgər rəqəmlər əvəzinə sətirlər lazımdırsa, sadəcə dırnaq əlavə et:
SELECT ARRAY['alma', 'banan', 'portağal'] AS fruits;
Nəticə:
| fruits |
|---|
| {alma, banan, portağal} |
Yeri gəlmişkən, PostgreSQL həyatı asanlaşdırmağı çox sevir. Hətta kiril əlifbası və ya başqa əlifba istifadə etsən də, massivlər problemsiz işləyəcək.
Nümunə: digər tiplərlə massivlər (məsələn, tarixlər)
Bəs tarixlərdən ibarət massiv yaratmaq istəsək? Çox asandır:
SELECT ARRAY['2023-01-01'::DATE, '2023-12-31'::DATE] AS important_dates;
Nəticə:
| important_dates |
|---|
| {2023-01-01, 2023-12-31} |
::DATE-yə fikir ver. Biz PostgreSQL-ə açıq şəkildə dedik ki, bu DATE tipidir. Onsuz o, sətirləri olduğu kimi götürə bilərdi və bu, tarixlər üçün tam düzgün olmazdı.
array_agg() ilə massivlərə aqreqasiya
İndi isə daha çətin və maraqlı hissəyə keçirik. Tutaq ki, artıq cədvəldə məlumatlar var və onları massivə qruplaşdırmaq lazımdır? Burada köməyə array_agg() funksiyası gəlir.
Ən güclü imkanlardan biri — bir çox sətri array_agg() ilə massivə çevirməkdir.
Əsas istifadə qaydası:
-- Test cədvəli yaradaq
CREATE TEMP TABLE students (
group_id INTEGER,
student_name TEXT
);
INSERT INTO students VALUES
(1, 'Anna'), (1, 'Otto'), (1, 'Mariya'),
(2, 'Aleks'), (2, 'Kira'),
(3, 'Yelena');
-- Tələbələri qruplara görə qruplaşdırırıq
SELECT
group_id,
array_agg(student_name) AS students
FROM students
GROUP BY group_id
ORDER BY group_id;
Massivdə elementlərin sıralanması:
SELECT
group_id,
array_agg(student_name ORDER BY student_name) AS students_sorted
FROM students
GROUP BY group_id;
Aqreqasiya zamanı filtrasiya:
SELECT
group_id,
array_agg(student_name) FILTER (WHERE student_name LIKE 'A%') AS students_a
FROM students
GROUP BY group_id;
Praktiki istifadə nümunələri
Massivlər gündəlik bir çox ssenaridə faydalıdır: tag-ların, icazələrin saxlanmasından tutmuş istifadəçinin gün ərzində etdiyi hərəkətlərin toplanmasına qədər. Aşağıda massivlərin PostgreSQL-də necə və harada istifadə olunduğunu daha yaxşı başa düşmək üçün nümunələr var.
Nümunə 1: Blog üçün tag sistemi
CREATE TABLE blog_posts (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
content TEXT,
tags TEXT[]
);
-- Müxtəlif sintaksislərlə insert
INSERT INTO blog_posts (title, content, tags) VALUES
('PostgreSQL öyrənirik', 'Məqalənin məzmunu...',
ARRAY['PostgreSQL', 'SQL', 'Verilənlər bazası']),
('2024-də veb inkişafı', 'Məqalənin məzmunu...',
'{"JavaScript", "React", "Node.js"}'),
('Maşın öyrənməsi', 'Məqalənin məzmunu...',
ARRAY['ML', 'Python', 'Data Science']);
-- Tag-lara görə məqalə axtarışı
SELECT title FROM blog_posts
WHERE 'PostgreSQL' = ANY(tags);
Nümunə 2: İstifadəçi icazə sistemi
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username TEXT NOT NULL,
permissions TEXT[]
);
INSERT INTO users (username, permissions) VALUES
('admin', ARRAY['read', 'write', 'delete', 'manage_users']),
('editor', ARRAY['read', 'write']),
('viewer', ARRAY['read']);
-- Sistemdə bütün unikal icazələrin aqreqasiyası
SELECT array_agg(DISTINCT permission) AS all_permissions
FROM users, unnest(permissions) AS permission;
Nümunə 3: İstifadəçi fəaliyyət tarixçəsi
CREATE TABLE user_actions (
user_id INTEGER,
action TEXT,
action_date DATE
);
INSERT INTO user_actions VALUES
(1, 'login', '2024-01-01'),
(1, 'view_profile', '2024-01-01'),
(1, 'edit_settings', '2024-01-01'),
(2, 'login', '2024-01-01'),
(2, 'logout', '2024-01-01');
-- İstifadəçi hərəkətlərini günlərə görə qruplaşdırırıq
SELECT
user_id,
action_date,
array_agg(action ORDER BY action) AS daily_actions
FROM user_actions
GROUP BY user_id, action_date
ORDER BY user_id, action_date;
4. Massivlərlə sorğular: seçmə və filtrasiya
Artıq massivlərimiz varsa, onları çıxarmağı və analiz etməyi bacarmalıyıq. Standart SELECT ilə massiv əldə edə bilərsən:
SELECT tags FROM articles WHERE id = 1;
Bu, belə qaytaracaq:
| tags |
|---|
| {SQL,PostgreSQL,Verilənlər bazaları} |
Bəs müəyyən bir tag olan məqaləni tapmaq lazımdırsa, məsələn PostgreSQL? Bu mövzuya növbəti mühazirədə ətraflı baxacağıq, amma ideya sadədir: massivlər bizə çeviklik verir və massivlərin içində dəyərləri axtarmağa imkan yaradır.
GO TO FULL VERSION