جزء من مجموعة: أدوات المطوّرين
أمان وتقنية

منسّق SQL

نسّق استعلامات SQL — يدعم MySQL، PostgreSQL، MS SQL

8 لهجات SQLتنسيق ذكيمحلي 100%
ستظهر النتيجة هنا
0
أحرف الإدخال
0
أحرف المخرج
0
أسطر المخرج
0
مصغّر (chars)

كل المعالجة تتم محلياً في متصفّحك. الاستعلامات لا تُرسَل لأي خادم.

دليل شامل

كتابة SQL أنظف: تنسيق، أداء، وأفضل الممارسات

كيف تكتب استعلامات SQL سهلة القراءة، أدوات التنسيق، وأفضل ممارسات لتحسين الأداء.

8 دقائق قراءة·تحديث مايو 2026

لماذا يهمّ تنسيق SQL

استعلام SQL مكتوب على سطر واحد طويل قد يعمل بكفاءة تامّة، لكنّه يكلّفك ساعات حين تحاول قراءته بعد ستّة أشهر، أو حين يحاول زميل مراجعته في Pull Request. التنسيق ليس ترفاً جمالياً؛ هو أداة هندسية تقلّل الأخطاء، تُسرّع المراجعات، وتجعل الفروقات في Git قابلة للقراءة سطراً سطراً.

في هذا الدليل نمرّ على ما يجعل استعلام SQL «نظيفاً»: قواعد المسافات والمحاذاة، اختيار حالة الكلمات المفتاحية، تسمية الجداول والأعمدة، وكيف يرتبط كلّ ذلك بالأداء فعلياً — لا بمظهر الشيفرة فقط.

قواعد التنسيق الأساسية

هناك ثلاث قواعد متّفق عليها في معظم أدلّة أسلوب SQL الحديثة (مثل دليل Mozilla ودليل GitLab الداخلي):

  • ضع كلّ بند رئيسي على سطر مستقلّ: SELECT، FROM، JOIN، WHERE، GROUP BY، HAVING، ORDER BY، LIMIT.
  • حاذِ الأعمدة في SELECT رأسياً حين تتجاوز ثلاثة أعمدة. السطر الواحد جيّد لاستعلام بسيط؛ الاستعلام التحليلي يحتاج عموداً لكلّ سطر.
  • استخدم اسماء أعمدة صريحة بدل SELECT *. النجمة تُكسر في أوّل مرّة يُضاف فيها عمود جديد، وتُربك الفهارس وتنقل بيانات لا تحتاجها فعلاً.

أمّا الكلمات المفتاحية، فالخلاف بين UPPERCASE و lowercase قديم. القاعدة العمليّة: اختر واحدة والتزم بها في المشروع كلّه. الأدوات الحديثة مثل sql-formatter (الذي تستخدمه أداتنا أعلاه) تفرض الاتساق بنقرة واحدة.

الفروقات بين اللهجات

SQL ليس لغة واحدة. ما يعمل في PostgreSQL قد يكسر في MySQL، وما تكتبه لـ T-SQL في Microsoft SQL Server قد يحتاج تعديلاً جذرياً ليعمل في Oracle. أبرز الفروقات:

  • تحديد عدد الصفوف: PostgreSQL و MySQL يستخدمان LIMIT 10؛ T-SQL يستخدم TOP 10؛ Oracle يستخدم FETCH FIRST 10 ROWS ONLY.
  • اقتباس المعرّفات: PostgreSQL يقبل علامتي الاقتباس المزدوجتين؛ MySQL يستخدم backticks افتراضياً؛ T-SQL يستخدم القوسين المربعين [column].
  • دوال التاريخ: NOW() في PostgreSQL و MySQL، GETDATE() في T-SQL، SYSDATE في Oracle.
  • التسلسلات الرقمية: AUTO_INCREMENT في MySQL، SERIAL أو IDENTITY في PostgreSQL، SEQUENCE في Oracle.

عند نقل استعلام بين لهجات، نسّقه أوّلاً ثم راجع كلّ بند يدوياً. أداتنا تدعم ثماني لهجات لتساعدك على رؤية كيف تبدو الشيفرة في كلّ واحدة منها.

التنسيق وأثره على الأداء

المسافات والأسطر الجديدة لا تؤثّر على خطّة التنفيذ (Execution Plan) إطلاقاً. محسّن الاستعلامات يتجاهلها قبل أن يبدأ عمله. لكن التنسيق الجيّد يكشف مشاكل أداء كانت مخفيّة في السطر الطويل:

  • JOIN ضمنيّ خطير: حين ترى FROM users, orders WHERE ... بدل JOIN ... ON، ذلك جدول ضرب (Cartesian) محتمل. التنسيق يجعل الفرق واضحاً فوراً.
  • دوال على أعمدة مفهرسة: WHERE UPPER(email) = ... يُلغي الفهرس على email. التنسيق يُبرز الدوال في الأماكن غير المتوقّعة.
  • استعلامات فرعية مكرّرة: نفس الـ subquery يظهر مرّتين أو ثلاث؟ ربّما يحتاج CTE (WITH clause) واحد بدل ثلاث رحلات للجدول.

