أغلب استعلامات SQL الحقيقية تُكتب مرة واحدة وتُقرأ عشرات المرات. وإذا كانت مكتوبة في سطر واحد، فكل مراجعة لاحق是对ها مهمة. التنسيق الجيد لا يجعل الاستعلام أجمل — يجعل أخطاءه مرئية قبل أن تلمس بيانات حقيقية.

لماذا التنسيق أداة مراجعة

الخطأ الذي يغفله目がك في سطر واحد يظهر فوراً في أسطر منفصلة:

قبل: سطر واحد مخفيsql
SELECT u.id,u.name,COUNT(o.id) FROM users u JOIN orders o ON o.user_id=u.id WHERE u.active=1 GROUP BY u.id,u.name HAVING COUNT(o.id)>5 ORDER BY COUNT(o.id) DESC LIMIT 10;
بعد: أخطاء صارت مرئيةsql
SELECT
  u.id,
  u.name,
  COUNT(o.id) AS order_count
FROM users u
JOIN orders o ON o.user_id = u.id
WHERE u.active = 1
GROUP BY u.id, u.name
HAVING COUNT(o.id) > 5
ORDER BY order_count DESC
LIMIT 10;

ترتيب القراءة المعياري

إذا تعلّمت ترتيباً واحداً والتزمت به، يصبح كل استعلام قابلاً للقراءة ذهنياً دون شرح:

  1. SELECT — ما الذي تريده بالضبط، مع أسماء أعمدة واضحة.
  2. FROM — الجداول الأساسية.
  3. JOIN — ما الذي تُضيفه،条件和 الربط.
  4. WHERE — تصفية الصفوف قبل التجميع.
  5. GROUP BY — تجميع الصفوف.
  6. HAVING — تصفية المجموعات بعد التجميع.
  7. ORDER BY — الترتيب النهائي.
  8. LIMIT — كم صفاً تريد.
مثال كامل مع注释sql
SELECT
  o.id,                          -- المفتاح
  o.total,                       -- المبلغ
  c.name AS customer_name        -- اسم العميل (اسم مستعار)
FROM orders o
INNER JOIN customers c
  ON c.id = o.customer_id        -- شرط الربط
WHERE o.status = 'paid'          -- قبل التجميع
  AND o.created_at >= '2026-01-01'
GROUP BY o.id, o.total, c.name
ORDER BY o.total DESC;

أخطاء منطقية شائعة

الخطأالسببالحل
SELECT *يكسر عند تغيّر الجدول وبطيءاذكر الحقول صراحة
WHERE بدل HAVINGيصفّي قبل التجميعاستخدم HAVING بعده
LEFT JOIN ثم WHERE على اليمينيلغي الـ LEFT JOINضع شرط JOIN في ON
LIKE '%نص%'يمنع استخدام الفهرسإن أمكن ابدأ بالنص بدون %
NOT IN مع NULLيُرجع نتائج خاطئةاستخدم NOT EXISTS
فخ NOT INsql
-- خطأ: إذا احتوى العمود على NULL، لا يُرجع أي صف
SELECT name FROM users
WHERE id NOT IN (SELECT user_id FROM orders);

-- صحيح: يتعامل مع NULL بأمان
SELECT name FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM orders o WHERE o.user_id = u.id
);

لماذا لا تُنفّذ الأداة استعلامك

أداة التنسيق الجيدة تقرأ النص وتعيد كتابته، ولا تتصل أبداً بقاعدة بياناتك ولا تُنفّذ أي شيء. الفرق:

ما تفعله الأداة الآمنةما لا تفعله أبداً
تقرأ النصلا تتصل بالخادم
تعيد تنسيقهلا تُنفّذ SELECT أو DELETE
تعرضه للنسخلا ترسله لأي طرف
تعمل في المتصفحلا تحتاج صلاحيات وصول

متى تستعمل أداة التنسيق

  • مراجعة استعلام قديم قبل تعديله.
  • توثيق استعلامات معقّدة في ويكي أو تعليق كود.
  • مشاركة استعلام في سؤال على Stack Overflow.
  • فحص استعلام قبل وضعه في تقرير أداء (EXPLAIN).
خطوات عمليةsql
-- 1. نسّق النص في الأداة
-- 2. راجع الأسماء والمنطق
-- 3. افحص الخطة قبل التنفيذ
EXPLAIN ANALYZE SELECT ... ;
-- 4. جرّب على بيانات محدودة
SELECT ... LIMIT 100;
-- 5. نفّذ