0Pricing
SQL Academy · درس

البحث داخل المصفوفات

معاملات ANY والاحتواء والتداخل

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

تخزّن المصفوفات قيمًا متعددة

يحتوي عمود المصفوفة في PostgreSQL على قيم متعددة داخل خلية واحدة. وقبل أن تتمكنوا من البحث داخل المصفوفات، من المفيد أن تروا شكلها.

ينشئ الاستعلام أدناه جدولًا يمكن أن ينتمي فيه كل منتج إلى عدة فئات مخزنة في صورة مصفوفة نصية.

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

INSERT INTO products (name, tags) VALUES
  ('Laptop',     ARRAY['electronics', 'computers', 'sale']),
  ('T-Shirt',    ARRAY['clothing', 'summer', 'sale']),
  ('Coffee Mug', ARRAY['kitchen', 'gifts']),
  ('Headphones', ARRAY['electronics', 'audio']),
  ('Notebook',   ARRAY['stationery', 'office']);

التحقق من العضوية باستخدام ANY

يتيح لكم العامل ANY اختبار ما إذا كانت قيمة ما تظهر في أي موضع من المصفوفة. والصياغة هي: value = ANY(array_column).

يعثر هذا الاستعلام على كل منتج يحمل الوسم electronics.

SELECT name, tags
FROM products
WHERE 'electronics' = ANY(tags);

لا يقتصر ANY على النصوص

يعمل ANY مع أي نوع بيانات يدعم المساواة. إليكم جدولًا للدرجات المخزنة في صورة مصفوفات من الأعداد الصحيحة. يسترجع الاستعلام الطلاب الذين حصلوا على الدرجة الكاملة 100 في اختبار واحد على الأقل.

CREATE TABLE students (
  student TEXT,
  scores  INT[]
);

INSERT INTO students VALUES
  ('Alice', ARRAY[88, 95, 100]),
  ('Bob',   ARRAY[70, 80, 90]),
  ('Carol', ARRAY[100, 100, 99]);

SELECT student, scores
FROM students
WHERE 100 = ANY(scores);

استبعاد الصفوف باستخدام NOT + ANY

للعثور على الصفوف التي لا تظهر فيها قيمة ما داخل المصفوفة، ادمجوا NOT مع ANY. لاحظوا أن value <> ANY(arr) له معنى مختلف — إذ يعيد القيمة true إذا اختلف أي عنصر، وهذا صحيح في معظم الحالات.

استخدموا NOT (value = ANY(arr)) لإجراء تحقق موثوق من الاستبعاد.

-- Find products that are NOT tagged as 'sale'
SELECT name, tags
FROM products
WHERE NOT ('sale' = ANY(tags));

عامل الاحتواء @>

يتحقق العامل @> مما إذا كانت إحدى المصفوفات تحتوي على جميع عناصر مصفوفة أخرى. فكّروا فيه بهذه الصيغة: هل تتضمن المصفوفة اليسرى كل عنصر مذكور في اليمين؟

يعثر هذا الاستعلام على المنتجات التي تحمل كلاً من الوسم electronics والوسم sale.

SELECT name, tags
FROM products
WHERE tags @> ARRAY['electronics', 'sale'];

عامل الاحتواء العكسي <@

العامل <@ هو عكس العامل @>. ويتحقق مما إذا كانت المصفوفة اليسرى محتواة بالكامل داخل المصفوفة اليمنى.

يعثر هذا الاستعلام على المنتجات التي تمثل قائمة وسومها بالكامل مجموعة جزئية من المجموعة electronics, computers, sale.

SELECT name, tags
FROM products
WHERE tags <@ ARRAY['electronics', 'computers', 'sale'];

عامل التداخل &&

يعيد العامل && القيمة true عندما تشترك مصفوفتان في عنصر مشترك واحد على الأقل. وهو المكافئ الخاص بالمصفوفات للسؤال: هل يوجد أي شيء مشترك بين هاتين القائمتين؟