CTE مقابل Subquery: متى تستخدم أيّاً

عبارات WITH (Common Table Expressions) أحدثت ثورة هادئة في قراءة SQL. بدل عشّ subqueries عميق، تكتب كلّ خطوة باسمها ثمّ تبني عليها:

WITH active_users AS (
  SELECT id, name
  FROM users
  WHERE status = 'active'
),
recent_orders AS (
  SELECT user_id, COUNT(*) AS orders_count
  FROM orders
  WHERE created_at >= CURRENT_DATE - INTERVAL '30 days'
  GROUP BY user_id
)
SELECT u.name, COALESCE(o.orders_count, 0) AS orders_30d
FROM active_users u
LEFT JOIN recent_orders o ON o.user_id = u.id
ORDER BY orders_30d DESC
LIMIT 50;

نفس الاستعلام بـ subqueries متداخلة يصبح كتلة واحدة صعبة القراءة. القاعدة: إذا تكرّر subquery مرّتين أو زاد عمق التداخل عن مستويين، حوّله إلى CTE.

تسمية الجداول والأعمدة

أسماء واضحة تختصر التعليقات وتجعل التنسيق يبدو أنظف. القواعد المتعارف عليها:

  • أسماء الجداول جمع وصغيرة: users لا User أو tbl_users.
  • أسماء الأعمدة مفردة وصغيرة مع snake_case: created_at لا CreatedAt أو createdat.
  • الأعمدة المرجعية بصيغة <table>_id: user_id، order_id.
  • تواريخ بـ _at (لحظات) أو _on (تواريخ فقط): created_at، birth_on.

ملاحظة أمنية: لا تُنسّق فقط، تحقّق

أدوات التنسيق — بما فيها أداتنا — لا تتحقّق من الأمان. أهمّ ثغرة في تطبيقات SQL ما زالت SQL Injection. القاعدة الذهبية: لا تبنِ استعلاماً بدمج سلاسل نصّية من المستخدم أبداً. استخدم parameterized queries أو prepared statements دائماً، في كلّ لغة وكلّ مكتبة. التنسيق يساعدك في القراءة؛ Parameter binding يحميك من الاختراق.

خلاصة

استعلام SQL منسّق جيّداً يُقرأ مرّة ويُكتب مرّات. القواعد بسيطة: بنود رئيسية على أسطر منفصلة، حالة موحّدة للكلمات المفتاحية، أسماء واضحة، CTE بدل subqueries المتداخلة، و parameter binding دائماً. أداتنا أعلاه تتكفّل بالتنسيق نفسه عبر ثماني لهجات، بشكل محليّ داخل متصفّحك — استعلاماتك لا تُرسَل لأيّ خادم.

فرض الأسلوب آلياً: SQL في CI

أفضل دليل أسلوب لا يَنفع إن لم يُفرَض. الحلّ: شغّل linter لـ SQL في كلّ Pull Request. SQLFluff هو المعيار الفعليّ اليوم — مكتوب بـ Python، يَدعم 14 لهجة (PostgreSQL، MySQL، BigQuery، Snowflake، Redshift، SQL Server، Oracle، DuckDB، وغيرها)، ويُمكن إعداده عبر ملفّ .sqlfluff في جذر المشروع. أمر واحد (sqlfluff fix .) يُعيد تنسيق كلّ ملفّات SQL في المستودع.

داخل GitHub Actions، يكفي خطوتان: pip install sqlfluffثمّ sqlfluff lint --dialect postgres ./sql/. أيّ مخالفة توقف CI وتمنع الدمج. النتيجة: المستودع كلّه يتبع نفس الأسلوب بعد أسابيع قليلة، ومراجعات Pull Requests تركّز على المنطق بدل الجدال حول المسافات. مشاريع dbt الحديثة تَستخدم نفس النمط عبر dbt-checkpoint و dbt-osmosisلتطبيق قواعد على نماذج البيانات.

إن كان فريقك على VS Code، أضِف إضافة SQLTools معvscode-sqlfluff ليرى المطوّر التحذيرات لحظيّاً أثناء الكتابة. تجربة المطوّر العربيّ تتحسّن كذلك: محرّر RTL يَدعم تعليقات عربيّة داخل الاستعلام (-- شرح بالعربيّة) بدون كسر التحليل، لأنّ SQL يَعتبر كلّ شيء بعد --نصّاً حرّاً حتّى نهاية السطر.

