فرمتدهنده و اعتبارسنج SQL - فرمتبندی رایگان کوئریهای SQL آنلاین
فرمتدهنده و اعتبارسنج رایگان SQL. فرمتبندی خودکار SQL با تورفتگی و حروف بزرگ مناسب. بررسی فوری خطاهای نحوی. با MySQL، PostgreSQL، SQL Server، Oracle کار میکند.
فرمتدهنده و اعتبارسنج SQL
فرمتبندی و اعتبارسنجی کوئریهای SQL با تورفتگی خودکار، بزرگنمایی کلیدواژهها و تشخیص خطاهای نحوی.
مستندات
چرا قالببندی SQL مهم است
آیا تا به حال پروژه پایگاه دادهای را به ارث بردهاید که SQL آن انگار توسط کسی با چشمان بسته تایپ شده باشد؟ تنها نیستید. قالببندی ضعیف SQL یکی از رایجترین منابع باگها و هدر رفتن زمان در توسعه پایگاه داده است.
این قالببندی و اعتبارسنجی SQL به شما کمک میکند تا کوئریهای نامنظم را به طور خودکار مرتب کند. SQL خود را جایگذاری کنید، و بلافاصله تورفتگی مناسب را اعمال میکند، کلیدواژهها را بزرگ مینویسد و خطاهای نحوی را بررسی میکند - همه اینها در مرورگر شما بدون ارسال داده به هیچ سروری. آنچه معمولاً 10-15 دقیقه قالببندی دستی طول میکشد، در چند ثانیه انجام میشود.
از تجربه من در کار با تیمهای پایگاه داده، بزرگترین صرفهجویی در زمان نه فقط قالببندی - بلکه شناسایی خطاها قبل از رسیدن به محیط تولید است. یک پرانتز جابجا شده یا یک نقل قول بسته نشده میتواند ساعتها اشکالزدایی را هدر دهد. این ابزار چنین مشکلاتی را بلافاصله، قبل از اجرای هر چیزی در پایگاه داده شما شناسایی میکند.
نحوه استفاده از فرمتکننده SQL
رابط کاربری عمداً ساده است - فقط کپی و اجرا کنید:
- SQL خود را در جعبه ورودی جای دهید (یا مستقیماً تایپ کنید اگر از ابتدا مینویسید)
- مشاهده فرمتبندی خودکار در حین تایپ - بدون نیاز به کلیک دکمهای، بدون تنظیمات پیچیده
- بررسی خطاهای اعتبارسنجی در صورت وجود در زیر خروجی فرمتبندی شده
- کپی SQL فرمتبندی شده با یک کلیک برای استفاده در IDE، مستندسازی یا ابزار پایگاه داده
در هر دستگاهی با مرورگر کار میکند. فرمتبندی کاملاً در سمت کاربر انجام میشود، بنابراین پرسوجوهای شما هرگز از دستگاه شما خارج نمیشوند - این موضوع هنگام کار با ساختارهای پایگاه داده تولید یا اسکیماهای حساس مهم است.
کارکرد فرمتکننده SQL
بزرگنمایی کلیدواژهها
تمام کلیدواژههای SQL به طور خودکار با حروف بزرگ نمایش داده میشوند—SELECT، FROM، WHERE، JOIN و غیره. این روش پیروی از قراردادی است که توسط اکثر تیمهای پایگاه داده استفاده میشود و باعث میشود کلیدواژهها از نام جداول و ستونهای شما به لحاظ بصری متمایز شوند. هنگامی که در حال بررسی یک کوئری پیچیده هستید، این جداسازی بصری به شما کمک میکند تا ساختار کوئری را در یک نگاه شناسایی کنید.
تورفتگی هوشمندانه
فرمتکننده SQL شما را بر اساس سلسله مراتب منطقی ساختار میدهد، نه فقط با اضافه کردن شکستن خط تصادفی. بندهای اصلی مانند SELECT و FROM از حاشیه سمت چپ شروع میشوند. بندهای JOIN زیر FROM تورفتگی دارند تا نشان دهند بخشی از انتخاب جدول هستند. زیرکوئریها سطوح تورفتگی اضافی دریافت میکنند، که منطق تودرتو را واضح میکند.
در عمل، این اتفاق میافتد: وقتی کوئریای با چندین join و زیرکوئری دارید، تورفتگی مناسب به شما اجازه میدهد ساختار کوئری را بدون خواندن هر کلمه ببینید. میتوانید بلافاصله تشخیص دهید که یک join کجا تمام میشود و دیگری شروع میشود، یا زیرکوئری در لیست SELECT شما کجا استفاده شده است.
شکستن خط منطقی
شکستن خط جایی اتفاق میافتد که به خوانایی کمک میکند، نه همه جا. هر بند اصلی خط خودش را دارد. موارد در لیستهای جدا شده با کاما (مانند نام ستونها در SELECT) هر کدام خط خودشان را با تورفتگی مناسب دارند. زیرکوئریها به لحاظ بصری جدا میشوند. عبارات CASE در WHEN، THEN و ELSE برای وضوح شکسته میشوند.
فاصلهگذاری از قراردادهای راهنمای سبک SQL که در صنعت استفاده میشود پیروی میکند، که این یعنی SQL فرمت شده شما برای سایر توسعهدهندگان آشنا خواهد بود.
اعتبارسنجی SQL: چه چیزی بررسی میشود
اعتبارسنج خطاهایی را میگیرد که معمولاً هنگام نوشتن سریع SQL از قلم میافتند. این ابزار جایگزین تحلیلگر کوئری پایگاه داده شما نیست، اما خطاهای رایج را قبل از اجرای کوئری شناسایی میکند.
خطاهای ساختاری
پرانتزهای نامتعادل در کوئریهای پیچیده با زیرکوئریهای تودرتو بسیار شایع هستند. اعتبارسنج تعداد پرانتزهای باز و بسته را میشمارد تا ناهماهنگیها را بلافاصله علامتگذاری کند. من شاهد حوادث تولیدی ناشی از یک پرانتز گمشده در یک کوئری 200 خطی بودهام - این ابزار آنها را زود شناسایی میکند.
رشتههای حرفی بسته نشده زمانی رخ میدهند که فراموش میکنید نقل قول بسته را در یک مقدار رشتهای بگذارید. پایگاه داده شما بلافاصله اینها را رد میکند، اما شناسایی آنها در اینجا از یک دور رفت و برگشت جلوگیری میکند.
مشکلات ترتیب بند زمانی علامتگذاری میشوند که بندها خارج از توالی ظاهر شوند. برای مثال، اگر HAVING را قبل از GROUP BY، یا WHERE را بعد از GROUP BY بگذارید، اعتبارسنج به شما هشدار میدهد. این مطابق با قوانین نحوی استاندارد SQL تعریف شده در استاندارد SQL ISO/IEC 9075 است.
خطاهای منطقی
بندهای JOIN بدون شرایط ON تولید جوینهای تصادفی میکنند که سطرهای بسیار بیشتری از آنچه قصد دارید برمیگردانند. سناریوی رایج: هنگام اضافه کردن جدول سوم یا چهارم به کوئری، بند ON را فراموش میکنید. بدون این بررسی، ممکن است متوجه نشوید تا زمانی که هزاران سطر تکراری در نتایج خود میبینید.
HAVING بدون GROUP BY از نظر فنی در اکثر پایگاههای داده SQL نامعتبر است. بند HAVING نتایج گروهبندی شده را فیلتر میکند، بنابراین نیاز به GROUP BY برای کار دارد. اعتبارسنج این عدم تطابق منطقی را شناسایی میکند.
شرایط WHERE ناقص زمانی رخ میدهند که شروع به تایپ یک شرط میکنید اما آن را تمام نمیکنید - مانند WHERE status = بدون مقدار. این موارد هنگام ویرایش کوئریها به راحتی از قلم میافتند.
آنچه شناسایی نمیشود
این اعتبارسنج بر نحو و ساختار متمرکز است، نه اسکیمای پایگاه داده. او نمیداند که:
- آیا نام جداول یا ستونهای شما در پایگاه داده وجود دارند
- آیا شما در حال اتصال با انواع داده سازگار هستید
- آیا کوئری شما با کارایی خوب اجرا میشود یا مشکلات بهینهسازی دارد
- آیا مجوز دسترسی به جداولی که کوئری میکنید را دارید
آن را به عنوان یک بررسی اولیه قبل از ارسال کوئری به پایگاه داده واقعی خود در نظر بگیرید.
قواعد قالببندی اعمال شده توسط این ابزار
قالببند قواعد ثابتی را بر اساس کنوانسیونهای راهنمای سبک SQL که اکثر تیمهای پایگاه داده دنبال میکنند، اعمال میکند.
کلیدواژهها با حروف بزرگ نوشته میشوند
هر کلیدواژه SQL به حروف بزرگ تبدیل میشود: SELECT، INSERT، UPDATE، DELETE، CREATE، ALTER، DROP. این شامل بندها (FROM، WHERE، GROUP BY، HAVING، ORDER BY)، انواع پیوست (JOIN، INNER JOIN، LEFT JOIN)، عملگرها (AND، OR، NOT، IN، BETWEEN، LIKE) و توابع رایج (COUNT، SUM، AVG، CASE، WHEN) میشود.
چرا با حروف بزرگ؟ این تمایز بصری بین عناصر زبان SQL و نامهای خاص پایگاه داده شما (جداول، ستونها، نامهای مستعار) را ایجاد میکند. هنگام اسکن یک پرسوجو، چشم شما بلافاصله ساختار را تشخیص میدهد.
دو فاصله تورفتگی در هر سطح
بندهای اصلی مانند SELECT و FROM از حاشیه سمت چپ شروع میشوند. بندهای JOIN دو فاصله زیر FROM تورفته میشوند تا نشان دهند بخشی از انتخاب جدول هستند. زیرپرسوجوها برای هر سطح تودرتو دو فاصله بیشتر تورفته میشوند. این یک سلسله مراتب بصری ایجاد میکند که با ساختار منطقی مطابقت دارد.
فهرستهای جدا شده با کاما (مانند نام ستونها در SELECT) هر کدام خط خود را با تورفتگی ثابت دارند. وقتی 15 ستون در لیست SELECT دارید، این کار اسکن و یافتن ستونهای خاص را آسان میکند.
شرایط در بندهای WHERE به صورت عمودی تراز میشوند. وقتی چندین شرط AND یا OR دارید، تراز کردن ساختار منطقی را بلافاصله آشکار میکند.
قبل و بعد: تفاوت را ببینید
قبل از قالببندی:
1select u.id, u.name, o.order_date from users u join orders o on u.id = o.user_id where o.status = "completed" group by u.id order by u.name;
2بعد از قالببندی:
1SELECT
2 u.id,
3 u.name,
4 o.order_date
5FROM users u
6 JOIN orders o ON u.id = o.user_id
7WHERE
8 o.status = "completed"
9GROUP BY
10 u.id
11ORDER BY
12 u.name;
13قوانین اعتبارسنجی: چه چیزی علامتگذاری میشود
اعتبارسنج یکپارچگی ساختاری و سازگاری منطقی اساسی را بررسی میکند. در اینجا به دنبال چه چیزی است:
بررسیهای ساختاری
پرانتزهای متعادل: پرانتزهای باز و بسته باید مطابقت داشته باشند. زیرپرسهای تودرتو اغلب سطوح مختلفی از پرانتزها دارند و اشتباه در شمارش آنها یکی از رایجترین خطاهای SQL است. اعتبارسنج آنها را برای شما میشمارد.
رشتههای به درستی بسته شده: هر علامت نقل قول باز (تک یا دوتایی) نیاز به علامت نقل قول بسته دارد. به نظر واضح میرسد، اما هنگام نوشتن یک درخواست پیچیده با چندین رشته متنی، از قلم انداختن یکی آسان است.
ترتیب صحیح بند: SQL الزامات ترتیبی خاصی دارد. SELECT قبل از FROM، که قبل از WHERE، که قبل از GROUP BY، که قبل از HAVING، که قبل از ORDER BY میآید. قرار دادن آنها خارج از توالی باعث خطاهای نحوی فوری میشود. اعتبارسنج این ترتیب را بر اساس استاندارد SQL بررسی میکند.
بررسیهای سازگاری منطقی
JOIN با شرط ON: هر JOIN نیاز به یک بند ON یا USING دارد تا نحوه ارتباط جداول را مشخص کند. بدون آن، یک cross join ایجاد میشود - هر سطر از یک جدول با هر سطر از جدول دیگر جفت میشود. این چیزی است که معمولاً نمیخواهید و معمولاً نشاندهنده یک بند ON از قلم افتاده است.
شرایط کامل WHERE: یک بند WHERE نیاز به گزارههای کامل دارد. WHERE status = بدون مقدار ناقص و نامعتبر است. اعتبارسنج این شرایط جزئی را علامتگذاری میکند.
HAVING نیاز به GROUP BY: بند HAVING نتایج گروهبندی شده را فیلتر میکند، بنابراین فقط زمانی معنا دارد که GROUP BY داشته باشید. استفاده از HAVING بدون GROUP BY یک خطای منطقی است که اکثر پایگاه دادهها آن را رد میکنند.
قوانین تجمیع GROUP BY: هنگام استفاده از توابع تجمیعی مانند COUNT() یا SUM()، هر ستون غیر تجمیعی در لیست SELECT باید در GROUP BY ظاهر شود. این یک الزام اساسی SQL است که اعتبارسنج آن را بررسی میکند.
مثالی از خطاهای رایج شناسایی شده
در اینجا SQL با چندین مشکل است که اعتبارسنج آن را علامتگذاری میکند:
1SELECT user_id, COUNT(*) FROM orders
2JOIN users
3WHERE status =
4GROUP BY
5HAVING count > 10;
6مشکلات شناسایی شده:
JOIN usersفاقد شرطON(یک cross join ایجاد خواهد کرد)WHERE status =ناقص (بدون مقدار مقایسه)- بند
GROUP BYخالی (بدون ستون مشخص شده) HAVING count > 10به ستون تعریف نشده اشاره دارد
چه زمانی از این فرمتدهنده SQL استفاده کنیم
در بررسی کدها
آیا تا به حال سعی کردهاید یک کوئری SQL ۵۰ خطی که در یک خط نوشته شده را بررسی کنید؟ وحشتناک است. قبل از ارسال کوئریها برای بررسی کد، آنها را از طریق فرمتدهنده اجرا کنید. بررسیکنندگان شما از شما تشکر خواهند کرد و میتوانند بر منطق تمرکز کنند به جای اینکه ساختار را رمزگشایی کنند.
هنگام بررسی درخواستهای pull با تغییرات پایگاه داده، از مشارکتکنندگان بخواهید SQL خود را ابتدا فرمت کنند. این کار یافتن خطاهای منطقی را بسیار آسانتر میکند زمانی که ساختار یکنواخت باشد.
اشکالزدایی مشکلات تولید
هنگامی که در حال عیبیابی یک کوئری ناموفق در محیط تولید هستید، فرمتبندی صحیح آن به شما کمک میکند ساختار را به وضوح ببینید. من دهها کوئری را اشکالزدایی کردهام که مشکل پس از فرمتبندی SQL واضح شد - یک شرط join از قلم افتاده، یک گروهبندی WHERE نادرست، یا یک زیرکوئری در جای اشتباه.
کوئری را از لاگهای خود کپی کنید، در اینجا جای دهید و بلافاصله خواهید دید که آیا مشکلات ساختاری وجود دارد.
کار با SQL تولید شده
ORMها (نگاشتگرهای شیء-رابطهای) مانند Hibernate، Entity Framework یا SQLAlchemy SQL را به طور خودکار تولید میکنند. گاهی اوقات نیاز دارید ببینید دقیقاً چه کوئریای تولید میکنند. SQL تولید شده معمولاً یک خط طولانی بدون فرمتبندی است. این ابزار کوئریهای تولید شده توسط ORM را قابل خواندن میکند تا بتوانید آنها را درک و بهینه کنید.
آموزش و یادگیری SQL
اگر در حال یادگیری SQL هستید یا آن را آموزش میدهید، این فرمتدهنده به درک ساختار صحیح کوئری کمک میکند. وقتی یک کوئری کاری را جای میدهید و میبینید چگونه فرمت میشود، قراردادها را یاد میگیرید. وقتی یک کوئری خراب را جای میدهید و خطاهای اعتبارسنجی را میبینید، متوجه میشوید چرا کار نمیکند.
مهاجرت بین سیستمهای پایگاه داده
پایگاههای داده مختلف (PostgreSQL، MySQL، SQL Server) گویشهای SQL کمی متفاوتی دارند. هنگام مهاجرت کوئریها بین سیستمها، فرمتبندی صحیح به شما کمک میکند نحو خاص گویش را شناسایی کنید که ممکن است نیاز به تنظیم داشته باشد. فرمتدهنده از قراردادهای SQL استاندارد پیروی میکند که در اکثر پایگاههای داده اصلی کار میکند.
جایگزینهای این فرمتدهنده SQL
محیطهای توسعه اختصاصی پایگاه داده
ابزارهایی مانند DataGrip، SQL Server Management Studio یا MySQL Workbench دارای فرمتدهندههای داخلی هستند. آنها قدرتمند بوده و مستقیماً با اتصالات پایگاه داده شما یکپارچه میشوند.
معامله معکوس: آنها نیاز به نصب و راهاندازی دارند. DataGrip برای افراد سالانه ۱۹۹ دلار هزینه دارد. SSMS رایگان است اما فقط برای ویندوز. اگر به فرمتدهی سریع بدون نصب نیاز دارید یا در چندین سیستم پایگاه داده کار میکنید، یک ابزار مرورگر محور عملیتر است.
افزونههای ویرایشگر
اگر SQL را در VS Code یا Sublime Text مینویسید، افزونههایی مانند SQL Beautify یا SqlBeautifier فرمتدهی را به ویرایشگر شما میآورند. این روش زمانی که در حال نوشتن پرسوجوها هستید و میخواهید فرمتدهی بلافاصله انجام شود، بسیار مناسب است.
محدودیت: افزونهها نیاز به پیکربندی دارند و به ویرایشگر خاصی وابسته هستند. هنگام به اشتراکگذاری SQL با همکاران یا ارسال پرسوجوها در مستندات، یک فرمتدهنده وب استاندارد اطمینان میدهد که همه همان فرمتبندی را میبینند.
فرمتدهندههای خط فرمان
ابزارهایی مانند sqlformat (Python) یا sql-formatter-cli (Node.js) میتوانند در خط لوله CI/CD ادغام شوند تا SQL را به طور خودکار در کنترل نسخه فرمت کنند. این کار یکنواختی در سطح تیم را تضمین میکند.
بهترین برای جریانهای کاری خودکار است نه فرمتدهی موردی. اگر فقط در حال پاکسازی چند پرسوجو یا یادگیری SQL هستید، ابزارهای خط فرمان پیچیدگی غیرضروری اضافه میکنند.
چگونه قالببندی SQL به یک رویه استاندارد تبدیل شد
SQL در دهه ۱۹۷۰ میلادی در IBM توسعه یافت، اما قراردادهای قالببندی بسیار دیرتر ظاهر شدند. SQL اولیه کارآمد اما ناهماهنگ بود - هر توسعهدهنده پرسوجوها را به شیوه متفاوتی قالببندی میکرد.
نقطه عطف در دهه ۱۹۹۰ رخ داد، زمانی که پایگاه دادهها از پروژههای تک توسعهدهنده به توسعه مبتنی بر تیم تغییر کردند. سازمانها شروع به ایجاد راهنماهای داخلی سبک SQL برای حفظ یکپارچگی کردند. زمانی که پنج توسعهدهنده روی یک پایگاه داده کار میکردند، SQL خوانا برای همکاری ضروری میشد.
دهه ۲۰۰۰ با ORMهایی همراه بود که SQL را به طور خودکار تولید میکردند. این ابزارها SQL کارآمد اما زشتی تولید میکردند - همه چیز در یک خط، بدون تورفتگی. این تقاضا برای قالببندهای خودکار را ایجاد کرد که بتوانند SQL تولید شده را برای انسان قابل خواندن کنند.
قالببندهای آنلاین SQL در دهه ۲۰۱۰ با بلوغ توسعه وب ظاهر شدند. به جای نصب ابزارها یا پیکربندی پلاگینهای IDE، توسعهدهندگان میتوانستند SQL را در مرورگر قالببندی کنند. این دسترسی به قالببندی مناسب را برای همه، از مبتدیان تازهکار SQL تا توسعهدهندگان باتجربهای که پرسوجوهای سریع را پاکسازی میکنند، دموکراتیزه کرد.
امروزه، قالببندی SQL به عنوان یک رویه پایه در نظر گرفته میشود، مشابه قالببندی کد در سایر زبانهای برنامهنویسی. راهنمای سبک SQL توسط سایمون هالیول قراردادهای گستردهای را ارائه میدهد و ابزارهایی مانند این، این استانداردها را به طور خودکار اجرا میکنند.
نمونههای کد
مثال ۱: پرسوجوی SELECT پایه
بدون فرمت:
1select id, first_name, last_name, email from customers where status = 'active' order by last_name, first_name;
2فرمتشده:
1SELECT
2 id,
3 first_name,
4 last_name,
5 email
6FROM
7 customers
8WHERE
9 status = 'active'
10ORDER BY
11 last_name,
12 first_name;
13مثال ۲: پرسوجوی JOIN
بدون فرمت:
1select c.id, c.name, o.order_date, o.total_amount from customers c left join orders o on c.id = o.customer_id where o.order_date >= '2023-01-01' and o.status != 'cancelled' order by o.order_date desc;
2فرمتشده:
1SELECT
2 c.id,
3 c.name,
4 o.order_date,
5 o.total_amount
6FROM
7 customers c
8 LEFT JOIN orders o ON c.id = o.customer_id
9WHERE
10 o.order_date >= '2023-01-01'
11 AND o.status != 'cancelled'
12ORDER BY
13 o.order_date DESC;
14مثال ۳: پرسوجوی پیچیده با زیرپرسوجو
بدون فرمت:
1select d.department_name, (select count(*) from employees e where e.department_id = d.id) as employee_count, (select avg(salary) from employees e where e.department_id = d.id) as avg_salary from departments d where d.active = true having employee_count > 0 order by avg_salary desc;
2فرمتشده:
1SELECT
2 d.department_name,
3 (
4 SELECT
5 COUNT(*)
6 FROM
7 employees e
8 WHERE
9 e.department_id = d.id
10 ) AS employee_count,
11 (
12 SELECT
13 AVG(salary)
14 FROM
15 employees e
16 WHERE
17 e.department_id = d.id
18 ) AS avg_salary
19FROM
20 departments d
21WHERE
22 d.active = TRUE
23HAVING
24 employee_count > 0
25ORDER BY
26 avg_salary DESC;
27فرمتبندی برنامهای SQL
در اینجا نمونههایی از نحوه پیادهسازی فرمتبندی SQL در زبانهای برنامهنویسی مختلف آورده شده است:
1// مثال فرمتبندی SQL در جاوااسکریپت با استفاده از کتابخانه sql-formatter
2const sqlFormatter = require('sql-formatter');
3
4function formatSQL(sql) {
5 return sqlFormatter.format(sql, {
6 language: 'sql',
7 uppercase: true,
8 linesBetweenQueries: 2,
9 indentStyle: 'standard'
10 });
11}
12
13const rawSQL = "select id, name from users where status='active'";
14const formattedSQL = formatSQL(rawSQL);
15console.log(formattedSQL);
161# مثال فرمتبندی SQL در پایتون با استفاده از sqlparse
2import sqlparse
3
4def format_sql(sql):
5 return sqlparse.format(
6 sql,
7 reindent=True,
8 keyword_case='upper',
9 identifier_case='lower',
10 indent_width=2
11 )
12
13raw_sql = "select id, name from users where status='active'"
14formatted_sql = format_sql(raw_sql)
15print(formatted_sql)
161// مثال فرمتبندی SQL در جاوا با استفاده از JSqlParser
2import net.sf.jsqlparser.parser.CCJSqlParserUtil;
3import net.sf.jsqlparser.statement.Statement;
4
5public class SQLFormatter {
6 public static String formatSQL(String sql) throws Exception {
7 Statement statement = CCJSqlParserUtil.parse(sql);
8 return statement.toString()
9 .replaceAll("(?i)SELECT", "\nSELECT")
10 .replaceAll("(?i)FROM", "\nFROM")
11 .replaceAll("(?i)WHERE", "\nWHERE")
12 .replaceAll("(?i)ORDER BY", "\nORDER BY");
13 }
14
15 public static void main(String[] args) throws Exception {
16 String rawSQL = "select id, name from users where status='active'";
17 String formattedSQL = formatSQL(rawSQL);
18 System.out.println(formattedSQL);
19 }
20}
211<?php
2// مثال فرمتبندی SQL در PHP
3function formatSQL($sql) {
4 // جایگزینی کلیدواژهها با نسخههای بزرگ
5 $keywords = ['SELECT', 'FROM', 'WHERE', 'JOIN', 'LEFT JOIN', 'RIGHT JOIN',
6 'INNER JOIN', 'GROUP BY', 'ORDER BY', 'HAVING', 'LIMIT'];
7
8 $formattedSQL = $sql;
9 foreach ($keywords as $keyword) {
10 $formattedSQL = preg_replace('/\b' . preg_quote($keyword, '/') . '\b/i', "\n$keyword", $formattedSQL);
11 }
12
13 // افزودن تورفتگی
14 $lines = explode("\n", $formattedSQL);
15 $result = '';
16 $indentLevel = 0;
17
18 foreach ($lines as $line) {
19 $trimmedLine = trim($line);
20 if (!empty($trimmedLine)) {
21 $result .= str_repeat(" ", $indentLevel) . $trimmedLine . "\n";
22 }
23 }
24
25 return $result;
26}
27
28$rawSQL = "select id, name from users where status='active'";
29$formattedSQL = formatSQL($rawSQL);
30echo $formattedSQL;
31?>
32سؤالات متداول
آیا این فرمتدهنده SQL با PostgreSQL، MySQL و SQL Server کار میکند؟
بله، با نحو SQL استاندارد که در پایگاهدادههای اصلی مشترک است کار میکند - PostgreSQL، MySQL، SQL Server (T-SQL)، Oracle، SQLite و MariaDB. فرمتدهنده بر روی SQL اصلی که همهجا کار میکند تمرکز دارد: SELECT، JOIN، WHERE، GROUP BY و غیره.
ویژگیهای خاص پایگاهداده ممکن است به طور کامل فرمت نشوند. برای مثال، نحو آرایه PostgreSQL یا توابع اختصاصی SQL Server ممکن است درمان فرمت خاصی دریافت نکنند، اما باعث خراب شدن فرمتدهنده نیز نمیشوند. پرسوجو همچنان خواناتر از قبل خواهد بود.
آیا کد SQL من به سرور ارسال میشود؟
خیر. همه چیز در مرورگر شما اتفاق میافتد. SQL خود را جایگذاری کنید و آن بدون هیچ درخواست شبکهای به صورت محلی فرمت میشود. پرسوجوهای شما هرگز از دستگاه شما خارج نمیشوند.
این موضوع هنگام کار با اسکیماهای پایگاهداده تولید یا منطق کسبوکار اختصاصی مهم است. هیچ خطری مبنی بر ثبت یا ذخیرهسازی اطلاعات حساس در سرور شخص دیگری وجود ندارد.
آیا اعتبارسنج میتواند همه خطاهای SQL را شناسایی کند؟
اصلاً. او فقط مسائل ساختاری و نحوی را شناسایی میکند - پرانتزهای گمشده، نقلقولهای بستهنشده، بندهای در ترتیب اشتباه. همین.
او نمیداند که نام جدولهای شما اشتباه است، نوع دادههای شما ناسازگار است یا پرسوجوی شما 10 دقیقه طول خواهد کشید. برای این کار، به پایگاهداده واقعی خود نیاز دارید. این اعتبارسنج را مانند غلطگیر برای SQL در نظر بگیرید، نه یک تحلیلگر پرسوجو.
چرا SQL را فرمت کنیم وقتی پایگاهداده آن را اجرا میکند؟
پایگاهدادهها به فرمت اهمیت نمیدهند - آنها پرسوجو را صرفنظر از فرمت پردازش میکنند. اما انسانها اهمیت میدهند. وقتی نیاز به اشکالزدایی یک پرسوجوی شکستخورده دارید، یک پرسوجوی موجود را اصلاح میکنید یا SQL شخص دیگری را بررسی میکنید، فرمت مناسب تفاوت بین درک آن در 30 ثانیه در مقابل 30 دقیقه را ایجاد میکند.
SQL فرمتبندی شده همچنین به شما در شناسایی خطاهای منطقی کمک میکند. وقتی ساختار واضح باشد، میتوانید ببینید که آیا جدولها را به درستی متصل کردهاید یا شرایط را در جای اشتباه گذاشتهاید.
آیا میتوانم تورفتگی یا سبک کلیدواژه را سفارشی کنم؟
در حال حاضر، خیر. فرمتدهنده از قراردادهای استاندارد استفاده میکند: کلیدواژههای بزرگ، تورفتگی دو فاصله، بندها در خطوط جداگانه. اینها از راهنمای سبک SQL که اکثر تیمها استفاده میکنند پیروی میکنند.
اگر به فرمتبندی سفارشی (عرض تورفتگی متفاوت، کلیدواژههای کوچک) نیاز دارید، به یک ابزار خط فرمان قابل پیکربندی مانند sqlformat یا یک IDE با تنظیمات فرمتبندی نیاز خواهید داشت.
آیا این با رویههای ذخیرهشده 1000 خطی کار میکند؟
پرسوجوهای بزرگ را فرمت میکند، اگرچه رویههای پیچیده (بیش از 1000 خط) ممکن است چند ثانیه برای پردازش نیاز داشته باشند. فرمتدهنده SQL که جایگذاری میکنید را صرفنظر از طول پردازش میکند.
برای رویههای عظیم، ممکن است بخواهید آنها را به قطعات کوچکتر تقسیم کنید یا از یک IDE خاص پایگاهداده که برای فایلهای بزرگ بهینهسازی شده استفاده کنید.
آیا فرمتبندی نحوه اجرای پرسوجوی من را تغییر میدهد؟
خیر. فرمتبندی فقط فاصلههای سفید اضافه میکند و بزرگی حروف را تغییر میدهد. پایگاهداده هر دو را نادیده میگیرد. پرسوجوی فرمتبندی شده دقیقاً همان نتایج را با همان کارایی مانند نسخه بدون فرمت برمیگرداند.
تنها استثنا: اگر اعتبارسنج خطاهای نحوی واقعی (پرانتزهای گمشده و غیره) پیدا کند، اصلاح آنها رفتار را تغییر خواهد داد - اما فقط از "اجرا نمیشود" به "به درستی اجرا میشود".
از چه استاندارد SQL پیروی میکند؟
فرمتدهنده از قراردادهای SQL-92 با گسترشهایی برای ویژگیهای رایج در SQL:1999 و استانداردهای بعدی پیروی میکند. این شامل SQL است که اکثر توسعهدهندگان روزانه مینویسند - پرسوجوهای SELECT، اتصالها، زیرپرسوجوها، عبارات CASE، توابع پنجره.
ویژگیهای بسیار جدید SQL از SQL:2016 یا SQL:2019 ممکن است شناسایی نشوند، اما باعث خراب شدن فرمتدهنده نمیشوند. فقط فرمتبندی پایه دریافت خواهید کرد.
آیا میتوانم از این برای Oracle PL/SQL یا SQL Server T-SQL استفاده کنم؟
برای پرسوجوهای پایه، بله. برای کد رویهای (بلوکهای PL/SQL، رویههای ذخیرهشده T-SQL با جریان کنترل)، فرمتبندی محدود خواهد بود. ابزار بر روی عبارات SELECT، INSERT، UPDATE، DELETE و بندهای آنها تمرکز دارد.
اگر به طور گسترده با کد رویهای خاص پایگاهداده کار میکنید، IDE بومی پایگاهداده شما (SQL Developer برای Oracle، SSMS برای SQL Server) فرمتبندی بهتری که کل نحو را درک میکند ارائه خواهد داد.
مراجع و مطالعات بیشتر
- راهنمای سبک SQL توسط سایمون هالیول - استاندارد رایج برای قراردادهای قالببندی SQL که توسط تیمهای توسعه استفاده میشود
- استاندارد SQL ISO/IEC 9075 - مشخصات رسمی بینالمللی استاندارد SQL
- مستندات نحو SQL PostgreSQL - مرجع جامع نحو SQL PostgreSQL
- مرجع Microsoft T-SQL - مستندات رسمی برای لهجه T-SQL سرور SQL
- دفترچه راهنمای مرجع MySQL - مرجع کامل دستورات SQL MySQL
شروع قالببندی SQL
SQL خوانا باعث میشود اشکالزدایی سریعتر، بررسی کد آسانتر و همکاری هموارتر شود. پرس و جوی خود را در بالا جایگذاری کنید تا آن را مطابق با ضوابط استاندارد صنعت قالببندی شده ببینید - بدون نصب، بدون پیکربندی، بدون خروج داده از مرورگر شما.