MySQL में जब टेबल या कॉलम नाम **रिजर्व्ड वर्ड्स** (आरक्षित शब्द) हों, या विशेष कैरेक्टर/स्पेस हों, तो **बैकटिक (` `)** का उपयोग अनिवार्य है।
सिंटैक्स
SELECT * FROM `table` WHERE `where` = condition;
समस्या: रिजर्व्ड वर्ड्स बिना बैकटिक के
mysql> CREATE TABLE table (
-> where INT
-> );
ERROR 1064 (42000): You have an error in your SQL syntax...
near 'table ( where int )' at line 1
table और where दोनों MySQL रिजर्व्ड वर्ड्स हैं।
समाधान: बैकटिक के साथ
mysql> CREATE TABLE `table` (
-> `where` INT
-> );
Query OK, 0 rows affected (0.55 sec)
रिकॉर्ड डालें और क्वेरी करें
INSERT INTO `table`(`where`) VALUES(1);
INSERT INTO `table`(`where`) VALUES(100);
INSERT INTO `table`(`where`) VALUES(1000);
SELECT * FROM `table` WHERE `where` = 100;
आउटपुट:
+-------+
| where |
+-------+
| 100 |
+-------+
बैकटिक कब आवश्यक हैं?
| स्थिति | उदाहरण | आवश्यक? |
|---|---|---|
| रिजर्व्ड वर्ड | select, where, order, group, table, index | हाँ |
| स्पेस वाला नाम | `first name` | हाँ |
| विशेष कैरेक्टर | `col-name`, `col@name` | हाँ |
| संख्या से शुरू | `123col` | हाँ |
| सामान्य नाम | users, first_name, id | नहीं (लेकिन अच्छा अभ्यास) |
सामान्य रिजर्व्ड वर्ड्स (आंशिक सूची)
SELECT, INSERT, UPDATE, DELETE, WHERE, FROM, JOIN,
INNER, LEFT, RIGHT, OUTER, ON, AS, ORDER, GROUP, BY,
HAVING, LIMIT, OFFSET, TABLE, INDEX, VIEW, TRIGGER,
PROCEDURE, FUNCTION, DATABASE, SCHEMA, USER, ROLE,
GRANT, REVOKE, CREATE, DROP, ALTER, TRUNCATE,
PRIMARY, KEY, FOREIGN, REFERENCES, UNIQUE, CHECK,
NULL, NOT, AND, OR, IN, LIKE, BETWEEN, IS, EXISTS,
CASE, WHEN, THEN, ELSE, END, IF, ELSEIF, LOOP,
CURSOR, DECLARE, SET, COMMIT, ROLLBACK, START,
TRANSACTION, LOCK, UNLOCK, HANDLER, PREPARE, EXECUTE
बेस्ट प्रैक्टिस
- हमेशा बैकटिक उपयोग करें - भविष्य में नाम रिजर्व्ड वर्ड बन सकता है
- ORM/क्वेरी बिल्डर स्वचालित रूप से बैकटिक जोड़ते हैं
sql_mode=ANSI_QUOTESमें डबल कोट्स (") भी काम करते हैं- सिंगल कोट्स (') स्ट्रिंग लिटरल के लिए हैं, पहचानकर्ता के लिए नहीं
सही बनाम गलत
-- सही
SELECT `id`, `name`, `email` FROM `users` WHERE `status` = 'active';
-- काम करता है लेकिन जोखिम भरा (यदि name रिजर्व्ड बन जाए)
SELECT id, name, email FROM users WHERE status = 'active';
-- गलत: सिंगल कोट्स पहचानकर्ता के लिए नहीं
SELECT 'id', 'name' FROM 'users'; -- यह स्ट्रिंग लिटरल लौटाएगा!