أدوات ذات صلة

أدوات أخرى مجانية على ArabToolBox، كلها تعمل في متصفّحك بدون تسجيل.

أسئلة شائعة

هل التنسيق يؤثّر على أداء استعلام SQL؟

لا، نهائياً. المسافات والأسطر الجديدة والتعليقات يتجاهلها محسّن الاستعلامات (Query Optimizer) قبل أن يبدأ عمله. خطّة التنفيذ (Execution Plan) تعتمد على بنية الاستعلام نفسها، الفهارس، وإحصائيات الجداول — لا على شكل النصّ. التنسيق يفيدك في القراءة والمراجعة فقط. لكن الأداة قد تُبرز مشاكل أداء كانت مخفيّة (مثل JOIN ضمنيّ، أو دوال على أعمدة مفهرسة) لأنّها تجعل البنية مرئيّة.

ما الفرق بين اللهجات الثماني المدعومة؟

PostgreSQL و MySQL هما الأكثر استخداماً في تطبيقات الويب. T-SQL لـ Microsoft SQL Server (شائع في بيئات Microsoft). SQLite للتطبيقات المحمولة والأجهزة المحدودة. PL/SQL لـ Oracle (شائع في البنوك والمؤسّسات الكبرى). BigQuery لـ Google Cloud Analytics. Snowflake لمستودعات البيانات السحابيّة. SQL القياسي محايد ويصلح للأساسيات. اختر اللهجة التي تستخدمها فعلاً لأنّ بعض الكلمات المفتاحية تختلف (مثل LIMIT في PostgreSQL/MySQL مقابل TOP في T-SQL).

هل يجب كتابة الكلمات المفتاحية بأحرف كبيرة (UPPERCASE)؟

لا يوجد فرق وظيفيّ — SQL غير حسّاس لحالة الأحرف في الكلمات المفتاحية. الخيار أسلوبيّ بحت. الاتفاقيّة التقليديّة (SELECT، FROM، WHERE) كانت الأحرف الكبيرة لتمييزها عن أسماء الجداول والأعمدة. الاتجاه الحديث (في GitLab و Mozilla style guides) يفضّل الأحرف الصغيرة لأنّها أهدأ بصرياً وأسرع في الكتابة. القاعدة: اختر واحدة والتزم بها في المشروع كلّه. أداتنا تتيح لك الخيارَين.

ما الفرق بين CTE و Subquery ومتى أستخدم أيّاً؟

Subquery استعلام داخل استعلام، مكتوب في مكانه. CTE (Common Table Expression، عبارة WITH) استعلام مُسمَّى يُكتب قبل الاستعلام الرئيسيّ ثمّ يُستخدم باسمه. الفرق: CTE أكثر قابليّة للقراءة، يُحسّن إعادة الاستخدام (نفس CTE يُستدعى مرّتين)، ويسمح بالاستعلامات التكراريّة (Recursive CTE). استخدم CTE حين يتكرّر subquery، أو حين يتجاوز عمق التداخل مستويَين، أو حين تحتاج تكرار. استخدم subquery للحالات البسيطة من سطر واحد.

هل أداة التنسيق تتحقّق من صحّة الاستعلام (Validation)؟

التنسيق وحده لا يفحص الأخطاء الدلاليّة (هل الجدول موجود؟ هل العمود من النوع الصحيح؟). لكنّ أداتنا ترفض تنسيق الاستعلامات ذات الخطأ النحويّ (Syntax) الواضح وتُظهر رسالة الخطأ، لأنّ مكتبة sql-formatter تحلّل الاستعلام أوّلاً. للتحقّق الكامل، شغّل الاستعلام مقابل قاعدة بيانات اختبار، أو استخدم EXPLAIN لمراجعة خطّة التنفيذ قبل التشغيل على الإنتاج.

هل الاستعلامات تُرسَل إلى خادم أو تُسجَّل في مكان ما؟

لا. كلّ التنسيق يتمّ في متصفّحك (Client-side) باستخدام مكتبة sql-formatter محليّاً. الاستعلام لا يُرفَع ولا يُسجَّل ولا يُرسَل لأيّ خادم. يمكنك قطع الإنترنت بعد فتح الصفحة وستظلّ الأداة تعمل. هذا مهمّ لأنّ استعلامات SQL غالباً تكشف بنية قاعدة البيانات وأسماء الجداول الحسّاسة، ولا يجوز رفعها لخدمات سحابيّة عشوائيّة.

قراءات ذات صلة

مقالات وأدلّة مرتبطة بنفس الموضوع على ArabToolBox.

أدوات قد تهمّك