चयन करें * टैबलेन से यहां से 1


129

मैं उत्सुक हो गया हूं। इन संबंधित प्रश्नों के बीच क्या अंतर हैं:

  1. SELECT * FROM `tablename`

  2. SELECT * FROM `tablename` WHERE 1

  3. SELECT * FROM `tablename` WHERE 1=1


9
क्या टैग के लिए "बहुत संकीर्ण" ध्वज है? क्योंकि यह कई पर लागू होता है, यदि सभी नहीं, तो SQL बोलियाँ। मैं इसे अक्सर MSSQL और Oracle में भी देखता हूँ। btw एपोस्ट्रोफ क्या हैं? क्या backtick `mysql ऑब्जेक्ट नामों को उद्धृत करने के लिए उपयोग नहीं किया गया है?
मेक्शरपफेस

3
@dlikikay आप टैग्स को संपादित कर सकते हैं ...
Braiam

2
एचएम। बस क्यों नहीं ... WHERE TRUE? मुझे पता है कि (ज्यादातर SQL में, MySQL सहित) TRUE सिर्फ एक फैंसी मैक्रो है 1- लेकिन फिर भी, यह पाठक के लिए थोड़ा अधिक स्पष्ट नहीं है?

2
2 अधिकांश SQL बोलियों में अमान्य है
edc65

जवाबों:


177

MySQL में 2 और 3 समान हैं, कार्यात्मक रूप से 1 भी समान है।

where 1 ऐसा मानक नहीं है, जैसा कि अन्य ने बताया है, अन्य बोलियों में काम नहीं करेगा।

लोग जोड़ते हैं where 1या where 1 = 1कुछ whereशर्तों को आसानी से जोड़ा जा सकता है या हटाया जा सकता है / एक क्वेरी से / कुछ " and..." घटकों को जोड़कर ।

अर्थात

SELECT * FROM `tablename` WHERE 1=1
--AND Column1 = 'Value1'
AND Column2 = 'Value2'

11
और तब भी जब आप प्रोग्राम को बाद में निष्पादित करने के लिए एक स्ट्रिंग में एक क्वेरी का निर्माण कर रहे हैं, अगर आप जोड़ते WHERE 1=1हैं तो आपको ध्यान रखने की आवश्यकता नहीं होगी यदि आप जिस स्थिति को स्ट्रिंग में जोड़ने की कोशिश कर रहे हैं वह पहला है (इसलिए इसे WHEREसामने की आवश्यकता होगी ) या नहीं।
विन्सेन्ट ओलिवर रिआरा

45
6 साल के लिए प्रोग्रामिंग किया गया और ऐसा करने के बारे में कभी नहीं सोचा - धन्यवाद!
साइमनगेट्स

6
ORDER BY 1यदि आप दो या अधिक चयनित बयानों का एक संघ कर रहे हैं तो (कॉलम नामों के बजाय) @dlatikay सिंटैक्स की आवश्यकता है।
मार्क स्टीवर्ट 20

5
@SimonGates मैं 6 साल से प्रोग्रामिंग कर रहा हूं और कभी भी कुछ और करने के बारे में नहीं सोचा है
WernerCD

4
@WernerCD मुझे लगता है कि कुछ प्रकार की सूची में फ़िल्टर क्लॉज़ की एक सूची बनाना कहीं अधिक समझदार है, और फिर स्ट्रिंग उन्हें " AND "सीमांकक के रूप में शामिल करता है।
ज़ेव स्पिट्ज़

76

जैसा कि आप जानते हैं, तीनों समान परिणाम देते हैं। (एक बूलियन संदर्भ में, MySQL पूर्णांक "1" को सच मानता है - वास्तव में, कोई भी संख्या जो "0" नहीं है, उसे सच माना जाता है)।

MySQL ऑप्टिमाइज़र को क्लॉज़ में लगातार स्थितियों को हटाने के लिए स्पष्ट रूप से प्रलेखित किया जाता है WHERE:

  • लगातार स्थिति को हटाने। । ।:

    (B> = ​​5 और B = 5) या (B = 6 और 5 = 5) या (B = 7 और 5 = 6) -> B = 5 या B = 6

इसलिए, तीनों को एक ही कोड में संकलित किया जाएगा।

वे सभी कार्यात्मक रूप से समतुल्य हैं और उनमें समान प्रदर्शन विशेषताएँ होनी चाहिए।

उस ने कहा, पहले और तीसरे मानक SQL हैं। दूसरा कई डेटाबेस में बूलियन अभिव्यक्ति त्रुटि के कुछ प्रकार का कारण होगा। तो, मैं आपको सलाह दूंगा कि आप इससे बचें (मुझे यकीन नहीं है कि यह MySQL के सख्त SQL मोड में काम करता है या नहीं)।

अक्सर तीसरे का उपयोग गतिशील WHEREखंडों का निर्माण करते समय किया जाता है । यह अतिरिक्त शर्तों को जोड़ना आसान बनाता है जैसे AND <condition>कि लिंग के बारे में चिंता किए बिना AND


6
यह सब कुछ कहने के लिए एक बेहतर उत्तर है जो अन्य उत्तर करता है लेकिन महत्वपूर्ण रूप से इस अंतर को इंगित करता है कि # 2 एएनएसआई-अनुरूप नहीं है।
अंडरस्कोर_ड

16

यदि आप प्रदर्शन और परिणामों में अंतर के बारे में पूछ रहे हैं, तो कोई भी नहीं है, 2 और 3 समान हैं WHERE TRUE, और वे पहले वाले के समान परिणाम देंगे।

1 - SELECT * FROM table_name

table_name(नहीं फिल्टर) से सभी डेटा में परिणाम

2 - SELECT * FROM table_name WHERE 1

1 के रूप में मूल्यांकन किया जाएगा TRUE, इसलिए - कोई फिल्टर नहीं - हर रिकॉर्ड वापस कर दिया जाएगा।

3 - SELECT * FROM table_name where 1=1

पिछले एक के रूप में ही, 1 = 1 एक TRUEअभिव्यक्ति है, इसलिए - कोई फ़िल्टर नहीं - हर रिकॉर्ड चुना जाएगा।


14

सभी समान हैं लेकिन 2 और 3 का उपयोग आसानी से AND/ORस्थितियों को संभालने के लिए किया जाता है जैसे:

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

8

1 में, MySQL को किसी भी स्थिति का मूल्यांकन करने की आवश्यकता नहीं है।

2 और 3 में, जहां स्थिति स्थिर है और पंक्तियों के मूल्यों पर आधारित नहीं है। यह बूलियन तर्क के साथ मूल्यांकन किया जाएगा और हमेशा सच होगा।

कार्यात्मक रूप से, कोई अंतर नहीं है। आपको कोड स्पष्टता के लिए 1 चुनना चाहिए।


7

सभी समान हैं लेकिन 2 और 3 का उपयोग AND / OR स्थितियों के लिए गतिशील प्रश्न बनाने के लिए किया जाता है

sqlquery ="  SELECT * FROM `tablename` where 1 =1 "

डायनेमिक क्वेरी बनाने के लिए हम 2 और 3 प्रारूप का उपयोग करते हैं इसलिए हम पहले से ही जानते हैं कि "जहां" कीवर्ड जोड़ा जाता है और हम अधिक फिल्टर जोड़ते रहते हैं। पसंद

sqlquery  = sqlquery + "and columna =a"
"AND columna =a " then

कुछ पंक्तियों के बाद यदि हमारे पास नए फिल्टर हैं तो हम "AND coulmnb = b" इत्यादि जोड़ते हैं

आपको उस खोजशब्द के लिए sql क्वेरी की जाँच करने की ज़रूरत नहीं है जहाँ उसके पहले या प्रारंभिक क्वेरी में रखा गया है

SELECT * FROM `tablename` WHERE 1=1 AND (columnname1 = 'Value' OR columnname2 = 'Value')

नहीं तो हम लिख सकते हैं sqlquery = "SELECT * FROM tablename"

फिर

अगर वहाँ कोई 'जहाँ' sqlquery तब खंड है

sqlquery  = sqlquery + "where columna =a"

अन्य

sqlquery  = sqlquery + "and columna =a"

4 प्रमुख स्थान एक कोड ब्लॉक को दर्शाते हैं। कृपया अपने उत्तर को ठीक से प्रारूपित करने के लिए संपादित करें, और सम्पूर्ण मार्काड प्रारूपण बाइबिल के लिए संपादन सहायता देखें ।
मैथ्यू गुइंडन

4

वे सभी एक ही उत्तर का उत्पादन करते हैं। हालाँकि जिस तरह से 2 और 3 लिखा जाता है, वह अधिकतर "जहाँ" कथन का नियंत्रण रखने के लिए होता है, इसलिए इसे जोड़ना या बाद में हटाना आसान हो जाएगा।

मुझे लगता है कि पहला और तीसरा तरीका इसे लिखने का उचित तरीका है। यदि आपको एक कथन की आवश्यकता है जहाँ आप संख्या 3 में पसंद करते हैं अन्यथा नंबर 1 काफी अच्छा होगा।


3

MS SQL 1 और 3 में समान हैं, हालाँकि, विकल्प 2 काम नहीं करेगा, विकल्प 2 MS SQL के रूप में एक अमान्य कथन है, जहाँ कुछ मानों की तुलना करने के लिए WHERE का उपयोग किया जाता है। उदाहरण के लिए:

  1. * MyTable जहाँ से ID = 3 (वैध) चुनें *
  2. * MyTable में से * सेलेक्ट करें * 1 = 1 के जैसा ही है।

2
  1. सेलेक्ट * FROM table_name : यह आपको किसी भी स्टेटमेंट को चलाने के साथ टेबल के सभी रिकॉर्ड देगा।
  2. सेलेक्ट करें * FROM table_name WHERE 1 : यह वह जगह है जहाँ स्थिति हमेशा सही होती है, इसका उपयोग ज्यादातर हैकर द्वारा किसी भी सिस्टम में करने के लिए किया जाता है। यदि आपने 2 और 3 की तुलना में sql इंजेक्शन के बारे में सुना है तो ऐसे परिदृश्य हैं जिन्हें हैकर द्वारा टेबल के सभी रिकॉर्ड प्राप्त करने के लिए मजबूर किया जाता है।
  3. सेलेक्ट * FROM table_name जहाँ 1 = 1 : यह आपको टेबल के सभी रिकॉर्ड देगा लेकिन यह जहाँ कथन की तुलना करेगा और फिर आगे बढ़ेगा, यह मूल रूप से इसके बाद और स्टेटमेंट जोड़ने या हटाने के लिए जोड़ा गया है।

1

परिणाम - सभी तीन प्रश्नों के लिए सारणी के बजाय निर्दिष्ट तालिका में सभी रिकॉर्ड देता है

SELECT * FROM tablename WHERE 1- इस उत्तर की जाँच करें

SELECT * FROM tablename WHERE 1=1- इस उत्तर की जाँच करें

WHERE क्लॉज ऑप्टिमाइज़ेशन के बारे में अधिक जानकारी के लिए इन्हें देखें: MYSQL , SQLite , SQL

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.