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 है जो आपके अपने डिवाइस पर चलता है। आपकी क्वेरी आपके अपने ब्राउज़र टैब के अंदर ही पढ़ी जाती है, उसकी स्पेसिंग दोबारा लिखी जाती है और आपको वापस दिखा दी जाती है — उसे कभी किसी सर्वर पर नहीं भेजा जाता, कभी स्टोर या लॉग नहीं किया जाता, और न कोई अकाउंट है न अपलोड का कोई स्टेप। इसलिए यह उन ऑफ़िस क्वेरी के लिए भी सुरक्षित है जिनमें असली टेबल के नाम, ग्राहकों का डेटा या अंदरूनी सिस्टम का ज़िक्र हो। इसका यह भी मतलब है कि एक बार लोड हो जाने के बाद पेज बिना इंटरनेट कनेक्शन के भी काम करता रहता है, इसलिए आप हवाई जहाज़ में या किसी सख़्ती से बंद कंपनी नेटवर्क के पीछे भी क्वेरी फ़ॉर्मेट कर सकते हैं।