الاسترجاع: SELECT و WHERE
نختار الأعمدة التي نحتاجها، والصفوف التي تحقق شروطنا. ⏱ نحو 25 دقيقة.
- تختار الأعمدة وتحسب أعمدة جديدة وتسمّيها بـ
AS. - تصفّي الصفوف بـ
WHEREوأدوات المقارنة. - تدمج الشروط بـ
ANDوORوNOTمع الأقواس. - تشرح ترتيب تنفيذ الاستعلام.
١اختيار الأعمدة
SELECT أكثر أوامر SQL استخدامًا: يقرأ البيانات ولا يغيّرها أبدًا. بعده الأعمدة التي نريدها بالترتيب الذي نريده، و * لكل الأعمدة:
SELECT name, price, category FROM products;| name | price | category |
|---|---|---|
| قهوة عربية 250غ | 35 | مشروبات |
| شاي أخضر | 18 | مشروبات |
| تمر عجوة 1كغ | 90 | تمور |
| تمر سكري 1كغ | 45 | تمور |
| عسل سدر 500غ | 150 | عسل |
| عسل زهور 500غ | 60 | عسل |
| دلة قهوة | 75 | أدوات |
| فناجين (6 قطع) | 40 | أدوات |
| هيل 100غ | 28 | بهارات |
| زعفران 5غ | 55 | بهارات |
| ماء زمزم 5لتر | 12 | مشروبات |
| مبخرة | 120 | أدوات |
٢الأعمدة المحسوبة والأسماء المستعارة
يمكن أن يكون العمود عملية حسابية، ونعطيه اسمًا مستعارًا بالكلمة AS:
SELECT name, price, ROUND(price * 1.15, 2) AS price_with_vat, price * stock AS stock_valueFROM products;
| name | price | price_with_vat | stock_value |
|---|---|---|---|
| قهوة عربية 250غ | 35 | 40.25 | 1400 |
| شاي أخضر | 18 | 20.7 | 1170 |
| تمر عجوة 1كغ | 90 | 103.5 | 2250 |
| تمر سكري 1كغ | 45 | 51.75 | 0 |
| عسل سدر 500غ | 150 | 172.5 | 1800 |
| عسل زهور 500غ | 60 | 69 | 1800 |
| دلة قهوة | 75 | 86.25 | 600 |
| فناجين (6 قطع) | 40 | 46 | 800 |
| هيل 100غ | 28 | 32.2 | 1400 |
| زعفران 5غ | 55 | 63.25 | 825 |
| ماء زمزم 5لتر | 12 | 13.8 | 1200 |
| مبخرة | 120 | 138 | 600 |
ROUND(x, 2) تقرّب الناتج إلى منزلتين عشريتين؛ فالحساب العشري في الحاسب قد يعطي 40.24999999 بدل 40.25.
ولدمج النصوص نستخدم || في SQLite. وفي MySQL الدالة CONCAT(a, ' - ', b):
SELECT name || ' (' || category || ')' AS labelFROM products;
| label |
|---|
| قهوة عربية 250غ (مشروبات) |
| شاي أخضر (مشروبات) |
| تمر عجوة 1كغ (تمور) |
| تمر سكري 1كغ (تمور) |
| عسل سدر 500غ (عسل) |
| عسل زهور 500غ (عسل) |
| دلة قهوة (أدوات) |
| فناجين (6 قطع) (أدوات) |
| هيل 100غ (بهارات) |
| زعفران 5غ (بهارات) |
| ماء زمزم 5لتر (مشروبات) |
| مبخرة (أدوات) |
٣تصفية الصفوف: WHERE
WHERE تختار الصفوف التي تحقق شرطًا. وأدوات المقارنة:
| المعامل | معناه | مثال |
|---|---|---|
= | يساوي | city = 'جدة' |
<> أو != | لا يساوي | status <> 'ملغى' |
> < | أكبر، أصغر | price > 50 |
>= <= | أكبر أو يساوي، أصغر أو يساوي | order_date >= '2025-04-01' |
SELECT name, priceFROM productsWHERE price > 50;
| name | price |
|---|---|
| تمر عجوة 1كغ | 90 |
| عسل سدر 500غ | 150 |
| عسل زهور 500غ | 60 |
| دلة قهوة | 75 |
| زعفران 5غ | 55 |
| مبخرة | 120 |
SELECT id, order_date, statusFROM ordersWHERE order_date >= '2025-04-01';
| id | order_date | status |
|---|---|---|
| 7 | 2025-04-01 | قيد الشحن |
| 8 | 2025-04-09 | قيد الشحن |
| 9 | 2025-04-20 | جديد |
| 10 | 2025-05-03 | جديد |
| 11 | 2025-05-07 | جديد |
| 12 | 2025-05-12 | جديد |
التواريخ بصيغة YYYY-MM-DD تُقارن كالنصوص بشكل صحيح، لأن السنة ثم الشهر ثم اليوم.
٤دمج الشروط: AND و OR و NOT
| المعامل | الصف يظهر إذا… |
|---|---|
AND | تحقق الشرطان معًا |
OR | تحقق أحدهما على الأقل |
NOT | لم يتحقق الشرط |
-- مشروبات سعرها أقل من 20SELECT name, category, priceFROM productsWHERE category = 'مشروبات' AND price < 20;
| name | category | price |
|---|---|---|
| شاي أخضر | مشروبات | 18 |
| ماء زمزم 5لتر | مشروبات | 12 |
انتبه: AND تُنفَّذ قبل OR، مثل الضرب قبل الجمع. هنا نريد «العسل والتمور التي سعرها فوق 80»:
SELECT name, category, priceFROM productsWHERE category = 'عسل' OR category = 'تمور' AND price > 80;
| name | category | price |
|---|---|---|
| تمر عجوة 1كغ | تمور | 90 |
| عسل سدر 500غ | عسل | 150 |
| عسل زهور 500غ | عسل | 60 |
SELECT name, category, priceFROM productsWHERE (category = 'عسل' OR category = 'تمور') AND price > 80;
| name | category | price |
|---|---|---|
| تمر عجوة 1كغ | تمور | 90 |
| عسل سدر 500غ | عسل | 150 |
بلا أقواس، فُهم الشرط: «كل العسل» أو «التمور فوق 80»، فظهر عسل الزهور بـ 60. الأقواس تحدد ما تريده بالضبط.
٥كيف يقرأ النظام الاستعلام؟
نكتب SELECT أولًا، لكن النظام ينفّذ بترتيب آخر:
FROM: من أي جدول؟WHERE: أي الصفوف تبقى؟SELECT: أي الأعمدة تُعرض؟
SELECT name, ROUND(price * 1.15, 2) AS price_vatFROM productsWHERE price_vat > 100;
| name | price_vat |
|---|---|
| تمر عجوة 1كغ | 103.5 |
| عسل سدر 500غ | 172.5 |
| مبخرة | 138 |
في SQLite يعمل هذا لأنه متساهل. لكن في MySQL والمعيار يفشل: WHERE تُنفَّذ قبل SELECT، فلا تعرف الاسم المستعار price_vat بعد. اكتب الحساب نفسه: WHERE price * 1.15 > 100.
(status)، والمنتجات التي نفدت (stock = 0).توقّع وتحقّق
لا يساوي في SQL:
!=أي يُنفَّذ أولًا؟
WHERE ثم SELECT.AND أم OR تُنفَّذ أولًا؟
لتسمية العمود المحسوب:
الخلاصة
SELECTأعمدةFROMجدولWHEREشرط;- الأعمدة المحسوبة تُسمّى بـ
AS، ودمج النص بـ || (وفيMySQLبـCONCAT). - المقارنة: = و <> و > و < و
>=و<=. ANDقبلOR، والأقواس تحسم المعنى.- التنفيذ:
FROMثمWHEREثمSELECT.
تحدٍّ برمجي: عروض الشتاء
متوسطقسم التسويق يجهز عرضًا على المشروبات والبهارات التي سعرها 30 ريالًا أو أقل، ويريد السعر بعد خصم 10%.
- اعرض: اسم المنتج
name، والسعرprice، والسعر بعد الخصم باسمoffer_price. - المنتجات من تصنيف «مشروبات» أو «بهارات» فقط، وسعرها 30 أو أقل.
👀 اعرض النتيجة المطلوبة
| name | price | offer_price |
|---|---|---|
| شاي أخضر | 18 | 16.2 |
| هيل 100غ | 28 | 25.2 |
| ماء زمزم 5لتر | 12 | 10.8 |
- الكود يعمل بلا أخطاء
- النتيجة فيها المنتجات الثلاثة الصحيحة بالأعمدة الثلاثة
- تستخدم الاسم المستعار offer_price
💡 تلميح 1
💡 تلميح 2
حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
SELECT name, price, price * 0.9 AS offer_priceFROM productsWHERE (category = 'مشروبات' OR category = 'بهارات') AND price <= 30;