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 * FROM products;
- 1 FROM هات الجدول
- 2 WHERE شيل الصفوف
- 3 SELECT اختار الأعمدة
…
الـ Syntax
SELECT column1, column2, ...
FROM table_name
WHERE condition;
column1, column2: الأعمدة اللي عايزها في النتيجة، وبينهم فاصلة.table_name: الجدول اللي هتجيب منه.condition: الشرط. أي صف الشرط عليه صح بيفضل، وأي صف عليه غلط (أو مش معروف) بيتشال.WHEREاختيارية. من غيرها بترجع كل الصفوف.- الـ
;في الآخر بتقول إن الكويري خلصت.
الجدول اللي هنشتغل عليه
كل الأمثلة على جدول products في داتابيز الكورس: 18 لابتوب. الكويري دي اتشغلت لوحدها أول ما وصلت هنا، وده PostgreSQL حقيقي جوه صفحتك:
SELECT * FROM products;
مثال 1: هات أعمدة معينة
عايز اسم وسعر كل لابتوب بس، من غير باقي التفاصيل.
SELECT name, price FROM products;
الشرح: النتيجة فيها 18 صف (كل المنتجات) بس عمودين. SELECT غيّر عدد الأعمدة بس، ماغيّرش عدد الصفوف. والأعمدة بتطلع بنفس الترتيب اللي كتبته، فلو كتبت price, name السعر هيطلع الأول.
مثال 2: هات كل الأعمدة
النجمة * معناها “كل الأعمدة، بالترتيب اللي اتعمل بيه الجدول”.
SELECT * FROM products;
مثال 3: سمّي العمود باسم تاني بـ AS
اسم العمود في النتيجة ممكن تغيّره بـ AS. ده اسمه Alias.
SELECT name AS laptop, price AS price_egp FROM products;
الشرح: الـ Alias بيغيّر اسم العمود في النتيجة بس. الجدول نفسه مااتغيرش، وعمود name لسه اسمه name.
مثال 4: اعمل حسبة جوه SELECT
SELECT مش بس بيختار أعمدة، ده بيحسب كمان. هنا السعر بعد ضريبة 14%:
SELECT name, price, price * 1.14 AS with_vat FROM products;
الشرح: with_vat عمود جديد اتحسب لكل صف لوحده، ومش موجود في الجدول. وبص على Lenovo Yoga Slim 7: سعره NULL (مش معروف)، فالسعر بعد الضريبة طلع NULL برضه. أي حسبة فيها NULL نتيجتها NULL.
مثال 5: شيل التكرار بـ DISTINCT
عايز تعرف المعالجات المختلفة اللي عندك، من غير ما المعالج يتكرر.
SELECT DISTINCT cpu FROM products;
الشرح: عندنا 18 منتج، بس عدد المعالجات المختلفة أقل. DISTINCT بيشيل الصفوف المتكررة من النتيجة. ولو كتبت أكتر من عمود (DISTINCT cpu, ram_gb) هيشيل التكرار للمجموعة كلها مع بعض، مش لكل عمود لوحده.
WHERE: فلتر الصفوف
لحد دلوقتي كنا بنختار أعمدة. WHERE بيختار صفوف: بيختبر الشرط على كل صف، واللي يعدّي بيفضل.
مثال 6: قارن برقم
اللابتوبات اللي سعرها أكبر من 50,000:
SELECT name, price FROM products WHERE price > 50000;
الشرح: عوامل المقارنة: = و <> (مش بيساوي) و > و < و >= و <=. ولاحظ إن Lenovo Yoga Slim 7 مش في النتيجة. سعره NULL، والسؤال “هل NULL أكبر من 50000؟” إجابته مش معروف، فالصف اتشال. درس الـ NULL الجاي كله عن الحتة دي.
مثال 7: قارن بنص
اللابتوبات اللي معالجها Apple M3 بالظبط:
SELECT name, cpu FROM products WHERE cpu = 'Apple M3';
مثال 8: شرطين مع بعض بـ AND و OR
لابتوبات رامتها 16 وسعرها أقل من 50,000:
SELECT name, ram_gb, price FROM products WHERE ram_gb = 16 AND price < 50000;
AND: الصف لازم يعدّي الشرطين.OR: يكفي يعدّي واحد منهم.
مثال 9: قايمة قيم بـ IN، ومدى بـ BETWEEN
بدل ما تكتب OR كذا مرة، IN بتاخد قايمة. و BETWEEN بتاخد مدى شامل الطرفين:
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:
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) هيطلع في النتيجة؟
لأ. WHERE بيسيب الصف بس لو الشرط صح. والمقارنة مع NULL مش صح ومش غلط، هي “مش معروف”، فالصف بيتشال.
أنهي كويري بتجيب لابتوبات الـ Gaming (1) أو الـ Business (2) اللي سعرها أقل من 50000؟
التانية. من غير أقواس AND بتتنفذ الأول، فالأولى بترجع كل الـ Gaming بأي سعر. و IN لازم القيم تبقى بين أقواس.
بأي ترتيب PostgreSQL بينفذ SELECT name FROM products WHERE ram_gb = 16؟
FROM (هات الجدول) ثم WHERE (شيل الصفوف) ثم SELECT (اختار الأعمدة). وعلشان كده الـ Alias اللي في SELECT مش متاح في WHERE.
تمارين
تمرين تطبيقي
سهل+1 اختبار مستخبي✓ اتحلاعرض اسم وسعر كل اللابتوبات اللي رامتها 16 جيجا.
SELECT name, price FROM products WHERE ram_gb = 16;
تمرين تطبيقي
متوسط+1 اختبار مستخبي✓ اتحلعميل ميزانيته أقل من 30,000 وعايز يشتري النهارده. اعرض الاسم والسعر والمخزون للابتوبات اللي سعرها أقل من 30000 وموجودة في المخزن.
SELECT name, price, stock FROM products WHERE stock > 0 AND price < 30000;
تمرين تطبيقي
متوسط+1 اختبار مستخبي✓ اتحلاعرض الاسم والمعالج لكل اللابتوبات اللي معالجها مش Intel: يعني بيبدأ بـ AMD أو بـ Apple.
SELECT name, cpu FROM products WHERE cpu LIKE 'AMD%' OR cpu LIKE 'Apple%';
الخلاصة
SELECTبيختار الأعمدة، وWHEREبيختار الصفوف.- الترتيب الحقيقي: FROM ثم WHERE ثم SELECT، علشان كده الـ Alias مش متاح في WHERE.
- النص بين
'علامات مفردة'، و"المزدوجة"لأسماء الأعمدة. ANDأقوى منOR، فاستخدم الأقواس.- المقارنة مع
NULLمش “صح”، فالصف بيتشال. ودي حكاية الدرس الجاي.
اتمرّن برة الموقع
مسائل حقيقية على نفس الأفكار. علّم على اللي حليته.
- 595. Big CountriesLeetCode
- Revising the Select Query IHackerRank