खोज…


परिचय

चयन कथन अधिकांश SQL प्रश्नों के दिल में है। यह निर्धारित करता है कि किस परिणाम सेट को क्वेरी द्वारा वापस किया जाना चाहिए, और लगभग हमेशा FROM क्लॉज के साथ संयोजन में उपयोग किया जाता है, जो यह परिभाषित करता है कि डेटाबेस के किस भाग को क्वेर किया जाना चाहिए।

वाक्य - विन्यास

  • [DISTINCT] [कॉलम 1] [, [कॉलम 2] ...] का चयन करें
    [तालिका] से
    [जहां हालत]
    [GROUP BY [column1] [, [column2] ...]

    [HAVING [column1] [, [column2] ...]

    [ASC द्वारा ORDER | DESC]

टिप्पणियों

सेलेक्ट यह निर्धारित करता है कि कौन से कॉलम का डेटा वापस लौटना है और किस क्रम में दिए गए टेबल से (यह देखते हुए कि वे आपकी क्वेरी में अन्य आवश्यकताओं से विशेष रूप से मेल खाते हैं - जहां फ़िल्टर और जोड़ होते हैं)।

SELECT Name, SerialNumber
FROM ArmyInfo

उदाहरण के लिए केवल Name और Serial Number कॉलम से परिणाम लौटाएंगे, लेकिन Rank नामक कॉलम से नहीं

SELECT *
FROM ArmyInfo

इंगित करता है कि सभी कॉलम वापस कर दिए जाएंगे। हालाँकि, कृपया ध्यान दें कि यह SELECT * का खराब अभ्यास है क्योंकि आप सचमुच एक टेबल के सभी कॉलमों को वापस कर रहे हैं।

किसी क्वेरी में सभी स्तंभों का चयन करने के लिए वाइल्डकार्ड वर्ण का उपयोग करना।

निम्नलिखित दो तालिकाओं वाले डेटाबेस पर विचार करें।

कर्मचारी तालिका:

ईद fName LName DeptId
1 जेम्स लोहार 3
2 जॉन जॉनसन 4

विभागों की तालिका:

ईद नाम
1 बिक्री
2 विपणन
3 वित्त
4 आईटी

सरल चयन कथन

* एक तालिका में सभी उपलब्ध स्तंभों का चयन करने के लिए वाइल्डकार्ड वर्ण का उपयोग किया जाता है।

जब स्पष्ट स्तंभ नामों के विकल्प के रूप में उपयोग किया जाता है, तो यह सभी तालिकाओं में सभी स्तंभों को लौटाता है जो एक क्वेरी FROM का चयन कर रहे हैं। यह प्रभाव उसके JOIN क्लॉस के माध्यम से क्वेरी एक्सेस तक पहुंचने वाली सभी तालिकाओं पर लागू होता है।

निम्नलिखित प्रश्न पर विचार करें:

SELECT * FROM Employees

यह Employees तालिका की सभी पंक्तियों के सभी क्षेत्रों को लौटाएगा:

ईद fName LName DeptId
1 जेम्स लोहार 3
2 जॉन जॉनसन 4

डॉट नोटेशन

किसी विशिष्ट तालिका से सभी मानों का चयन करने के लिए, वाइल्डकार्ड वर्ण को डॉट नोटेशन के साथ तालिका में लागू किया जा सकता है।

निम्नलिखित प्रश्न पर विचार करें:

SELECT 
    Employees.*, 
    Departments.Name
FROM 
    Employees
JOIN 
    Departments 
    ON Departments.Id = Employees.DeptId

यह Employee तालिका पर सभी क्षेत्रों के साथ एक डेटा सेट लौटाएगा, उसके बाद Departments तालिका में केवल Name फ़ील्ड:

ईद fName LName DeptId नाम
1 जेम्स लोहार 3 वित्त
2 जॉन जॉनसन 4 आईटी

उपयोग के खिलाफ चेतावनी

आमतौर पर यह सलाह दी जाती है कि उत्पादन कोड में * का उपयोग करना जहां संभव हो, से बचा जाता है, क्योंकि यह कई संभावित समस्याओं का कारण बन सकता है:

  1. अतिरिक्त आईओ, नेटवर्क लोड, मेमोरी का उपयोग, और इसी तरह, डेटाबेस इंजन रीडिंग डेटा के कारण, जिसकी आवश्यकता नहीं है और इसे फ्रंट-एंड कोड में स्थानांतरित कर रहा है। यह विशेष रूप से एक चिंता का विषय है जहां बड़े क्षेत्र हो सकते हैं जैसे कि लंबे नोट या संलग्न फाइलों को संग्रहीत करने के लिए उपयोग किया जाता है।
  2. आगे अतिरिक्त IO लोड अगर डेटाबेस को SELECT <columns> FROM <table> अधिक जटिल क्वेरी के लिए डिस्क के आंतरिक भाग को डिस्क के रूप में स्पूल करने की आवश्यकता होती है।
  3. अतिरिक्त प्रसंस्करण (और / या अधिक IO) यदि कुछ अनावश्यक कॉलम हैं:
    • डेटाबेस में गणना किए गए कॉलम जो उनका समर्थन करते हैं
    • किसी दृश्य से चुनने के मामले में, एक तालिका / दृश्य से स्तंभ जो क्वेरी ऑप्टिमाइज़र अन्यथा ऑप्टिमाइज़ कर सकता है
  4. अनपेक्षित त्रुटियों की क्षमता यदि स्तंभों को तालिका और विचारों में जोड़ा जाता है जो बाद में अस्पष्ट कॉलम नामों का परिणाम देता है। उदाहरण के लिए SELECT * FROM orders JOIN people ON people.id = orders.personid ORDER BY displayname - अगर displayname नाम का एक कॉलम कॉलम भविष्य के संदर्भ के लिए उपयोगकर्ताओं को उनके आदेशों को सार्थक नाम देने की अनुमति देने के लिए आदेश तालिका में जोड़ा जाता है तो कॉलम नाम दिखाई देगा। आउटपुट में दो बार इसलिए ORDER BY क्लॉज़ अस्पष्ट होगा जो हाल के MS SQL सर्वर संस्करणों में "अस्पष्ट कॉलम नाम" हो सकता है, और यदि इस उदाहरण में नहीं है तो आपका एप्लिकेशन कोड उस व्यक्ति का ऑर्डर नाम प्रदर्शित करना शुरू कर सकता है जहां व्यक्ति का नाम है। क्योंकि नया स्तंभ उस नाम का पहला नाम है, और इसी तरह लौटा।

जब आप उपयोग कर सकते हैं * , मन में उपरोक्त चेतावनी असर?

जबकि उत्पादन कोड में सबसे अच्छा परहेज, * जांच या प्रोटोटाइप कार्य के लिए डेटाबेस के खिलाफ मैनुअल प्रश्नों का प्रदर्शन करते समय शॉर्टहैंड के रूप में उपयोग करना ठीक है।

कभी-कभी आपके आवेदन में डिजाइन के फैसले इसे अपरिहार्य बनाते हैं (ऐसी परिस्थितियों में, tablealias.* प्राथमिकता tablealias.* सिर्फ * जहां संभव हो)।

EXISTS का उपयोग करते समय, जैसे SELECT A.col1, A.Col2 FROM A WHERE EXISTS (SELECT * FROM B where A.ID = B.A_ID) , हम बी से कोई डेटा नहीं लौटा रहे हैं। इस प्रकार एक SELECT A.col1, A.Col2 FROM A WHERE EXISTS (SELECT * FROM B where A.ID = B.A_ID) अनावश्यक और है इंजन जानता है कि B से कोई मान नहीं लौटाए जा रहे हैं, इस प्रकार * का उपयोग करने के लिए कोई प्रदर्शन हिट नहीं होता है। इसी तरह COUNT(*) ठीक है क्योंकि यह भी वास्तव में किसी भी कॉलम को वापस नहीं करता है, इसलिए केवल उन्हीं को पढ़ने और संसाधित करने की आवश्यकता होती है जो फ़िल्टरिंग उद्देश्यों के लिए उपयोग किए जाते हैं।

शर्त के साथ चयन करना

जहां क्लॉज के साथ चयन का मूल सिंटैक्स है:

SELECT column1, column2, columnN
FROM table_name
WHERE [condition]

[स्थिति] कोई भी SQL अभिव्यक्ति हो सकती है, जैसे कि, <, =, <>,> =, <=, LIKE, NOT, IN, BETWEEN इत्यादि की तुलना या तार्किक ऑपरेटरों का उपयोग करके।

निम्न कथन तालिका 'कार' से सभी कॉलम लौटाता है जहाँ स्थिति कॉलम 'READY' है:

SELECT * FROM Cars WHERE status = 'READY'

अधिक उदाहरणों के लिए WHERE और HAVING देखें।

व्यक्तिगत कॉलम चुनें

SELECT 
    PhoneNumber, 
    Email, 
    PreferredContact 
FROM Customers

यह कथन Customers तालिका की सभी पंक्तियों से PhoneNumber , Email और PreferredContact कॉलम लौटाएगा। साथ ही कॉलम उस क्रम में वापस आ जाएंगे जिसमें वे SELECT क्लॉज में दिखाई देते हैं।

परिणाम होगा:

फ़ोन नंबर ईमेल PreferredContact
3347927472 [email protected] फ़ोन
2137921892 [email protected] ईमेल
शून्य [email protected] ईमेल

यदि कई तालिकाएं एक साथ जुड़ती हैं, तो आप स्तंभ नाम से पहले तालिका नाम निर्दिष्ट करके स्तंभों का चयन कर सकते हैं: [table_name].[column_name]

SELECT 
    Customers.PhoneNumber, 
    Customers.Email, 
    Customers.PreferredContact,
    Orders.Id AS OrderId
FROM 
    Customers
LEFT JOIN 
    Orders ON Orders.CustomerId = Customers.Id

* AS OrderId अर्थ है कि Orders टेबल के Id फ़ील्ड को OrderId नामक कॉलम के रूप में वापस किया जाएगा। अधिक जानकारी के लिए स्तंभ उपनाम के साथ चयन करना देखें।

लंबी तालिका नामों के उपयोग से बचने के लिए, आप टेबल उपनामों का उपयोग कर सकते हैं। यह प्रत्येक क्षेत्र के लिए लंबी तालिका नाम लिखने के दर्द को कम करता है जिसे आप जॉइन में चुनते हैं। यदि आप सेल्फ जॉइन कर रहे हैं (एक ही टेबल के दो उदाहरणों के बीच एक जुड़ाव), तो आपको टेबल को अलग करने के लिए टेबल अलायन्स का उपयोग करना चाहिए। हम Customers c या Customers AS c तरह एक तालिका उपनाम लिख सकते हैं। यहाँ c Customers लिए एक उपनाम के रूप में काम करता है और हम यह कह सकते हैं कि आइए इस तरह से Email का चयन करें: c.Email

SELECT 
    c.PhoneNumber, 
    c.Email, 
    c.PreferredContact,
    o.Id AS OrderId
FROM 
    Customers c
LEFT JOIN 
    Orders o ON o.CustomerId = c.Id

कॉलम उपनामों का उपयोग कर चयन करें

कॉलम उपनामों का उपयोग मुख्य रूप से कोड को छोटा करने और स्तंभ नामों को अधिक पठनीय बनाने के लिए किया जाता है।

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

इसके अलावा वे कभी-कभी आवश्यक होते हैं , उदाहरण के लिए, गणना किए गए आउटपुट को नाम देने के लिए।

SQL के सभी संस्करण

उपनाम डबल कोट्स ( " ) का उपयोग करके SQL के सभी संस्करणों में बनाया जा सकता है।

SELECT 
    FName AS "First Name", 
    MName AS "Middle Name",
    LName AS "Last Name"
FROM Employees  

SQL के विभिन्न संस्करण

Microsoft SQL सर्वर में एक उपनाम बनाने के लिए आप एकल उद्धरण ( ' ), दोहरे उद्धरण चिह्नों ( " ) और वर्ग कोष्ठक ( [] ) का उपयोग कर सकते हैं।

SELECT 
    FName AS "First Name", 
    MName AS 'Middle Name',
    LName AS [Last Name]
FROM Employees  

दोनों में परिणाम होगा:

पहला नाम मध्य नाम उपनाम
जेम्स जॉन लोहार
जॉन जेम्स जॉनसन
माइकल मार्कस विलियम्स

यह कथन दिए गए नाम (एक उपनाम) के साथ FName और LName कॉलम LName । यह उपनाम के बाद AS ऑपरेटर का उपयोग करके प्राप्त किया जाता है, या कॉलम नाम के बाद सीधे उपनाम लिखता है। इसका मतलब यह है कि निम्नलिखित क्वेरी में उपरोक्त के समान परिणाम है।

SELECT 
    FName "First Name", 
    MName "Middle Name",
    LName "Last Name"
FROM Employees 
पहला नाम मध्य नाम उपनाम
जेम्स जॉन लोहार
जॉन जेम्स जॉनसन
माइकल मार्कस विलियम्स

हालांकि, स्पष्ट संस्करण (यानी, AS ऑपरेटर का उपयोग करके) अधिक पठनीय है।

यदि उपनाम में एक एकल शब्द है जो आरक्षित शब्द नहीं है, तो हम इसे एकल उद्धरण, दोहरे उद्धरण या कोष्ठक के बिना लिख सकते हैं:

SELECT 
    FName AS FirstName, 
    LName AS LastName
FROM Employees  
पहला नाम उपनाम
जेम्स लोहार
जॉन जॉनसन
माइकल विलियम्स

उदाहरण के लिए, दूसरों के बीच एमएस SQL सर्वर में उपलब्ध एक और भिन्नता है <alias> = <column-or-calculation>

SELECT FullName = FirstName + ' ' + LastName, 
       Addr1    = FullStreetAddress,
       Addr2    = TownName
FROM CustomerDetails  

जो इसके बराबर है:

SELECT FirstName + ' ' + LastName As FullName
       FullStreetAddress          As Addr1,
       TownName                   As Addr2
FROM CustomerDetails  

दोनों में परिणाम होगा:

पूरा नाम Addr1 Addr2
जेम्स स्मिथ 123 AnyStreet TOWNVILLE
जॉन जॉनसन 668 MyRoad Anytown
माइकल विलियम्स 999 उच्च अंत डॉ Williamsburgh

कुछ का उपयोग कर = बजाय As आसान, पढ़ने के लिए हालांकि कई, इस प्रारूप के खिलाफ सिफारिश जिसका मुख्य कारण यह मानक इतने व्यापक रूप से सभी डेटाबेस द्वारा समर्थित नहीं नहीं है। यह = वर्ण के अन्य उपयोगों के साथ भ्रम पैदा कर सकता है।

SQL के सभी संस्करण

इसके अलावा, यदि आपको आरक्षित शब्दों का उपयोग करने की आवश्यकता है , तो आप बचने के लिए कोष्ठक या उद्धरण का उपयोग कर सकते हैं:

SELECT
    FName as "SELECT",
    MName as "FROM",
    LName as "WHERE"
FROM Employees

SQL के विभिन्न संस्करण

इसी तरह, आप सभी अलग-अलग तरीकों से MSSQL में कीवर्ड से बच सकते हैं:

SELECT 
    FName AS "SELECT", 
    MName AS 'FROM',
    LName AS [WHERE]
FROM Employees  
चुनते हैं से कहाँ पे
जेम्स जॉन लोहार
जॉन जेम्स जॉनसन
माइकल मार्कस विलियम्स

साथ ही, एक स्तंभ उपनाम का उपयोग उसी क्वेरी के अंतिम खंड के किसी भी उपयोग किया जा सकता है, जैसे कि ORDER BY :

SELECT 
    FName AS FirstName, 
    LName AS LastName
FROM 
    Employees 
ORDER BY 
    LastName DESC

हालाँकि, आप उपयोग नहीं कर सकते हैं

SELECT
    FName AS SELECT,
    LName AS FROM
FROM 
    Employees
ORDER BY 
    LastName DESC

इन आरक्षित शब्दों ( SELECT और FROM ) FROM एक उपनाम बनाने के लिए।

यह निष्पादन पर कई त्रुटियों का कारण होगा।

क्रमबद्ध परिणामों के साथ चयन

SELECT * FROM Employees ORDER BY LName

यह कथन Employees सभी कॉलम लौटा देगा।

ईद fName LName फ़ोन नंबर
2 जॉन जॉनसन 2468101214
1 जेम्स लोहार 1 2 3 4 5 6 7 8 9 0
3 माइकल विलियम्स 1357911131
SELECT * FROM Employees ORDER BY LName DESC

या

 SELECT * FROM Employees ORDER BY LName ASC

यह कथन सॉर्टिंग दिशा बदलता है।

एक भी कई सॉर्टिंग कॉलम निर्दिष्ट कर सकता है। उदाहरण के लिए:

SELECT * FROM Employees ORDER BY LName ASC, FName ASC

यह उदाहरण LName द्वारा पहले परिणामों को सॉर्ट करेगा और फिर, उन रिकॉर्ड्स के लिए जिनके पास एक ही LName , FName द्वारा FName । यह आपको एक परिणाम देगा जो आपको एक टेलीफोन बुक में मिलेगा।

ORDER BY क्लॉज में कॉलम नाम को फिर से लिखने से बचाने के लिए, कॉलम के नंबर के बजाय इसका उपयोग करना संभव है। ध्यान दें कि कॉलम नंबर 1 से शुरू होते हैं।

SELECT Id, FName, LName, PhoneNumber FROM Employees ORDER BY 3

आप ORDER BY क्लॉज़ में एक CASE स्टेटमेंट एम्बेड कर सकते हैं।

SELECT Id, FName, LName, PhoneNumber FROM Employees ORDER BY CASE WHEN LName='Jones` THEN 0 ELSE 1 END ASC

यह शीर्ष पर "जोन्स" के LName के साथ सभी रिकॉर्ड रखने के लिए आपके परिणामों को सॉर्ट करेगा।

उन स्तंभों का चयन करें जिन्हें आरक्षित खोजशब्दों के नाम पर रखा गया है

जब एक कॉलम नाम आरक्षित कीवर्ड से मेल खाता है, तो मानक SQL के लिए आवश्यक है कि आप इसे दोहरे उद्धरण चिह्नों में संलग्न करें:

SELECT 
    "ORDER",
    ID 
FROM ORDERS

ध्यान दें कि यह स्तंभ नाम केस-संवेदी बनाता है।

कुछ DBMSes के पास नामों को उद्धृत करने का मालिकाना तरीका है। उदाहरण के लिए, SQL सर्वर इस उद्देश्य के लिए वर्ग कोष्ठक का उपयोग करता है:

SELECT 
    [Order],
    ID 
FROM ORDERS

जबकि MySQL (और MariaDB) डिफ़ॉल्ट रूप से बैकटिक्स का उपयोग करता है:

SELECT 
    `Order`,
    id 
FROM orders

रिकॉर्ड की निर्दिष्ट संख्या का चयन करना

SQL 2008 मानक वापस आने वाले रिकॉर्ड की संख्या को सीमित करने के लिए FETCH FIRST क्लॉज को परिभाषित करता है।

SELECT Id, ProductName, UnitPrice, Package 
FROM Product 
ORDER BY UnitPrice DESC
FETCH FIRST 10 ROWS ONLY

यह मानक केवल कुछ RDMS के हाल के संस्करणों में समर्थित है। अन्य प्रणालियों में वेंडर-विशिष्ट गैर-मानक सिंटैक्स प्रदान किया गया है। प्रगति OpenEdge 11.x FETCH FIRST <n> ROWS ONLY सिंटैक्स का समर्थन करता है।

इसके अतिरिक्त, FETCH FIRST <n> ROWS ONLY OFFSET <m> ROWS FETCH FIRST <n> ROWS ONLY पंक्तियों को लाने से पहले लंघन पंक्तियों की अनुमति देता है।

SELECT Id, ProductName, UnitPrice, Package 
FROM Product 
ORDER BY UnitPrice DESC
OFFSET 5 ROWS
FETCH FIRST 10 ROWS ONLY

निम्न क्वेरी SQL सर्वर और MS Access में समर्थित है:

SELECT TOP 10 Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC

MySQL या PostgreSQL में ऐसा ही करने के लिए LIMIT कीवर्ड का उपयोग किया जाना चाहिए:

SELECT Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
LIMIT 10

Oracle में एक ही साथ किया जा सकता ROWNUM :

SELECT Id, ProductName, UnitPrice, Package
FROM Product
WHERE ROWNUM <= 10
ORDER BY UnitPrice DESC    

परिणाम : 10 रिकॉर्ड

Id    ProductName               UnitPrice             Package
38    Côte de Blaye             263.50                12 - 75 cl bottles
29    Thüringer Rostbratwurst   123.79                50 bags x 30 sausgs.
9    Mishi Kobe Niku            97.00                 18 - 500 g pkgs.
20    Sir Rodney's Marmalade    81.00                 30 gift boxes
18    Carnarvon Tigers          62.50                 16 kg pkg.
59    Raclette Courdavault      55.00                 5 kg pkg.
51    Manjimup Dried Apples     53.00                 50 - 300 g pkgs.
62    Tarte au sucre            49.30                 48 pies
43    Ipoh Coffee               46.00                 16 - 500 g tins
28    Rössle Sauerkraut         45.60                 25 - 825 g cans

विक्रेता नूतन:

यह नोट करना महत्वपूर्ण है कि Microsoft SQL में TOP WHERE क्लॉज के बाद काम करता है और यदि टेबल में कहीं भी मौजूद है, तो वे निर्दिष्ट संख्या को वापस कर देंगे, जबकि ROWNUM WHERE क्लॉज के हिस्से के रूप में काम करता है, ताकि अन्य स्थितियां मौजूद न हों। तालिका की शुरुआत में निर्दिष्ट पंक्तियों की संख्या, आपको शून्य परिणाम मिलेंगे, जब दूसरों को पाया जा सकता है।

तालिका उपनाम के साथ चयन करना

SELECT e.Fname, e.LName 
FROM Employees e

कर्मचारी तालिका को सीधे नाम के बाद उपनाम 'ई' दिया जाता है। यह उन परिदृश्यों में अस्पष्टता को दूर करने में मदद करता है जहां कई तालिकाओं में समान फ़ील्ड नाम होता है और आपको उस तालिका के रूप में विशिष्ट होना चाहिए जिससे आप डेटा वापस करना चाहते हैं।

SELECT e.Fname, e.LName, m.Fname AS ManagerFirstName 
FROM Employees e 
    JOIN Managers m ON e.ManagerId = m.Id

ध्यान दें कि एक बार जब आप एक उपनाम को परिभाषित करते हैं, तो आप अब कैनोनिकल टेबल नाम का उपयोग नहीं कर सकते हैं। अर्थात,

SELECT e.Fname, Employees.LName, m.Fname AS ManagerFirstName 
FROM Employees e 
JOIN Managers m ON e.ManagerId = m.Id

एक त्रुटि फेंक देंगे।

यह ध्यान देने योग्य है कि टेबल उपनाम - अधिक औपचारिक रूप से 'रेंज चर' - INNER JOIN वजह से डुप्लिकेट कॉलम की समस्या को हल करने के लिए SQL भाषा में पेश किए गए थे। 1992 SQL मानक ने NATURAL JOIN (mySQL, PostgreSQL और Oracle में लागू किया गया था लेकिन अभी तक SQL Server में लागू नहीं) करके इस पहले के डिज़ाइन दोष को ठीक किया, जिसके परिणाम में डुप्लिकेट कॉलम नाम कभी नहीं थे। उपरोक्त उदाहरण दिलचस्प है कि तालिकाओं को विभिन्न नामों ( Id और ManagerId ) के साथ स्तंभों में शामिल किया गया है, लेकिन स्तंभों पर एक ही नाम ( LName , FName ) के साथ शामिल नहीं होना चाहिए, प्रदर्शन करने के लिए स्तंभों का नाम बदलने की आवश्यकता होती है शामिल होने से पहले :

SELECT Fname, LName, ManagerFirstName 
FROM Employees
     NATURAL JOIN
     ( SELECT Id AS ManagerId, Fname AS ManagerFirstName
       FROM Managers ) m;

ध्यान दें कि यद्यपि उपनामित / श्रेणी चर को विकृत तालिका के लिए घोषित किया जाना चाहिए (अन्यथा एसक्यूएल एक त्रुटि फेंक देगा), यह वास्तव में क्वेरी में इसका उपयोग करने के लिए कभी भी समझ में नहीं आता है।

कई तालिकाओं से पंक्तियों का चयन करें

SELECT *
FROM
    table1,
    table2
SELECT
    table1.column1,
    table1.column2,
    table2.column1
FROM
    table1,
    table2

इसे SQL में क्रॉस उत्पाद कहा जाता है यह सेट में क्रॉस उत्पाद के समान है

ये कथन एक क्वेरी में कई तालिकाओं से चयनित कॉलम लौटाते हैं।

प्रत्येक तालिका से लौटे स्तंभों के बीच कोई विशिष्ट संबंध नहीं है।

सकल कार्यों के साथ चयन करना

औसत

AVG() कुल फ़ंक्शन चयनित मानों का औसत लौटाएगा।
SELECT AVG(Salary) FROM Employees
एग्रीगेट फ़ंक्शंस को जहां क्लॉज़ के साथ जोड़ा जा सकता है।
SELECT AVG(Salary) FROM Employees where DepartmentId = 1
समूह के साथ समुच्चय कार्यों को भी समूह के साथ जोड़ा जा सकता है।

यदि कर्मचारी को कई विभाग के साथ वर्गीकृत किया गया है और हम हर विभाग के लिए औसत वेतन प्राप्त करना चाहते हैं तो हम निम्नलिखित क्वेरी का उपयोग कर सकते हैं।

SELECT AVG(Salary) FROM Employees GROUP BY DepartmentId

न्यूनतम

MIN() कुल फ़ंक्शन चयनित मानों की न्यूनतम राशि लौटाएगा।
SELECT MIN(Salary) FROM Employees

ज्यादा से ज्यादा

MAX() कुल फ़ंक्शन चयनित मानों की अधिकतम राशि लौटाएगा।
SELECT MAX(Salary) FROM Employees

गिनती

COUNT() कुल फ़ंक्शन चयनित मानों की गिनती लौटाएगा।
SELECT Count(*) FROM Employees
यह उन स्थितियों के साथ भी जोड़ा जा सकता है जहां विशिष्ट परिस्थितियों को संतुष्ट करने वाली पंक्तियों की गिनती प्राप्त करने के लिए शर्तें हैं।
SELECT Count(*) FROM Employees where ManagerId IS NOT NULL
कॉलम में मानों की संख्या प्राप्त करने के लिए विशिष्ट कॉलम भी निर्दिष्ट किए जा सकते हैं। ध्यान दें कि NULL मान को गिना नहीं गया है।
Select Count(ManagerId) from Employees
काउंट को अलग काउंट के लिए अलग कीवर्ड के साथ भी जोड़ा जा सकता है।
Select Count(DISTINCT DepartmentId) from Employees

योग

SUM() कुल फ़ंक्शन सभी पंक्तियों के लिए चुने गए मानों का योग लौटाता है।
SELECT SUM(Salary) FROM Employees

अशक्त के साथ चयन करना

SELECT Name FROM Customers WHERE PhoneNumber IS NULL

नल के साथ चयन एक अलग वाक्यविन्यास लेता है। उपयोग न करें = इसके बजाय IS NULL या IS NOT NULL उपयोग करें।

CASE के साथ चयन

जब परिणामों के लिए कुछ तर्क 'मक्खी पर' लागू करने की आवश्यकता होती है तो कोई इसे लागू करने के लिए CASE कथन का उपयोग कर सकता है।

SELECT CASE WHEN Col1 < 50 THEN 'under' ELSE 'over' END threshold
FROM TableName 

जंजीर भी हो सकती है

SELECT 
    CASE WHEN Col1 < 50 THEN 'under' 
         WHEN Col1 > 50 AND Col1 <100 THEN 'between' 
         ELSE 'over' 
    END threshold
FROM TableName 

एक भी एक और CASE बयान के अंदर CASE हो सकता है

SELECT 
    CASE WHEN Col1 < 50 THEN 'under' 
         ELSE 
            CASE WHEN Col1 > 50 AND Col1 <100 THEN Col1 
            ELSE 'over' END 
    END threshold
FROM TableName 

टेबल को लॉक किए बिना चयन करना

कभी-कभी जब रीड्स के लिए ज्यादातर (या केवल) तालिकाओं का उपयोग किया जाता है, तो इंडेक्सिंग में कोई मदद नहीं होती है और हर थोड़ी सी गिनती होती है, कोई प्रदर्शन में सुधार के लिए बिना लॉक का चयन कर सकता है।


एस क्यू एल सर्वर

SELECT * FROM TableName WITH (nolock)

माई एसक्यूएल

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM TableName;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

आकाशवाणी

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM TableName;

डीबी 2

SELECT * FROM TableName WITH UR;

UR अर्थ है "बिना पढ़े"।


यदि टेबल पर उपयोग किया जाता है जिसमें रिकॉर्ड संशोधन हो रहे हैं तो अप्रत्याशित परिणाम हो सकते हैं।

विशिष्ट चुनें (केवल अनन्य मान)

SELECT DISTINCT ContinentCode
FROM Countries;

इस क्वेरी सब वापस आ जाएगी DISTINCT (अद्वितीय, अलग) से मूल्यों ContinentCode से स्तंभ Countries तालिका

ContinentCode
ओसी
यूरोपीय संघ
जैसा
NA
ए एफ

SQLFiddle डेमो

कॉलम से कई मानों की स्थिति चुनें

SELECT * FROM Cars  WHERE status IN ( 'Waiting', 'Working' )

यह शब्दार्थ के बराबर है

SELECT * FROM Cars  WHERE ( status = 'Waiting' OR status = 'Working' )

अर्थात value IN ( <value list> ) डिसंक्शन (तार्किक OR ) के लिए एक आशुलिपि है।

पंक्ति समूहों के लिए समेकित परिणाम प्राप्त करें

विशिष्ट स्तंभ मान के आधार पर पंक्तियों की गणना:

SELECT category, COUNT(*) AS item_count
FROM item
GROUP BY category;

विभाग द्वारा औसत आय प्राप्त करना:

SELECT department, AVG(income)
FROM employees
GROUP BY department;

महत्वपूर्ण बात यह है कि केवल GROUP BY क्लॉज में निर्दिष्ट कॉलम का चयन करें या एग्रीगेट किए गए कार्यों के साथ उपयोग किया जाए।


वहाँ WHERE खंड भी साथ इस्तेमाल किया जा सकता GROUP BY , लेकिन WHERE किसी भी समूह से पहले बाहर रिकॉर्ड फिल्टर किया जाता है:

SELECT department, AVG(income)
FROM employees
WHERE department <> 'ACCOUNTING'
GROUP BY department;

यदि आपको समूहीकरण के बाद परिणामों को फ़िल्टर करने की आवश्यकता है, उदाहरण के लिए, केवल उन विभागों को देखने के लिए जिनकी औसत आय 1000 से अधिक है, तो आपको HAVING क्लॉज का उपयोग करने की आवश्यकता है:

SELECT department, AVG(income)
FROM employees
WHERE department <> 'ACCOUNTING'
GROUP BY department
HAVING avg(income) > 1000;

1 से अधिक शर्त के साथ चयन करना।

क्वेरी में और शर्तें जोड़ने के लिए AND कीवर्ड का उपयोग किया जाता है।

नाम आयु लिंग
सैम 18
जॉन 21
बॉब 22
मैरी 23 एफ
SELECT name FROM persons WHERE gender = 'M' AND age > 20;

यह लौटेगा:

नाम
जॉन
बॉब

OR कीवर्ड का उपयोग करना

SELECT name FROM persons WHERE gender = 'M' OR age < 20;

यह लौटेगा:

नाम
सैम
जॉन
बॉब

इन खोजशब्दों को और अधिक जटिल मापदंड संयोजनों के लिए संयोजित किया जा सकता है:

SELECT name
FROM persons
WHERE (gender = 'M' AND age < 20)
   OR (gender = 'F' AND age > 20);

यह लौटेगा:

नाम
सैम
मैरी


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow