SQL ফরম্যাটার ও বিউটিফায়ার
এলোমেলো একটি কোয়েরি পেস্ট করুন আর সেটি ফেরত পান পরিষ্কার ও ইনডেন্ট করা অবস্থায় — প্রতিটি ক্লজ আলাদা লাইনে, কলামগুলো সারিবদ্ধ, সাবকোয়েরি ভিতরে সরানো। অথবা মিনিফাই করুন চেপে সেটিকে এক লাইনে গুটিয়ে ফেলুন। কোটের ভিতরের টেক্সট আর আপনার কমেন্ট কখনো বদলানো হয় না। সবকিছু আপনার ব্রাউজারেই হয়, কিছুই আপলোড হয় না।
ফরম্যাটার আসলে কী বদলায়
টুলটি আপনার কোয়েরি একটি একটি করে অক্ষর পড়ে এবং সেটিকে ছোট ছোট টুকরোয় ভাগ করে — শব্দ, সংখ্যা, ব্র্যাকেট, অপারেটর, কোটের ভিতরের টেক্সট আর কমেন্ট। তারপর ঠিক সেই টুকরোগুলোই নতুন লাইন ব্রেক ও ইনডেন্ট দিয়ে আবার লিখে দেয়। টুকরোগুলো নিজে কখনো বদলানো, বাদ দেওয়া বা আগে-পিছে করা হয় না, তাই যে কোয়েরি আপনি ফেরত পান সেটি ঠিক তা-ই করে যা আপনার পেস্ট করা কোয়েরিটি করত। একমাত্র ঐচ্ছিক পরিবর্তন হলো রিজার্ভড কীওয়ার্ডের বড় বা ছোট হাতের অক্ষর, আর সেটা শুধু কীওয়ার্ডেই প্রয়োগ হয়: যে নাম আপনি কোট, ব্যাকটিক বা স্কোয়ার ব্র্যাকেটে মুড়ে দিয়েছেন সেটি আপনার দেওয়া কেসই রাখে, আর টেক্সট বা কমেন্টের ভিতরের প্রতিটি অক্ষরও তাই।
একটি হাতে-কলমে উদাহরণ
এই রইল একটি আসল কোয়েরি, যেমনটা প্রায়ই আসে — সবটা এক লাইনে, অপারেটরের দুপাশে কোনো স্পেস নেই:
select id,name,email from users u where u.active=1 and u.plan in (select plan from plans where price>0) order by name 2-স্পেস ইনডেন্ট আর বড় হাতের (UPPER) কীওয়ার্ড বেছে ফরম্যাট করুন চাপুন, আর পাবেন:
SELECT
id,
name,
email
FROM users u
WHERE u.active = 1
AND u.plan IN (
SELECT plan
FROM plans
WHERE price > 0
)
ORDER BY name
তিনটি জিনিস লক্ষ করুন। তিনটি কলামের প্রতিটি নিজের লাইন পেয়েছে, কারণ কলাম একটির বেশি। WHERE-এর
দুটি টেস্ট একটির নিচে আরেকটি রাখা হয়েছে, যাতে আলাদা করে পড়া যায়। আর ব্র্যাকেটের ভিতরের সাবকোয়েরিটি আরও এক
ধাপ ভিতরে সরে গেছে, তার বন্ধ ব্র্যাকেট ঠিক সেই লাইনের সঙ্গে সারিবদ্ধ যেটি তাকে খুলেছিল — এভাবেই এক নজরে বোঝা
যায় সেটি কোথায় শুরু আর কোথায় শেষ। একই কোয়েরিতে
মিনিফাই করুন চাপলে সেটি বরং এক লাইনে ফিরে আসে:
SELECT id, name, email FROM users u WHERE u.active = 1 AND u.plan IN (SELECT plan FROM plans WHERE price > 0) ORDER BY name কোথায় লাইন ভাঙবে, তা এটি কীভাবে ঠিক করে
| নিয়ম | এর মানে কী |
|---|---|
| শুধু ফাঁকা জায়গা বদলায় | শব্দ, সংখ্যা, যতিচিহ্ন আর ব্র্যাকেট সবই একই ক্রমে ফেরত আসে। টুলটি শুধু এদের মাঝের ফাঁকা জায়গাটুকু নতুন করে লেখে। |
| প্রতিটি ক্লজ আলাদা লাইনে | SELECT, FROM, JOIN, ON, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, UNION, INSERT INTO, VALUES, UPDATE, SET ও DELETE FROM — এদের প্রত্যেকটি নতুন লাইন থেকে শুরু হয়। |
| AND ও OR ভিতরে সরে যায় | WHERE, ON বা HAVING-এর ভিতরে প্রতিটি AND ও OR নতুন লাইনে, আরও এক ধাপ ভিতরে শুরু হয়, যাতে প্রতিটি টেস্ট আলাদা করে দেখা যায়। BETWEEN 1 AND 9-এর AND নিজের জায়গাতেই থাকে, কারণ সেটি দুটি টেস্টকে জুড়ছে না। |
| প্রতিটি কলাম নিজের লাইনে | SELECT তালিকায় একটির বেশি আইটেম থাকলে প্রতিটি আইটেম এক ধাপ ভিতরে নিজের আলাদা লাইন পায়। একটিমাত্র আইটেম SELECT-এর লাইনেই থাকে। ফাংশন কলের ভিতরের কমা, যেমন COALESCE(a, b), কখনো লাইন ভাঙে না। |
| সাবকোয়েরি ভিতরে সরে যায় | SELECT বা WITH দিয়ে শুরু হওয়া ব্র্যাকেট ইনডেন্টের নতুন একটি ধাপ খোলে, আর তার বন্ধ ব্র্যাকেট সেই লাইনের সঙ্গে সারিবদ্ধ হয় যেটি তাকে খুলেছিল। বাকি সব ব্র্যাকেট যেখানে আছে সেখানেই থাকে। |
| স্টেটমেন্টগুলো আলাদা করা হয় | সেমিকোলন একটি স্টেটমেন্ট শেষ করে। পরেরটি একটি ফাঁকা লাইনের পর আবার বাঁ দিকের কিনারা থেকে শুরু হয়, তাই কয়েকটি কোয়েরি থাকা ফাইলও পড়ার মতো থাকে। |
ফাংশন ও টাইপের নাম, যেমন COUNT, COALESCE বা VARCHAR, আপনি যে
কেসে টাইপ করেছেন সেই কেসেই রেখে দেওয়া হয়, কারণ count-এর মতো কোনো শব্দ বিল্ট-ইন ফাংশন নাকি
আপনার নিজের কোনো কলামের নাম, তা টুলটি জানতে পারে না। সেগুলো বড় হাতের অক্ষরে চাইলে ঐভাবেই টাইপ করুন,
ফরম্যাটার সেভাবেই রেখে দেবে।
SQL ক্লজের ক্রম: আপনি যা লেখেন বনাম ডেটাবেস যা করে
একটি কোয়েরি লেখা হয় এক ক্রমে, আর তার কাজ চলে সম্পূর্ণ অন্য ক্রমে। আসল ক্রমটা জানা থাকলে অনেক বিভ্রান্তিকর এরর মেসেজের মানে বোঝা যায়, তাই এটা হাতের কাছে রাখা ভালো:
| ক্লজ | আপনি কত নম্বরে লেখেন | ডেটাবেস কত নম্বরে চালায় | এটি কী করে |
|---|---|---|---|
SELECT | 1 | 6 | উত্তরে কোন কোন কলাম, বা কোন কোন হিসাব, ফেরত আসবে তা বেছে নেয়। এখানে AS দিয়ে বানানো নামগুলো কেবল এই ধাপ থেকেই অস্তিত্ব পায়। |
FROM | 2 | 1 | যে টেবিল থেকে সারিগুলো পড়া হয় তার নাম বলে। ডেটাবেস আসলে সবার আগে এই কাজটাই করে। |
JOIN … ON | 3 | 2 | দ্বিতীয় একটি টেবিল নিয়ে আসে এবং বলে দেয় তার সারিগুলো প্রথমটির সারির সঙ্গে কীভাবে মেলে। |
WHERE | 4 | 3 | পরীক্ষায় ফেল করা একক সারিগুলো বাদ দেয়। এটি যেকোনো গ্রুপিংয়ের আগে চলে, তাই এটি কোনো SUM বা COUNT দেখতে পায় না। |
GROUP BY | 5 | 4 | একই মান থাকা সব সারিকে গুটিয়ে প্রতিটি গ্রুপের জন্য একটি করে সারি বানায়, যাতে SUM, COUNT ও AVG-এর যোগ করার মতো কিছু থাকে। |
HAVING | 6 | 5 | পরীক্ষায় ফেল করা পুরো গ্রুপগুলো বাদ দেয়। সহজ নিয়ম: WHERE সারি ছাঁকে, HAVING গ্রুপ ছাঁকে। |
ORDER BY | 7 | 7 | যা বাকি থাকে তা সাজায়। এটি SELECT-এর পরে চলে বলে AS দিয়ে আপনার বানানো নাম ধরেও সাজাতে পারে। |
LIMIT / OFFSET | 8 | 8 | শুধু প্রথম কয়েকটি সারি রাখে, আর চাইলে শুরুতে কয়েকটি বাদও দিতে পারে। SQL Server-এ এটি লেখা হয় TOP বা OFFSET … FETCH দিয়ে। |
এই কারণেই SELECT price * qty AS total … WHERE total > 100 স্ট্যান্ডার্ড SQL ও বেশিরভাগ ডেটাবেসে ব্যর্থ হয় (SQLite বাড়তি সুবিধা হিসেবে এটি মেনে নেয়), কিন্তু
ORDER BY total কাজ করে। WHERE চলে ধাপ 3-এ, আর SELECT ধাপ 6-এ
গিয়ে total নামটি বানায়, তাই সেই মুহূর্তে নামটির অস্তিত্বই নেই। ORDER BY চলে
ধাপ 7-এ, অর্থাৎ তার পরে। এই কারণেই কোনো টোটাল বা কাউন্ট HAVING-এ বসে, কখনো
WHERE-এ নয়: যে গ্রুপগুলো থেকে এই সংখ্যা গোনা হয়, সেগুলো ধাপ 4-এর আগে তৈরিই হয় না।
কোন কোন ডেটাবেসে এটি কাজ করে
ফরম্যাটারটি ইচ্ছে করেই কোনো একটি প্রোডাক্টে বাঁধা না রেখে সব ডায়ালেক্টের উপযোগী করে বানানো, তাই MySQL, MariaDB,
PostgreSQL, SQL Server, SQLite, Oracle, Snowflake, BigQuery ও Redshift-এর কোয়েরি সবই ঠিকঠাক ফরম্যাট হয়। নাম
কোট করার তিনটি ধরনই বোঝা যায় — স্ট্যান্ডার্ড SQL-এর জন্য ডাবল কোট, MySQL-এর জন্য ব্যাকটিক, SQL Server-এর
জন্য স্কোয়ার ব্র্যাকেট — আর সেগুলো সরাসরি যেমন আছে তেমনই পার হয়ে যায়। ?, :name,
@name ও $1-এর মতো প্লেসহোল্ডার অক্ষত থাকে, তাই আপনার অ্যাপ্লিকেশন কোড থেকে সরাসরি
তুলে আনা কোয়েরিও ফরম্যাট করতে পারেন। টুলটি যেহেতু আপনার SQL কখনো চালানোর বা বিচার করার চেষ্টা করে না, তাই
অচেনা কোনো কীওয়ার্ড বা ফাংশন বাতিল না হয়ে হুবহু কপি হয়ে যায়।
মানুষ কখন এটি কাজে লাগায়
- লগ ফাইল, ORM ডাম্প বা স্ট্যাক ট্রেস থেকে তুলে আনা এমন কোয়েরি, যা একটা লম্বা লাইন হয়ে এসেছে।
- কোড রিভিউয়ের আগে হাতে লেখা কোয়েরি গুছিয়ে নেওয়া, যাতে রিভিউয়ার লেআউট নয়, লজিক পড়েন।
- সহকর্মীর কোয়েরি বদলানোর আগে সেটিকে পড়ার মতো করে নেওয়া।
- কনফিগ ফাইল, স্প্রেডশিটের সেল বা JSON ফিল্ডে বসানোর জন্য কোয়েরিকে এক লাইনে গুটিয়ে আনা।
- যে কোয়েরি ডেটাবেস বারবার ফিরিয়ে দিচ্ছে, তার হারানো ব্র্যাকেট বা বাড়তি কমা খুঁজে বের করা।
গোপনীয়তা
ফরম্যাটারটি পুরোপুরি আপনার নিজের ডিভাইসে চলে। আপনার SQL আপনার নিজের ব্রাউজারের ভিতরেই পড়া হয় ও নতুন করে স্পেস বসানো হয়, কখনো কোনো সার্ভারে পাঠানো হয় না, জমা বা লগ করাও হয় না — তাই আসল টেবিলের নাম আর অফিসের কোয়েরি নিয়েও এটি ব্যবহার করা নিরাপদ, এবং পেজ একবার লোড হয়ে গেলে অফলাইনেও কাজ করতে থাকে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
- ফরম্যাট করলে কি আমার কোয়েরির কাজ বদলে যায়?
- না। টুলটি শুধু আপনার কোয়েরির অংশগুলোর মাঝের ফাঁকা জায়গা নতুন করে লেখে, আর চাইলে রিজার্ভড কীওয়ার্ডগুলো বড় বা ছোট হাতের অক্ষরে বদলায়। SQL বাড়তি স্পেস, ট্যাব আর লাইন ব্রেক পুরোপুরি উপেক্ষা করে, আর কীওয়ার্ড কেস-সেনসিটিভ নয়, তাই SELECT id FROM t আর select id from t একই কোয়েরি। নামের ব্যাপারটা আলাদা: Linux-এ MySQL টেবিলের নাম t আর T-কে দুটি আলাদা টেবিল হিসেবে ধরে, সেজন্যই কেস বদলের বিকল্পটি শুধু কীওয়ার্ডের জন্য। শব্দ, সংখ্যা, ব্র্যাকেট আর যতিচিহ্ন সবসময় একই ক্রমে ফেরত আসে — টুলটি এমন একটি যাচাইয়ের ওপর তৈরি যা প্রমাণ করে যে ফরম্যাটের আগে ও পরে অংশগুলোর তালিকা হুবহু এক, তাই চুপিসারে কিছু বাদ পড়তে বা যোগ হতে পারে না।
- এটি কোন কোন SQL ডেটাবেসের সঙ্গে কাজ করে?
- এটিকে কোনো একটি ডেটাবেসে বাঁধা না রেখে সব ডায়ালেক্টের উপযোগী করে বানানো হয়েছে, তাই এটি MySQL, MariaDB, PostgreSQL, SQL Server, SQLite, Oracle, Snowflake, BigQuery ও Redshift-এর কোয়েরি সামলাতে পারে। নাম কোট করার তিনটি উপায়ই বোঝা যায়: স্ট্যান্ডার্ড SQL, PostgreSQL, Oracle ও SQLite-এর জন্য ডাবল কোট, MySQL-এর জন্য ব্যাকটিক, আর SQL Server-এর জন্য স্কোয়ার ব্র্যাকেট। যেহেতু এটি আপনার কোয়েরি কখনো চালানো বা যাচাই করার চেষ্টা করে না, তাই আগে না-দেখা কোনো কীওয়ার্ড বা ফাংশন এরর না ঘটিয়ে হুবহু পার হয়ে যায়। একটা কথা জেনে রাখুন: এটি স্ট্যান্ডার্ড নিয়ম মানে যে টেক্সটের ভিতরের কোট দুবার লেখা হয়, তাই MySQL-এর ব্যাকস্ল্যাশ এস্কেপ, যেমন ব্যাকস্ল্যাশ-কোট, সাধারণ অক্ষর হিসেবে পড়া হয়।
- কোট করা টেক্সট আর কমেন্ট কেন হুবহু আগের মতো রেখে দেওয়া হয়?
- কারণ সেগুলো বদলালে আপনার কোয়েরিই বদলে যাবে, আর কোনো ফরম্যাটারের পক্ষে কিছু ভেঙে ফেলার এটাই সবচেয়ে সহজ রাস্তা। কোটের ভিতরের কোনো টেক্সটে যদি ঘটনাচক্রে select শব্দ, একটি কমা বা ব্র্যাকেট থাকে, তবুও সেটা শুধুই টেক্সট, যা জমা রাখা হয় বা যার সঙ্গে তুলনা করা হয়, তাই সেটিকে অক্ষত থাকতেই হবে। কমেন্টের বেলাতেও একই কথা: "-- select everything" লেখা একটি নোট নোটই, কোড নয়। টুলটি কীওয়ার্ড খোঁজার আগেই কোট করা টেক্সট আর কমেন্ট চিনে নেয়, তাই তাদের ভিতরের কোনো কিছুর কেস কখনো বদলানো হয় না, একাধিক লাইনে ভাঙা হয় না, বা কলাম আলাদা করার চিহ্ন হিসেবে গোনা হয় না।
- ফরম্যাট আর মিনিফাইয়ের মধ্যে পার্থক্য কী?
- ফরম্যাট আপনার কোয়েরিকে ছড়িয়ে দেয়: প্রতিটি ক্লজ আলাদা লাইনে, প্রতিটি কলাম আলাদা লাইনে, সাবকোয়েরি ভিতরে সরানো, যাতে একজন মানুষ এক নজরে তার গড়ন বুঝতে পারেন। মিনিফাই ঠিক উল্টোটা করে, পুরো কোয়েরিকে একক স্পেস দিয়ে এক লাইনে গুটিয়ে আনে — যখন কোনো লগ লাইন, স্প্রেডশিটের সেল, JSON ফিল্ড বা লাইন ব্রেক পছন্দ না করা কোনো কনফিগ ফাইলে কোয়েরি বসাতে হয়, তখন এটা কাজে লাগে। মিনিফাইও কোট করা টেক্সট আর কমেন্ট অক্ষত রাখে। শুধু একটা জিনিস এটি এক লাইনে মেলাতে পারে না: ডাবল-ড্যাশ কমেন্ট, কারণ লাইনে তার পরের সবকিছু ডেটাবেস উপেক্ষা করে — তাই আপনার বাকি কোয়েরি বাঁচাতে ঠিক তার পরে একটি লাইন ব্রেক রেখে দেওয়া হয়।
- এটি কি আমার SQL-এর ভুল ধরে?
- আসলে না, আর এটি তেমন ভানও করে না। এটি কখনো কোনো ডেটাবেসের সঙ্গে সংযুক্ত হয় না, তাই আপনার টেবিল ও কলাম আছে কি না, বা কোয়েরিটি চলবে কি না, তা জানতে পারে না। তবে শুধু টেক্সট দেখেই যে দুটি বিষয়ে এটি নিশ্চিত হতে পারে, সেগুলো এটি দেখিয়ে দেয়: একটি গোল ব্র্যাকেট যা খোলা হয়েছে কিন্তু কখনো বন্ধ হয়নি, আর কোট করা এমন টেক্সট যার বন্ধ করার কোট নেই। দুটোই টাইপ করার সাধারণ ভুল, আর দুটোই বক্সগুলোর নিচে দেখানো হয়। এর বাইরে, কোয়েরিটিকে প্রতিটি ক্লজ আলাদা লাইনে সাজানো অবস্থায় দেখাই সাধারণত একটি বাদ পড়া কমা বা ভুল জায়গায় চলে যাওয়া শর্ত ধরার জন্য যথেষ্ট।
- আমার SQL কি কোথাও পাঠানো হয়?
- না। পুরো ফরম্যাটারটি সাধারণ JavaScript, যা আপনার নিজের ডিভাইসে চলে। আপনার কোয়েরি আপনার নিজের ব্রাউজার ট্যাবের ভিতরেই পড়া হয়, নতুন করে স্পেস বসানো হয় আর আপনাকে ফেরত দেখানো হয় — কখনো কোনো সার্ভারে পাঠানো হয় না, কখনো জমা বা লগ করা হয় না, আর কোনো অ্যাকাউন্ট বা আপলোডের ধাপও নেই। তাই আসল টেবিলের নাম, গ্রাহকের ডেটা বা অভ্যন্তরীণ সিস্টেমের উল্লেখ থাকা অফিসের কোয়েরির জন্যও এটি নিরাপদ। এর মানে এটাও যে পেজটি একবার লোড হয়ে গেলে ইন্টারনেট সংযোগ ছাড়াও কাজ করে যায়, তাই প্লেনে বসে বা কড়াকড়ি করে আটকানো কোনো অফিস নেটওয়ার্কের পেছনেও কোয়েরি ফরম্যাট করতে পারেন।