sql - एसक्यूएल:कैसे एक क्वेरी से एक औसत गणना करने के लिए




sql-server sql-server-2012 (2)

मैं अपनी पहली पूर्णकालिक नौकरी में लगभग एक हफ्ते के लिए एसक्यूएल का उपयोग कर रहा हूं, और मैं एक क्वेरी से कुछ आंकड़ों की गणना करने की कोशिश कर रहा हूं जहां मैंने अलग-अलग तालिकाओं से कॉलम जोड़ लिया है

विशेष रूप से, मैं एक संयुक्त तालिका से औसत की गणना करने की कोशिश कर रहा हूं, जहां मैंने फिल्टर लागू किया है (या बाधाएं? मैं एसक्यूएल भाषा पर स्पष्ट नहीं हूं)।

Google पर शोध करने से, मैंने सीख लिया कि कैसे औसतन गणना करना है:

SELECT AVG(column_name) 
FROM table_name

मुझे जो समस्या आ रही है वह यह है कि यह केवल डेटाबेस में मौजूदा तालिकाओं के साथ काम करता है, न कि मैंने जो नई क्वेरी बनाई हैं

मेरे कोड का सरलीकृत संस्करण इस प्रकार है:

SELECT 
    Animal_Facts.Animal_Name, Animal_Facts.Prev_Reg_Amount, 
    Names.Given_Name, Animal_Class.Class_Description
FROM 
    Names
INNER JOIN
    Animal_Facts ON Names.Name_Key = Animal_Facts.Name_Key
INNER JOIN 
    Animal_Class ON Animal_Facts.Class_Key = Animal_Class.Class_Key

यह क्वेरी तीन तालिकाओं से चार कॉलमों को जोड़ती है, जहां Class_Description वर्णन है कि क्या पशु दूषित है, माइक्रोचिप, एक पेंशनभोगी आदि के स्वामित्व में है, और Pre_Reg_Amount पंजीकरण शुल्क का भुगतान किया जाता है।

मैं पेंशनभोगी लोगों द्वारा दिए गए औसत शुल्क को ढूंढना चाहता हूं, इसलिए तालिका को फ़िल्टर करने के लिए मैंने निम्नलिखित कोड को शामिल किया:

AND Animal_Class.Class_Description LIKE ('%pensioner%')

और फिर मैं जोड़ते हुए औसत की गणना करने के लिए:

SELECT AVG(Animal_Facts.Prev_Reg_Amount) from Animal_Facts

तो मेरा कुल कोड है:

SELECT 
    Animal_Facts.Animal_Name, Animal_Facts.Prev_Reg_Amount, 
    Names.Given_Name, Animal_Class.Class_Description
FROM 
    Names
INNER JOIN
    Animal_Facts ON Names.Name_Key = Animal_Facts.Name_Key
INNER JOIN
    Animal_Class ON Animal_Facts.Class_Key = Animal_Class.Class_Key
                 AND Animal_Class.Class_Description LIKE ('%pensioner%')

SELECT AVG(Animal_Facts.Prev_Reg_Amount) 
FROM Animal_Facts

अब यह समस्या यह है कि Excel में इस गणना को जांचने के बाद, मुझे वास्तव में पेंशनभोगी डेटा का औसत नहीं मिल रहा है, लेकिन सभी डेटा का औसत क्या एसक्यूएल में मेरी निर्मित टेबल से औसत (और अन्य आँकड़े) की गणना करने का कोई तरीका है?

नोट: मैं एक्सेल में डेटा निर्यात करके इन सभी आंकड़ों की गणना करने में सक्षम हूं, लेकिन यह अधिक समय लगता है। मैं इसके बजाय एसक्यूएल के भीतर ऐसा कैसे करना सीखूँगा


Answers

SELECT AVG(af.Prev_Reg_Amount)
FROM
    Animal_Facts af
    INNER JOIN Animal_Class ac
    ON af.Class_Key = ac.Class_Key
    AND Class_Description LIKE ('%pensioner%')

जरूरी

एसक्यूएल इंजेक्शन को रोकने का सबसे अच्छा तरीका बचने के बजाय तैयार वक्तव्यों का उपयोग करना है, क्योंकि स्वीकृत उत्तर दर्शाता है।

Aura.Sql और EasyDB जैसे पुस्तकालय हैं जो डेवलपर्स को तैयार कथनों का उपयोग आसान बनाने की अनुमति देते हैं। एसक्यूएल इंजेक्शन को रोकने में तैयार कथन बेहतर क्यों हैं, इस बारे में और जानने के लिए, इस mysql_real_escape_string() बाईपास का संदर्भ लें और हाल ही में वर्डप्रेस में यूनिकोड एसक्यूएल इंजेक्शन भेद्यताएं तय करें

इंजेक्शन रोकथाम - mysql_real_escape_string()

इन हमलों को रोकने के लिए PHP ने विशेष रूप से बनाया गया कार्य किया है। आपको केवल एक फ़ंक्शन, mysql_real_escape_string के मुंह का उपयोग करना है।

mysql_real_escape_string एक स्ट्रिंग लेता है जो एक MySQL क्वेरी में उपयोग किया जा रहा है और उसी स्ट्रिंग को सभी SQL इंजेक्शन प्रयासों से सुरक्षित रूप से बचने के प्रयासों को वापस कर देता है। असल में, यह उन परेशान उद्धरणों को प्रतिस्थापित करेगा (') उपयोगकर्ता एक MySQL- सुरक्षित विकल्प, एक बच निकला उद्धरण \ "के साथ प्रवेश कर सकता है।

नोट: इस फ़ंक्शन का उपयोग करने के लिए आपको डेटाबेस से कनेक्ट होना चाहिए!

// MySQL से कनेक्ट करें

$name_bad = "' OR 1'"; 

$name_bad = mysql_real_escape_string($name_bad);

$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
echo "Escaped Bad Injection: <br />" . $query_bad . "<br />";


$name_evil = "'; DELETE FROM customers WHERE 1 or username = '"; 

$name_evil = mysql_real_escape_string($name_evil);

$query_evil = "SELECT * FROM customers WHERE username = '$name_evil'";
echo "Escaped Evil Injection: <br />" . $query_evil;

आप MySQL - SQL इंजेक्शन रोकथाम में अधिक जानकारी प्राप्त कर सकते हैं।





sql sql-server sql-server-2012