يعثر الاستعلام أدناه على المنتجات التي تشترك في وسم واحد على الأقل مع قائمة تسوق محددة.

SELECT name, tags
FROM products
WHERE tags && ARRAY['audio', 'summer', 'gifts'];

التداخل مقابل الاحتواء — الفرق الأساسي

من السهل الخلط بين @> و&&. إليكم مقارنة واضحة:

  • tags @> ARRAY['a','b'] — يجب أن يحتوي الصف على كلٍّ من 'a' و'b'.
  • tags && ARRAY['a','b'] — يكفي أن يحتوي الصف على 'a' أو 'b' واحد على الأقل.
-- Contains: must have BOTH 'electronics' AND 'sale'
SELECT name FROM products WHERE tags @> ARRAY['electronics', 'sale'];

-- Overlap: must have AT LEAST ONE of 'electronics' or 'sale'
SELECT name FROM products WHERE tags && ARRAY['electronics', 'sale'];

استخدام array_length للتصفية حسب الحجم

قد ترغبون أحيانًا في العثور على الصفوف التي تحتوي المصفوفة فيها على عدد محدد من العناصر. تعيد array_length(arr, 1) عدد العناصر في البعد الأول.

يعثر هذا الاستعلام على المنتجات التي تحتوي على ثلاثة وسوم بالضبط.

SELECT name, tags
FROM products
WHERE array_length(tags, 1) = 3;

دمج عمليات البحث في المصفوفات مع شروط أخرى

تعمل عوامل المصفوفات إلى جانب شروط SQL العادية. ويمكنكم دمجها مع AND وOR وأي مسندات أخرى في عبارة WHERE لإنشاء عوامل تصفية دقيقة.

-- Products tagged 'sale' AND whose name starts with a letter before 'N'
SELECT name, tags
FROM products
WHERE 'sale' = ANY(tags)
  AND name < 'N'
ORDER BY name;

فهرسة المصفوفات لتسريع البحث

قد تكون عمليات البحث في المصفوفات بطيئة في الجداول الكبيرة من دون فهرس. وقد صُمم فهرس PostgreSQL من نوع GIN (Generalized Inverted Index) لأعمدة المصفوفات، ويدعم العوامل @> و<@ و&& بكفاءة.

لا يستخدم ANY فهرس GIN مباشرةً، لكن عاملي التداخل والاحتواء يستخدمانه.

-- Create a GIN index on the tags array column
CREATE INDEX idx_products_tags ON products USING GIN (tags);

-- This query can now use the index
SELECT name FROM products WHERE tags @> ARRAY['electronics'];

تحقق سريع: عوامل المصفوفات

اختبروا مدى فهمكم لعوامل البحث في مصفوفات PostgreSQL.

مراجعة الدرس

في هذا الدرس تعلمتم ثلاث طرق أساسية للبحث داخل مصفوفات PostgreSQL:

  • = ANY(arr) — يتحقق مما إذا كانت قيمة واحدة موجودة في أي موضع من المصفوفة.
  • @> (الاحتواء) — يتحقق من أن المصفوفة تتضمن جميع العناصر المحددة.
  • && (التداخل) — يتحقق من أن المصفوفة تشترك في عنصر واحد على الأقل مع مصفوفة أخرى.

رأيتم أيضًا <@ للتحقق من الاحتواء العكسي، وarray_length للتصفية حسب الحجم، وفهرس GIN لتسريع عمليات البحث في المصفوفات ضمن مجموعات البيانات الكبيرة. ويمنحكم دمج هذه العوامل مع شروط WHERE القياسية تحكمًا دقيقًا ومرنًا في البيانات متعددة القيم.

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

هل درس «البحث داخل المصفوفات» مجاني؟

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

ماذا ستتعلم في «البحث داخل المصفوفات»؟

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

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

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

كم من الوقت يستغرق درس «البحث داخل المصفوفات»؟

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

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

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

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

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