0Pricing
SQL Academy · درس

UNNEST والتجميع

حوّل المصفوفات إلى صفوف والعكس

UNNEST والتجميع درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

ما هي UNNEST؟

يتيح لكم PostgreSQL تخزين المصفوفات داخل عمود واحد. لكنكم قد تحتاجون أحيانًا إلى التعامل مع كل عنصر على حدة — وهنا يأتي دور UNNEST.

UNNEST دالة تعيد مجموعة من الصفوف، إذ توسّع المصفوفة إلى مجموعة من الصفوف بمعدل صف واحد لكل عنصر. فكّروا فيها باعتبارها عكس التجميع: فبدلًا من دمج صفوف متعددة في صف واحد، تفكك قيمة واحدة إلى صفوف متعددة.

مثال أساسي على UNNEST

أبسط استخدام لـ UNNEST هو تمرير قيمة مصفوفة حرفية مباشرةً. يتحول كل عنصر إلى صف مستقل في مجموعة النتائج.

نوسّع هنا مصفوفة عادية من الأعداد الصحيحة إلى صفوف منفردة:

SELECT UNNEST(ARRAY[10, 20, 30, 40]) AS value;

UNNEST مع المصفوفات النصية

يعمل UNNEST مع أي نوع من المصفوفات، بما في ذلك النصوص. ويفيد ذلك عندما يكون لديكم عمود يخزن وسومًا أو فئات أو بيانات شبيهة بالبيانات المفصولة بفواصل، ولكنها مشفرة في صورة مصفوفة PostgreSQL.

SELECT UNNEST(ARRAY['apple', 'banana', 'cherry']) AS fruit;

استخدام UNNEST مع عمود من جدول

تظهر القوة الحقيقية لـ UNNEST عند استخدامه مع عمود فعلي في جدول. إذ يمكن أن تحتوي كل من صفوف الجدول على مصفوفة بطول مختلف، وسيعمل UNNEST على توسيعها جميعًا إلى صفوف منفردة.

في هذا المثال، يحتوي جدول products على عمود مصفوفة نصية باسم tags:

CREATE TABLE products (
  id   SERIAL PRIMARY KEY,
  name TEXT,
  tags TEXT[]
);

INSERT INTO products (name, tags) VALUES
  ('Laptop',  ARRAY['electronics', 'computing', 'portable']),
  ('Shirt',   ARRAY['clothing', 'casual']),
  ('Blender', ARRAY['kitchen', 'electronics']);

SELECT name, UNNEST(tags) AS tag
FROM products;

عدّ مرات ظهور الوسوم

بعد توسيع عمود مصفوفة، يمكنكم التعامل مع النتائج مثل أي صفوف أخرى وتطبيق الدوال التجميعية عليها. نعدّ هنا عدد المنتجات المرتبطة بكل وسم.

النمط هو: استخدام UNNEST في استعلام فرعي أو CTE، ثم GROUP BY للقيمة الموسّعة:

SELECT tag, COUNT(*) AS product_count
FROM (
  SELECT UNNEST(tags) AS tag
  FROM products
) AS expanded
GROUP BY tag
ORDER BY product_count DESC;

UNNEST مع الترتيب

تكون مواضع العناصر داخل المصفوفة مهمة أحيانًا. يوفر PostgreSQL عبارة WITH ORDINALITY لإرفاق رقم صف بكل عنصر موسّع، حتى تعرفوا فهرسه الأصلي في المصفوفة (بدءًا من 1).

SELECT val, pos
FROM UNNEST(ARRAY['first', 'second', 'third']) WITH ORDINALITY AS t(val, pos);

استخدام الترتيب مع جدول

تكون عبارة WITH ORDINALITY مفيدة بشكل خاص عند تخزين قوائم مرتبة في مصفوفة. ومن الأمثلة على ذلك جدول قائمة تشغيل يكون ترتيب المقاطع فيه مهمًا:

CREATE TABLE playlists (
  id     SERIAL PRIMARY KEY,
  title  TEXT,
  tracks TEXT[]
);

INSERT INTO playlists (title, tracks) VALUES
  ('Morning Mix', ARRAY['Song A', 'Song B', 'Song C']);

