CodeGym /Kurslar /SQL SELF /PostgreSQL-də massivlərlə işləmək

PostgreSQL-də massivlərlə işləmək

SQL SELF
Səviyyə , Dərs
Mövcuddur

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

  1. 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;
  1. 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.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION