अध्याय 01 क्वेरी और SQL फ़ंक्शन
“कोई भी अनोखी छवि जिसकी आप कल्पना करते हैं, शायद पहले से ही इंटरनेट पर या किसी डेटाबेस में मौजूद है… आज की समस्या यह नहीं रही कि सही छवि कैसे बनाई जाए, बल्कि यह है कि पहले से मौजूद छवि को कैसे खोजा जाए”
— लेव मैनोविच
1.1 परिचय
कक्षा ग्यारह में हमने डेटाबेस की अवधारणाओं को समझा और MySQL का उपयोग करके डेटाबेस बनाना सीखा। हमने यह भी सीखा कि SQL क्वेरीज़ का उपयोग करके डेटाबेस में डेटा को कैसे भरा, हेरफेर किया और प्राप्त किया जाए।
इस अध्याय में हम कुछ और SQL कमांड सीखने जा रहे हैं जो डेटाबेस में विभिन्न प्रश्नों को करने के लिए आवश्यक हैं। हम समझेंगे कि सिंगल रो फंक्शन, मल्टीपल रो फंक्शन, रिकॉर्�्ड्स को आरोही या अवरोही क्रम में व्यवस्थित करना, किसी मानदंड के आधार पर रिकॉर्ड्स को समूहित करना और SQL का उपयोग करके कई टेबलों पर कार्य करना कैसे किया जाता है।
आइए एक CARSHOWROOM नामक डेटाबेस बनाएं, जिसकी स्कीमा चित्र 1.1 में दिखाई गई है। इसमें निम्नलिखित चार संबंध हैं:
- INVENTORY: शोरूम के इन्वेंटरी में मौजूद प्रत्येक कार का नाम, मूल्य, मॉडल, निर्माण वर्ष और ईंधन प्रकार संग्रहीत करता है,
- CUSTOMER: प्रत्येक ग्राहक की ग्राहक आईडी, नाम, पता, फोन नंबर और ईमेल संग्रहीत करता है,
- SALE: बिक्री की चालान संख्या, कार आईडी, ग्राहक आईडी, बिक्री तिथि, भुगतान का तरीका, बिक्री कर्मचारी की आईडी और बेची गई कार की बिक्री मूल्य संग्रहीत करता है,
- EMPLOYEE: शोरूम में प्रत्येक कर्मचारी की कर्मचारी आईडी, नाम, जन्म तिथि, शामिल होने की तिथि, पद और वेतन संग्रहीत करता है।
चित्र 1.1: डेटाबेस CARSHOWROOM का स्कीमा आरेख
चार संबंधों के रिकॉर्ड क्रमशः तालिकाओं $1.1,1.2,1.3$ और 1.4 में दिखाए गए हैं।
तालिका 1.1 Inventory
mysql>SELECT * FROM INVENTORY;
| Carld | CarName | Price | Model | YearManufacture | Fueltype |
|---|---|---|---|---|---|
| D001 | कार 1 | 582613.00 | LXI | 2017 | पेट्रोल |
| D002 | कार 1 | 673112.00 | VXI | 2018 | पेट्रोल |
| B001 | कार 2 | 567031.00 | सिग्मा 1.2 | 2019 | पेट्रोल |
| B002 | कार 2 | 647858.00 | डेल्टा 1.2 | 2018 | पेट्रोल |
| E001 | कार 3 | 355205.00 | 5 STR STD | 2017 | CNG |
| E002 | कार 3 | 654914.00 | CARE | 2018 | CNG |
| S001 | कार 4 | 514000.00 | LXI | 2017 | पेट्रोल |
| S002 | कार 4 | 614000.00 | VXI | 2018 | पेट्रोल |
8 पंक्तियाँ सेट में (0.00 सेकंड)
तालिका 1.2 CUSTOMER
mysql>SELECT * FROM CUSTOMER;
| CustId | CustName | CustAdd | Phone | |
|---|---|---|---|---|
| C0001 | अमित साहा | L-10, पीतमपुरा | 4564587857 | $\text{amitsaha2@mail.com}$ |
| C0002 | रेहनुमा | J-12, साकेत | 5527688761 | $\text{rehnuma@hotmail.com}$ |
| C0003 | चार्वी नायर | 10/9, FF, रोहिणी | 6811635425 | $\text{charvi123@yahoo.com}$ |
| C0004 | गुरप्रीत | A-10/2, SF, मयूर विहार | 3511056125 | $\text{gursingh@yahoo.com}$ |
4 rows in set $(0.00 \mathrm{sec})$
mysql>SELECT * FROM SALE;
तालिका 1.3 SALE
| InvoiceNo | CarId | CustId | SaleDate | PaymentMode | EmpID | SalePrice |
|---|---|---|---|---|---|---|
| I00001 | D001 | c0001 | 2019-01-24 | credit card | E004 | 613247.00 |
| I00002 | s001 | c0002 | 2018-12-12 | online | E001 | 590321.00 |
| I00003 | s002 | c0004 | 2019-01-25 | I Cheque | E010 | 604000.00 |
| I00004 | D002 | c0001 | 2018-10-15 | Bank Finance | E007 | 659982.00 |
| I00005 | E001 | c0003 | 2018-12-20 | Credit card | E002 | 369310.00 |
| I00006 | s002 | c0002 | 2019-01-30 | Bank Finance | E007 | 620214.00 |
6 rows in set $(0.00 \mathrm{sec})$
mysql>SELECT * FROM EMPLOYEE;
तालिका 1.4 EMPLOYEE
| EmpId | Emp Name | DOB | DOJ | Designation | Salary |
|---|---|---|---|---|---|
| E001 | Rushi | 1994-07-10 | 2017-12-12 | Sal esman | 25550 |
| E0O2 | Sanjay | 1990-03-12 | 2016-06-05 | Sal esman | 33100 |
| E0O3 | Zohar | 1975-08-30 | 1999-01-08 | Peon | 20000 |
| E004 | Arpit | 1989-06-06 | 2010-12-02 | Sal esman | 39100 |
| E006 | Sanjucta | 1985-11-03 | 2012-07-01 | Receptionist | 27350 |
| E007 | Mayank | 1993-04-03 | 2017-01-01 | Sal es man | 27352 |
| E010 | Raj kumar | 1987-02-26 | 2013-10-23 | Sal es man | 31111 |
1.2 SQL में फंक्शन
हम जानते हैं कि एक फंक्शन किसी विशेष कार्य को करने के लिए उपयोग किया जाता है और यह परिणामस्वरूप शून्य या अधिक मान लौटाता है। SQL क्वेरी लिखते समय भी फंक्शन उपयोगी होते हैं। फंक्शन किसी टेबल के एक या अनेक रिकॉर्ड (पंक्तियों) पर काम करने के लिए लगाए जा सकते हैं। एक या अनेक पंक्तियों में उनके उपयोग के आधार पर, SQL फंक्शनों को सिंगल रो फंक्शन और एग्रीगेट फंक्शन के रूप में वर्गीकृत किया गया है।
1.2.1 सिंगल रो फंक्शन
इन्हें स्केलर फंक्शन भी कहा जाता है। सिंगल रो फंक्शन एक एकल मान पर लागू होते हैं और एक एकल मान लौटाते हैं। चित्र 1.2 तीन श्रेणियों—संख्यात्मक (गणित), स्ट्रिंग, दिनांक और समय—के अंतर्गत विभिन्न सिंगल रो फंक्शनों की सूची देता है।
गणित फंक्शन इनपुट के रूप में संख्यात्मक मान लेते हैं और परिणामस्वरूप संख्यात्मक मान लौटाते हैं। स्ट्रिंग फंक्शन इनपुट के रूप में वर्ण मान लेते हैं और आउटपुट के रूप में वर्ण या संख्यात्मक मान लौटाते हैं। दिनांक और समय फंक्शन इनपुट के रूप में दिनांक और समय मान लेते हैं और आउटपुट के रूप में संख्यात्मक या स्ट्रिंग, या दिनांक और समय मान लौटाते हैं।
चित्र 1.2: SQL में सिंगल रो फंक्शनों की तीन श्रेणियाँ
(A) संख्यात्मक फंक्शन
तीन सामान्यतः प्रयुक्त संख्यात्मक फंक्शन POWER(), ROUND() और MOD() हैं। इनका उपयोग और सिंटैक्स तालिका 1.5 में दिया गया है।
तालिका 1.5 गणित फंक्शन
| फलन | विवरण | उदाहरण सहित आउटपुट |
|---|---|---|
| POWER(X,Y) इसे POW(X,Y) भी लिखा जा सकता है | $\mathrm{X}$ को घात Y पर गणना करता है। | mysql>SELECT POWER $(2,3)$; आउटपुट: 8 |
| ROUND(N,D) | संख्या $N$ को $D$ दशमलव स्थानों तक राउंड करता है। नोट: यदि $D=0$ है, तो यह संख्या को निकटतम पूर्णांक तक राउंड करता है। |
mysql>SELECT ROUND(2912.564, 1); आउटपुट: 2912.6 mysql> SELECT ROUND(283.2); आउटपुट: 283 |
| $\operatorname{MOD}(\mathrm{A}, \mathrm{B})$ | संख्या A को संख्या B से विभाजित करने के बाद शेषफल लौटाता है। | mysql>SELECT $\operatorname{MOD}(21,2)$; आउटपुट: 1 |
उदाहरण 1.1
बिक्री बढ़ाने के लिए, मान लीजिए कार डीलर अपने ग्राहकों को कुल राशि को 10 आसान ईएमआई (समान मासिक किस्तों) में चुकाने की पेशकश करने का निर्णय लेता है। मान लीजिए कि ईएमआई 10,000 के गुणकों में होनी चाहिए। इसके लिए, डीलर इन्वेंटरी तालिका से निम्नलिखित डेटा के साथ CarID और Price सूचीबद्ध करना चाहता है:
a) GST की गणना Price का $12 %$ के रूप में करें और परिणाम को एक दशमलव स्थान तक राउंड करके प्रदर्शित करें। mysql> SELECT ROUND(12/100*Price,1) “GST” FROM INVENTORY;
| GST |
|---|
| 69913.6 |
| 80773.4 |
| 68043.7 |
| 77743.0 |
| 42624.6 |
| 78589.7 |
| 61680.0 |
| 73680.0 |
b) इन्वेंटरी तालिका में एक नया कॉलम FinalPrice जोड़ें, जिसका मान Price और $12 %$ GST के योग के रूप में होगा।
mysq|>SELECT * FROM I NVENTORY;ADD FinalPrice Numeric(10,1);
Query OK, 8 rows affected (0.03 sec)
रिकॉर्ड्स: 8 डुप्लिकेट्स: 0 चेतावनियाँ: 0
mysql> UPDATE INVENTORY SET
FinalPrice=Price+Round(Price*12/100,1);
Query OK, 8 पंक्तियाँ प्रभावित (0.01 sec)
पंक्तियाँ मिलीं: 8 बदली गईं: 8 चेतावनियाँ: 0
mysql> SELECT * FROM INVENTORY;
| CarId | CarName | Price | Model | YearManufacture | Fuel Type | Final Pric |
|---|---|---|---|---|---|---|
| D001 | कार 1 | 582613.00 | LXI | 2017 | पेट्रोल | 652526.6 |
| D002 | कार 1 | 673112.00 | VXI | 2018 | पेट्रोल | 753885.4 |
| B001 | कार 2 | 567031.00 | सिग्मा 1.2 | 2019 | पेट्रोल | 635074.7 |
| B002 | कार 2 | 647858.00 | डेल्टा 1.2 | 2018 | पेट्रोल | 725601.0 |
| E001 | आई कार 3 | 355205.00 | 5STR STD | 2017 | CNG | 397829.6 |
| E002 | आई कार 3 | 654914.00 | CARE | 2018 | CNG | 733503.7 |
| S001 | कार 4 | 514000.00 | LXI | 2017 | पेट्रोल | 575680.0 |
| 5002 | कार 4 | 614000.00 | VXI | 2018 | पेट्रोल | 687680.0 |
8 पंक्तियाँ सेट में $(0.00 \mathrm{sec})$
c) प्रत्येक महीने देय राशि की गणना करें और प्रदर्शित करें (1000 के गुणकों में), जिसकी गणना कार की FinalPrice को 10 किस्तों में विभाजित करने के बाद की जानी है।
d) राशि को EMIs में विभाजित करने के बाद, मॉड्यूलर डिवीज़न करके तुरंत देय शेष राशि ज्ञात करें।
उपरोक्त समस्याओं को हल करने के लिए निम्न SQL क्वेरी का उपयोग किया जा सकता है:
mysql> select Carld, Finalprice, ROUND( (Finalprice-
MOD(FinalPrice, 10000)/(10,0) “EMI “, MOD(FinalPrice, 10000) “Remaining Amount " FROM I NVENTORY:
| कारआईडी | अंतिम मूल्य | ईएमआई | शेष राशि |
|---|---|---|---|
| D001 | 652526.6 | 65000 | 2526.6 |
| D002 | 753885.4 | 75000 | 3885.4 |
| B001 | 635074.7 | 63000 | 5074.7 |
| B002 | 725601.0 | 72000 | 5601.0 |
| E001 | 397829.6 | 39000 | 7829.6 |
| E002 | 733503.7 | 73000 | 3503.7 |
| S001 | 575680.0 | 57000 | 5680.0 |
| S002 | 687680.0 | 68000 | 7680.0 |
उदाहरण 1.2
a) आइए अब SALE टेबल में एक नया कॉलम Commission जोड़ें। कॉलम Commission की कुल लंबाई 7 होनी चाहिए जिसमें 2 दशमलव स्थान हों।
mysql> ALTER TABLE SALE ADD(Commission Numeric $(7,2))$;
Query OK, 6 rows affected $(0.34 \mathrm{sec})$
Records: 6 Duplicates: O Warnings: 0
b) आइए अब बिक्री एजेंटों के लिए कमीशन की गणना SalePrice का 12 प्रतिशत के रूप में करें, नव जोड़े गए कॉलम Commission में मान डालें और फिर SALE टेबल के उन रिकॉर्ड्स को प्रदर्शित करें जहाँ commission $>73000$ है।
mysql> UPDATE SALE SET
Commission $=12 / 100 *$ SalePrice;
Query OK, 6 rows affected $(0.06 \mathrm{sec})$
Rows matched: 6 Changed: 6 Warnings: 0
mysql> SELECT * FROM SALE WHERE Commission > 73000;
| invoiceno | carid | custid | saledate | paymentmode | empid | saleprice | Commission |
|---|---|---|---|---|---|---|---|
| I00001 | D001 | C0001 | 2019-01-24 | Credit Card | E004 | 613247.00 | 73589.64 |
| I0000 | D002 | C0001 | 2018-10-15 | Bank Finance | E007 | 659982.00 | 79197.84 |
| I00006 | S002 | C0002 | 2019-01-30 | Bank Finance | E007 | 620214.00 | 74425.68 |
c) InvoiceNo, SalePrice और Commission प्रदर्शित करें जिससे कि कमीशन मान 0 तक राउंड हो।
mysql > SELECT InvoiceNo, SalePrice, Round(Commission, 0) FROM SALE;
| I00001 | 613247.00 | 73590 |
|---|---|---|
| I00002 | 590321.00 | 70839 |
| I00003 | 604000.00 | 72480 |
| I00004 | 659982.00 | 79198 |
| I00005 | 369310.00 | 44317 |
| I00006 | 620214.00 | 74426 |
गतिविधि 1.1
CARSHOWROOM डेटाबेस की SALE तालिका का उपयोग करते हुए, निम्नलिखित के लिए SQL क्वेरीज़ लिखें:
a) InvoiceNo और शून्य दशमलव स्थानों तक राउंड किया गया कमीशन मान प्रदर्शित करें।
b) उन SALE के विवरण प्रदर्शित करें जहाँ भुगतान मोड क्रेडिट कार्ड है।
(B) स्ट्रिंग फंक्शन्स
स्ट्रिंग फंक्शन्स अल्फान्यूमेरिक डेटा पर विभिन्न संचालन कर सकते हैं जो एक तालिका में संग्रहीत हैं। इनका उपयोग केस बदलने (अपरकेस से लोअरकेस या इसके विपरीत), सबस्ट्रिंग निकालने, स्ट्रिंग की लंबाई गणना करने आदि के लिए किया जा सकता है। स्ट्रिंग फंक्शन्स और उनके उपयोग को तालिका 1.6 में दिखाया गया है।
तालिका 1.6 स्ट्रिंग फंक्शन्स
| फंक्शन | विवरण | उदाहरण सह आउटपुट |
|---|---|---|
| UCASE(string) OR UPPER(string) |
स्ट्रिंग को अपरकेस में बदलता है। | mysqI > SELECT UCASE( “Informatics Practices”): Output: I NFORMATICS PRACTICES |
| LOWER(string) OR LCASE(string) |
स्ट्रिंग को लोअरकेस में बदलता है। | mysql > SELECT LOWER( “Informatics Practices”): Output: informatics practices |
| MID(string, pos, n) OR SUBSTRING(string, pos, n) OR SUBSTR(string, pos, n) |
स्ट्रिंग के निर्दिष्ट स्थान (pos) से शुरू होकर आकार $n$ का उप-स्ट्रिंग लौटाता है। यदि $n$ निर्दिष्ट नहीं है, तो यह स्थान pos से स्ट्रिंग के अंत तक का उप-स्ट्रिंग लौटाता है। | mysql> SELECT MID(“Informatics”, 3, 4); Output:form mysql>SELECT MID(‘Informatics’,7); Output: atics |
| LENGTH(string) | निर्दिष्ट स्ट्रिंग में वर्णों की संख्या लौटाता है। | mysqI > SELECT LENGTH( “Informatics”); Output: 11 |
| LEFT(string, N) | स्ट्रिंग के बाईं ओर से $N$ संख्या के वर्ण लौटाता है। | mysql > SELECT LEFT( “Computer”, 4$) ;$ Output: Comp |
| RIGHT(string, N) | स्ट्रिंग के दाईं ओर से $N$ संख्या के वर्ण लौटाता है। | mysqI> SELECT RIGHT(“SCIENCE”, 3 ); Output: NCE |
| INSTR(string, substring) | दी गई स्ट्रिंग में उप-स्ट्रिंग की पहली उपस्थिति का स्थान लौटाता है। यदि उप-स्ट्रिंग स्ट्रिंग में मौजूद नहीं है तो 0 लौटाता है। | mysql > SELECT INSTR( “Informatics”, “ma”): Output: 6 |
| LTRIM(string) | अग्रस्थ (leading) सफेद स्थान वर्णों को हटाने के बाद दी गई स्ट्रिंग लौटाता है। | mysql>SELECT LENGTH(“DELHI”), LENGTH(LTRIM(“ DELHI”)); Output: |
| RTRIM(string) | अनुस्थ (trailing) सफेद स्थान वर्णों को हटाने के बाद दी गई स्ट्रिंग लौटाता है | mysql>SELECT LENGTH(“PEN “) LENGTH(RTRIM(“PEN “)); Output: |
| TRIM(string) | अग्रस्थ और अनुस्थ दोनों सफेद स्थान वर्णों को हटाने के बाद दी गई स्ट्रिंग लौटाता है | mysql> SELECT LENGTH(“ MADAM “),LENGTH(TRIM(“ MADAM “)); Output: |
उदाहरण 1.3
आइए CUSTOMER संबंध का उपयोग करें जो तालिका 1.2 में दिखाया गया है ताकि स्ट्रिंग फ़ंक्शनों के काम को समझा जा सके।
a) तालिका CUSTOMER से ग्राहक नाम को लोअर केस और ग्राहक ईमेल को अपर केस में प्रदर्शित करें।
mysql > SELECT LOWER(CustName), UPPER(Email) FROM CUSTOMER;
| LOWER(CustName) | UPPER(Email) |
|---|---|
| amitsaha | $\text{AMITSAHA2@GMAIL.COM}$ |
| rehnuma | $\text{REHNUMA@HOTMAIL.COM}$ |
| charvinayyar | $\text{CHARVI123@YAHOO.COM}$ |
| gurpreet | $\text{GURSINGH@YAHOO.COM}$ |
गतिविधि 1.2
CARSHOWROOM डेटाबेस की तालिका INVENTORY का उपयोग करते हुए, निम्नलिखित के लिए SQL क्वेरीज़ लिखें:
a) यदि CarMake का मान अक्षर ’ $\mathrm{B}$ ’ से शुरू होता है तो उसे अपरकेस में बदलें।
b) यदि कार के मॉडल की लंबाई 4 से अधिक है तो Model विशेषता से स्थिति 3 से अंत तक सबस्ट्रिंग प्राप्त करें।
b) ईमेल की लंबाई और ईमेल आईडी से ’ $a$ ’ वाले वर्ण से पहले वाला भाग प्रदर्शित करें। ध्यान दें - ’ $a$ ’ को प्रिंट न करें।
mysql > SELECT LENGTH(Email), LEFT(Email, INSTR(Email,”@”)-1) FROM CUSTOMER;
| LENGTH(Email) | LEFT(Email, INSTR(Email,”@")-1) |
|---|---|
| 19 | amitsaha2 |
| 19 | rehnuma |
| 19 | charvi123 |
| 19 | gur_singh |
4 पंक्तियाँ सेट में $(0.03 \mathrm{sec})$
INSTR फ़ंक्शन ईमेल पते में " $a$ " की स्थिति लौटाएगा। इसलिए “@” के बिना ईमेल आईडी प्रिंट करने के लिए हमें स्थिति - 1 का उपयोग करना होगा।
गतिविधि 1.3
CARSHOWROOM डेटाबेस की EMPLOYEE टेबल का उपयोग करते हुए, निम्नलिखित के लिए SQL क्वेरीज़ लिखें:
a) कर्मचारी का नाम और उसके EmpId के अंतिम 2 अक्षर प्रदर्शित करें।
b) कर्मचारी का पदनाम और पदनाम में ’ $\mathrm{e}$ ’ अक्षर की स्थिति प्रदर्शित करें, यदि मौजूद हो।
c) मान लें कि चार अंकों का क्षेत्र कोड मोबाइल नंबर में स्थिति संख्या 3 से शुरू होकर दिखाई देता है। उदाहरण के लिए, 4726309212 मोबाइल नंबर का क्षेत्र कोड 2630 है। अब, Rohini में रहने वाले ग्राहक का क्षेत्र कोड प्रदर्शित करने के लिए SQL क्वेरी लिखें।
mysql> SELECT MID(Phone, 3,4) FROM CUSTOMER WHERE Custadd like ‘%Rohini %’ ;
| MID(Phone,3,4) |
|---|
| 1163 |
1 row in set (0.00 sec)
d) ग्राहकों के ईमेल से डोमेन नाम एक्सटेंशन “.com” हटाकर ईमेल प्रदर्शित करें। mysql> SELECT TRIM( “. com” from Email) FROM CUSTOMER;
| TRIM(".com" FROM Email) |
|---|
| amitsaha2@gmail |
| rehnuma@hotmail |
| charvi123@yahoo |
| gur_singh@yahoo |
4 rows in set (0.00 sec)
e) केवल yahoo ईमेल वाले सभी ग्राहकों के विवरण प्रदर्शित करें।
mysql> SELECT * FROM CUSTOMER WHERE Email LIKE
“%yahoo%” ;
| Cust I D | Cust Name | CustAdd | Phone | E ma i I |
|---|---|---|---|---|
| C0OO3 | Charvi Nayyar | $10 / 9$, FF, Rohini | 6811635425 | $\text{charvi123@yahoo.com}$ |
| COOO4 | Gurpreet | A- $10 / 2, S F$, MayurVihar | 3511056125 | $\text{gursingh@yahoo.com}$ |
2 rows in set (0.00 sec)t
(C) दिनांक और समय फंक्शन
विभिन्न फंक्शन होते हैं जो दिनांक और समय डेटा पर संचालन करने के लिए उपयोग किए जाते हैं। कुछ संचालनों में वर्तमान दिनांक दिखाना, दिनांक के प्रत्येक तत्व (दिन, माह और वर्ष) को निकालना, सप्ताह का दिन दिखाना आदि शामिल हैं। तालिका 1.7 विभिन्न दिनांक और समय फंक्शनों को समझाती है।
तालिका 1.7 दिनांक फंक्शन
| फंक्शन | विवरण | उदाहरण सहित आउटपुट |
|---|---|---|
| NOW() | यह वर्तमान सिस्टम दिनांक और समय लौटाता है। | mysql > SELECT NOW(); आउटपुट: 2019-07-11 19:41:17 |
| DATE() | यह दी गई दिनांक/समय अभिव्यक्ति से दिनांक भाग लौटाता है। | mysql> SELECT DATE(NOW()); आउटपुट: 2019-07-11 |
| MONTH(date) | यह दिनांक से माह को संख्यात्मक रूप में लौटाता है। | mysql > SELECT MONTH(NOW()); आउटपुट: 7 |
| MONTHNAME(date) | यह निर्दिष्ट दिनांक से माह का नाम लौटाता है। | mysqI > SELECT MONTHNAME(“2003-11-28”) आउटपुट: November |
| YEAR(date) | यह दिनांक से वर्ष लौटाता है। | mysql> SELECT YEAR( “2003-10-03”); आउटपुट: 2003 |
| DAY(date) | यह दिनांक से दिन भाग लौटाता है। | mysql> SELECT DAY(“2003-03-24”); आउटपुट: 24 |
| DAYNAME(date) | यह दिनांक से दिन का नाम लौटाता है। | mysqI > SELECT DAYNAME(“2019-07-11”) आउटपुट: Thursday |
उदाहरण 1.4
आइए CARSHOWROOM डेटाबेस की EMPLOYEE तालिका का उपयोग करके कुछ दिनांक और समय फंक्शनों के कार्य को दिखाते हैं।
a) सभी कर्मचारियों के जुड़ने का दिन, माह संख्या और वर्ष चुनें।
mysql > SELECT DAY(DOJ), MONTH(DOJ), YEAR(DOJ) FROM EMPLOYEE;
| DAY(DOJ) | MONTH(DOJ) | YEAR(DOJ) |
|---|---|---|
| 12 | 12 | 2017 |
| 5 | 6 | 2016 |
| 8 | 1 | 1999 |
| 2 | 12 | 2010 |
| 1 | 7 | 2012 |
| 1 | 1 | 2017 |
| 23 | 10 | 2013 |
7 rows in set (0.03 sec)
गतिविधि 1.4
CARSHOWROOM डेटाबेस की EMPLOYEE टेबल का उपयोग करते हुए, उन सभी कर्मचारियों की जन्म का दिन सूचीबद्ध करें जिनका वेतन 25000 से अधिक है।
b) यदि जॉइनिंग की तारीख रविवार नहीं है, तो इसे निम्नलिखित प्रारूप में प्रदर्शित करें “Wednesday, 26, November, 1979.”
सोचिए और विचार कीजिए
क्या हम अंकगणितीय संचालकों $\left(+,-.{ }^{*}\right.$, or /) का उपयोग डेटा फंक्शनों पर कर सकते हैं?
mysql> SELECT DAYNAME(DOJ), DAY(DOJ),
MONTHNAME(DOJ), YEAR(DOJ) FROM EMPLOYEE WHERE
DAYNAME(DOJ)!=‘Sunday’;
| DAYNAME(DOJ) | DAY(DOJ) | MONTHNAME(DOJ) | YEAR(DOJ) |
|---|---|---|---|
| Tuesday | 12 | December | 2017 |
| Friday | 8 | January | 1999 |
| Thursday | 2 | December | 2010 |
| Wednesday | 23 | October | 2013 |
4 rows in set (0.00 sec)
1.2.2 समष्टि फंक्शन
समष्टि फंक्शनों को बहु-पंक्ति फंक्शन भी कहा जाता है। ये फंक्शन रिकॉर्ड्स के एक समूह पर समग्र रूप से कार्य करते हैं और जिस स्तंभ पर फंक्शन लागू किया जाता है, उसके प्रत्येक स्तंभ के लिए एकल मान लौटाते हैं। तालिका 1.8 एकल पंक्ति फंक्शन और बहु-पंक्ति फंक्शन के बीच अंतर दिखाती है। तालिका 1.9 कुछ समष्टि फंक्शनों और उनके उपयोग का वर्णन करती है। ध्यान दें कि स्तंभ संख्यात्मक प्रकार का होना चाहिए।
तालिका 1.8 एकल पंक्ति और बहु-पंक्ति फ़ंक्शनों के बीच अंतर
| एकल_पंक्ति फ़ंक्शन | बहु-पंक्ति फ़ंक्शन |
|---|---|
| 1. यह एक समय में एकल पंक्ति पर संचालित होता है। | 1. यह पंक्तियों के समूहों पर संचालित होता है। |
| 2. यह प्रति पंक्ति एक परिणाम देता है। | 2. यह पंक्तियों के एक समूह के लिए एक परिणाम देता है। |
| 3. इसे Select, Where और Order by क्लॉज़ में उपयोग किया जा सकता है। | 3. इसे केवल select क्लॉज़ में उपयोग किया जा सकता है। |
| 4. गणित, स्ट्रिंग और दिनांक फ़ंक्शन एकल पंक्ति फ़ंक्शन के उदाहरण हैं। | 4. Max(), Min(), Avg(), Sum(), Count() और Count(*) बहु-पंक्ति फ़ंक्शन के उदाहरण हैं। |
तालिका 1.9 SQL में एग्रीगेट फ़ंक्शन
| फंक्शन | विवरण | उदाहरण सहित आउटपुट |
|---|---|---|
| MAX(column) | निर्दिष्ट कॉलम से सबसे बड़ा मान लौटाता है। | mysqI > SELECT MAX(Price) FROM I NVENTORY; आउटपुट: 673112.00 |
| MIN(column) | निर्दिष्ट कॉलम से सबसे छोटा मान लौटाता है। | mysqI > SELECT MIN(Price) FROM I NVENTORY; आउटपुट: 355205.00 |
| AVG(column) | निर्दिष्ट कॉलम में मौजूद मानों का औसत लौटाता है। | mysqI > SELECT AVG(Price) FROM I NVENTORY; आउटपुट: 576091.625000 |
| SUM(column) | निर्दिष्ट कॉलम के मानों का योग लौटाता है। | mysqI > SELECT SUM(Price) FROM I NVENTORY; आउटपुट: 4608733.00 |
| COUNT(column) | निर्दिष्ट कॉलम में मौजूद मानों की संख्या NULL मानों को छोड़कर लौटाता है। नोट: इस उदाहरण में मान लीजिए कि MANAGER टेबल में दो ऐट्रिब्यूट और चार रिकॉर्ड हैं। |
mysql> SELECT COUNT(MEMNAME) FROM MANAGER; |
| COUNT $(*)$ | टेबल में मौजूद रिकॉर्ड्स की संख्या लौटाता है। नोट: टेबल में किसी विशेष मानदंड से मेल खाने वाले रिकॉर्ड्स की संख्या दिखाने के लिए हमें COUNT(*) के साथ WHERE क्लॉज़ का उपयोग करना होगा। |
mysql> SELECT COUNT(*) from MANAGER आउटपुट: |
उदाहरण 1.5
a) तालिका INVENTORY से उन रिकॉर्ड्स की कुल संख्या प्रदर्शित करें जिनमें मॉडल VXI है।
mysql>SELECT COUNT(*) FROM INVENTORY WHERE
Model = “VXI”;
| COUNT(*) |
|---|
| 2 |
1 row in set (0.00 sec)
b) तालिका INVENTORY से उपलब्ध विभिन्न प्रकार के मॉडल्स की कुल संख्या प्रदर्शित करें।
mysql> SELECT COUNT(DISTINCT Model) FROM INVENTORY;
| COUNT(DISTINCT MODEL) |
|---|
| 6 |
1 row in set (0.09 sec)
गतिविधि 1.5
a) तालिका SALE से उस ग्राहक द्वारा खरीदी गई कारों के विक्रय मूल्य का योग निकालें जिसकी आईडी C0001 है।
b) तालिका SALE से अधिकतम और न्यूनतम कमीशन ज्ञात करें।
c) तालिका INVENTORY से सभी LXI मॉडल की कारों की औसत कीमत प्रदर्शित करें।
mysql>SELECT AVG(Price) FROM INVENTORY WHERE
Model = “LXI”;
| AVG(Price) |
|---|
| 548306.500000 |
1 row in set (0.03 sec)
1.3 SQL में GROUP BY
कभी-कभी हमें किसी कॉलम में सामान्य मानों के आधार पर पंक्तियों के समूह को प्राप्त करने की आवश्यकता होती है। यह GROUP BY क्लॉज़ का उपयोग करके किया जा सकता है। यह उन पंक्तियों को एक साथ समूहित करता है जिनमें निर्दिष्ट कॉलम में समान मान होते हैं। हम समूहित मानों पर कार्य करने के लिए एग्रीगेट फंक्शन्स (COUNT, MAX, MIN, AVG और SUM) का उपयोग कर सकते हैं। SQL में HAVING क्लॉज़ का उपयोग GROUP BY क्लॉज़ के साथ पंक्तियों पर शर्तें निर्दिष्ट करने के लिए किया जाता है।
CARSHOWROOM डेटाबेस से SALE तालिका पर विचार करें:
mysql> SELECT * FROM SALE;
| InvoiceNo | CarId | CustId | SaleDate | PaymentMode | EmpID | SalePrice | Commission |
|---|---|---|---|---|---|---|---|
| I00001 | D001 | C0001 | 2019-01-24 | क्रेडिट कार्ड | E004 | 613247.00 | 73589.64 |
| I00002 | S001 | C0002 | 2018-12-12 | ऑनलाइन | E001 | 590321.00 | 70838.52 |
| I00003 | S002 | C0004 | 2019-01-25 | चेक | E010 | 604000.00 | 72480.00 |
| I00004 | D002 | C0001 | 2018-10-15 | बैंक फाइनेंस | E007 | 659982.00 | 79197.84 |
| I00005 | E001 | C0003 | 2018-12-20 | क्रेडिट कार्ड | E002 | 369310.00 | 44317.20 |
| I00006 | S002 | C0002 | 2019-01-30 | बैंक फाइनेंस | E007 | 620214.00 | 74425.68 |
6 rows in set (0.11 sec)
CarID, CustID, SaleDate, PaymentMode, EmpID, SalePrice वे कॉलम हैं जिनमें समान मान वाली पंक्तियाँ हो सकती हैं। इसलिए इन कॉलमों पर GROUP BY क्लॉज़ का उपयोग किया जा सकता है ताकि किसी विशेष प्रकार (कॉलम) के रिकॉर्ड्स की संख्या ज्ञात की जा सके, या प्रत्येक कार प्रकार की कीमत का योग निकाला जा सके।
उदाहरण 1.6
a) SALE टेबल से प्रत्येक ग्राहक द्वारा खरीदी गई कारों की संख्या प्रदर्शित करें।
mysql > SELECT CustID, COUNT(*) “Number of Cars”
FROM SALE GROUP BY CustID;
| CustID | Number of Cars |
|---|---|
| C0001 | 2 |
| C0002 | 2 |
| C0003 | 1 |
| C0004 | 1 |
4 rows in set (0.00 sec)
b) ग्राहक आईडी और खरीदी गई कारों की संख्या प्रदर्शित करें यदि ग्राहक ने SALE टेबल से 1 से अधिक कार खरीदी हैं।
mysql> SELECT CustID, COUNT(*) FROM SALE GROUP BY
CustID HAVING COUNT(*) >1;
| CustID | COUNT(*) |
|---|---|
| C0001 | 2 |
| C0002 | 2 |
2 rows in set (0.30 sec)
गतिविधि 1.6
a) प्रत्येक कर्मचारी द्वारा बेची गई कुल कारों की सूची बनाएं।
b) प्रत्येक कर्मचारी द्वारा की गई अधिकतम बिक्री की सूची बनाएं।
c) SALE तालिका से प्रत्येक भुगतान विधि की श्रेणी में लोगों की संख्या प्रदर्शित करें।
mysql > SELECT PaymentMode, COUNT (Payment Mode) FROM SALE GROUP BY Paymentmode ORDER BY Paymentmode;
| PaymentMode | Count(PaymentMode) |
|---|---|
| Bank Finance | 2 |
| Cheque | 1 |
| Credit Card | 2 |
| Online | 1 |
4 rows in set (0.00 sec)
d) वह PaymentMode और उस विधि से एक से अधिक बार किए गए भुगतानों की संख्या प्रदर्शित करें जिनमें एक से अधिक बार भुगतान हुए हों।
mysql > SELECT PaymentMode, Count (PaymentMode) FROM SALE GROUP BY Paymentmode HAVI NG COUNT(*) >1 ORDER
| PaymentMode | Count(PaymentMode) |
|---|---|
| Bank Finance | 2 |
| Credit Card | 2 |
2 rows in set (0.00 sec)
1.4 संबंधों पर संचालन
हम संबंधों पर कुछ संचालन जैसे यूनियन, इंटरसेक्शन और सेट डिफरेंस कर सकते हैं ताकि दो तालिकाओं के टपल्स को मिलाया जा सके। ये तीनों संचालन द्विआधारी संचालन हैं क्योंकि ये दो तालिकाओं पर कार्य करते हैं। यहाँ ध्यान दें कि ये संचालन तभी लागू किए जा सकते हैं जब दोनों संबंधों में गुणों की समान संख्या हो और दोनों तालिकाओं में संगत गुणों का डोमेन समान हो।
1.4.1 यूनियन (U)
यह संचालन दो तालिकाओं की चयनित पंक्तियों को एक साथ जोड़ने के लिए उपयोग किया जाता है। यदि कुछ पंक्तियाँ दोनों तालिकाओं में समान हैं, तो यूनियन संचालन का परिणाम उन पंक्तियों को केवल एक बार दिखाएगा। चित्र 1.3 दो सेटों का यूनियन दिखाता है।
चित्र 1.3: दो समुच्चयों का यूनियन
आइए दो संबंधों DANCE और MUSIC पर विचार करें जो क्रमशः तालिकाओं 1.10 और 1.11 में दिखाए गए हैं।
तालिका 1.10 DANCE
| SNo | Name | Class |
|---|---|---|
| 1 | Aastha | 7A |
| 2 | Mahira | 6A |
| 3 | Mohit | 7B |
| 4 | Sanjay | 7A |
तालिका 1.11 MUSIC
| SNo | Name | Class |
|---|---|---|
| 1 | Mehak | 8A |
| 2 | Mahira | 6A |
| 3 | Lavanya | 7A |
| 4 | Sanjay | 7A |
| 5 | Abhay | 8A |
यदि हमें किसी भी एक कार्यक्रम में भाग लेने वाले विद्यार्थियों की सूची चाहिए, तो हमें संबंधों DANCE और MUSIC पर यूनियन संक्रिया (प्रतीक U द्वारा दर्शाई गई) लगानी होगी। यूनियन संक्रिया का आउटपुट तालिका 1.12 में दिखाया गया है।
तालिका 1.12 DANCE $\cup$ MUSIC
| SNo | Name | Class |
|---|---|---|
| 1 | Aastha | 7A |
| 2 | Mahira | 6A |
| 3 | Mohit | 7B |
| 4 | Sanjay | 7A |
| 1 | Mehak | 8A |
| 3 | Lavanya | 7A |
| 5 | Abhay | 8A |
1.4.2 INTERSECT ( )
इंटरसेक्ट संक्रिया दो तालिकाओं से सामान टपल प्राप्त करने के लिए प्रयोग की जाती है और इसे प्रतीक $\cap$ द्वारा दर्शाया जाता है। चित्र 1.4 दो समुच्चयों का इंटरसेक्शन दिखाता है।
चित्र 1.4: दो समुच्चयों का सर्वनिष्ठ (Intersection)
मान लीजिए हमें उन विद्यार्थियों की सूची प्रदर्शित करनी है जो दोनों आयोजनों (DANCE और MUSIC) में भाग ले रहे हैं, तो इन दो तालिकाओं पर सर्वनिष्ठ संक्रिया लागू की जाएगी। INTERSECT संक्रिया का आउटपुट तालिका 1.13 में दिखाया गया है।
तालिका 1.13 DANCE MUSIC
| SNo | Name | Class |
|---|---|---|
| 2 | Mahira | 6A |
| 4 | Sanjay | 7A |
1.4.3 MINUS (-)
यह संक्रिया उन टपल/पंक्तियों को प्राप्त करने के लिए प्रयोग की जाती है जो पहली तालिका में हैं परंतु दूसरी तालिका में नहीं हैं, और इस संक्रिया को चिह्न - (माइनस) द्वारा दर्शाया जाता है। चित्र 1.5 दो समुच्चयों के बीच माइनस संक्रिया (जिसे सेट अंतर भी कहा जाता है) को दर्शाता है।
चित्र 1.5: दो समुच्चयों का अंतर
मान लीजिए, हमें उन विद्यार्थियों की सूची चाहिए जो केवल MUSIC में भाग ले रहे हैं और DANCE आयोजन में नहीं। तब हम MINUS संक्रिया का प्रयोग करेंगे, जिसका आउटपुट तालिका 1.14 में दिया गया है।
तालिका 1.14 DANCE - MUSIC
| SNo | Name | Class |
|---|---|---|
| 1 | Mehak | 8A |
| 3 | Lavanya | 7A |
| 5 | Abhay | 8A |
1.4.4 कार्तीय गुणन
कार्तीय गुणन संचालन दो संबंधों से टपलों को संयोजित करता है। यह दो इनपुट संबंधों से सभी पंक्ति युग्मों को परिणामस्वरूप देता है, चाहे उनके पास सामान्य गुणों पर समान मान हों या न हों। इसे ’ $\mathrm{X}$ ’ द्वारा दर्शाया जाता है।
परिणामी संबंध की घाता उन दोनों संबंधों की घाताओं के योग के रूप में गणना की जाती है जिन पर विचार किया जा रहा है। परिणामी संबंध की कार्डिनैलिटी उन संबंधों की कार्डिनैलिटी के गुणनफल के रूप में गणना की जाती है जिन पर कार्तीय गुणन लागू किया गया है। आइए संबंधों DANCE और MUSIC का उपयोग कर कार्तीय गुणन के आउटपुट को दिखाएँ। ध्यान दें कि दोनों संबंध घाता 3 के हैं। संबंधों DANCE और MUSIC की कार्डिनैलिटी क्रमशः 4 और 5 है। इन दो संबंधों पर कार्तीय गुणन लागू करने से घाता 6 और कार्डिनैलिटी 20 वाला एक संबंध परिणामस्वरूप मिलेगा, जैसा कि तालिका 1.15 में दिखाया गया है।
तालिका 1.15 DANCE X MUSIC
| क्रम सं | नाम | कक्षा | क्रम सं | नाम | कक्षा |
|---|---|---|---|---|---|
| 1 | आस्था | 7A | 1 | मेहक | 8A |
| 2 | महिरा | 6A | 1 | मेहक | 8A |
| 3 | मोहित | 7B | 1 | मेहक | 8A |
| 4 | संजय | 7A | 1 | मेहक | 8A |
| 1 | आस्था | 7A | 2 | महिरा | 6A |
| 2 | महिरा | 6A | 2 | महिरा | 6A |
| 3 | मोहित | 7B | 2 | महिरा | 6A |
| 4 | संजय | 7A | 2 | महिरा | 6A |
| 1 | आस्था | 7A | 3 | लावण्या | 7A |
| 2 | महिरा | 6A | 3 | लावण्या | 7A |
| 3 | मोहित | 7B | 3 | लावण्या | 7A |
| 4 | संजय | 7A | 3 | लावण्या | 7A |
| 1 | आस्था | 7A | 4 | संजय | 7A |
| 2 | महिरा | 6A | 4 | संजय | 7A |
| 3 | मोहित | 7B | 4 | संजय | 7A |
| 4 | संजय | 7A | 4 | संजय | 7A |
| 1 | आस्था | 7A | 5 | अभय | 8A |
| 2 | महिरा | 6A | 5 | अभय | 8A |
| 3 | मोहित | 7B | 5 | अभय | 8A |
| 4 | संजय | 7A | 5 | अभय | 8A |
20 पंक्तियाँ सेट में (0.03 sec)
1.5 क्वेरी में दो संबंधों का उपयोग
अब तक हमने SQL में केवल एक ही संबंध का उपयोग कर क्वेरी लिखी हैं। इस खंड में हम दो संबंधों का उपयोग कर क्वेरी लिखना सीखेंगे।
1.5.1 दो तालिकाओं पर कार्टेशियन गुणा
पिछले खंड से हमने सीखा कि ऑपरेटर कार्टेशियन प्रोडक्ट को दो तालिकाओं पर लागू करने पर एक ऐसी तालिका प्राप्त होती है जिसमें अंतर्निहित तालिकाओं के सभी संभावित टपलों के संयोजन होते हैं। जब एक से अधिक तालिकाओं का उपयोग किसी क्वेरी में करना हो, तो हमें FROM क्लॉज़ में अल्पविराम से अलग करके तालिकाओं के नाम निर्दिष्ट करने होते हैं, जैसा कि उदाहरण 1.7 में दिखाया गया है। ऐसी क्वेरी चलाने पर DBMS (MySql) पहले निर्दिष्ट तालिकाओं पर कार्टेशियन प्रोडक्ट लागू करके एक एकल तालिका बनाता है। उदाहरण 1.7 की निम्नलिखित क्वेरी दो तालिकाओं DANCE और MUSIC पर कार्टेशियन प्रोडक्ट लागू करती है:
उदाहरण 1.7
a) संबंधों DANCE और MUSIC के टपलों के सभी संभावित संयोजन प्रदर्शित करें
mysql>SELECT * FROM DANCE, MUSIC;
चूँकि हम क्वेरी में SELECT * का उपयोग कर रहे हैं, इसलिए आउटपुट तालिका 1.15 होगी जिसकी डिग्री 6 और कार्डिनैलिटी 20 है।
b) संबंधों DANCE और MUSIC के टपलों के सभी संभावित संयोजनों में से केवल वे पंक्तियाँ प्रदर्शित करें जिनमें दोनों में विशेषता name का समान मान हो।
mys $q l$ > SELECT * FROM DANCE $D$, MUSIC M WHERE D. Name $=$ M. Name;
तालिका 1.16 समान नाम वाले टपल
| Sno | Name | Class | Sno | Name | class |
|---|---|---|---|---|---|
| 2 | Mahira | 6A | 2 | Mahira | 6A |
| 4 | Sanjay | 7A | 4 | Sanjay | 7A |
2 rows in set (0.00 sec)
ध्यान दें कि इस क्वेरी में हमने टेबल उपनामों (DANCE के लिए D और MUSIC के लिए M) का उपयोग किया है, बिल्कुल कॉलम उपनामों की तरह, ताकि टेबल्स को छोटे नामों से संदर्भित किया जा सके। यह ध्यान देना महत्वपूर्ण है कि टेबल उपनाम केवल वर्तमान क्वेरी के लिए ही वैध होता है और यदि FROM क्लॉज़ में किसी टेबल को उपनाम दिया गया है तो क्वेरी में मूल टेबल नाम का उपयोग नहीं किया जा सकता।
1.5.2 दो टेबल्स पर JOIN
JOIN ऑपरेशन निर्दिष्ट शर्तों पर दो टेबल्स से टपल्स को संयुक्त करता है। यह कार्टेशियन प्रोडक्ट से अलग है, जो टपल्स के सभी संभावित संयोजन बनाता है। SQL के JOIN क्लॉज़ का उपयोग करते समय, हम FROM क्लॉज़ के भीतर दो टेबल्स के संबंधित गुणों पर शर्तें निर्दिष्ट करते हैं। आमतौर पर, ऐसा गुण एक टेबल में प्राइमरी की होता है और दूसरी टेबल में फॉरेन की। आइए SchoolUniform डेटाबेस में दो टेबल्स UNIFORM (UCode, UName, UColor) और COST (UCode, Size, Price) बनाते हैं। UCode टेबल UNIFORM में प्राइमरी की है। UCode और Size टेबल COST में कंपोज़िट की हैं। इसलिए, Ucode दोनों टेबल्स के बीच एक सामान्य गुण है जिसका उपयोग दोनों टेबल्स से सामान्य डेटा प्राप्त करने के लिए किया जा सकता है। इसलिए, हमें इस टेबल को बनाते समय Price टेबल में Ucode को फॉरेन की के रूप में परिभाषित करना होगा।
टेबल 1.17 Uniform टेबल
| Ucode | Uname | Ucolor |
|---|---|---|
| 1 | Shirt | White |
| 2 | Pant | Grey |
| 3 | Tie | Blue |
टेबल 1.18 Cost टेबल
| Ucode | Size | Price |
|---|---|---|
| 1 | L | 580 |
| 1 | M | 500 |
| 2 | L | 890 |
| 2 | M | 810 |
उदाहरण 1.7
UNIFORM और COST तालिकाओं के संबंधित टपल्स के UCode, UName, UColor, Size और Price सूचीबद्ध करें।
दी गई क्वेरी को नीचे दिए गए तीन अलग-अलग तरीकों से लिखा जा सकता है:
a) where clause में शर्त का उपयोग करते हुए
mysqI > SELECT * FROM UNIFORM U, COST C WHERE
U. UCode = C. UCode;
Table 1.19 क्वेरी का आउटपुट
| UCode | UName | UColor | Ucode | Size | Price |
|---|---|---|---|---|---|
| 1 | Shirt | White | 1 | L | 580 |
| 1 | Shirt | White | 1 | M | 500 |
| 2 | Pant | Grey | 2 | L | 890 |
| 2 | Pant | Grey | 2 | M | 810 |
4 rows in set $(0.08 \mathrm{sec})$
चूँकि दोनों तालिकाओं में attribute Ucode है, इसलिए अस्पष्टता दूर करने के लिए हमें table alias का उपयोग करना पड़ता है। इसलिए, हमने SELECT और FROM clauses में qualifier का उपयोग किया है ताकि UCode attribute की सीमा दिखाई जा सके।
b) JOIN clause का स्पष्ट उपयोग
mysqI>SELECT * FROM UNIFORM U JOIN COST C ON U. Ucode $=$ C. Ucode;
क्वेरी का आउटपुट Table 1.19 में दिखाए गए समान है। इस क्वेरी में, हमने FROM clause में शर्त के साथ स्पष्ट रूप से JOIN clause का उपयोग किया है। इसलिए, WHERE clause में कोई शर्त देने की आवश्यकता नहीं है।
c) NATURAL JOIN clause का स्पष्ट उपयोग
क्वेरी (a) और (b) का आउटपुट जो टेबल 1.19 में दिखाया गया है, में Ucode नामक एक दोहराया गया कॉलम है जिसमें बिल्कुल समान मान हैं। यह अतिरिक्त कॉलम कोई अतिरिक्त जानकारी प्रदान नहीं करता। JOIN ऑपरेशन का एक एक्सटेंशन NATURAL JOIN है जो SQL में JOIN क्लॉज़ की तरह काम करता है, लेकिन अतिरिक्त ऐट्रिब्यूट को हटा देता है। यह ऑपरेटर तभी दो टेबल्स की सामग्री को जोड़ने के लिए प्रयोग किया जा सकता है जब दोनों टेबल्स में एक सामान्य ऐट्रिब्यूट हो। ऊपर दी गई SQL क्वेरी NATURAL JOIN का उपयोग करके नीचे दिखाई गई है:
mysql>SELECT * FROM UNIFORM NATURAL JOIN COST;
| UCode | UName | UColor | Size | Price |
|---|---|---|---|---|
| 1 | Shirt | White | L | 580 |
| 1 | Shirt | White | M | 500 |
| 2 | Pant | Grey | L | 890 |
| 2 | Pant | Grey | M | 810 |
आउटपुट से स्पष्ट है कि इस क्वेरी का परिणाम (a) और (b) में लिखी गई क्वेरीज़ के समान है, सिवाय इसके कि ऐट्रिब्यूट Ucode केवल एक बार दिखाई देता है।
निम्नलिखित कुछ बिंदु हैं जिन्हें ध्यान में रखना चाहिए जब दो या अधिक रिलेशन्स पर JOIN ऑपरेशन्स लगाए जाते हैं:
- यदि दो टेबल्स को सामान्य ऐट्रिब्यूट पर समानता की शर्त के आधार पर जोड़ना है, तो कोई ON क्लॉज़ के साथ JOIN या FROM क्लॉज़ में NATURAL JOIN का उपयोग कर सकता है। यदि तीन टेबल्स को समानता की शर्त पर जोड़ना है, तो दो JOIN या NATURAL JOIN की आवश्यकता होती है।
- सामान्य तौर पर, $\mathrm{N}$ टेबल्स को समानता की शर्त पर मिलाने के लिए $\mathrm{N}-1$ joins की आवश्यकता होती है।
- JOIN क्लॉज़ के साथ, हम दो टेबल्स के टपल्स को मिलाने के लिए कोई भी रिलेशनल ऑपरेटर्स उपयोग कर सकते हैं।
सारांश
- एक फंक्शन किसी विशेष कार्य को करने और परिणामस्वरूप एक मान लौटाने के लिए प्रयुक्त होता है।
- सिंगल-रो फंक्शन एक ही पंक्ति पर कार्य करके एक एकल मान लौटाते हैं।
- मल्टीपल-रो फंक्शन रिकॉर्ड्स के एक समूह पर समग्र रूप से कार्य करते हैं और एक एकल मान लौटाते हैं।
- न्यूमेरिक फंक्शन संख्यात्मक मानों पर संचालन करते हैं और संख्यात्मक मान लौटाते हैं।
- स्ट्रिंग फंक्शन कैरेक्टर प्रकार के मानों पर संचालन करते हैं और या तो कैरेक्टर या संख्यात्मक मान लौटाते हैं।
- डेट और टाइम फंक्शन हमें डेट प्रकार के डेटा मानों से निपटने की अनुमति देते हैं।
- GROUP BY फंक्शन उन पंक्तियों को एक साथ समूहित करने के लिए प्रयुक्त होता है जो किसी निर्दिष्ट कॉलम में समान मान रखती हैं। कुछ समूह फंक्शन COUNT, MAX, MIN, AVG और SUM हैं।
- जॉन एक ऐसा संचालन है जो दो या अधिक टेबलों को उनके बीच एक या अधिक सामान फील्ड्स के आधार पर मिलाने के लिए प्रयुक्त होता है।
अभ्यास
1. निम्नलिखित प्रश्नों के उत्तर दें:
a) RDBMS को परिभाषित करें। कोई दो RDBMS सॉफ्टवेयरों के नाम बताएं।
b) SELECT स्टेटमेंट में निम्नलिखित क्लॉज़ का उद्देश्य क्या है?
i) ORDER BY
ii) HAVING
c) Single_row functions और Aggregate functions के बीच कोई दो अंतर बताएं।
d) Cartesian Product से आप क्या समझते हैं?
e) निम्नलिखित संचालनों को करने के लिए फंक्शनों के नाम लिखें:
i) उस दिन को “Monday”, “Tuesday” आदि के रूप में दिखाने के लिए, जिस दिन भारत को आज़ादी मिली।
ii) दिए गए स्ट्रिंग की किसी विशेष स्थिति से निर्दिष्ट संख्या में कैरेक्टर दिखाने के लिए।
iii) उस महीने का नाम दिखाने के लिए जिसमें आपका जन्म हुआ था।
iv) अपने नाम को बड़े अक्षरों में प्रदर्शित करने के लिए।
2. निम्नलिखित SQL कमांड्स द्वारा उत्पन्न आउटपुट लिखें:
a) SELECT POW $(2,3)$;
b) SELECT ROUND(123.2345, 2), $\operatorname{ROUND}(342.9234,-1)$;
c) SELECT LENGTH(“Informatics Practices”);
d) SELECT YEAR(“1979/11/26”), MONTH(“1979/11/26”), DAY(“1979/11/26”), MONTHNAME(“1979/11/26”);
e) SELECT LEFT(“INDIA”,3), RIGHT(“Computer Science”,4);
f) SELECT MID(“Informatics”,3,4), SUBSTR(“Practices”,3);
3. निम्नलिखित “Product” नामक तालिका पर विचार करें, जो एक किराना दुकान में बेचे जा रहे उत्पादों का विवरण दिखाती है।
| PCode | PName | UPrice | Manufacturer |
|---|---|---|---|
| P01 | Washing Powder | 120 | Surf |
| P02 | Tooth Paste | 54 | Colgate |
| P03 | Soap | 25 | Lux |
| P04 | Tooth Paste | 65 | Pepsodant |
| P05 | Soap | 38 | Dove |
| P06 | Shampoo | 245 | Dove |
a) निम्नलिखित के लिए SQL क्वेरीज़ लिखें:
i. उपयुक्त डेटा प्रकारों और कंस्ट्रेंट्स के साथ Product तालिका बनाएं।
ii. Product में प्राइमरी कुंजी की पहचान करें।
iii. उत्पाद नाम के अनुसार अवरोही क्रम में उत्पाद कोड, उत्पाद नाम और मूल्य सूचीबद्ध करें। यदि PName समान है तो मूल्य के आरोही क्रम में डेटा प्रदर्शित करें।
iv. Product तालिका में एक नया कॉलम Discount जोड़ें।
v. उन सभी उत्पादों के लिए जहां UPrice 100 से अधिक है, Product तालिका में डिस्काउंट का मान UPrice का 10 प्रतिशत के रूप में गणना करें, अन्यथा डिस्काउंट 0 होगा।
vi. Dove द्वारा निर्मित सभी उत्पादों की कीमत 12 प्रतिशत बढ़ाएं।
vii.प्रत्येक निर्माता द्वारा निर्मित उत्पादों की कुल संख्या प्रदर्शित करें।
b) ऊपर दी गई Product तालिका में दी गई जानकारी के आधार पर निम्नलिखित क्वेरीज़ को चलाने पर उत्पन्न होने वाला आउटपुट लिखें:
i. SELECT PName, Average(UPrice) FROM Product GROUP BY Pname;
ii. SELECT DISTINCT Manufacturer FROM Product;
iii. SELECT COUNT(DISTINCT PName) FROM Product;
iv. SELECT PName, MAX(UPrice), MIN(UPrice) FROM Product GROUP BY PName;
4. अध्याय में दी गई CARSHOWROOM डेटाबेस का उपयोग करते हुए, निम्नलिखित के लिए SQL क्वेरीज़ लिखें:
a) INVENTORY तालिका में एक नया कॉलम Discount जोड़ें।
b) सभी कारों के लिए उपयुक्त डिस्काउंट मान सेट करें, निम्नलिखित बातों को ध्यान में रखते हुए:
(i) LXI मॉडल पर कोई डिस्काउंट उपलब्ध नहीं है।
(ii) VXI मॉडल पर 10% डिस्काउंट दिया जाता है।
(iii) LXI मॉडल और VXI मॉडल के अलावा अन्य कारों पर 12% डिस्काउंट दिया जाता है।
c) उस सबसे महंगी कार का नाम प्रदर्शित करें जिसका फ्यूल टाइप “Petrol” है।
d) Car4 पर उपलब्ध औसत डिस्काउंट और कुल डिस्काउंट की गणना करें।
e) उन कारों की कुल संख्या सूचीबद्ध करें जिन पर कोई डिस्काउंट नहीं है।
5. निम्नलिखित तालिकाओं Student और Stream को Streams_of_Students डेटाबेस में मान लें। Stream तालिका की प्राइमरी कुंजी StCode (स्ट्रीम कोड) है जो Student तालिका में फॉरेन कुंजी है। Student तालिका की प्राइमरी कुंजी AdmNo (एडमिशन नंबर) है।
| AdmNo | Name | StCode |
|---|---|---|
| 211 | Jay | NULL |
| 241 | Aditya | S03 |
| 290 | Diksha | S01 |
| 333 | Jasqueen | S02 |
| 356 | Vedika | S01 |
| 380 | Ashpreet | S03 |
| StCode | Stream |
|---|---|
| S01 | Science |
| $\mathrm{SO}_{2}$ | Commerce |
| $\mathrm{SO}_{3}$ | Humanities |
निम्नलिखित के लिए SQL क्वेरीज़ लिखें:
a) डेटाबेस Streams_Of_Students बनाएं।
b) टेबल Student बनाएं, दी गई टेबल में दिए गए डेटा के आधार पर उपयुक्त डेटा प्रकार चुनकर।
c) टेबल्स Student और Stream से प्राइमरी कुंजियों की पहचान करें। साथ ही, टेबल Stream से फॉरेन कुंजी की पहचान करें।
d) Jay ने अब अपना स्ट्रीम Humanities कर लिया है। इस परिवर्तन को दर्शाने के लिए उपयुक्त SQL क्वेरी लिखें।
e) उन छात्रों के नाम प्रदर्शित करें जिनके नाम ’ $a$ ’ अक्षर से समाप्त होते हैं। साथ ही, छात्रों को वर्णानुक्रम में व्यवस्थित करें।
f) Science और Humanities स्ट्रीम में नामांकित छात्रों के नाम प्रदर्शित करें, छात्र नाम के वर्णानुक्रम में क्रमबद्ध करें, फिर प्रवेश संख्या के आरोही क्रम में (डुप्लिकेट नामों के लिए)।
g) प्रत्येक स्ट्रीम में उन छात्रों की संख्या सूचीबद्ध करें जिनमें 1 से अधिक छात्र हैं।
h) विभिन्न स्ट्रीम्स में नामांकित छात्रों के नाम प्रदर्शित करें, जहां छात्रों को प्रवेश संख्या के अवरोही क्रम में व्यवस्थित किया गया है।
i) Student और Stream टेबल पर कार्टेशियन गुणनफल दिखाएं। साथ ही कार्टेशियन गुणनफल लागू करने के बाद उत्पन्न डिग्री और कार्डिनैलिटी का उल्लेख करें।
j) स्ट्रीम तालिका में एक नया कॉलम “TeacherIncharge” जोड़ें। प्रत्येक पंक्ति में उपयुक्त डेटा डालें।
k) शिक्षकों और छात्रों के नामों की सूची बनाएं।
l) यदि स्टूडेंट और स्ट्रीम तालिकाओं पर फिर से कार्टेशियन गुणा लागू किया जाता है, तो इस संशोधित तालिका की डिग्री और कार्डिनैलिटी क्या होगी?