SELECT p.title, track, position
FROM playlists p,
     UNNEST(p.tracks) WITH ORDINALITY AS t(track, position)
ORDER BY p.id, position;

التصفية بعد UNNEST

بما أن UNNEST يحوّل عناصر المصفوفة إلى صفوف، يمكنكم تصفيتها باستخدام عبارة WHERE عادية. ويتيح لكم ذلك العثور على جميع الصفوف التي تحتوي مصفوفتها على قيمة محددة من دون استخدام عامل احتواء المصفوفات.

SELECT DISTINCT name
FROM products,
     UNNEST(tags) AS tag
WHERE tag = 'electronics';

إعادة التجميع في مصفوفة

عكس UNNEST هو ARRAY_AGG. فبعد توسيع الصفوف وتحويلها أو تصفيتها، يمكنكم جمع النتائج مرة أخرى في مصفوفة. ويُعد هذا النمط التكراري — التوسيع، ثم المعالجة، ثم إعادة التجميع — أسلوبًا شائعًا في PostgreSQL.

SELECT ARRAY_AGG(tag ORDER BY tag) AS sorted_tags
FROM (
  SELECT UNNEST(ARRAY['cherry', 'apple', 'banana']) AS tag
) AS t;

إزالة العناصر المكررة من المصفوفة

من الاستخدامات العملية للدورة الكاملة بين تفكيك المصفوفة وتجميعها إزالة العناصر المكررة منها. استخدم UNNEST للمصفوفة، وطبّق DISTINCT، ثم أعد تجميع العناصر باستخدام ARRAY_AGG:

SELECT ARRAY_AGG(DISTINCT tag ORDER BY tag) AS unique_tags
FROM UNNEST(ARRAY['sql', 'database', 'sql', 'postgresql', 'database']) AS tag;

دمج أعمدة مصفوفات متعددة

يمكنك استخدام UNNEST على عدة مصفوفات بالتوازي في جملة FROM. يطابق PostgreSQL العناصر حسب مواضعها. وإذا كانت أطوال المصفوفات مختلفة، فإن المصفوفة الأقصر تنتج قيم NULL للمواضع الإضافية في المصفوفة الأطول.

SELECT key, value
FROM UNNEST(
  ARRAY['name',    'city',      'role'],
  ARRAY['Alice',   'Istanbul',  'DBA']
) AS t(key, value);

اختبار المعرفة

اختبر مدى فهمك لاستخدام UNNEST وتجميع المصفوفات في PostgreSQL.

مراجعة الدرس

تعلمت في هذا الدرس كيفية تحويل المصفوفات إلى صفوف ثم إعادتها إلى مصفوفات باستخدام الدوال المضمّنة في PostgreSQL:

  • UNNEST — يوسّع المصفوفة إلى صف واحد لكل عنصر، ويعمل مع القيم الحرفية وأعمدة الجداول على حد سواء.
  • WITH ORDINALITY — يضيف فهرسًا موضعيًا إلى كل عنصر بعد تفكيك المصفوفة، بحيث تعرف ترتيبه الأصلي فيها.
  • Filtering — بعد تفكيك المصفوفة، يمكنك استخدام WHERE كما تفعل مع أي صفوف عادية.
  • ARRAY_AGG — عكس UNNEST؛ يجمع الصفوف مجددًا في مصفوفة، مع إمكانية استخدام ORDER BY أو DISTINCT.
  • Parallel UNNEST — تُوسَّع عدة مصفوفات في جملة FROM جنبًا إلى جنب، وتُطابق عناصرها حسب الموضع.

يتيح لك إتقان نمط تفكيك المصفوفة ومعالجة عناصرها ثم إعادة تجميعها التعامل مع بيانات المصفوفات بالقدرة التعبيرية الكاملة للغة SQL.

الأسئلة الشائعة

هل درس «UNNEST والتجميع» مجاني؟

نعم — نص درس «UNNEST والتجميع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «UNNEST والتجميع»؟

حوّل المصفوفات إلى صفوف والعكس تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «UNNEST والتجميع»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات أعمدة المصفوفات
  2. البحث داخل المصفوفات
  3. UNNEST والتجميع
  4. المصفوفات مقابل الجداول المطَبَّعة
← العودة إلى SQL Academy