खोज…
परिचय
चयन कथन अधिकांश 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 | आईटी |
उपयोग के खिलाफ चेतावनी
आमतौर पर यह सलाह दी जाती है कि उत्पादन कोड में *
का उपयोग करना जहां संभव हो, से बचा जाता है, क्योंकि यह कई संभावित समस्याओं का कारण बन सकता है:
- अतिरिक्त आईओ, नेटवर्क लोड, मेमोरी का उपयोग, और इसी तरह, डेटाबेस इंजन रीडिंग डेटा के कारण, जिसकी आवश्यकता नहीं है और इसे फ्रंट-एंड कोड में स्थानांतरित कर रहा है। यह विशेष रूप से एक चिंता का विषय है जहां बड़े क्षेत्र हो सकते हैं जैसे कि लंबे नोट या संलग्न फाइलों को संग्रहीत करने के लिए उपयोग किया जाता है।
- आगे अतिरिक्त IO लोड अगर डेटाबेस को
SELECT <columns> FROM <table>
अधिक जटिल क्वेरी के लिए डिस्क के आंतरिक भाग को डिस्क के रूप में स्पूल करने की आवश्यकता होती है। - अतिरिक्त प्रसंस्करण (और / या अधिक IO) यदि कुछ अनावश्यक कॉलम हैं:
- डेटाबेस में गणना किए गए कॉलम जो उनका समर्थन करते हैं
- किसी दृश्य से चुनने के मामले में, एक तालिका / दृश्य से स्तंभ जो क्वेरी ऑप्टिमाइज़र अन्यथा ऑप्टिमाइज़ कर सकता है
- अनपेक्षित त्रुटियों की क्षमता यदि स्तंभों को तालिका और विचारों में जोड़ा जाता है जो बाद में अस्पष्ट कॉलम नामों का परिणाम देता है। उदाहरण के लिए
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 |
ए एफ |
कॉलम से कई मानों की स्थिति चुनें
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);
यह लौटेगा:
नाम |
---|
सैम |
मैरी |