بنناجح
المرحلة 2 · اختيار الداتا وفلترتها الدرس 1 من 5

SELECT و WHERE

أول أمرين هتكتبهم في أي كويري، وآخر أمرين هتبطّل تستخدمهم. SELECT بيختار الأعمدة، و WHERE بيختار الصفوف. هنشوفهم بالترتيب اللي PostgreSQL بينفذهم بيه فعلاً، وبأمثلة بتشتغل قدامك.

في الدرس ده هتتعلم
  • تكتب SELECT لأعمدة معينة، أو كل الأعمدة بـ *، وتعرف إمتى * غلط
  • تسمّي الأعمدة بـ AS وتعمل حسبة جوه الـ SELECT
  • تفلتر الصفوف بـ WHERE بالمقارنات و AND و OR و IN و BETWEEN و LIKE
  • تفهم ليه WHERE بيتنفذ قبل SELECT، وده بيأثر على كتابتك إزاي

SELECT بتعمل إيه؟

SELECT هو الأمر اللي بتجيب بيه داتا من جدول أو أكتر، وبيرجعهالك على شكل جدول جديد: صفوف وأعمدة.

  • بيجيب أعمدة معينة بالاسم، أو كل الأعمدة بـ *.
  • بيتكتب معاه WHERE علشان تختار صفوف معينة بس.
  • ومعاه بعدين ORDER BY و GROUP BY و JOIN، وكل واحد ليه درس لوحده.

قبل أي كلام، اتفرّج على المحاكي ده وهو شغال لوحده. وبعدين اختار أعمدة وشرط بإيدك وشوف الكويري بتتنفذ خطوة خطوة:

محاكي SELECT و WHERE
SELECT *
FROM products;
  1. 1 FROM هات الجدول
  2. 2 WHERE شيل الصفوف
  3. 3 SELECT اختار الأعمدة
products الجدول الأصلي
النتيجة

…

SELECT
WHERE

الـ Syntax

SELECT column1, column2, ...
FROM table_name
WHERE condition;
  • column1, column2: الأعمدة اللي عايزها في النتيجة، وبينهم فاصلة.
  • table_name: الجدول اللي هتجيب منه.
  • condition: الشرط. أي صف الشرط عليه صح بيفضل، وأي صف عليه غلط (أو مش معروف) بيتشال.
  • WHERE اختيارية. من غيرها بترجع كل الصفوف.
  • الـ ; في الآخر بتقول إن الكويري خلصت.

الجدول اللي هنشتغل عليه

كل الأمثلة على جدول products في داتابيز الكورس: 18 لابتوب. الكويري دي اتشغلت لوحدها أول ما وصلت هنا، وده PostgreSQL حقيقي جوه صفحتك:

جدول products
SELECT * FROM products;

مثال 1: هات أعمدة معينة

عايز اسم وسعر كل لابتوب بس، من غير باقي التفاصيل.

مثال 1
SELECT name, price FROM products;

الشرح: النتيجة فيها 18 صف (كل المنتجات) بس عمودين. SELECT غيّر عدد الأعمدة بس، ماغيّرش عدد الصفوف. والأعمدة بتطلع بنفس الترتيب اللي كتبته، فلو كتبت price, name السعر هيطلع الأول.

مثال 2: هات كل الأعمدة

النجمة * معناها “كل الأعمدة، بالترتيب اللي اتعمل بيه الجدول”.

مثال 2
SELECT * FROM products;

مثال 3: سمّي العمود باسم تاني بـ AS

اسم العمود في النتيجة ممكن تغيّره بـ AS. ده اسمه Alias.

مثال 3
SELECT name AS laptop, price AS price_egp FROM products;

الشرح: الـ Alias بيغيّر اسم العمود في النتيجة بس. الجدول نفسه مااتغيرش، وعمود name لسه اسمه name.

مثال 4: اعمل حسبة جوه SELECT

SELECT مش بس بيختار أعمدة، ده بيحسب كمان. هنا السعر بعد ضريبة 14%:

مثال 4
SELECT name, price, price * 1.14 AS with_vat FROM products;

الشرح: with_vat عمود جديد اتحسب لكل صف لوحده، ومش موجود في الجدول. وبص على Lenovo Yoga Slim 7: سعره NULL (مش معروف)، فالسعر بعد الضريبة طلع NULL برضه. أي حسبة فيها NULL نتيجتها NULL.

مثال 5: شيل التكرار بـ DISTINCT

عايز تعرف المعالجات المختلفة اللي عندك، من غير ما المعالج يتكرر.

مثال 5
SELECT DISTINCT cpu FROM products;

الشرح: عندنا 18 منتج، بس عدد المعالجات المختلفة أقل. DISTINCT بيشيل الصفوف المتكررة من النتيجة. ولو كتبت أكتر من عمود (DISTINCT cpu, ram_gb) هيشيل التكرار للمجموعة كلها مع بعض، مش لكل عمود لوحده.

WHERE: فلتر الصفوف

لحد دلوقتي كنا بنختار أعمدة. WHERE بيختار صفوف: بيختبر الشرط على كل صف، واللي يعدّي بيفضل.

مثال 6: قارن برقم

اللابتوبات اللي سعرها أكبر من 50,000:

مثال 6
SELECT name, price FROM products WHERE price > 50000;

الشرح: عوامل المقارنة: = و <> (مش بيساوي) و > و < و >= و <=. ولاحظ إن Lenovo Yoga Slim 7 مش في النتيجة. سعره NULL، والسؤال “هل NULL أكبر من 50000؟” إجابته مش معروف، فالصف اتشال. درس الـ NULL الجاي كله عن الحتة دي.

مثال 7: قارن بنص

اللابتوبات اللي معالجها Apple M3 بالظبط:

مثال 7
SELECT name, cpu FROM products WHERE cpu = 'Apple M3';

مثال 8: شرطين مع بعض بـ AND و OR

لابتوبات رامتها 16 وسعرها أقل من 50,000:

مثال 8
SELECT name, ram_gb, price FROM products WHERE ram_gb = 16 AND price < 50000;
  • AND: الصف لازم يعدّي الشرطين.
  • OR: يكفي يعدّي واحد منهم.

مثال 9: قايمة قيم بـ IN، ومدى بـ BETWEEN

بدل ما تكتب OR كذا مرة، IN بتاخد قايمة. و BETWEEN بتاخد مدى شامل الطرفين:

مثال 9
SELECT name, ram_gb, price FROM products WHERE ram_gb IN (16, 32) AND price BETWEEN 40000 AND 80000;

الشرح: ram_gb IN (16, 32) هي هي ram_gb = 16 OR ram_gb = 32. و price BETWEEN 40000 AND 80000 هي هي price >= 40000 AND price <= 80000، يعني اللابتوب اللي سعره 40000 بالظبط هيطلع.

مثال 10: دوّر جوه النص بـ LIKE

كل لابتوبات Lenovo، يعني الاسم بيبدأ بكلمة Lenovo:

مثال 10
SELECT name FROM products WHERE name LIKE 'Lenovo%';
  • %: أي عدد من الحروف (حتى صفر).
  • _: حرف واحد بالظبط.
  • '%Pro%' يعني فيه كلمة Pro في أي حتة.

ليه مينفعش تستخدم الـ Alias في WHERE؟

جرّب تفلتر على with_vat اللي عملناه في مثال 4:

هتطلع خطأ
SELECT name, price * 1.14 AS with_vat FROM products WHERE with_vat > 50000;

شغّلها. هتطلع خطأ إن العمود with_vat مش موجود. والسبب هو نفس الترتيب اللي شفته في المحاكي: WHERE بيتنفذ قبل SELECT، فساعة ما WHERE بيشتغل، with_vat لسه ماتعملش. الحل إنك تكتب الحسبة نفسها في الشرط:

الحل
SELECT name, price * 1.14 AS with_vat FROM products WHERE price * 1.14 > 50000;

أخطاء شائعة

الغلط ليه غلط الصح
WHERE cpu = "Apple M3" العلامتين المزدوجتين = اسم عمود WHERE cpu = 'Apple M3'
WHERE price = NULL مفيش حاجة بتساوي NULL، ولا NULL نفسه WHERE price IS NULL (الدرس الجاي)
WHERE with_vat > 50000 الـ Alias بيتعمل في SELECT، بعد WHERE كرر الحسبة في WHERE
a = 1 OR a = 2 AND b < 5 AND بتتنفذ الأول (a = 1 OR a = 2) AND b < 5
SELECT * في الكود بتجيب أعمدة ماطلبتهاش اكتب الأعمدة بالاسم

اختبر نفسك

سؤال✓

SELECT name, price FROM products WHERE price > 50000; — Lenovo Yoga Slim 7 (سعره NULL) هيطلع في النتيجة؟

سؤال✓

أنهي كويري بتجيب لابتوبات الـ Gaming (1) أو الـ Business (2) اللي سعرها أقل من 50000؟

سؤال✓

بأي ترتيب PostgreSQL بينفذ SELECT name FROM products WHERE ram_gb = 16؟

تمارين

تمرين تطبيقي

سهل+1 اختبار مستخبي✓ اتحل

اعرض اسم وسعر كل اللابتوبات اللي رامتها 16 جيجا.

💡 تلميح

شرط واحد بـ = على عمود ram_gb.

تمرين تطبيقي

متوسط+1 اختبار مستخبي✓ اتحل

عميل ميزانيته أقل من 30,000 وعايز يشتري النهارده. اعرض الاسم والسعر والمخزون للابتوبات اللي سعرها أقل من 30000 وموجودة في المخزن.

💡 تلميح

شرطين لازم الاتنين يتحققوا: موجود في المخزن (stock > 0)، وسعره أقل من 30000.

تمرين تطبيقي

متوسط+1 اختبار مستخبي✓ اتحل

اعرض الاسم والمعالج لكل اللابتوبات اللي معالجها مش Intel: يعني بيبدأ بـ AMD أو بـ Apple.

💡 تلميح

شرطين بـ OR، وكل واحد فيهم LIKE بـ % في الآخر. وخلّي بالك من الحروف الكبيرة.

الخلاصة

  • SELECT بيختار الأعمدة، و WHERE بيختار الصفوف.
  • الترتيب الحقيقي: FROM ثم WHERE ثم SELECT، علشان كده الـ Alias مش متاح في WHERE.
  • النص بين 'علامات مفردة'، و "المزدوجة" لأسماء الأعمدة.
  • AND أقوى من OR، فاستخدم الأقواس.
  • المقارنة مع NULL مش “صح”، فالصف بيتشال. ودي حكاية الدرس الجاي.

اتمرّن برة الموقع

مسائل حقيقية على نفس الأفكار. علّم على اللي حليته.

  1. 584. Find Customer RefereeLeetCode

    فيها NULL. جرّبها، ولو فشلت ارجعلها بعد درس الـ NULL