Chapter 09 Structured Query Language (SQL)
“कोई भी अनूठी छवि जो आप चाहते हैं, शायद पहले से ही इंटरनेट पर या किसी डेटाबेस में मौजूद है… आज की समस्या यह नहीं रही कि सही छवि कैसे बनाई जाए, बल्कि यह कि पहले से मौजूद छवि को कैसे खोजा जाए।”
$\quad$ - लेव मैनोविच
9.1 परिचय
हमने पिछले अध्याय में रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) और इसके उद्देश्य के बारे में सीखा है। कई RDBMS जैसे MySQL, Microsoft SQL Server, PostgreSQL, Oracle आदि हैं जो हमें रिलेशनों से युक्त एक डेटाबेस बनाने की अनुमति देते हैं। ये RDBMS हमें उस डेटाबेस पर क्वेरीज़ के माध्यम से डेटा संग्रहीत, पुनः प्राप्त और हेरफेर करने की भी अनुमति देते हैं। इस अध्याय में हम सीखेंगे कि MySQL का उपयोग करके डेटाबेस कैसे बनाएं, भरें और क्वेरी करें।
9.2 स्ट्रक्चर्ड क्वेरी लैंग्वेज (SQL)
फ़ाइल सिस्टम के मामले में डेटा तक पहुँचने के लिए एप्लिकेशन प्रोग्राम लिखने पड़ते हैं। हालाँकि, डेटाबेस मैनेजमेंट सिस्टम के लिए विशेष प्रकार की भाषाएँ होती हैं जिन्हें क्वेरी लैंग्वेज कहा जाता है, जिनका उपयोग डेटाबेस से डेटा तक पहुँचने और उसे हेरफेर करने के लिए किया जा सकता है। स्ट्रक्चर्ड क्वेरी लैंग्वेज (SQL) सबसे लोकप्रिय क्वेरी लैंग्वेज है जिसका उपयोग प्रमुख रिलेशनल डेटाबेस मैनेजमेंट सिस्टम जैसे MySQL, ORACLE, SQL Server आदि द्वारा किया जाता है।
गतिविधि 9.1
RDBMS के अलावा अन्य प्रकार के डेटाबेस खोजें और सूचीबद्ध करें।
SQL सीखना आसान है क्योंकि इसके कथन वर्णनात्मक अंग्रेज़ी शब्दों से बने होते हैं और यह केस-संवेदी नहीं है। हम SQL का उपयोग करके आसानी से एक डेटाबेस बना सकते हैं और उससे संवाद कर सकते हैं। SQL का उपयोग करने का लाभ यह है कि हमें यह निर्दिष्ट नहीं करना पड़ता कि डेटाबेस से डेटा कैसे प्राप्त करना है। बल्कि, हम केवल यह बताते हैं कि क्या निकालना है, और बाकी SQL संभाल लेता है। यद्यपि इसे क्वेरी भाषा कहा जाता है, SQL केवल क्वेरी करने से कहीं अधिक कर सकता है। SQL डेटा की संरचना को परिभाषित करने, डेटाबेस में डेटा को संचालित करने, बाधाओं को घोषित करने और हमारी आवश्यकताओं के अनुसार विभिन्न तरीकों से डेटाबेस से डेटा पुनः प्राप्त करने के लिए कथन प्रदान करता है।
इस अध्याय में, हम अध्याय 8 में चर्चा किए गए StudentAttendance का उपयोग करके एक डेटाबेस बनाएंगे। हम यह भी सीखेंगे कि डेटाबेस को डेटा से कैसे भरा जाता है, डेटा को कैसे संचालित किया जाता है और SQL क्वेरीज़ के माध्यम से डेटाबेस से डेटा कैसे प्राप्त किया जाता है।
9.2.1 MySQL इंस्टॉल करना
MySQL एक ओपन सोर्स RDBMS सॉफ़्टवेयर है जिसे आधिकारिक वेबसाइट https:// dev.mysql.com/downloads से आसानी से डाउनलोड किया जा सकता है। MySQL इंस्टॉल करने के बाद, MySQL सेवा प्रारंभ करें। mysql> प्रॉम्प्ट (चित्र 9.1) दिखाई देना इस बात का संकेत है कि MySQL SQL कथन स्वीकार करने के लिए तैयार है।
चित्र 9.1: MySQL शेल
SQL का उपयोग करते समय निम्नलिखित कुछ महत्वपूर्ण बिंदुओं को ध्यान में रखना चाहिए:
- SQL केस असेंसिटिव है। उदाहरण के लिए, कॉलम नाम ‘salary’ और ‘SALARY’ SQL के लिए समान हैं।
- हमेशा SQL स्टेटमेंट्स को सेमीकोलन (;) से समाप्त करें।
- बहु-पंक्ति SQL स्टेटमेंट्स दर्ज करने के लिए, हम पहली पंक्ति के बाद “;” नहीं लिखते हैं। हम अगली पंक्ति पर जारी रखने के लिए Enter कुंजी दबाते हैं। प्रॉम्प्ट mysql> तब “->” में बदल जाता है, यह दर्शाता है कि स्टेटमेंट अगली पंक्ति पर जारी है। अंतिम पंक्ति के बाद “;” डालें और Enter दबाएं।
9.3 MYSQL में डेटा टाइप्स और कंस्ट्रेंट्स
हम जानते हैं कि एक डेटाबेस में एक या अधिक रिलेशन्स होते हैं और प्रत्येक रिलेशन (टेबल) ऐट्रिब्यूट्स (कॉलम) से बना होता है। प्रत्येक ऐट्रिब्यूट का एक डेटा टाइप होता है। हम प्रत्येक ऐट्रिब्यूट के लिए कंस्ट्रेंट्स भी निर्दिष्ट कर सकते हैं।
गतिविधि 9.2
MySQL में समर्थित अन्य डेटा टाइप्स कौन से हैं? क्या पूर्णांक और फ्लोट डेटा टाइप के अन्य वेरिएंट हैं?
9.3.1 ऐट्रिब्यूट का डेटा टाइप
किसी ऐट्रिब्यूट का डेटा टाइप यह इंगित करता है कि उस ऐट्रिब्यूट में किस प्रकार का डेटा मान हो सकता है। यह यह भी तय करता है कि उस ऐट्रिब्यूट के डेटा पर कौन-से ऑपरेशन किए जा सकते हैं। उदाहरण के लिए, संख्यात्मक डेटा पर अंकगणितीय ऑपरेशन किए जा सकते हैं लेकिन वर्ण डेटा पर नहीं। MySQL में सामान्यतः उपयोग किए जाने वाले डेटा टाइप्स संख्यात्मक टाइप, दिनांक और समय टाइप, और स्ट्रिंग टाइप हैं जैसा कि तालिका 9.1 में दिखाया गया है।
$\hspace{4cm}$ तालिका 9.1 MySQL में सामान्यतः उपयोग किए जाने वाले डेटा टाइप्स
| डेटा प्रकार | विवरण |
|---|---|
| CHAR $(n)$ | वर्ण प्रकार के डेटा की लंबाई $\mathrm{n}$ निर्दिष्ट करता है, जहाँ $\mathrm{n}$ 0 से 255 तक कोई भी मान हो सकता है। CHAR निश्चित लंबाई का होता है, अर्थात् CHAR (10) घोषित करने का अर्थ है 10 वर्णों के लिए स्थान आरक्षित करना। यदि डेटा में 10 वर्ण नहीं हैं (उदाहरण के लिए, ‘city’ में चार वर्ण हैं), तो MySQL शेष 6 वर्णों को दाईं ओर स्पेस भरकर पूरा करता है। |
| VARCHAR$(n)$ | वर्ण प्रकार के डेटा की लंबाई निर्दिष्ट करता है, जहाँ $\mathrm{n}$ 0 से 65535 तक कोई भी मान हो सकता है। लेकिन CHAR के विपरीत, VARCHAR(n) एक परिवर्तनीय-लंबाई वाला डेटा प्रकार है। अर्थात् VARCHAR (30) घोषित करने का अर्थ है अधिकतम 30 वर्ण संग्रहीत किए जा सकते हैं, लेकिन वास्तव में आवंटित बाइट्स दर्ज किए गए स्ट्रिंग की लंबाई पर निर्भर करेंगे। इसलिए VARCHAR (30) में “city” केवल 4 वर्ण संग्रहीत करने के लिए आवश्यक स्थान घेरेगा। |
| INT | INT एक पूर्णांक मान निर्दिष्ट करता है। प्रत्येक INT मान 4 बाइट्स का भंडारण घेरता है। 4 बाइट पूर्णांक प्रकार में अनुमत अहस्ताक्षरित मानों की सीमा 0 से $4,294,967,295$ तक है। इससे बड़े मानों के लिए हमें BIGINT का उपयोग करना होता है, जो 8 बाइट्स घेरता है। |
| FLOAT | दशमलव बिंदु वाले अंक रखता है। प्रत्येक FLOAT मान 4 बाइट्स घेरता है। |
| DATE | DATE प्रकार ‘YYYY-MM-DD’ प्रारूप में तिथियों के लिए प्रयोग किया जाता है। YYYY 4 अंकों का वर्ष है, MM 2 अंकों का माह है और DD 2 अंकों की तारीख है। समर्थित सीमा ’ $1000-01-01$ ’ से ’ $9999-12-31$ ’ तक है। |
सोचिए और विचार कीजिए
कौन-से दो constraints एक साथ लगाने पर Primary Key constraint उत्पन्न करते हैं?
9.3.2 Constraints
Constraints कुछ विशेष प्रकार की पाबंदियाँ होती हैं जो यह निर्धारित करती हैं कि किसी attribute में डेटा के मान क्या हो सकते हैं। तालिका 9.2 SQL में प्रयुक्त कुछ सामान्य constraints की सूची देती है। यह सुनिश्चित करने के लिए प्रयोग किए जाते हैं कि डेटा सही हो। यद्यपि, किसी table के प्रत्येक attribute के लिए constraints परिभाषित करना अनिवार्य नहीं है।
$\hspace{3.5cm}$ तालिका 9.2 सामान्यतः प्रयुक्त SQL Constraints
| Constraint | विवरण |
|---|---|
| NOT NULL | यह सुनिश्चित करता है कि किसी column में NULL मान नहीं हो सकता, जहाँ NULL का अर्थ है लापता/ अज्ञात/लागू नहीं मान। |
| UNIQUE | यह सुनिश्चित करता है कि column के सभी मान अद्वितीय/विशिष्ट हों। |
| DEFAULT | यदि कोई मान प्रदान नहीं किया जाता तो column के लिए निर्दिष्ट एक डिफ़ॉल्ट मान। |
| PRIMARY KEY | वह column जो table में प्रत्येक row/record की अद्वितीय पहचान कर सकता है। |
| FOREIGN KEY | वह column जो दूसरी table में PRIMARY KEY के रूप में परिभाषित attribute के मान को संदर्भित करता है। |
9.4 डेटा परिभाषा के लिए SQL
डेटा संग्रहित करने के लिए हमें पहले संबंध स्कीमा को परिभाषित करना होता है। स्कीमा को परिभाषित करने में एक संबंध बनाना और उसे नाम देना, संबंध में गुणधर्मों की पहचान करना, प्रत्येक गुणधर्म के लिए डेटा प्रकार तय करना और आवश्यकतानुसार बाधाएँ निर्दिष्ट करना शामिल है। कभी-कभी हमें संबंध स्कीमा में बदलाव भी करने पड़ सकते हैं। SQL हमें संबंध स्कीमा को परिभाषित, संशोधित और हटाने के लिए कथन लिखने की अनुमति देता है। ये डेटा परिभाषा भाषा (DDL) का भाग हैं।
हम पहले ही सीख चुके हैं कि डेटा डेटाबेस में संबंधों या तालिकाओं में संग्रहित किया जाता है। इसलिए हम कह सकते हैं कि डेटाबेस तालिकाओं का संग्रह होता है। Create कथन का उपयोग डेटाबेस और उसकी तालिकाओं (संबंधों) को बनाने के लिए किया जाता है। डेटाबेस बनाने से पहले हमें यह स्पष्ट होना चाहिए कि डेटाबेस में कितनी तालिकाएँ होंगी, प्रत्येक तालिका में कितने स्तंभ (गुणधर्म) होंगे, प्रत्येक स्तंभ का डेटा प्रकार क्या होगा और यदि कोई हो तो उसकी बाधा क्या होगी।
9.4.1 CREATE Database
डेटाबेस बनाने के लिए हम CREATE DATABASE कथन का उपयोग करते हैं जैसा कि निम्नलिखित सिंटैक्स में दिखाया गया है:
CREATE DATABASE databasename;
StudentAttendance नामक डेटाबेस बनाने के लिए हम mysql प्रॉम्प्ट पर निम्नलिखित कमांड टाइप करेंगे। mysql> CREATE DATABASE studentattendance;
Query OK, 1 row affected $(0.02 \mathrm{sec})$
नोट: LINUX वातावरण में डेटाबेस और टेबल के नाम केस-संवेदी होते हैं जबकि WINDOWS में ऐसा कोई अंतर नहीं होता। हालांकि, एक अच्छी प्रथा के तौर पर यह सुझाव दिया जाता है कि डेटाबेस/टेबल का नाम उसी अक्षर-केस में लिखें जिसमें उन्हें बनाते समय इस्तेमाल किया गया था।
एक DBMS एक कंप्यूटर पर कई डेटाबेस प्रबंधित कर सकता है। इसलिए हमें उस डेटाबेस को चुनना होता है जिसे हम इस्तेमाल करना चाहते हैं। मौजूदा डेटाबेसों के नाम जानने के लिए हम कथन SHOW DATABASES का उपयोग करते हैं। सूचीबद्ध डेटाबेसों में से हम इस्तेमाल के लिए डेटाबेस चुन सकते हैं। एक बार डेटाबेस चुन लेने के बाद हम टेबल बनाना या डेटा क्वेरी करना आगे बढ़ा सकते हैं।
StudentAttendance डेटाबेस का उपयोग करने के लिए निम्नलिखित SQL कथन की आवश्यकता होती है।
mysql> USE StudentAttendance;
Database changed
प्रारंभ में बनाया गया डेटाबेस खाली होता है। इसे show tables कथन का उपयोग करके जांचा जा सकता है जो किसी डेटाबेस के भीतर सभी टेबलों के नाम सूचीबद्ध करता है।
एक डेटाबेस के भीतर सभी टेबलों के नाम।
mysql> SHOW TABLES;
Empty set (0.06 sec)
गतिविधि 9.3
कथन show database; टाइप करें। क्या यह StudentAttendance डेटाबेस का नाम दिखाता है?
9.4.2 CREATE Table
StudentAttendance डेटाबेस बनाने के बाद, हमें इस डेटाबेस में संबंधों को परिभाषित करना होता है और प्रत्येक संबंध के लिए गुणों को डेटा प्रकार और प्रतिबंध (यदि कोई हो) के साथ निर्दिष्ट करना होता है। यह CREATE TABLE कथन का उपयोग करके किया जाता है।
वाक्य-रचना:
CREATE TABLE tablename(
attributename1 datatype constraint,
attributename2 datatype constraint, :
attributenameN datatype constraint);
CREATE TABLE कथन के संबंध में निम्नलिखित बिंदुओं का ध्यान रखना महत्वपूर्ण है:
-
किसी तालिका में स्तंभों की संख्या उस संबंध की डिग्री को परिभाषित करती है, जिसे N द्वारा दर्शाया जाता है।
-
Attribute name तालिका में स्तंभ का नाम निर्दिष्ट करता है।
-
Datatype यह निर्दिष्ट करता है कि कोई attribute किस प्रकार के आंकड़े रख सकता है।
-
Constraint किसी attribute के मानों पर लगाए गए प्रतिबंधों को दर्शाता है। डिफ़ॉल्ट रूप से प्रत्येक attribute NULL मान ले सकता है, सिवाय प्राइमरी कुंजी के।
आइए तालिका STUDENT के attributes के डेटा प्रकारों को उनके constraints (यदि कोई हो) के साथ पहचानें। यह मानते हुए कि कक्षा में अधिकतम 100 विद्यार्थी हैं और रोल नंबर के मान 1 से 100 तक क्रमबद्ध हैं, हम जानते हैं कि RollNumber attribute के मानों को संग्रहीत करने के लिए 3 अंक पर्याप्त हैं। इसलिए, इस attribute के लिए डेटा प्रकार INT उपयुक्त है। किसी विद्यार्थी के नाम (SName) में कुल वर्णों की संख्या भिन्न हो सकती है। यह मानते हुए कि नाम में अधिकतम 20 वर्ण हैं, हम SName स्तंभ के लिए VARCHAR(20) का उपयोग करते हैं। attribute SDateofBirth के लिए डेटा प्रकार DATE है और यह मानते हुए कि विद्यालय अभिभावक का 12 अंकों का आधार नंबर GUID के रूप में उपयोग करता है, हम GUID को CHAR(12) घोषित कर सकते हैं क्योंकि आधार नंबर निश्चित लंबाई का होता है और हम GUID पर कोई गणितीय संक्रिया नहीं करने वाले हैं।
टेबल 9.3, 9.4 और 9.5 क्रमशः संबंधों STUDENT, GUARDIAN और ATTENDANCE के प्रत्येक गुण के लिए चुने गए डेटा प्रकार और बाधा को दर्शाते हैं।
$\hspace{1.5cm}$ टेबल 9.3 संबंध STUDENT के गुणों के लिए डेटा प्रकार और बाधाएँ
| Attribute Name | Data expected to be stored | Data type | Constraint |
|---|---|---|---|
| RollNumber | अधिकतम 3 अंकों की संख्यात्मक मान | I NT | PRI MARY KEY |
| SName | अधिकतम 20 वर्णों की परिवर्तनीय लंबाई की स्ट्रिंग | VARCHAR (20) | NOT NULL |
| SDateofBirth | दिनांक मान | DATE | NOT NULL |
| GUID | 12 अंकों की संख्यात्मक मान | CHAR (12) | FOREIGN KEY |
$\hspace{1.3cm}$ टेबल 9.4 संबंध GUARDIAN के गुणों के लिए डेटा प्रकार और बाधाएँ
| Attribute Name | Data expected to be stored | Data type | Constraint |
|---|---|---|---|
| GUID | 12 अंकों के आधार संख्या की संख्यात्मक मान | CHAR (12) | PRI MARY KEY |
| GName | अधिकतम 20 वर्णों की परिवर्तनीय लंबाई की स्ट्रिंग | VARCHAR(20) | NOT NULL |
| GPhone | 10 अंकों की संख्यात्मक मान | CHAR(10) | NULL UNI QUE |
| GAddress | 30 वर्णों की परिवर्तनीय लंबाई की स्ट्रिंग | VARCHAR(30) | NOT NULL |
$\hspace{0.6cm}$ टेबल 9.5 संबंध ATTENDANCE के गुणों के लिए डेटा प्रकार और बाधाएँ।
| विशेषता नाम | संग्रहीत होने वाला अपेक्षित डेटा | डेटा प्रकार | बाध्यता |
|---|---|---|---|
| AttendanceDate | दिनांक मान | DATE | PRI MARY KEY* |
| RollNumber | अधिकतम 3 अंकों वाला संख्यात्मक मान | I NT | PRI MARY KEY* FOREIGN KEY |
| AttendanceStatus | उपस्थित के लिए ‘P’ और अनुपस्थित के लिए ‘A’ | CHAR(1) | NOT NULL |
${ }^{*}$ का अर्थ है संयुक्त प्राइमरी कुंजी का भाग।
एक बार डेटा प्रकार और बाध्यताओं की पहचान हो जाने पर, आइए सरलीकरण के लिए विशेषता नाम के साथ बिना बाध्यताएँ निर्दिष्ट किए तालिकाएँ बनाएँ। हम खंड 9.4.4 में विशेषताओं पर बाध्यताओं को शामिल करना सीखेंगे।
सोचिए और विचार कीजिए
संपर्क संख्या (मोबाइल नंबर) संग्रहीत करने के लिए Char और Varchar में से किस डेटाटाइप को आप प्राथमिकता देंगे? चर्चा कीजिए।
उदाहरण 9.1 तालिका STUDENT बनाना।
mysql> CREATE TABLE STUDENT(
$\qquad$ -> RollNumber INT,
$\qquad$ -> SName VARCHAR(20),
$\qquad$ -> SDateofBirth DATE,
$\qquad$ -> GUID CHAR (12),
$\qquad$ -> PRIMARY KEY (RollNumber));
Query OK, 0 rows affected (0.91 sec)
नोट: “,” दो विशेषताओं को अलग करने के लिए प्रयोग किया जाता है और प्रत्येक कथन अर्धविराम (;) से समाप्त होता है। तीर (->) एक इंटरैक्टिव निरंतरता संकेत है। यदि हम एक अधूरा कथन दर्ज करते हैं, तो SQL शेल हमें शेष कथन दर्ज करने की प्रतीक्षा करेगा।
9.4.3 तालिका का वर्णन करना
हम पहले से बनी हुई तालिका की संरचना DESCRIBE कथन या DESC कथन का उपयोग करके देख सकते हैं।
व्याकरण:
DESCRIBE tablename;
mysql> DESCRIBE STUDENT;
| फील्ड | प्रकार | नल | कुंजी | डिफॉल्ट | अतिरिक्त |
|---|---|---|---|---|---|
| Rol I Number SNa me SDat eof Birth GUI D |
int varchar(20) date char(12) |
NO YES YES YES |
PRI | NULL NULL NULL NULL |
4 पंक्तियाँ सेट में (0.06 सेकंड)
हम StudentAttendance डेटाबेस में टेबल देखने के लिए SHOW TABLES स्टेटमेंट का उपयोग कर सकते हैं। अब तक, हमारे पास केवल STUDENT टेबल है।
mysql > SHOW TABLES;
| Tables_in_studentattendance |
|---|
| student |
1 पंक्ति सेट में (0.00 सेकंड)
गतिविधि 9.4
तालिका 9.4 और 9.5 में दिए गए डेटा प्रकारों के अनुसार अन्य दो संबंध GUARDIAN और ATTENDANCE बनाएँ और उनकी संरचनाएँ देखें। इन दोनों टेबल्स में कोई भी कंस्ट्रेन्ट न जोड़ें।
9.4.4 ALTER Table
टेबल बनाने के बाद, हमें एहसास हो सकता है कि हमें कोई विशेषता जोड़नी या हटानी है या किसी मौजूदा विशेषता के डेटा प्रकार को संशोधित करना है या विशेषता में कंस्ट्रेन्ट जोड़ना है। ऐसे सभी मामलों में, हमें ALTER स्टेटमेंट का उपयोग करके टेबल की संरचना (स्कीमा) को बदलना या संशोधित करना होता है।
(A) किसी संबंध में प्राइमरी कुंजी जोड़ना
अब हम गतिविधि 9.4 में बनाई गई टेबल्स को संशोधित करते हैं। निम्नलिखित MySQL स्टेटमेंट GUARDIAN संबंध में एक प्राइमरी कुंजी जोड़ता है:
mysql> ALTER TABLE GUARDIAN ADD PRI MARY KEY (GUID);
$\qquad$ Query OK, O rows affected ( 1.14 sec)
$\qquad$ Records: O Duplicates: O Warnings: 0
अब आइए ATTENDANCE रिलेशन में प्राइमरी की जोड़ें। इस रिलेशन की प्राइमरी की एक संयुक्त की है जो दो ऐट्रिब्यूट्स – AttendanceDate और RollNumber – से बनी है।
mysql> ALTER TABLE ATTENDANCE
$\qquad$ -> ADD PRIMARY KEY(AttendanceDate,
$\quad$ RollNumber);
$\quad$ Query OK, 0 rows affected (0.52 sec)
$\quad$ Records: 0 Duplicates: 0 Warnings: 0
गतिविधि 9.5
ATTENDANCE टेबल में फॉरेन की जोड़ें (चित्र 9.1 का प्रयोग करें) रेफरेंसिंग और रेफरेंस्ड टेबल्स को पहचानने के लिए)।
(B) किसी रिलेशन में फॉरेन की जोड़ना
एक बार प्राइमरी की जोड़ देने के बाद, अगला कदम है रिलेशन में फॉरेन की जोड़ना (यदि कोई हो)। रिलेशन में फॉरेन की जोड़ते समय निम्नलिखित बिंदुओं का ध्यान रखना होता है:
- रेफरेंस्ड रिलेशन पहले से बना होना चाहिए।
- रेफरेंस्ड ऐट्रिब्यूट(स) रेफरेंस्ड रिलेशन की प्राइमरी की का हिस्सा होने चाहिए।
- रेफरेंस्ड और रेफरेंसिंग ऐट्रिब्यूट्स के डेटा टाइप और साइज़ एक समान होने चाहिए।
सिंटैक्स:
ALTER TABLE table name ADD FOREIGN KEY(attribute name) REFERENCES referenced_table_name (attribute name);
अब आइए STUDENT टेबल में फॉरेन की जोड़ें। टेबल 9.3 दिखाता है कि ऐट्रिब्यूट GUID (रेफरेंसिंग ऐट्रिब्यूट) एक फॉरेन की है और यह GUARDIAN टेबल के ऐट्रिब्यूट GUID (रेफरेंस्ड ऐट्रिब्यूट) को रेफर करता है। इसलिए, STUDENT रेफरेंसिंग टेबल है और GUARDIAN रेफरेंस्ड टेबल है जैसा कि पिछले अध्याय के चित्र 8.4 में दिखाया गया है।
mysql> ALTER TABLE STUDENT
$\qquad$ -> ADD FOREIGN KEY(GUID) REFERENCES
$\qquad$ -> GUARDIAN(GUID);
$\quad$ Query OK, 0 rows affected (0.75 sec)
$\quad$ Records: 0 Duplicates: 0 Warnings: 0
सोचिए और विचार कीजिए
टेबल ATTENDANCE और STUDENT में विदेशी कुंजियों के नाम बताइए। क्या टेबल GUARDIAN में कोई विदेशी कुंजी है?
(C) किसी मौजूदा attribute पर UNIQUE constraint जोड़ना
GUARDIAN टेबल में, attribute GPhone पर UNIQUE constraint है जिसका अर्थ है कि उस कॉलम में कोई दो मान समान नहीं होने चाहिए।
Syntax:
ALTER TABLE table_name ADD UNIQUE (attribute name);
अब आइए टेबल 9.4 में दिखाए अनुसार GUARDIAN टेबल के attribute GPhone पर UNIQUE constraint जोड़ते हैं।
mysql> ALTER TABLE GUARDIAN
$\qquad$ -> ADD UNIQUE(GPhone);
$\quad$ Query OK, 0 rows affected (0.44 sec)
$\quad$ Records: 0 Duplicates: 0 Warnings: 0
(D) किसी मौजूदा टेबल में attribute जोड़ना
कभी-कभी हमें किसी टेबल में एक अतिरिक्त attribute जोड़ने की आवश्यकता हो सकती है। यह ADD attribute statement का उपयोग करके किया जा सकता है जैसा कि निम्नलिखित Syntax में दिखाया गया है:
ALTER TABLE table_name ADD attribute name DATATYPE;
मान लीजिए, स्कूल के प्रिंसिपल ने कुछ जरूरतमंद छात्रों को छात्रवृत्ति देने का निर्णय लिया है जिसके लिए अभिभावक की आय जाननी होगी। लेकिन, स्कूल ने अब तक टेबल GUARDIAN के साथ income attribute maintain नहीं किया है। इसलिए, डेटाबेस डिज़ाइनर को अब टेबल GUARDIAN में data type INT का एक नया attribute Income जोड़ने की आवश्यकता है।
mysql> ALTER TABLE GUARDIAN
$\qquad$ -> ADD income INT;
$\quad$ Query OK, 0 rows affected (0.47 sec)
$\quad$ Records: 0 Duplicates: 0 Warnings: 0
(E) किसी attribute का datatype बदलना
हम ALTER statement का उपयोग करके किसी table के मौजूदा attributes के data types बदल सकते हैं।
Syntax:
ALTER TABLE table_name MODIFY attribute DATATYPE;
मान लीजिए हमें GUARDIAN table के attribute GAddress का size VARCHAR(30) से VARCHAR(40) करना है। MySQL statement इस प्रकार होगी:
mysql> ALTER TABLE GUARDIAN
$\qquad$ -> MODIFY GAddress VARCHAR(40);
$\qquad$ Query OK, 0 rows affected (0.11 sec)
$\qquad$ Records: 0 Duplicates: 0 Warnings: 0
(F) किसी attribute की constraint बदलना
जब हम कोई table बनाते हैं, तो डिफ़ॉल्ट रूप से प्रत्येक attribute NULL value लेता है, सिवाय उस attribute के जिसे primary key के रूप में परिभाषित किया गया हो। हम alter statement का उपयोग करके किसी attribute की constraint NULL से NOT NULL बदल सकते हैं।
Syntax:
ALTER TABLE table_name MODIFY attribute DATATYPE NOT NULL;
**
सोचिए और विचार कीजिए
न्यूनतम और अधिकतम आय मान क्या हो सकते हैं जिन्हें आय attribute में दर्ज किया जा सकता है यदि डेटा प्रकार INT है?
(G) किसी attribute में डिफ़ॉल्ट मान जोड़ना
यदि हम किसी attribute के लिए डिफ़ॉल्ट मान निर्दिष्ट करना चाहते हैं, तो निमलिखित syntax का प्रयोग करें:
ALTER TABLE table_name MODIFY attribute DATATYPE
DEFAULT default _ value;
STUDENT के SDateofBirth का डिफ़ॉल्ट मान $15^{\text {th }}$ May 2000 सेट करने के लिए, निम्नलिखित statement लिखें:
mysql> ALTER TABLE STUDENT
$\qquad$ -> MODIFY SDateofBirth DATE DEFAULT ‘2000-05-15’;
$\quad$ Query OK, 0 rows affected (0.08 sec)
$\quad$ Records: 0 Duplicates: 0 Warnings: 0
नोट: MODIFY का उपयोग करते समय हमें DEFAULT के साथ attribute का डेटा प्रकार भी निर्दिष्ट करना होता है।
(H) कोई attribute हटाना
ALTER का उपयोग करके हम किसी table से attributes हटा सकते हैं, जैसा कि निम्नलिखित syntax में दिखाया गया है:
ALTER TABLE table_name DROP attribute;
GUARDIAN table (Table 9.4) से income attribute हटाने के लिए, निम्नलिखित MySQL statement लिखें:
mysql> ALTER TABLE GUARDIAN DROP income;
$\qquad$ Query OK, 0 rows affected (0.42 sec)
$\qquad$ Records: 0 Duplicates: 0 Warnings: 0
(I) table से primary key हटाना
कभी-कभी table से primary key constraint हटाने की आवश्यकता हो सकती है। उस स्थिति में, Alter table command निम्नलिखित तरीके से प्रयोग की जा सकती है:
Syntax:
ALTER TABLE table_name DROP PRI MARY KEY;
GUARDIAN तालिका (चित्र 9.4) की प्राइमरी कुंजी को हटाने के लिए निम्न MySQL कथन लिखें:
mysql> ALTER TABLE GUARDIAN DROP PRIMARY KEY;
$\qquad$ Query OK, 0 rows affected (0.72 sec)
$\qquad$ Records: 0 Duplicates: 0 Warnings: 0
नोट: हमने GUARDIAN तालिका से प्राइमरी कुंजी हटा दी है, लेकिन प्रत्येक तालिका में अद्वितीयता बनाए रखने के लिए एक प्राइमरी कुंजी होनी चाहिए। इसलिए, हमें GUARDIAN तालिका के लिए प्राइमरी कुंजी निर्दिष्ट करने के लिए Alter Table कमांड के साथ ADD कथन का उपयोग करना होगा जैसा कि पिछले उदाहरणों में दिखाया गया है।
9.4.5 DROP कथन
कभी-कभी डेटाबेस में एक तालिका या स्वयं डेटाबेस को हटाने की आवश्यकता होती है। हम सिस्टम से डेटाबेस या तालिका को स्थायी रूप से हटाने के लिए DROP कथन का उपयोग कर सकते हैं। हालांकि, इस कथन का उपयोग करते समय बहुत सावधानी बरतनी चाहिए क्योंकि इसे पूर्ववत नहीं किया जा सकता है।
तालिका को हटाने के लिए सिंटैक्स:
DROP TABLE table_name;
डेटाबेस को हटाने के लिए सिंटैक्स:
DROP DATABASE database name;
नोट: डेटाबेस को हटाने के लिए DROP कथन का उपयोग करने से अंततः उसके भीतर की सभी तालिकाएं हट जाएंगी।
9.5 डेटा हेरफेर के लिए SQL
पिछले खंड में, हमने StudentAttendance नामक डेटाबेस बनाया जिसमें तीन संबंध STUDENT, GUARDIAN और ATTENDANCE हैं। जब हम एक तालिका बनाते हैं, तो केवल इसकी संरचना बनती है लेकिन तालिका में कोई डेटा नहीं होता है। तालिका में रिकॉर्ड भरने के लिए INSERT कथन का उपयोग किया जाता है। साथ ही, तालिका रिकॉर्ड्स को DELETE और UPDATE कथनों का उपयोग करके हटाया या अद्यतन किया जा सकता है। ये SQL कथन डेटा हेरफेर भाषा (DML) का हिस्सा हैं।
डेटाबेस का उपयोग करके डेटा मैनिपुलेशन का अर्थ है डेटाबेस में नए डेटा का समावेश, मौजूदा डेटा को हटाना या मौजूदा डेटा में संशोधन करना।
9.5.1 रिकॉर्ड्स का समावेश (INSERTION)
INSERT INTO स्टेटमेंट का उपयोग टेबल में नए रिकॉर्ड्स सम्मिलित करने के लिए किया जाता है। इसका सिंटैक्स है:
INSERT I NTO tablename
VALUES (value1, value2, $\ldots$);
यहाँ value1 attribute1 के अनुरूप है, value2 attribute2 के अनुरूप है और आगे भी ऐसे ही। ध्यान दें कि यदि INSERT स्टेटमेंट में मानों की संख्या टेबल में कुल attributes की संख्या के बराबर है तो हमें insert स्टेटमेंट में attribute नाम निर्दिष्ट करने की आवश्यकता नहीं है।
सावधानी: जब किसी टेबल में foreign key के साथ रिकॉर्ड्स भरते हैं, तो सुनिश्चित करें कि संदर्भित टेबल्स में रिकॉर्ड्स पहले से ही भरे हुए हैं।
आइए StudentAttendance डेटाबेस में कुछ रिकॉर्ड्स सम्मिलित करें। हम पहले GUARDIAN टेबल में रिकॉर्ड्स सम्मिलित करेंगे क्योंकि इसमें कोई foreign key नहीं है। GUARDIAN टेबल के लिए नमूना रिकॉर्ड्स का एक समूह दी गई टेबल (Table 9.6) में दिखाया गया है।
$\hspace{4.5cm}$ Table 9.6 GUARDIAN Table
| GUID | GName | GPhone | GAddress |
|---|---|---|---|
| 444444444444 | Amit Ahuja | 5711492685 | G-35, Ashok Vihar, Delhi |
| 111111111111 | Baichung Bhutia | 3612967082 | Flat no. 5, Darjeeling Appt., Shimla |
| 101010101010 | Himanshu Shah | 4726309212 | 26/77, West Patel Nagar, Ahmedabad |
| 333333333333 | Danny Dsouza | S -13, Ashok Village, Daman | |
| 466444444666 | Sujata P. | 3801923168 | HNO-13, B- block, Preet Vihar, Madurai |
निम्नलिखित INSERT कथन तालिका में पहला रिकॉर्ड जोड़ता है:
mysql> INSERT INTO GUARDIAN
$\qquad$ -> VALUES (444444444444, ‘Amit Ahuja’,
$\qquad$ -> 5711492685, ‘G-35,Ashok vihar, Delhi’ );
$\qquad$ Query OK, 1 row affected (0.01 sec)
हम INSERT किए गए रिकॉर्ड्स को देखने के लिए SQL कथन SELECT * from table_name का उपयोग कर सकते हैं। SELECT कथन अगले खंड में समझाया जाएगा।
mysql> SELECT * from GUARDIAN;
| GUID | GName | Gphone | GAddress |
|---|---|---|---|
| 444444444444 | Amit Ahuja | 5711492685 | G-35, Ashok vihar, Delhi |
1 row in set (0.00 sec)
यदि हम तालिका में केवल कुछ गुणों के लिए मान डालना चाहते हैं (यह मानते हुए कि अन्य गुणों में NULL या कोई अन्य डिफ़ॉल्ट मान है), तो हम INSERT INTO कथन के निम्नलिखित सिंटैक्स का उपयोग करके उन गुण नामों को निर्दिष्ट करेंगे जिनमें मान डाले जाने हैं।
Syntax:
I NSERT I NTO tablename (column1, column2, …)
VALUES (value1, value2, …);
तालिका 9.6 के चौथे रिकॉर्ड को डालने के लिए जहाँ GPhone नहीं दिया गया है, हमें अन्य तीन फ़ील्ड्स में मान डालने होंगे (GPhone को तालिका बनाते समय डिफ़ॉल्ट रूप से NULL सेट किया गया था)। इस स्थिति में, हमें उन गुण नामों को निर्दिष्ट करना होगा जिनमें हम मान डालना चाहते हैं। मान उसी क्रम में देने होंगे जिस क्रम में वे INSERT कथन में लिखे गए हैं।
गतिविधि 9.6
तालिका 9.6 की शेष 3 पंक्तियों को GUARDIAN तालिका में डालने के लिए SQL कथन लिखिए।
mysql> INSERT INTO GUARDIAN(GUID, GName, GAddress)
$\qquad$ -> VALUES (333333333333, ‘Danny Dsouza’,
$\qquad$ -> ‘S -13, Ashok Village, Daman’ );
$\qquad$ Query OK, 1 row affected (0.03 sec)
नोट: टेक्स्ट और तिथि मानों को “’” (सिंगल कोट्स) में बंद करना चाहिए।
mysql> SELECT * from GUARDIAN;
| GUID | GName | Gphone | GAddress |
|---|---|---|---|
| 333333333333 444444444444 |
Danny Dsouza Amit Ahuja |
NULL 5711492685 |
S -13 , Ashok village, Daman G-35, Ashok vihar, Delhi |
अब आइए तालिका 9.7 में दिए गए रिकॉर्ड्स को STUDENT तालिका में डालें।
$\hspace{3cm}$ तालिका 9.7 STUDENT तालिका
| RollNumber | SName | SDateofBirth | GUID |
|---|---|---|---|
| 1 | Atharv Ahuja | 2003-05-15 | 444444444444 |
| 2 | Daizy Bhutia | 2002-02-28 | 11111111111 |
| 3 | Taleem Shah | 2002-02-28 | |
| 4 | John Dsouza | 2003-08-18 | 33333333333 |
| 6 | Ali Shah | 2003-07-05 | 101010101010 |
तालिका 9.7 का पहला रिकॉर्ड डालने के लिए, हम निम्नलिखित MySQL स्टेटमेंट लिखते हैं
mysql> INSERT INTO STUDENT
$\quad$ -> VALUES(1,‘Atharv Ahuja’,‘2003-05-15’,
$\quad$ 444444444444);
$\quad$ Query OK, 1 row affected (0.11 sec)
$\quad$ OR
$\quad$ mysql> INSERT INTO STUDENT (RollNumber, SName,
$\quad$ SDateofBirth, GUID)
$\qquad$ -> VALUES (1,‘Atharv Ahuja’,‘2003-05-15’,
$\quad$ 444444444444);
$\quad$ Query OK, 1 row affected (0.02 sec)
याद रखें कि तिथि को ‘YYYY-MM-DD’ प्रारूप में संग्रहीत किया जाता है।
mysql> SELECT * from STUDENT;
| RollNumber | SName | SDateofBirth | GUID |
|---|---|---|---|
| 1 | Atharv Ahuja | 2003-05-15 | 444444444444 |
अब हम तालिका 9.7 का तीसरा रिकॉर्ड डालते हैं जिसमें GUID NULL है। याद रखें कि GUID इस तालिका की विदेशी कुंजी है और इसलिए NULL मान ले सकती है। इसलिए हम GUID के लिए NULL मान रख सकते हैं और निम्नलिखित कथन का उपयोग करके रिकॉर्ड डाल सकते हैं:
गतिविधि 9.7
तालिका 9.7 की शेष 4 पंक्तियों को STUDENT तालिका में डालने के लिए SQL कथन लिखें।
mysql> INSERT INTO STUDENT
$\qquad$ -> VALUES(3, ‘Taleem Shah’,‘2002-02-28’, NULL);
$\qquad$ Query OK, 1 row affected (0.05 sec)
mysql> SELECT * from STUDENT;
| RollNumber | SName | SDateofBirth | GUID |
|---|---|---|---|
| 1 | Atharv Ahuja | 2003-05-15 | 444444444444 |
| 2 | Taleem Shah | 2002-02-28 | NULL |
हमें उपरोक्त INSERT कथन में NULL लिखना पड़ा क्योंकि हम कॉलम नामों का उल्लेख नहीं कर रहे थे। अन्यथा, यदि हमें केवल कुछ विशेष गुणों के लिए डेटा डालना हो तो हमें गुणों के नाम मानों के साथ उल्लेख करने चाहिए, जैसा कि निम्नलिखित क्वेरी में दिखाया गया है:
mysql> INSERT INTO STUDENT (RollNumber, SName,
$\qquad$ -> SDateofBirth) VALUES (3, ‘Taleem Shah’,‘2002-02-28’);
$\qquad$ Query OK, 1 row affected (0.05 sec)
सोचिए और विचार कीजिए
- डाले जाने वाले डेटा का क्रम ज्ञात न हो तो दोनों INSERT कथनों में से किसका उपयोग किया जाना चाहिए?
- क्या हम समान रोल नंबर वाले दो रिकॉर्ड डाल सकते हैं?
9.6 डेटा क्वेरी के लिए SQL
अब तक हमने सीखा है कि डेटाबेस कैसे बनाया जाता है और उसमें डेटा को कैसे संग्रहीत और संचालित किया जाता है। हम डेटाबेस में डेटा संग्रहीत करने में रुचि रखते हैं क्योंकि भविष्य में डेटाबेस से डेटा को जिस भी तरह चाहें उस तरह पुनः प्राप्त करना आसान होता है। SQL MySQL डेटाबेस (या किसी अन्य RDBMS) में कई तालिकाओं में संग्रहीत डेटा को पुनः प्राप्त करने के लिए कुशल तंत्र प्रदान करता है। SQL कथन SELECT तालिकाओं से डेटा पुनः प्राप्त करने के लिए प्रयोग किया जाता है और इसे क्वेरी कथन भी कहा जाता है।
9.6.1 SELECT कथन
SQL कथन SELECT डेटाबेस की तालिकाओं से डेटा पुनः प्राप्त करने के लिए प्रयोग किया जाता है और आउटपुट भी तालिका रूप में प्रदर्शित होता है।
व्याकरण:
SELECT attribute1, attribute2, …
FROM table_name
WHERE condition;
यहाँ, attribute 1, attribute $2, \ldots$ तालिका table_name के स्तंभ नाम हैं जिनसे हम डेटा पुनः प्राप्त करना चाहते हैं। FROM खंड हमेशा SELECT खंड के साथ लिखा जाता है क्योंकि यह उस तालिका का नाम निर्दिष्ट करता है जिससे डेटा पुनः प्राप्त किया जाना है। WHERE खंड वैकल्पिक है और निर्दिष्ट शर्त(ओं) को पूरा करने वाले डेटा को पुनः प्राप्त करने के लिए प्रयोग किया जाता है।
किसी तालिका में उपलब्ध सभी डेटा को चुनने के लिए, हम निम्नलिखित select कथन का प्रयोग करते हैं:
SELECT * FROM table_name;
उदाहरण 9.2 निम्नलिखित क्वेरी रोल नंबर 1 वाले छात्र का नाम और जन्म तिथि पुनः प्राप्त करती है:
mysql> SELECT SName, SDateofBirth
$\qquad$ -> FROM STUDENT
$\qquad$ -> WHERE RollNumber = 1;
| SName | SDateofBirth |
|---|---|
| अथर्व अहूजा | 2003-05-15 |
1 row in set (0.03 sec)
सोचें और विचार करें
सोचें और अपने दैनिक जीवन से कुछ उदाहरण गिनें जहाँ डेटा को डेटाबेस में संग्रहित करना और उसी पर क्वेरी करना उपयोगी हो सकता है।
9.6.2 डेटाबेस OFFICE का उपयोग कर क्वेरी करना
संगठन डेटा को तालिकाओं के रूप में संग्रहित करने के लिए डेटाबेस बनाए रखते हैं। आइए किसी संगठन के डेटाबेस OFFICE पर विचार करें जिसमें EMPLOYEE, DEPARTMENT जैसी कई संबंधित तालिकाएँ हैं। डेटाबेस में हर EMPLOYEE किसी DEPARTMENT को सौंपा जाता है और उसका विभाग संख्या (DeptId) EMPLOYEE तालिका में विदेशी कुंजी के रूप में संग्रहित होता है। आइए संबंध ‘EMPLOYEE’ को तालिका 9.8 में दिखाए अनुसार लें और डेटा पुनः प्राप्त करने के लिए SELECT कथन लागू करें:
तालिका 9.8 EMPLOYEE तालिका में डाले जाने वाले रिकॉर्ड
| EmpNo | Ename | Salary | Bonus | Deptld |
|---|---|---|---|---|
| 101 | आलिया | 10000 | 234 | D02 |
| 102 | कृतिका | 60000 | 123 | D01 |
| 103 | शब्बीर | 45000 | 566 | D01 |
| 104 | गुरप्रीत | 19000 | 565 | D04 |
| 105 | जोसेफ | 34000 | 875 | D03 |
| 106 | सान्या | 48000 | 695 | D02 |
| 107 | वर्गीस | 15000 | D01 | |
| 108 | नचाओबी | 29000 | D05 | |
| 109 | दारिभा | 42000 | D04 | |
| 110 | तान्या | 50000 | 467 | D05 |
(A) चयनित स्तंभ पुनः प्राप्त करना
निम्न क्वेरी सभी कर्मचारियों के कर्मचारी संख्याओं को चुनती है:
mysql> SELECT EmpNo FROM EMPLOYEE;
| EmpNo |
|---|
| 101 |
| 102 |
| 103 |
| 104 |
| 105 |
| 106 |
| 107 |
| 108 |
| 109 |
| 110 |
10 rows in set (0.41 sec)
निम्नलिखित क्वेरी सभी कर्मचारियों के कर्मचारी संख्या और कर्मचारी नाम का चयन करती है, हम लिखते हैं:
mysql> SELECT EName as Name FROM EMPLOYEE;
| EmpNo | Ename |
|---|---|
| 101 | आलिया |
| 102 | कृतिका |
| 103 | शब्बीर |
| 104 | गुरप्रीत |
| 105 | जोसेफ |
| 106 | सान्या |
| 107 | वर्गीस |
| 108 | नचाओबी |
| 109 | दारिभा |
| 110 | तान्या |
10 rows in set (0.00 sec)
(B) कॉलम का नाम बदलना
यदि हम आउटपुट प्रदर्शित करते समय किसी कॉलम का नाम बदलना चाहते हैं, तो यह उपनाम ‘AS’ का उपयोग करके किया जा सकता है। निम्नलिखित क्वेरी सभी कर्मचारियों के लिए आउटपुट में कर्मचारी नाम को Name के रूप में चुनती है:
mysql> SELECT EName as Name FROM EMPLOYEE;
| Name |
|---|
| आलिया |
| कृतिका |
| शब्बीर |
| गुरप्रीत |
| जोसेफ |
| सान्या |
| वर्गीस |
| नचाओबी |
| दारिभा |
| तान्या |
10 rows in set (0.00 sec)
उदाहरण 9.3 सभी कर्मचारियों के नाम उनकी वार्षिक आय (वेतन12 के रूप में गणना) के साथ चुनें। जब क्वेरी परिणाम प्रदर्शित करें, तो कॉलम EName का नाम Name रखें mysql>SELECT EName as Name, Salary 12 From EMPLOYEE;
| Name | Salary*12 |
|---|---|
| आलिया | 120000 |
| कृतिका | 720000 |
| शब्बीर | 540000 |
| गुरप्रीत | 228000 |
| जोसेफ | 408000 |
| सान्या | 576000 |
| वर्गीस | 180000 |
| नचाओबी | 348000 |
| दारिभा | 504000 |
| तान्या | 600000 |
10 rows in set (0.02 sec)
ध्यान दें कि आउटपुट में, वार्षिक आय कॉलम के लिए Salary* 12 को कॉलम नाम के रूप में प्रदर्शित किया गया है। आउटपुट टेबल में, हम उस कॉलम का नाम बदलने के लिए उपनाम का उपयोग कर सकते हैं जैसा कि नीचे दिखाया गया है:
_mysql> SELECT Ename AS Name, Salary*12 AS ‘Annual Income’
-> FROM EMPLOYEE;
| Name | Annual Income |
|---|---|
| Aaliya | 120000 |
| Kritika | 720000 |
| Shabbir | 540000 |
| Gurpreet | 228000 |
| Joseph | 408000 |
| Sanya | 576000 |
| Vergese | 180000 |
| Nachaobi | 348000 |
| Daribha | 504000 |
| Tanya | 600000 |
10 rows in set (0.00 sec)
नोट: Annual Income को डेटाबेस टेबल में एक नए कॉलम के रूप में नहीं जोड़ा जाएगा। यह केवल क्वेरी के आउटपुट को प्रदर्शित करने के लिए है।
**यदि एक उपनाम वाले कॉलम नाम में स्पेस हो, जैसे कि Annual Income, तो उसे उद्धरण चिह्नों में लिखना चाहिए, जैसे ‘Annual Income’
(C) Distinct Clause
डिफ़ॉल्ट रूप से, SQL क्वेरी के माध्यम से प्राप्त सभी डेटा को आउटपुट के रूप में दिखाता है। हालांकि, डुप्लिकेट मान हो सकते हैं। जब SELECT स्टेटमेंट को DISTINCT क्लॉज़ के साथ संयोजित किया जाता है, तो यह दोहराव के बिना रिकॉर्ड लौटाता है (विशिष्ट रिकॉर्ड)। उदाहरण के लिए, जब कर्मचारी संबंध से विभाग संख्या प्राप्त की जाती है, तो डुप्लिकेट मान हो सकते हैं क्योंकि कई कर्मचारी एक ही विभाग में नियुक्त होते हैं। सभी कर्मचारियों के लिए अद्वितीय विभाग संख्या चुनने के लिए, हम DISTINCT का उपयोग नीचे दिखाए अनुसार करते हैं:
mysql > SELECT DISTINCT DeptId FROM EMPLOYEE;
| DeptId |
|---|
| D02 |
| D01 |
| D04 |
| D03 |
| D05 |
5 rows in set (0.03 sec)
(D) WHERE Clause
WHERE क्लॉज़ का उपयोग उन डेटा को प्राप्त करने के लिए किया जाता है जो कुछ निर्दिष्ट शर्तों को पूरा करते हैं। OFFICE डेटाबेस में, एक से अधिक कर्मचारी की एक ही वेतन हो सकता है। निम्नलिखित क्वेरी विभाग संख्या D01 में कार्यरत कर्मचारियों की विशिष्ट वेतन देती है:
mysql> SELECT DISTINCT Salary
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE Deptid=‘D01’;
चूँकि कॉलम DeptId स्ट्रिंग प्रकार का है, इसके मान को उद्धरण चिह्नों (‘D01’) में रखा गया है।
| Salary |
|---|
| 60000 |
| 45000 |
| 15000 |
3 rows in set (0.02 sec)
उपरोक्त उदाहरण में, WHERE खंड में $=$ ऑपरेटर का उपयोग किया गया है। अन्य संबंधात्मक ऑपरेटर $(<,<=,>$, >=, !=) ऐसी शर्तें निर्दिष्ट करने के लिए प्रयोग किए जा सकते हैं। लॉजिकल ऑपरेटर AND, OR और NOT कई शर्तों को जोड़ने के लिए प्रयोग किए जाते हैं।
उदाहरण 9.4 D04 विभाग के उन सभी कर्मचारियों के सभी विवरण दिखाएँ जो 5000 से अधिक कमाते हैं।
mysql> SELECT * FROM EMPLOYEE
$\qquad$ -> WHERE Salary > 5000 AND DeptId = ‘D04’;
| EmpNo | Ename | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 104 | Gurpreet | 19000 | 565 | D04 |
| 109 | Daribha | 42000 | NULL | D04 |
2 rows in set (0.00 sec)
उदाहरण 9.5 निम्नलिखित क्वेरी Aaliya को छोड़कर सभी कर्मचारियों के रिकॉर्ड चुनती है।
mysql> SELECT * FROM EMPLOYEE
$\qquad$ -> WHERE NOT Ename = ‘Aaliya’;
| E mp No | Ename | Sal ary | Bonus | DeptId |
|---|---|---|---|---|
| 102 | Kritika | 60000 | 123 | D0 1 |
| 103 | Shabbir | 45000 | 566 | D0 1 |
| 104 | Gurpreet | 19000 | 565 | D0 4 |
| 105 | Joseph | 34000 | 875 | D0 3 |
| 106 | Sanya | 48000 | 695 | D02 |
| 107 | Vergese | 15000 | NULL | D0 1 |
| 108 | Nachaobi | 29000 | NULL | D05 |
| 109 | Daribha | 42000 | NULL | D0 4 |
| 110 | Tanya | 50000 | 467 | D0 5 |
9 rows in set (0.00 sec)
सोचिए और विचार कीजिए
यदि उपरोक्त क्वेरी में हम “Aaliya” को “AALIYA” या “aaliya” या “AaLIYA” लिखें तो क्या होगा? क्या क्वेरी समान आउटपुट देगी या कोई त्रुटि आएगी?
उदाहरण 9.6 निम्नलिखित क्वेरी उन सभी कर्मचारियों का नाम और विभाग संख्या चुनती है जो 20000 और 50000 के बीच वेतन पा रहे हैं (दोनों मान सम्मिलित हैं).
mysql> SELECT Ename, DeptId
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE Salary>=20000 AND Salary<=50000;
| Ename | DeptId |
|---|---|
| Shabbir | D01 |
| Joseph | D03 |
| Sanya | D02 |
| Nachaobi | D05 |
| Daribha | D04 |
| Tanya | D05 |
6 rows in set (0.00 sec)
SELECT * FROM EMPLOYEE
WHERE Salary >5000 OR Deptld =20;
उदाहरण 9.6 में दी गई क्वेरी एक रेंज को परिभाषित करती है जिसे BETWEEN तुलना ऑपरेटर का उपयोग करके भी जाँचा जा सकता है, जैसा कि नीचे दिखाया गया है:
mysql> SELECT Ename, DeptId
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE Salary BETWEEN 20000 AND 50000;
| Ename | DeptId |
|---|---|
| Shabbir | D01 |
| Joseph | D03 |
| Sanya | D02 |
| Nachaobi | D05 |
| Daribha | D04 |
| Tanya | D05 |
6 rows in set (0.03 sec)
नोट: BETWEEN ऑपरेटर मानों की एक रेंज को परिभाषित करता है जिसमें कॉलम का मान आना चाहिए ताकि शर्त सत्य हो सके।
गतिविधि 9.8
उदाहरण 9.6 में दी गई क्वेरी द्वारा उत्पन्न आउटपुट और निम्नलिखित क्वेरी के आउटपुट की तुलना कीजिए और OR तथा AND ऑपरेटरों के बीच अंतर कीजिए।
उदाहरण 9.7 निम्नलिखित क्वेरी उन सभी कर्मचारियों का विवरण चुनती है जो D01, D02 या D04 deptid वाले विभागों में कार्यरत हैं।
mysql> SELECT *
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE DeptId = ‘D01’ OR DeptId = ‘D02’ OR
DeptId = ‘D04’;
| EmpNo | EName | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 101 | आलिया | 10000 | 234 | D02 |
| 102 | कृतिका | 60000 | 123 | D01 |
| 103 | शब्बीर | 45000 | 566 | D01 |
| 104 | गुरप्रीत | 19000 | 565 | D04 |
| 106 | सान्या | 48000 | 695 | D02 |
| 107 | वर्गीज़ | 15000 | NULL | D01 |
| 109 | दारिभा | 42000 | NULL | D04 |
7 rows in set (0.00 sec)
(E) सदस्यता ऑपरेटर IN
IN ऑपरेटर एक मान की तुलना मानों के समूह से करता है और सही लौटाता है यदि वह मान उस समूह से संबंधित है। उपरोक्त क्वेरी को IN ऑपरेटर का उपयोग करके नीचे दिखाए अनुसार पुनः लिखा जा सकता है:
mysql> SELECT * FROM EMPLOYEE
$\qquad$ -> WHERE DeptId IN (‘D01’, ‘D02’ , ‘D04’);
| EmpNo | EName | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 101 | आलिया | 10000 | 234 | D02 |
| 102 | कृतिका | 60000 | 123 | D01 |
| 103 | शब्बीर | 45000 | 566 | D01 |
| 104 | गुरप्रीत | 19000 | 565 | D04 |
| 106 | सान्या | 48000 | 695 | D02 |
| 107 | वर्गीज़ | 15000 | NULL | D01 |
| 109 | दारिभा | 42000 | NULL | D04 |
7 rows in set (0.00 sec)
उदाहरण 9.8 निम्नलिखित क्वेरी उन सभी कर्मचारियों का विवरण चुनती है जो विभाग संख्या D01 या D02 में कार्यरत नहीं हैं।
mysql> SELECT * FROM EMPLOYEE
$\qquad$ -> WHERE DeptId NOT IN(‘D01’, ‘D02’);
| EmpNo | EName | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 104 | गुरप्रीत | 19000 | 565 | D04 |
| 105 | जोसेफ़ | 34000 | 875 | D03 |
| 108 | नचाओबी | 29000 | NULL | D05 |
| 109 | डारिभा | 42000 | NULL | D04 |
| 110 | तान्या | 50000 | 467 | D05 |
5 पंक्तियाँ सेट में (0.00 sec)
नोट: यहाँ हमें NOT को IN के साथ संयोजित करना होता है क्योंकि हमें DeptId D01 और D02 को छोड़कर सभी रिकॉर्ड प्राप्त करने हैं।
(F) ORDER BY Clause
ORDER BY clause का उपयोग डेटा को किसी निर्दिष्ट कॉलम के सापेक्ष क्रमबद्ध रूप में प्रदर्शित करने के लिए किया जाता है। डिफ़ॉल्ट रूप से, ORDER BY निर्दिष्ट कॉलम के मानों के आरोही क्रम में रिकॉर्ड प्रदर्शित करता है। रिकॉर्ड्स को अवरोही क्रम में प्रदर्शित करने के लिए DESC (अर्थात् descending) कीवर्ड को उस कॉलम के साथ लिखना होता है।
उदाहरण 9.9 निम्नलिखित क्वेरी सभी कर्मचारियों का विवरण उनके वेतन के आरोही क्रम में चुनती है।
mysql> SELECT * FROM EMPLOYEE
$\qquad$ -> ORDER BY Salary;
| EmpNo | EName | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 101 | आलिया | 10000 | 234 | D02 |
| 107 | वर्गीज़ | 15000 | NULL | D01 |
| 104 | गुरप्रीत | 19000 | 565 | D04 |
| 108 | नचाओबी | 29000 | NULL | D05 |
| 105 | जोसेफ़ | 34000 | 875 | D03 |
| 109 | डारिभा | 42000 | NULL | D04 |
| 103 | शब्बीर | 45000 | 566 | D01 |
| 106 | सान्या | 48000 | 695 | D02 |
| 110 | तान्या | 50000 | 467 | D05 |
| 102 | कृतिका | 60000 | 123 | D01 |
10 पंक्तियाँ सेट में (0.05 sec)
उदाहरण 9.10 सभी कर्मचारियों का विवरण उनके वेतन के अवरोही क्रम में चुनें।
mysql> SELECT * FROM EMPLOYEE
$\qquad$ -> ORDER BY Salary DESC;
| EmpNo | EName | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 102 | कृतिका | 60000 | 123 | D01 |
| 110 | तान्या | 50000 | 467 | D05 |
| 106 | सान्या | 48000 | 695 | D02 |
| 103 | शब्बीर | 45000 | 566 | D01 |
| 109 | दारिभा | 42000 | NULL | D04 |
| 105 | जोसेफ | 34000 | 875 | D03 |
| 108 | नाचाओबी | 29000 | NULL | D05 |
| 104 | गुरप्रीत | 19000 | 565 | D04 |
| 107 | वर्गीस | 15000 | NULL | D01 |
| 101 | आलिया | 10000 | 234 | D02 |
10 rows in set (0.00 sec)
गतिविधि 9.9
निम्नलिखित 2 क्वेरीज़ को निष्पादित करें और पता लगाएं कि यदि हम ORDER BY क्लॉज़ में दो कॉलम निर्दिष्ट करें तो क्या होगा:
SELECT * FROM
EMPLOYEE
ORDER BY Salary,
Bonus;SELECT * FROM EMPLOYEE
ORDER BY
Sal ary, Bonus
DESC;
(G) NULL मानों को संभालना
SQL एक विशेष मान NULL का समर्थन करता है जो गुम या अज्ञात मान को दर्शाने के लिए प्रयोग होता है। उदाहरण के लिए, GUARDIAN तालिका में Gphone कॉलम कुछ रिकॉर्ड्स के लिए गुम मान रख सकता है। इसलिए, ऐसे अज्ञात मानों को दर्शाने के लिए NULL का प्रयोग किया जाता है। यह ध्यान रखना महत्वपूर्ण है क NULL 0 (शून्य) से भिन्न होता है। साथ ही, NULL मान के साथ किया गया कोई भी अंकगणितीय संचालन NULL देता है। उदाहरण के लिए: $5+$ NULL = NULL क्योंकि NULL अज्ञात है इसलिए परिणाम भी अज्ञात होता है। किसी कॉलम में NULL मान की जांच करने के लिए हम IS NULL ऑपरेटर का प्रयोग करते हैं।
उदाहरण 9.11 निम्नलिखित क्वेरी उन सभी कर्मचारियों का विवरण चुनती है जिन्हें बोनस नहीं दिया गया है। इसका अर्थ है कि बोनस कॉलम खाली होगा।
mysql> SELECT * FROM EMPLOYEE
$\qquad$ -> WHERE Bonus IS NULL;
| EmpNo | Ename | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 107 | Vergese | 15000 | NULL | D01 |
| 108 | Nachaobi | 29000 | NULL | D05 |
| 109 | Daribha | 42000 | NULL | D04 |
3 rows in set (0.00 sec)
उदाहरण 9.12 निम्नलिखित क्वेरी उन सभी कर्मचारियों के नाम चुनती है जिन्हें बोनस दिया गया है (अर्थात् बोनस null नहीं है) और जो विभाग D01 में कार्यरत हैं।
mysql> SELECT * FROM EMPLOYEE
$\qquad$ -> WHERE Bonus IS NULL;
| EName |
|---|
| Kritika Shabbir |
2 rows in set (0.00 sec)
(H) सबस्ट्रिंग पैटर्न मिलान
कई बार हम ऐसी स्थितियों का सामना करते हैं जहाँ हम सटीक पाठ या मान से मिलान करके क्वेरी नहीं करना चाहते। बल्कि, हम कॉलम मानों में केवल कुछ वर्णों या मानों का मिलान खोजने में रुचि रखते हैं। उदाहरण के लिए, “T” से शुरू होने वाले नामों को खोजना या ‘60’ से शुरू होने वाले पिन कोड खोजना। इसे सबस्ट्रिंग पैटर्न मिलान कहा जाता है। हम ऐसे पैटर्नों का मिलान $=$ ऑपरेटर का उपयोग करके नहीं कर सकते क्योंकि हम सटीक मिलान की तलाश में नहीं हैं। SQL एक LIKE ऑपरेटर प्रदान करता है जिसे WHERE क्लॉज़ के साथ उपयोग किया जा सकता है ताकि किसी कॉलम में निर्दिष्ट पैटर्न की खोज की जा सके।
LIKE ऑपरेटर निम्नलिखित दो वाइल्डकार्ड वर्णों का उपयोग करता है:
- % (प्रतिशत)- शून्य, एक या एक से अधिक वर्णों को दर्शाने के लिए उपयोग किया जाता है
- _ (अंडरस्कोर)- ठीक एक एकल वर्ण को दर्शाने के लिए उपयोग किया जाता है
उदाहरण 9.13 निम्नलिखित क्वेरी उन सभी कर्मचारियों का विवरण चुनती है जिनके नाम ‘K’ से शुरू होते हैं।
mysql> SELECT * FROM EMPLOYEE
$\qquad$ -> WHERE Ename like ‘K%’;
| EmpNo | Ename | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 102 | Kritika | 60000 | 123 | D01 |
1 row in set (0.00 sec)
उदाहरण 9.14 निम्नलिखित क्वेरी उन सभी कर्मचारियों का विवरण चुनती है जिनके नाम ‘a’ पर समाप्त होते हैं और जिनकी सैलरी 45000 से अधिक है।
mysql> SELECT * FROM EMPLOYEE
$\qquad$ -> WHERE Ename like ‘%a’
$\qquad$ -> AND Salary > 45000;
| EmpNo | Ename | Salary | Bonus | DeptId | |
|---|---|---|---|---|---|
| 102 | Kritika | 60000 | 123 | D01 | |
| 106 | Sanya | 48000 | 695 | D02 | |
| 110 | Tanya | 50000 | 467 | D05 |
3 rows in set (0.00 sec)
सोचिए और विचार कीजिए
जब हम अपने मोबाइल फोन की संपर्क सूची में किसी संपर्क के नाम का पहला अक्षर टाइप करते हैं, तो उस अक्षर वाले सभी नाम प्रदर्शित होते हैं। क्या आप इस प्रक्रिया के साथ SQL कथन को संबंधित कर सकते हैं? अन्य वास्तविक जीवन की स्थितियों की सूची बनाइए जहाँ आप SQL कथन को कार्यरत देख सकते हैं।
उदाहरण 9.15 निम्नलिखित क्वेरी उन सभी कर्मचारियों का विवरण चुनती है जिनके नाम में ठीक 5 अक्षर हैं और जो किसी भी अक्षर से शुरू होते हैं लेकिन उसके बाद ‘ANYA’ होता है।
mysql> SELECT * FROM EMPLOYEE
$\qquad$ -> WHERE Ename like ‘_ANYA’;
| EmpNo | Ename | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 106 | Sanya | 48000 | 695 | D02 |
| 110 | Tanya | 50000 | 467 | D05 |
2 rows in set (0.00 sec)
उदाहरण 9.16 निम्नलिखित क्वेरी उन सभी कर्मचारियों के नाम चुनती है जिनके नाम में ‘se’ उपस्ट्रिंग के रूप में होता है।
mysql> SELECT Ename FROM EMPLOYEE
$\qquad$ -> WHERE Ename like ‘%se%’;
| Ename |
|---|
| Joseph Vergese |
2 rows in set (0.00 sec)
उदाहरण 9.17 निम्नलिखित क्वेरी उन सभी कर्मचारियों के नाम चुनती है जिनके नाम में दूसरे स्थान पर ‘a’ अक्षर होता है।
_mysql> SELECT EName FROM EMPLOYEE
$\qquad$ -> WHERE Ename like ‘a%’;
| EName |
|---|
| Aaliya |
| Sanya |
| Nachaobi |
| Daribha |
| Tanya |
5 rows in set (0.00 sec)
9.7 डेटा अद्यतन और विलोपन
डेटा का अद्यतन और विलोपन SQL डेटा मैनिपुलेशन लैंग्वेज (DML) का भी हिस्सा है। इस खंड में, हम इन दो डेटा मैनिपुलेशन विधियों को खंड 9.4 में दिए गए StudentAttendance डेटाबेस पर लागू करने जा रहे हैं।
9.7.1 डेटा अद्यतन
हमें किसी तालिका में मौजूदा रिकॉर्ड्स की एक या अधिक कॉलम के मानों में बदलाव करने की आवश्यकता हो सकती है। उदाहरण के लिए, हमें पते, फोन नंबर या नाम की वर्तनी आदि में कुछ बदलाव करने की आवश्यकता हो सकती है। ऐसे संशोधन मौजूदा डेटा में करने के लिए UPDATE स्टेटमेंट का उपयोग किया जाता है।
सिंटैक्स:
UPDATE table_name
SET attribute1 = value1, attribute2 = value2, …
WHERE condition;
स्टूडेंट टेबल 9.7 में रोल नंबर 3 वाले छात्र के GUID में NULL मान है। मान लीजिए रोल नंबर 3 और 5 वाले छात्र भाई-बहन हैं। तब, STUDENT टेबल में हमें रोल नंबर 3 वाले छात्र के लिए GUID मान 101010101010 भरना होगा। किसी विशेष पंक्ति (रिकॉर्ड) का GUID अपडेट या बदलने के लिए हमें WHERE क्लॉज़ का उपयोग करके उस रिकॉर्ड को निर्दिष्ट करना होता है, जैसा नीचे दिखाया गया है:
mysql> UPDATE STUDENT
$\qquad$ -> SET GUID = 101010101010
$\qquad$ -> WHERE RollNumber = 3;
Query OK, 1 row affected (0.06 sec) Rows matched: 1
Changed: 1 Warnings: 0
हम तब अपडेटेड डेटा को SELECT * FROM STUDENT स्टेटमेंट का उपयोग करके सत्यापित कर सकते हैं।
सावधानी: यदि हम UPDATE स्टेटमेंट में WHERE क्लॉज़ छोड़ देते हैं तो सभी रिकॉर्ड्स का GUID 101010101010 हो जाएगा।
हम UPDATE स्टेटमेंट का उपयोग करके एक से अधिक कॉलम के मान भी अपडेट कर सकते हैं। मान लीजिए, GUID 466444444666 वाले अभिभावक ने पता ‘WZ - 68, Azad Avenue, Bijnour, MP’ और फोन नंबर ‘4817362092’ बदलने का अनुरोध किया है।
mysql> UPDATE GUARDIAN
$\qquad$ -> SET GAddress = ‘WZ - 68, Azad Avenue,
-> Bijnour, MP’, GPhone = 9010810547
$\qquad$ -> WHERE GUID = 466444444666;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM GUARDIAN ;
| GUID | GName | Gphone | GAddress | |
|---|---|---|---|---|
| 444444444444 111111111111 101010101010 333333333333 466444444666 |
अमित अहूजा बाइचुंग भूटिया हिमांशु शाह डैनी डिसूज़ा सुजाता पी. |
5711492685 3612967082 4726309212 NULL 3801923168 |
G-35, अशोक विहार, दिल्ली फ़्लैट नं. 5, दार्जिलिंग अपार्टमेंट, शिमला 26/77, वेस्ट पटेल नगर, अहमदाबाद S -13, अशोक विलेज, दमन WZ - 68, आज़ाद एवेन्यू, बिजनौर, MP |
5 rows in set (0.00 sec)
9.7.2 डेटा विलोपन
DELETE कथन का उपयोग तालिका से एक या अधिक रिकॉर्ड हटाने/निकालने के लिए किया जाता है।
व्याकरण:
DELETE FROM table_name
WHERE condition;
मान लीजिए कि रोल नंबर 2 वाला छात्र स्कूल छोड़ चुका है। हम STUDENT तालिका से उस रिकॉर्ड को हटाने के लिए निम्नलिखित MySQL कथन का उपयोग कर सकते हैं।
mysql> DELETE FROM STUDENT WHERE RollNumber = 2;
Query OK, 1 row affected (0.06 sec)
mysql> SELECT * FROM STUDENT ;
| RollNumber | SName | SDateofBirth | GUID | |
|---|---|---|---|---|
| 1 3 4 5 6 |
अथर्व अहूजा तालीम शाह जॉन डिसूज़ा अली शाह मानिका पी. |
2003-05-15 2002-02-28 2003-08-18 2003-07-05 2002-03-10 |
444444444444 101010101010 333333333333 101010101010 466444444666 |
5 rows in set (0.00 sec)
चेतावनी: UPDATE स्टेटमेंट की तरह, हमें DELETE स्टेटमेंट का उपयोग करते समय टेबल में रिकॉर्ड्स को हटाने के लिए WHERE क्लॉज़ शामिल करने में सावधानी बरतनी चाहिए। अन्यथा, टेबल में मौजूद सभी रिकॉर्ड्स हट जाएंगे।
9.8 SQL में फंक्शन्स
इस खंड में, हम समझेंगे कि SQL में सिंगल रो फंक्शन्स, मल्टीपल रो फंक्शन्स, कुछ मानदंडों के आधार पर रिकॉर्ड्स को ग्रुप करना और मल्टीपल टेबल्स पर काम कैसे किया जाता है।
चित्र 9.2: डेटाबेस CARSHOWROOM का स्कीमा आरेख
आइए एक डेटाबेस बनाते हैं जिसे CARSHOWROOM कहा जाता है और जिसका स्कीमा चित्र 9.2 में दिखाया गया है। इसमें निम्नलिखित चार रिलेशन्स हैं:
1) INVENTORY: शोरूम के इन्वेंटरी में मौजूद प्रत्येक कार का नाम, मूल्य, मॉडल, निर्माण वर्ष और ईंधन प्रकार संग्रहित करता है,
2) CUSTOMER: प्रत्येक ग्राहक की ग्राहक आईडी, नाम, पता, फोन नंबर और ईमेल संग्रहित करता है,
3) SALE: बेची गई कार की इनवॉइस नंबर, कार आईडी, ग्राहक आईडी, बिक्री तिथि, भुगतान का तरीका, सेल्सपर्सन की कर्मचारी आईडी और बिक्री मूल्य संग्रहित करता है,
4) EMPLOYEE: शोरूम में कार्यरत प्रत्येक कर्मचारी की कर्मचारी आईडी, नाम, जन्म तिथि, ज्वाइनिंग तिथि, पद और वेतन संग्रहित करता है।
चारों रिलेशन्स के रिकॉर्ड्स क्रमशः टेबल्स 9.9, 9.10, 9.11 और 9.12 में दिखाए गए हैं।
टेबल 9.9 INVENTORY
mysql> SELECT * FROM INVENTORY;
| कारआईडी | कारनाम | कीमत | मॉडल | वर्षनिर्माण | ईंधनप्रकार | |
|---|---|---|---|---|---|---|
| D001 D002 B001 B002 E001 E002 S001 S002 |
डिज़ायर डिज़ायर बलेनो बलेनो ईको ईको स्विफ्ट स्विफ्ट |
58263.00 673112.00 567031.00 647858.00 355205.00 654914.00 514000.00 614000.00 |
एलएक्सआई वीएक्सआई सिग्मा1.2 डेल्टा1.2 5 स्ट्र स्टड केयर एलएक्सआई वीएक्सआई |
2017 2018 2019 2018 2017 2018 2017 2018 |
पेट्रोल पेट्रोल पेट्रोल पेट्रोल सीएनजी सीएनजी पेट्रोल पेट्रोल |
8 पंक्तियाँ सेट में (0.00 सेकंड)
तालिका 9.10 ग्राहक
mysql> SELECT * FROM CUSTOMER;
| ग्राहकआईडी | ग्राहकनाम | ग्राहकपता | फोन | ईमेल | |
|---|---|---|---|---|---|
| C0001 C0002 C0003 C0004 |
अमित शाह रहनुमा चार्वी नैयर गुरप्रीत |
एल-10, पीतमपुरा जे-12, साकेत 10/9, एफएफ, रोहिणी ए-10/2, एसएफ, मयूर विहार |
4564587852 5527688761 6811635425 3511056125 |
amitsaha@gmailcom jai@gmailcom you@gmailcom may@gmailcom |
4 पंक्तियाँ सेट में (0.00 सेकंड)
तालिका 9.11 बिक्री
mysql> SELECT * FROM SALE;
| InvoiceNo | CarId | CustId | SaleDate | PaymentMode | EmpID | SalePrice | |
|---|---|---|---|---|---|---|---|
| I00001 I00002 I00003 I00004 I00005 I00006 |
D001 S001 S002 D002 E001 S002 |
C0001 C0002 C0004 C0001 C0003 C0002 |
2019-01-24 2018-12-12 2019-01-25 2018-10-15 2018-12-20 2019-01-30 |
क्रेडिट कार्ड ऑनलाइन चेक बैंक फाइनेंस क्रेडिट कार्ड बैंक फाइनेंस |
E004 E001 E010 E007 E002 E007 |
613248.00 590321.00 604000.00 659982.00 369310.00 620214.00 |
6 पंक्तियाँ सेट में (0.00 सेकंड)
तालिका 9.12 कर्मचारी
mysql> SELECT * FROM EMPLOYEE;
| EmpID | EmpName | DOB | DOJ | Designation | Salary | |
|---|---|---|---|---|---|---|
| E001 E002 E003 E004 E006 E007 E010 |
रुशिल संजय ज़ोहर अर्पित संजुक्ता मयंक राजकुमार |
1994-07-10 1990-03-12 1975-08-30 1989-06-06 1985-11-03 1993-04-03 1987-02-26 |
2017-12-12 2016-06-05 1999-01-08 2010-12-02 2012-07-01 2017-01-01 2013-10-23 |
सेल्समैन सेल्समैन चपरासी सेल्समैन रिसेप्शनिस्ट सेल्समैन सेल्समैन |
25550 33100 20000 39100 27350 27352 31111 |
7 पंक्तियाँ सेट में (0.00 सेकंड)
हम जानते हैं कि एक फंक्शन किसी विशेष कार्य को करने के लिए प्रयोग किया जाता है और यह परिणामस्वरूप शून्य या अधिक मान लौटाता है। SQL क्वेरी लिखते समय भी फंक्शन उपयोगी होते हैं। फंक्शन को किसी तालिका के एक या अनेक रिकॉर्ड (पंक्तियों) पर काम करने के लिए लगाया जा सकता है। एक या अनेक पंक्तियों में उनके प्रयोग के आधार पर SQL फंक्शनों को
एकल पंक्ति फंक्शन और समूह फंक्शन (Aggregate functions) में वर्गीकृत किया जाता है।
9.8.1 एकल पंक्ति फंक्शन
इन्हें स्केलर फंक्शन भी कहा जाता है। एकल पंक्ति फंक्शन एक एकल मान पर लागू होते हैं और एक एकल मान लौटाते हैं। चित्र 9.3 तीन श्रेणियों—संख्यात्मक (गणित), स्ट्रिंग, दिनांक और समय—के अंतर्गत विभिन्न एकल पंक्ति फंक्शनों को सूचीबद्ध करता है।
चित्र 9.3: SQL में एकल-पंक्ति फंक्शनों की तीन श्रेणियाँ
गणित फंक्शन संख्यात्मक मान को इनपुट के रूप में लेते हैं और परिणामस्वरूप संख्यात्मक मान लौटाते हैं। स्ट्रिंग फंक्शन वर्ण मान को इनपुट के रूप में लेते हैं और आउटपुट के रूप में वर्ण या संख्यात्मक मान लौटाते हैं। दिनांक और समय फंक्शन दिनांक व समय मान को इनपुट के रूप में लेते हैं और संख्यात्मक या स्ट्रिंग या दिनांक व समय को आउटपुट के रूप में लौटाते हैं।
(A) गणित फंक्शन
तीन सामान्यतः प्रयुक्त संख्यात्मक फंक्शन POWER(), ROUND() और MOD() हैं। इनका उपयोग वाक्य-रचना सहित तालिका 9.13 में दिया गया है।
$\hspace{4.5cm}$ तालिका 9.13 गणित फंक्शन
| फ़ंक्शन | विवरण | उदाहरण सहित आउटपुट |
|---|---|---|
| POWER(X,Y) इसे इस प्रकार भी लिखा जा सकता है POW(X,Y) |
$\mathrm{X}$ को घात $\mathrm{Y}$ पर गणना करता है। | mysql > SELECT POWER $(2,3)$; आउटपुट: 8 |
| ROUND(N,D) | संख्या $\mathrm{N}$ को $\mathrm{D}$ दशमलव स्थानों तक राउंड करता है। नोट: यदि $\mathrm{D}=0$ है, तो यह संख्या को निकटतम पूर्णांक तक राउंड करता है। |
mysql >SELECT ROUND(2912.564, 1); आउटपुट: 2912.6 mysqi> SELECT ROUND(283.2); आउटपुट: 283 |
| $\operatorname{MOD}(\mathrm{A}, \mathrm{B})$ | संख्या A को संख्या B से विभाजित करने के बाद शेषफल लौटाता है। | mysql> SELECT MOD $(21,2)$; आउटपुट: 1 |
उदाहरण 9.18 बिक्री बढ़ाने के लिए, मान लीजिए कार डीलर अपने ग्राहकों को कुल राशि को 10 आसान ईएमआई (समान मासिक किस्तों) में भुगतान करने की पेशकश करता है। मान लें कि ईएमआई 10000 के गुणकों में होने की आवश्यकता है। इसके लिए, डीलर इन्वेंटरी तालिका से निम्नलिखित डेटा के साथ CarID और Price सूचीबद्ध करना चाहता है:
a) मूल्य का 12 प्रतिशत के रूप में जीएसटी की गणना करें और परिणाम को एक दशमलव स्थान तक राउंड करके प्रदर्शित करें।
mysql> SELECT ROUND(12/100*Price,1) “GST” FROM INVENTORY;
| GST |
|---|
| 69913.6 80773.4 68043.7 77773.0 42624.6 78589.0 61680.0 73680.0 |
8 rows in set (0.00 sec)
गतिविधि 9.10
CARSHOWROOM डेटाबेस की SALE तालिका का उपयोग करते हुए, निम्नलिखित के लिए SQL क्वेरीज़ लिखें:
a) InvoiceNo और कमीशन मान को शून्य दशमलव स्थानों तक राउंड करके प्रदर्शित करें।
b) SALE के विवरण प्रदर्शित करें जहाँ भुगतान मोड क्रेडिट कार्ड है।
b) तालिका inventory में एक नया कॉलम FinalPrice जोड़ें जिसका मान Price और GST के 12 प्रतिशत के योग के रूप में होगा।
mysql> ALTER TABLE INVENTORY ADD(FinalPrice
Numeric(10,1));
Query OK, 8 rows affected (0.03 sec)
Records: 8 Duplicates: 0 Warnings: 0
mysql> UPDATE INVENTORY SET
FinalPrice=Price+Round(Price*12/100,1);
Query OK, 8 rows affected (0.01 sec)
Rows matched: 8 Changed: 8 Warnings: 0
mysql > SELECT * FROM I NVENTORY;
| Carld | CarName | Price | Model | I Year Manufacture | Fuel Type | Final Price |
|---|---|---|---|---|---|---|
| D0O1 | Dzire | 582613.00 | LXI | 2017 | Petrol | 652526.6 |
| D002 | Dzire | 673112.00 | VXI | 2018 | Petrol | 753885.4 |
| B001 | Bal eno | 567031.00 | Si g ma 1.2 | 2019 | Petrol | 635074.7 |
| B002 | Bal eno | 647858.00 | Delta 1.2 | 2018 | Petrol | 725601.0 |
| E0O1 | EECO | 355205.00 | 5 STR STD | 2017 | $C N G$ | 397829.6 |
| E002 | EECO | 654914.00 | CARE | 2018 | CNG | 733503.7 |
| 5001 | SWI F T | 514000.00 | LXI | 2017 | Petrol | 575680.0 |
| SOO2 | SWI F T | 614000.00 | VXI | 2018 | Petrol | 687680.0 |
8 rows in set (0.00 sec)
c) गाड़ी की FinalPrice को 10 किस्तों में बाँटने के बाद प्रत्येक माह देय राशि (1000 के गुणकों में) की गणना करें और प्रदर्शित करें।
d) राशि को EMIs में बाँटने के बाद, मॉड्यूलर डिवीज़न करके तुरंत देय शेष राशि ज्ञात करें।
उपरोक्त (c) और (d) समस्या को हल करने के लिए निम्नलिखित SQL क्वेरी का उपयोग किया जा सकता है:
mysql> SELECT CarId, FinalPrice, ROUND(FinalPriceMOD (FinalPrice,1000)/10,0) “EMI”,
MOD(FinalPrice,10000) “Remaining Amount” FROM INVENTORY;
| CarId | Final Price | E MI | Remaining Amount |
|---|---|---|---|
| D001 D002 B001 B002 E001 E002 S001 S002 |
652526.6 753885.4 635074.7 725601.0 397829.6 733503.7 575680.0 687680.0 |
652474 753797 635067 725541 397747 733453 575612 687612 |
2526.6 3885.4 5074.7 5601.0 7829.6 3503.7 5680.0 7680.0 |
उदाहरण 9.19
a) आइए अब SALE तालिका में एक नया कॉलम Commission जोड़ें। कॉलम Commission की कुल लंबाई 7 होनी चाहिए जिसमें 2 दशमलव स्थान हों।
mysql> ALTER TABLE SALE ADD(Commission
Numeric(7,2));
Query OK, 6 rows affected (0.34 sec)
Records: 6 Duplicates: 0 Warnings: 0
b) आइए अब सेल्स एजेंटों के लिए कमीशन की गणना SalePrice का $12 %$ के रूप में करें, नवीनतम जोड़े गए कॉलम Commission में मान सम्मिलित करें और फिर SALE तालिका के ऐसे रिकॉर्ड प्रदर्शित करें जहाँ commission >73000 हो।
mysql> UPDATE SALE SET
Commission=12/100*SalePrice;
Query OK, 6 rows affected (0.06 sec)
Rows matched: 6 Changed: 6 Warnings: 0
mysql> SELECT * FROM SALE WHERE Commission > 73000;
| invoiceno | carid | custid | saledate | paymentmode | empid | saleprice | Commission |
|---|---|---|---|---|---|---|---|
| I00001 I00004 I00006 |
D001 D002 D003 |
C0001 C000 1 C0002 |
2019-01-24 2018-10-15 2019-01-30 |
Credit Card Bank Finance Bank Finance |
E004 E007 E007 |
613248.00 659982.00 620214.00 |
73589.64 79198.84 74425.68 |
3 rows in set (0.02 sec)
c) InvoiceNo, SalePrice और Commission प्रदर्शित करें जिससे कि commission का मान 0 तक राउंड हो।
mysql> SELECT InvoiceNo, SalePrice,
Round(Commission,0) FROM SALE;
| InvoiceNo | SalePrice | Round(Commission,0) |
|---|---|---|
| I00001 I00002 I00003 I00004 I00005 I00006 |
613248.00 590321.00 604000.00 659982.00 369310.00 620214.00 |
73590 70839 72480 79198 44317 74426 |
6 rows in set (0.00 sec)
(B) String Functions
स्ट्रिंग फंक्शन टेबल में संग्रहीत अल्फ़ान्यूमेरिक डेटा पर विभिन्न संचालन कर सकते हैं। इनका उपयोग केस बदलने (अपरकेस से लोअरकेस या इसके विपरीत), सबस्ट्रिंग निकालने, स्ट्रिंग की लंबाई गणना करने आदि के लिए किया जा सकता है। स्ट्रिंग फंक्शन और उनके उपयोग को टेबल 9.14 में दिखाया गया है।
गतिविधि 9.11
CARSHOWROOM डेटाबेस की INVENTORY टेबल का उपयोग करते हुए, निम्नलिखित के लिए SQL क्वेरीज़ लिखें:
a) यदि CarMake का मान ’ B ’ अक्षर से शुरू होता है तो उसे अपरकेस में बदलें।
b) यदि कार के मॉडल की लंबाई 4 से अधिक है तो Model विशेषता से स्थिति 3 से अंत तक की सबस्ट्रिंग लाएं।
$\hspace{4cm}$ टेबल 9.14 स्ट्रिंग फंक्शन
गतिविधि 9.12
CARSHOWROOM डेटाबेस की EMPLOYEE टेबल का उपयोग करते हुए, निम्नलिखित के लिए SQL क्वेरीज़ लिखें:
a) कर्मचारी का नाम और उसके EmpId के अंतिम 2 वर्ण प्रदर्शित करें।
b) कर्मचारी का पद और यदि मौजूद हो तो पद में वर्ण ’ $\mathrm{e}$ ’ की स्थिति प्रदर्शित करें।
उदाहरण 9.20 आइए स्ट्रिंग फंक्शन के कार्य को समझने के लिए टेबल 9.10 में दिखाए गए Customer संबंध का उपयोग करें।
a) CUSTOMER टेबल से कस्टमर नाम को लोअर केस में और कस्टमर ईमेल को अपर केस में प्रदर्शित करें।
mysql> SELECT LOWER(CustName), UPPER(Email) FROM CUSTOMER;
| LOWER(CustName) | UPPER(Email) |
|---|---|
| amit shah rehnuma charvi nayyar gurpreet |
AMITSAHA2@GMAILCOM REHNUMA@HOTMAILCOM CHARVI123@YAHOOCOM GUR_SINGH@YAHOOCOM |
4 rows in set (0.00 sec)
b) ईमेल की लंबाई और ईमेल आईडी में ‘$a$’ वाले वर्ण से पहले वाले ईमेल के भाग को प्रदर्शित करें। नोट - ‘@’ मत छापें।
mysql > SELECT LENGTH(Email), LEFT(Email, I NSTR(Email, “@” )-1) FROM CUSTOMER;
| LENGTH(Email) | LEFT(Email, INSTR(Email, “@”)-1) |
|---|---|
| 19 19 19 19 |
amitsaha2 rehnuma charvi123 gur_singh |
4 rows in set (0.03 sec)
INSTR फ़ंक्शन ईमेल पते में “@” की स्थिति लौटाएगा। इसलिए, “@” के बिना ईमेल आईडी छापने के लिए हमें स्थिति -1 का उपयोग करना होगा।
Activity 9.13
CARSHOWROOM डेटाबेस की EMPLOYEE तालिका का उपयोग करके, उन सभी कर्मचारियों की जन्मतिथि सूचीबद्ध करें जिनका वेतन 25000 से अधिक है।
c) मान लें कि चार अंकों वाला क्षेत्र कोड मोबाइल नंबर में स्थिति संख्या 3 से शुरू होता है। उदाहरण के लिए, 9818511338 मोबाइल नंबर का क्षेत्र कोड 1851 है। अब, रोहिणी में रहने वाले ग्राहक का क्षेत्र कोड प्रदर्शित करने के लिए 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)
Think and Reflect
क्या हम तिथि फ़ंक्शनों पर अंकगणितीय संचालक $(+,-.{ }^{*}$, या /) का उपयोग कर सकते हैं?
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) केवल याहू ईमेल वाले सभी ग्राहकों का विवरण प्रदर्शित करें।
mysql> SELECT * FROM CUSTOMER WHERE Email LIKE “%yahoo%”;
| CustID | CustName | CustAdd | Phone | ||
|---|---|---|---|---|---|
| C0003 C0004 |
Charvi Nayyar Gurpreet |
10/9, FF, Rohini A-10/2, SF, Mayur Vihar |
6811635425 3511056125 |
charvi123@yahoocom gur_singh@yahoocom |
2 rows in set (0.00 sec)
(C) दिनांक और समय फ़ंक्शन
विभिन्न फ़ंक्शन हैं जो दिनांक और समय डेटा पर संचालन करने के लिए उपयोग किए जाते हैं। कुछ संचालनों में वर्तमान दिनांक प्रदर्शित करना, दिनांक के प्रत्येक तत्व (दिन, माह और वर्ष) को निकालना, सप्ताह का दिन प्रदर्शित करना आदि शामिल हैं। तालिका 9.15 विभिन्न दिनांक और समय फ़ंक्शनों की व्याख्या करती है।
$\hspace{4.5cm}$ तालिका 9.15 दिनांक फ़ंक्शन
| फंक्शन | विवरण | उदाहरण सहित आउटपुट |
|---|---|---|
| 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 |
उदाहरण 9.21 आइए CARSHOWROOM डेटाबेस की EMPLOYEE तालिका का उपयोग करके कुछ दिनांक और समय फंक्शनों के कार्य को दिखाते हैं।
a) सभी कर्मचारियों के ज्वाइनिंग का दिन, माह संख्या और वर्ष चुनें।
mysql> SELECT DAY(DOJ), MONTH(DOJ), YEAR(DOJ) FROM EMPLOYEE;
| DAY(DOJ) | MONTH(DOJ) | YEAR(DOJ) |
|---|---|---|
| 12 5 8 2 1 1 23 |
12 6 1 12 7 1 10 |
2017 2016 1999 2010 2012 2017 2013 |
7 पंक्तियाँ सेट में (0.03 सेकंड)
गतिविधि 9.14
क) टेबल SALE से उस ग्राहक की ID C0001 वाली कारों की खरीद पर बिक्री मूल्य का योग निकालें।
ख) SALE टेबल से अधिकतम और न्यूनतम कमीशन निकालें।
ख) यदि जॉइनिंग की तारीख रविवार नहीं है, तो इसे निम्न प्रारूप में प्रदर्शित करें “बुधवार, 26, नवम्बर, 1979.”
| DAYNAME ( DOJ) | DAY (DOJ) | MONT HNAME (DOJ ) | YEAR(DOJ) |
|---|---|---|---|
| मंगलवार शुक्रवार गुरुवार बुधवार |
12 8 2 23 |
दिसम्बर जनवरी दिसम्बर अक्टूबर |
2017 1999 2010 2013 |
9.8.2 समष्टि फ़ंक्शन
समष्टि फ़ंक्शनों को बहु-पंक्ति फ़ंक्शन भी कहा जाता है। ये फ़ंक्शन रिकॉर्ड्स के समूह पर समग्र रूप से कार्य करते हैं और जिस कॉलम पर फ़ंक्शन लागू किया जाता है, उसके प्रत्येक कॉलम के लिए एकल मान लौटाते हैं। तालिका 9.16 एकल पंक्ति फ़ंक्शन और बहु-पंक्ति फ़ंक्शन के बीच अंतर दिखाती है। तालिका 9.17 कुछ समष्टि फ़ंक्शनों और उनके उपयोग का वर्णन करती है। ध्यान दें कि कॉलम संख्यात्मक प्रकार का होना चाहिए।
$\hspace{1.5cm}$ तालिका 9.16 एकल और बहु-पंक्ति फ़ंक्शन के बीच अंतर
| Single Row Function | Multiple row function |
|---|---|
| 1. यह एक समय में एकल पंक्ति पर कार्य करता है। 2. यह प्रति पंक्ति एक परिणाम देता है। 3. इसे Select, Where और Order by क्लॉज़ में प्रयोग किया जा सकता है। 4. Math, String और Date फ़ंक्शन Single Row फ़ंक्शन के उदाहरण हैं। |
1. यह पंक्तियों के समूह पर कार्य करता है। 2. यह पंक्तियों के समूह के लिए एक परिणाम देता है। 3. इसे केवल select क्लॉज़ में प्रयोग किया जा सकता है। 4. Max(), Min(), Avg(), Sum(), Count() और Count(*) Multiple Row फ़ंक्शन के उदाहरण हैं। |
$\hspace{3cm}$ Table 9.17 SQL में Aggregate Functions
Example 9.22
a) तालिका INVENTORY से उन रिकॉर्ड की कुल संख्या प्रदर्शित करें जिनमें मॉडल VXI है।
mysql> SELECT COUNT(*) FROM INVENTORY WHERE
Model=”VXI”;
| COUNT(*) |
|---|
| $\hspace{2cm}$ 2 |
1 row in set (0.00 sec)
b) तालिका INVENTORY से उपलब्ध विभिन्न प्रकार के मॉडल्स की कुल संख्या प्रदर्शित करें।
mysqI > SELECT COUNT(DISTINCT Model) FROM INVENTORY;
| COUNT(DISTINCT MODEL) |
|---|
| $\hspace{3cm}$ 6 |
1 row in set (0.09 sec)
c) तालिका INVENTORY से Model LXI वाली सभी कारों की औसत कीमत प्रदर्शित करें।
mysql> SELECT AVG(Price) FROM INVENTORY WHERE
Model=“LXI”;
| AVG(Price) |
|---|
| 548306.500000 |
1 row in set (0.03 sec)
गतिविधि 9.15
क) प्रत्येक कर्मचारी द्वारा बेची गई कुल कारों की सूची बनाएँ।
ख) प्रत्येक कर्मचारी द्वारा की गई अधिकतम बिक्री की सूची बनाएँ।
9.9 SQL में GROUP BY CLAUSE
कभी-कभी हमें किसी कॉलम में सामान्य मानों के आधार पर पंक्तियों के समूह को लाना होता है। यह GROUP BY clause का उपयोग करके किया जा सकता है। यह उन पंक्तियों को एक साथ समूहित करता है जिनमें निर्दिष्ट कॉलम में समान मान होते हैं। हम समूहीकृत मानों पर कार्य करने के लिए एग्रीगेट फ़ंक्शन (COUNT, MAX, MIN, AVG और SUM) का उपयोग कर सकते हैं। SQL में HAVING Clause का उपयोग Group By clause वाली पंक्तियों पर शर्तें निर्दिष्ट करने के लिए किया जाता है।
CARSHOWROOM डेटाबेस की SALE टेबल पर विचार करें:
mysql> SELECT * FROM SALE;
| InvoiceNo | CarId | CustId | SaleDate | PaymentMode | EmpID | SalePrice | Commission |
|---|---|---|---|---|---|---|---|
| I00001 I00002 I00003 I00004 I00005 I00006 |
D001 S001 S002 D002 E001 S002 |
C0001 C0002 C0004 C0001 C0003 C0002 |
2019-01-24 2018-12-12 2019-01-25 2018-10-15 2018-12-20 2019-01-30 |
Credit Card Online Cheque Bank Finance Credit Card Bank Finance |
E004 E001 E010 E007 E002 E007 |
613248.00 590321.00 604000.00 659982.00 369310.00 620214.00 |
73589.64 70838.52 72480.00 79198.84 44318.20 74425.68 |
6 rows in set (0.11 sec)
CarID, CustID, SaleDate, PaymentMode, EmpID, SalePrice वे कॉलम हैं जिनमें समान मानों वाली पंक्तियाँ हो सकती हैं। इसलिए इन कॉलमों पर Group by clause का उपयोग किसी विशेष प्रकार (कॉलम) के रिकॉर्ड्स की संख्या ज्ञात करने, या प्रत्येक कार प्रकार की कीमत का योग निकालने के लिए किया जा सकता है।
उदाहरण 9.23
a) SALE टेबल से प्रत्येक ग्राहक द्वारा खरीदी गई कारों की संख्या प्रदर्शित करें।
mysql> SELECT CustID, COUNT(*) “Number of Cars” FROM SALE GROUP BY CustID;
| CustID | Number of Cars |
|---|---|
| C0001 C0002 C0003 C0004 |
2 2 1 1 |
4 rows in set (0.00 sec)
b) SALE टेबल से वे ग्राहक आईडी और कारों की संख्या प्रदर्शित करें जिन्होंने एक से अधिक कार खरीदी हैं।
mysql> SELECT CustID, COUNT() FROM SALE GROUP BY
CustID HAVING Count()>1;
| CustID | COUNT(*) |
|---|---|
| C0001 C0002 |
2 2 |
2 rows in set (0.30 sec)
c) SALE टेबल से प्रत्येक भुगतान मोड श्रेणी में लोगों की संख्या प्रदर्शित करें।
mysql> SELECT PaymentMode, COUNT(PaymentMode)
FROM SALE GROUP BY Paymentmode ORDER BY
Paymentmode;
| PaymentMode | Count(PaymentMode) |
|---|---|
| Bank Finance Cheque Credit Card Online |
2 1 2 1 |
4 rows in set (0.00 sec)
d) वे PaymentMode और उस मोड से एक से अधिक बार किए गए भुगतानों की संख्या प्रदर्शित करें।
mysql> SELECT PaymentMode, Count(PaymentMode)
FROM SALE GROUP BY Paymentmode HAVING COUNT(*)>1
ORDER BY Paymentmode;
| PaymentMode | Count(PaymentMode) |
|---|---|
| Bank Finance Credit Card |
2 2 |
2 rows in set (0.00 sec)
9.10 संबंधों पर संचालन
हम संबंधों पर कुछ संचालन जैसे यूनियन, इंटरसेक्शन और सेट डिफरेंस कर सकते हैं ताकि दो तालिकाओं के टपल्स को मिलाया जा सके। ये तीनों संचालन बाइनरी संचालन हैं क्योंकि ये दो तालिकाओं पर काम करते हैं। ध्यान दें कि ये संचालन तभी लागू किए जा सकते हैं जब दोनों संबंधों में गुणों की समान संख्या हो और दोनों तालिकाओं में संगत गुणों के डोमेन भी समान हों।
9.10.1 यूनियन ( $\cup)$
यह संचालन दो तालिकाओं की चयनित पंक्तियों को एक साथ मिलाने के लिए प्रयोग किया जाता है। यदि कुछ पंक्तियाँ दोनों तालिकाओं में समान हैं, तो यूनियन संचालन का परिणाम उन पंक्तियों को केवल एक बार दिखाएगा। चित्र 9.4 दो सेटों की यूनियन को दर्शाता है।
चित्र 9.4: दो सेटों की यूनियन
आइए दो संबंध DANCE और MUSIC पर विचार करें जो क्रमशः तालिका 9.18 और 9.19 में दिखाए गए हैं।
तालिका 9.18 DANCE
| SNo | Name | Class |
|---|---|---|
| 1 | Aastha | 7 A |
| 2 | Mahira | 6 A |
| 3 | Mohit | 7 B |
| 4 | Sanjay | 7 A |
तालिका 9.19 MUSIC
| SNo | Name | Class | | :—: | :—: | | 1 | Mehak | 8A | | 2 | Mahira | 6A | | 3 | Lavanya | 7A | | 4 | Sanjay | 7A | | 5 | Abhay | 8A |
यदि हमें उन छात्रों की सूची चाहिए जो किसी एक भी कार्यक्रम में भाग ले रहे हैं, तो हमें DANCE और MUSIC संबंधों पर यूनियन संचालन (प्रतीक $U$ द्वारा दर्शाया गया) लागू करना होगा। यूनियन संचालन का आउटपुट
तालिका 9.20 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 |
9.10.2 इंटरसेक्ट ( $\cap$ )
इंटरसेक्ट संचालन का उपयोग दो तालिकाओं से सामान टपल प्राप्त करने के लिए किया जाता है और इसे प्रतीक $\cap$ द्वारा दर्शाया जाता है। आकृति 9.5 दो समुच्चयों का इंटरसेक्शन दिखाती है।
आकृति 9.5: दो समुच्चयों का इंटरसेक्शन
मान लीजिए, हमें उन छात्रों की सूची दिखानी है जो दोनों कार्यक्रमों (DANCE और MUSIC) में भाग ले रहे हैं, तो इन दोनों तालिकाओं पर इंटरसेक्ट संचालन लागू किया जाएगा। इंटरसेक्ट संचालन का आउटपुट तालिका 9.21 में दिखाया गया है।
तालिका 9.21 DANCE $\cap$ MUSIC
| SNo | Nmae | Class |
|---|---|---|
| 2 4 |
Mahira Sanjay |
6A 7A |
9.10.3 माइनस (-)
यह संचालन उन टपल/पंक्तियों को प्राप्त करने के लिए उपयोग किया जाता है जो पहली तालिका में हैं लेकिन दूसरी तालिका में नहीं हैं और इस संचालन को प्रतीक - (माइनस) द्वारा दर्शाया जाता है। आकृति 9.6 दो समुच्चयों के बीच माइनस संचालन (जिसे सेट अंतर भी कहा जाता है) दिखाती है।
चित्र 9.6: दो समुच्चयों का अंतर
मान लीजिए हम उन विद्यार्थियों की सूची चाहते हैं जो केवल संगीत (MUSIC) में भाग ले रहे हैं, नृत्य (DANCE) में नहीं। तब हम MINUS संक्रिया का उपयोग करेंगे, जिसका आउटपुट तालिका 9.22 में दिया गया है।
तालिका 9.22 DANCE - MUSIC
| SNo | Name | Class |
|---|---|---|
| 1 | मेहक | 8A |
| 3 | लावण्या | 7A |
| 5 | अभय | 8 |
9.10.4 कार्टेशियन गुणनफल (X)
कार्टेशियन गुणनफल संक्रिया दो संबंधों से टपलों को संयुक्त करती है। इसके परिणामस्वरूप दो इनपुट संबंधों से सभी पंक्ति युग्म प्राप्त होते हैं, चाहे उनके पास सामान्य गुणधर्मों पर समान मान हों या न हों। इसे ’ $\mathrm{X}$ ’ द्वारा दर्शाया जाता है।
परिणामी संबंध की घात (degree) की गणना विचाराधीन दोनों संबंधों की घातों के योग के रूप में की जाती है। परिणामी संबंध की कार्डिनैलिटी (cardinality) की गणना उन संबंधों की कार्डिनैलिटी के गुणनफल के रूप में की जाती है जिन पर कार्टेशियन गुणनफल लागू किया गया है। आइए संबंधों DANCE और MUSIC का उपयोग करके कार्टेशियन गुणनफल का आउटपुट दिखाएं। ध्यान दें कि दोनों संबंधों की घात 3 है। संबंधों DANCE और MUSIC की कार्डिनैलिटि क्रमशः 4 और 5 है। इन दो संबंधों पर कार्टेशियन गुणनफल लागू करने से घात 6 और कार्डिनैलिटी 20 वाला एक संबंध प्राप्त होगा, जैसा कि तालिका 9.23 में दिखाया गया है।
तालिका 9.23 DANCE X MUSIC
| क्रम संख्या | नाम | कक्षा | क्रम संख्या | नाम | कक्षा |
|---|---|---|---|---|---|
| 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 |
आस्था महिरा मोहित संजय आस्था महिरा मोहित संजय आस्था महिरा मोहित संजय आस्था महिरा मोहित संजय आस्था महिरा मोहित संजय |
7A 6A 7B 7A 7A 6A 7B 7A 7A 6A 7A 7A 7A 6A 7A 7A 7A 6A 7B 7A |
1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 |
मेकक मेकक मेकक मेकक महिरा महिरा महिरा महिरा लावण्य लावण्य लावण्य लावण्य संजय संजय संजय संजय अभय अभय अभय अभय |
8A 8A 8A 8A 6A 6A 6A 6A 7A 7A 7A 7A 7A 7A 7A 7A 8A 8A 8A 8A |
20 rows in set (0.03 sec)
9.11 दो संबंधों का उपयोग एक क्वेरी में
अब तक हमने SQL में केवल एक ही संबंध का उपयोग करते हुए क्वेरीज़ लिखी हैं। इस खंड में हम दो संबंधों का उपयोग करते हुए क्वेरीज़ लिखना सीखेंगे।
9.11.1 दो तालिकाओं पर कार्टेशियन गुणा
पिछले खंड से हमने सीखा कि दो तालिकाओं पर कार्टेशियन गुणन (cartesian product) ऑपरेटर लगाने पर परिणामस्वरूप एक ऐसी तालिका मिलती है जिसमें अंतर्निहित तालिकाओं के सभी संभावित टपल-संयोजन होते हैं। जब किसी क्वेरी में एक से अधिक तालिकाओं का उपयोग करना हो, तो हमें FROM क्लॉज़ में अल्पविराम (comma) से अलग करके तालिकाओं के नाम देने होते हैं, जैसा कि उदाहरण 9.24 में दिखाया गया है। ऐसी क्वेरी चलाने पर DBMS (MySQL) पहले निर्दिष्ट तालिकाओं पर कार्टेशियन गुणन लगाकर एक ही तालिका तैयार करता है। उदाहरण 9.24 की निम्नलिखित क्वेरी दो तालिकाओं DANCE और MUSIC पर कार्टेशियन गुणन लगाती है:
उदाहरण 9.24
a) संबंध DANCE और MUSIC के टपलों के सभी संभावित संयोजन प्रदर्शित करें
mysql > SELECT * FROM DANCE, MUSIC;
चूँकि हम क्वेरी में SELECT * का उपयोग कर रहे हैं, इसलिए आउटपुट तालिका 9.23 होगी जिसकी डिग्री 6 और कार्डिनैलिटी 20 है।
b) संबंध DANCE और MUSIC के सभी संभावित टपल-संयोजनों में से केवल वे पंक्तियाँ प्रदर्शित करें जिनमें दोनों तालिकाओं के name गुणों का मान समान हो।
mysqI>SELECT * FROM DANCE $D$, MUSIC M WHERE
D. Name = M. Name;
तालिका 9.24 समान नाम वाले टपल
| SNo | Nmae | Class | Sno | Name | Class |
|---|---|---|---|---|---|
| 2 4 |
Mahira Sanjay |
6A 7A |
2 4 |
Mahira Sanjay |
6A 7A |
ध्यान दें कि इस क्वेरी में हमने टेबल उपनामों (DANCE के लिए D और MUSIC के लिए M) का उपयोग किया है, बिल्कुल कॉलम उपनामों की तरह (अनुभाग 9.6.2 देखें) ताकि टेबलों को छोटे नामों से संदर्भित किया जा सके। यह ध्यान रखना महत्वपूर्ण है कि टेबल उपनाम केवल वर्तमान क्वेरी के लिए ही वैध होता है और यदि FROM क्लॉज़ में उपनाम दिया गया है तो मूल टेबल नाम क्वेरी में उपयोग नहीं किया जा सकता।
9.11.2 दो टेबलों पर JOIN
JOIN ऑपरेशन निर्दिष्ट शर्तों पर दो टेबलों से टपलों को मिलाता है। ये कार्टेशियन प्रोडक्ट से अलग है जो टपलों के सभी संभावित संयोजन बनाता है। SQL के JOIN क्लॉज़ का उपयोग करते समय, हम FROM क्लॉज़ के भीतर दो टेबलों के संबंधित ऐट्रिब्यूट्स पर शर्तें निर्दिष्ट करते हैं। आमतौर पर, ऐसा ऐट्रिब्यूट एक टेबल में प्राइमरी की होता है और दूसरी टेबल में फॉरेन की। आइए SchoolUniform डेटाबेस में दो टेबल UNIFORM (UCode, UName, UColor) और COST (UCode, Size, Price) बनाते हैं। UCode टेबल UNIFORM में प्राइमरी की है। UCode और Size टेबल COST में कंपोज़िट की है। इसलिए, Ucode दोनों टेबलों के बीच एक सामान्य ऐट्रिब्यूट है जिसका उपयोग दोनों टेबलों से सामान्य डेटा प्राप्त करने के लिए किया जा सकता है। इसलिए, हमें इस टेबल को बनाते समय Price टेबल में Ucode को फॉरेन की के रूप में परिभाषित करना होगा।
टेबल 9.25 Uniform टेबल
| Ucode | Uname | Ucolor |
|---|---|---|
| 1 2 3 |
Shirt Pant Tie |
White Grey Blue |
टेबल 9.26 Cost टेबल
| Ucode | $\mathrm{Size}$ | Price |
|---|---|---|
| 1 | L | 580 |
| 1 | $M$ | 500 |
| 2 | L | 890 |
| 2 | M | 810 |
उदाहरण 9.25 तालिकाओं UNIFORM और COST के संबंधित टपलों के UCode, UName, UColor, Size और Price की सूची बनाएं।
दिए गए क्वेरी को नीचे दिए गए तीन अलग-अलग तरीकों से लिखा जा सकता है।
a) where clause में शर्त का प्रयोग
mysql>SELECT * FROM UNIFORM U, COST C WHERE
U. UCode = C. UCode;
तालिका 9.27 क्वेरी का आउटपुट
| 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 |
4 rows in set (0.08 sec)
चूंकि दोनों तालिकाओं में Ucode विशेषता है, इसलिए अस्पष्टता दूर करने के लिए हमें तालियास का प्रयोग करना होगा। इसलिए, हमने SELECT और FROM खंडों में विशेषता UCode के साथ क्वालिफायर का प्रयोग किया है ताकि इसका दायरा दिखाया जा सके।
b) JOIN clause का स्पष्ट प्रयोग
mysql> SELECT * FROM UNIFORM U JOIN COST C ON U. Ucode $=$ C. Ucode;
क्वेरी का आउटपुट तालिका 9.26 में दिखाए गए समान है। इस क्वेरी में हमने FROM खंड में शर्त के साथ स्पष्ट रूप से JOIN clause का प्रयोग किया है। इसलिए where clause में कोई शर्त देने की आवश्यकता नहीं है।
c) NATURAL JOIN clause का स्पष्ट प्रयोग
क्वेरी (a) और (b) का आउटपुट जो टेबल 9.26 में दिखाया गया है, में 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 |
4 rows in set (0.17 sec)
आउटपुट से स्पष्ट है कि इस क्वेरी का परिणाम (a) और (b) में लिखी गई क्वेरियों के समान है सिवाय इसके कि ऐट्रिब्यूट Ucode केवल एक बार प्रकट होता है।
निम्नलिखित बिंदु ध्यान में रखने योग्य हैं जब दो या अधिक संबंधों पर JOIN ऑपरेशन लगाए जाते हैं:
- यदि दो टेबलों को साझा ऐट्रिब्यूट पर समानता की शर्त के आधार पर जोड़ना है, तो कोई FROM क्लॉज में ON क्लॉज के साथ JOIN या NATURAL JOIN का उपयोग कर सकता है। यदि तीन टेबलों को समानता की शर्त पर जोड़ना है, तो दो JOIN या NATURAL JOIN की आवश्यकता होती है।
- सामान्यतया, $\mathrm{N}$ टेबलों को समानता की शर्त पर मिलाने के लिए $\mathrm{N}-1$ joins की आवश्यकता होती है।
- JOIN क्लॉज के साथ, हम दो टेबलों के टपल्स को मिलाने के लिए कोई भी संबंधपरक ऑपरेटर उपयोग कर सकते हैं।
सारांश
- डेटाबेस संबंधित तालिकाओं का संग्रह होता है। MySQL एक ‘संबंधपरक’ DBMS है।
- DDL (डेटा डेफिनिशन लैंग्वेज) में SQL स्टेटमेंट्स जैसे Create table, Alter table और Drop table शामिल होते हैं।
- DML (डेटा मैनिपुलेशन लैंग्वेज) में SQL स्टेटमेंट्स जैसे insert, select, update और delete शामिल होते हैं।
- एक तालिका पंक्तियों और स्तंभों का संग्रह होता है, जहाँ प्रत्येक पंक्ति एक रिकॉर्ड होता है और स्तंभ रिकॉर्ड्स की विशेषता को दर्शाते हैं।
- ALTER TABLE स्टेटमेंट तालिका की संरचना में बदलाव करने के लिए उपयोग किया जाता है जैसे स्तंभों को जोड़ना, हटाना या डेटाटाइप बदलना।
- UPDATE स्टेटमेंट तालिका में मौजूदा डेटा को संशोधित करने के लिए उपयोग किया जाता है।
- SQL क्वेरी में WHERE क्लॉज शर्तों को लागू करने के लिए उपयोग किया जाता है।
- DISTINCT क्लॉज दोहराव को समाप्त करने और मानों को केवल एक बार प्रदर्शित करने के लिए उपयोग किया जाता है।
- BETWEEN ऑपरेटर सीमा मानों सहित मानों की सीमा को परिभाषित करता है।
- IN ऑपरेटर उन मानों को चुनता है जो दिए गए मानों की सूची में किसी भी मान से मेल खाते हैं।
- NULL मानों की जांच IS NULL और IS NOT NULL का उपयोग करके की जा सकती है।
- ORDER BY क्लॉज SQL क्वेरी के परिणाम को निर्दिष्ट गुण मानों के संबंध में आरोही या अवरोही क्रम में प्रदर्शित करने के लिए उपयोग किया जाता है। डिफ़ॉल्ट रूप से क्रम आरोही होता है।
- LIKE ऑपरेटर पैटर्न मिलान के लिए उपयोग किया जाता है। % और _ दो वाइल्ड कार्ड वर्ण हैं। प्रतिशत (%) प्रतीक शून्य या अधिक वर्णों को दर्शाने के लिए उपयोग किया जाता है। अंडरस्कोर (_) प्रतील एक एकल वर्ण को दर्शाने के लिए उपयोग किया जाता है।
- एक फंक्शन एक विशेष कार्य करने और परिणामस्वरूप एक मान लौटाने के लिए उपयोग किया जाता है।
- सिंगल रो फंक्शन तालिका की एकल पंक्ति पर काम करता है और एकल मान लौटाता है।
- मल्टीपल रो फंक्शन रिकॉर्ड्स के समूह पर समग्र रूप से काम करता है और एकल मान लौटाता है। उदाहरणों में COUNT, MAX, MIN, AVG और SUM शामिल हैं।
- GROUP BY फंक्शन तालिका की उन पंक्तियों को समूहीकृत करने के लिए उपयोग किया जाता है जो निर्दिष्ट स्तंभ में समान मान रखती हैं।
- जॉइन एक ऑपरेशन है जो दो या अधिक तालिकाओं से एक या अधिक सामान्य फील्ड्स के आधार पर पंक्तियों को संयोजित करने के लिए उपयोग किया जाता है।
अभ्यास
1. निम्नलिखित प्रश्नों के उत्तर दीजिए:
a) RDBMS को परिभाषित कीजिए। कोई दो RDBMS सॉफ्टवेयरों के नाम बताइए।
b) SELECT कथन में निम्नलिखित खंडों का उद्देश्य क्या है?
$\quad$ i) ORDER BY
$\quad$ ii) GROUP BY
c) Single Row Functions और Aggregate Functions के बीच कोई दो अंतर बताइए।
d) Cartesian Product से आप क्या समझते हैं?
e) निम्नलिखित कथनों के बीच अंतर बताइए:
$\quad$ i) ALTER और UPDATE
$\quad$ ii) DELETE और DROP
f) निम्न संचालनों को करने के लिए फलनों के नाम लिखिए:
$\quad$ i) “Monday”, “Tuesday” जैसा दिन प्रदर्शित करने के लिए, जब भारत को स्वतंत्रता मिली थी।
$\quad$ ii) दिए गए स्ट्रिंग के किसी विशेष स्थान से निर्धारित संख्या में वर्ण प्रदर्शित करने के लिए।
$\quad$ iii) उस महीने का नाम प्रदर्शित करने के लिए जिसमें आपका जन्म हुआ था।
$\quad$ iv) आपका नाम बड़े अक्षरों में प्रदर्शित करने के लिए।
2. निम्नलिखित SQL कथनों द्वारा उत्पन्न आउटपुट लिखिए:
a) SELECT POW $(2,3)$;
b) SELECT ROUND(342.9234,-1);
c) SELECT LENGTH(“Informatics Practices”);
d) SELECT $\hspace{2cm}$ YEAR(“1979/11/26”),
MONTH(“1979/11/26”), $\hspace{2cm}$ DAY(“1979/11/26”),
MONTHNAME(“1979/11/26”);
e) SELECT $\quad$ LEFT(“INDIA”,3), $\quad$ RIGHT(“Computer Science”,4),
MID(“Informatics”,3,4), $\quad$ SUBSTR(“Practices”,3);
3. निम्नलिखित MOVIE तालिका को ध्यान में रखिए और उसके आधार पर SQL क्वेरीज़ लिखिए।
| MovieID | MovieName | Category | ReleaseDate | ProductionCost | |
|---|---|---|---|---|---|
| BusinessCost | |||||
| 001 | Hindi_Movie | Musica1 | 2018-04-23 | 124500 | 130000 |
| 002 | Tamil_Movie | Action | 2016-05-17 | 112000 | 118000 |
| 003 | English_Movie | Horror | 2017-08-06 | 245000 | 360000 |
| 004 | Bengali_Movie | Adventure | 2017-01-04 | 72000 | 100000 |
| 005 | Telugu_Movie | Action | - | 100000 | - |
| 006 | Punjabi_Movie | Comedy | - | 30500 | - |
a) Movie तालिका से सारी जानकारी प्रदर्शित करें।
b) केवल MovieID, MovieName और Total_Earning दिखाते हुए फिल्मों द्वारा किया गया व्यवसाय सूचीबद्ध करें। Total_Earning की गणना ProductionCost और BusinessCost के योग के रूप में की जाएगी।
c) फिल्मों की विभिन्न श्रेणियों की सूची बनाएं।
d) प्रत्येक फिल्म का शुद्ध लाभ उसका MovieID, MovieName और NetProfit दिखाते हुए ज्ञात करें। Net Profit की गणना Business Cost और Production Cost के अंतर के रूप में की जाएगी।
e) उन सभी फिल्मों के MovieID, MovieName और Cost की सूची बनाएं जिनका ProductionCost 10,000 से अधिक और $1,00,000$ से कम है।
f) उन सभी फिल्मों का विवरण सूचीबद्ध करें जो कॉमेडी या एक्शन श्रेणी में आते हैं।
g) उन सभी फिल्मों का विवरण सूचीबद्ध करें जो अभी तक रिलीज़ नहीं हुई हैं।
4. मान लीजिए आपके स्कूल प्रबंधन ने कक्षा XI और कक्षा XII के छात्रों के बीच क्रिकेट मैच आयोजित करने का निर्णय लिया है। प्रत्येक कक्षा के छात्रों को चार टीमों में से किसी एक टीम - टीम टाइटन, टीम रॉकर्स, टीम मैग्नेट और टीम हरिकेन - में शामिल होने के लिए कहा गया है। गर्मियों की छुट्टियों के दौरान इन टीमों के बीच विभिन्न मैच आयोजित किए जाएंगे। अपने खेल शिक्षक की निम्नलिखित कार्यों में सहायता करें:
a) एक डेटाबेस “Sports” बनाएं।
b) निम्नलिखित विचारों के साथ एक तालिका “TEAM” बनाएं:
$\quad$ i) इसमें एक कॉलम TeamID होना चाहिए जो 1 से 9 के बीच का एक पूर्णांक मान संग्रहीत करे, जो किसी टीम की अद्वितीय पहचान को संदर्भित करता है।
$\quad$ ii) प्रत्येक TeamID का इससे संबद्ध नाम (TeamName) होना चाहिए, जो कम से कम 10 वर्णों की एक स्ट्रिंग होनी चाहिए।
c) तालिका स्तर की बाधा का उपयोग करके TeamID को प्राथमिक कुंजी बनाएं।
d) एक SQL कथन का उपयोग करके तालिका TEAM की संरचना दिखाएं।
e) छात्रों की प्राथमिकताओं के अनुसार चार टीमें नीचे दी गई हैं। इन चार पंक्तियों को TEAM तालिका में डालें:
$\quad$ पंक्ति 1: (1, Team Titan)
$\quad$ पंक्ति 2: (2, Team Rockers)
$\quad$ पंक्ति 3: (3, Team Magnet)
$\quad$ पंक्ति 3: (4, Team Hurricane)
f) एक DML कथन का उपयोग करके तालिका TEAM की सामग्री दिखाएं।
g) अब एक अन्य तालिका MATCH_DETAILS बनाएं और नीचे दिखाए गए अनुसार डेटा डालें। प्रत्येक विशेषता के लिए उपयुक्त डेटा प्रकार और बाधाएं चुनें।
तालिका: MATCH_DETAILS
| MatchID | $\quad$ MatchDate | FirstTeamID | SecondTeamID | FirstTeamScore | SecondTeamScore |
|---|---|---|---|---|---|
| M1 | 2018-07-17 | $\qquad$ 1 | $\qquad$ 2 | $\qquad$ 90 | $\qquad$ 86 |
| M2 | 2018-07-18 | $\qquad$ 3 | $\qquad$ 4 | $\qquad$ 45 | $\qquad$ 48 |
| M3 | 2018-07-19 | $\qquad$ 1 | $\qquad$ 3 | $\qquad$ 78 | $\qquad$ 56 |
| M4 | 2018-07-19 | $\qquad$ 2 | $\qquad$ 4 | $\qquad$ 56 | $\qquad$ 67 |
| M5 | 2018-07-18 | $\qquad$ 1 | $\qquad$ 4 | $\qquad$ 32 | $\qquad$ 87 |
| M6 | 2018-07-17 | $\qquad$ 2 | $\qquad$ 3 | $\qquad$ 67 | $\qquad$ 51 |
5. दो संबंधों (TEAM, MATCH_DETAILS) वाले स्पोर्ट्स डेटाबेस का उपयोग करते हुए निम्नलिखित के लिए क्वेरीज़ लिखें:
a) उन सभी मैचों के MatchID प्रदर्शित करें जहाँ दोनों टीमों ने 70 से अधिक स्कोर किया है।
b) उन सभी मैचों के MatchID प्रदर्शित करें जहाँ FirstTeam ने 70 से कम स्कोर किया है लेकिन SecondTeam ने 70 से अधिक स्कोर किया है।
c) उन मैचों के MatchID और दिनांक प्रदर्शित करें जो Team 1 द्वारा खेले गए और उसने जीते।
d) उन मैचों के MatchID प्रदर्शित करें जो Team 2 द्वारा खेले गए और उसने नहीं जीते।
e) संबंध TEAM का नाम बदलकर T_DATA करें। साथ ही गुण TeamID और TeamName को क्रमशः T_ID और T_NAME में बदलें।
6. एक दुकान जिसका नाम वंडरफुल गारमेंट्स है और जो स्कूल यूनिफॉर्म बेचती है, वह SCHOOLUNIFORM नामक एक डेटाबेस रखती है जैसा कि नीचे दिखाया गया है। इसमें दो संबंध शामिल हैं - UNIFORM और COST। उन्होंने UNIFORM संबंध के लिए UniformCode को प्राथमिक कुंजी बनाया। इसके अलावा, उन्होंने COST संबंध के लिए UniformCode और Size को समग्र कुंजी के रूप में उपयोग किया। डेटाबेस स्कीमा और डेटाबेस स्थिति का विश्लेषण करके, निमलिखित विसंगतियों को दूर करने के लिए SQL क्वेरी निर्दिष्ट करें।
a) मेसर्स वंडरफुल गारमेंट्स लाल रंग के, मीडियम साइज के रूमाल भी रखते हैं, जिनकी कीमत Rs. 100 प्रति नग है।
b) INSERT INTO COST (UCode, Size, Price) values (7, ‘M’,100);
$\quad$ जब उपरोक्त क्वेरी का उपयोग डेटा डालने के लिए किया जाता है, तो रूमाल के विवरण को UNIFORM संबंध में दर्ज किए बिना ही उसके मान COST तालिका में डाल दिए जाते हैं। ऐसी व्यवस्था बनाएं ताकि COST तालिका में डेटा तभी दर्ज किया जा सके जब वह पहले से UNIFORM तालिका में मौजूद हो।
c) इसके अलावा, उन्हें एक आइटम को नया UCode तभी देना चाहिए जब उसका एक वैध UName हो। SCHOOLUNIFORM डेटाबेस में उपयुक्त बाधाएं जोड़ने के लिए एक क्वेरी लिखें।
d) एक ऐसी बाधा जोड़ें ताकि किसी आइटम की कीमत हमेशा शून्य से अधिक हो।
7. निम्नलिखित “Product” नामक तालिका पर विचार करें, जो एक किराना दुकान में बेचे जा रहे उत्पादों का विवरण दिखा रही है।
| PCode | PName | UPrice | Manufacturer |
|---|---|---|---|
| P01 | Washing Powder | 120 | Surf |
| P02 | Toothpaste | 54 | Colgate |
| P03 | Soap | 25 | Lux |
| P04 | Toothpaste | 65 | Pepsodent |
| P05 | Soap | 38 | Dove |
| P06 | Shampoo | 245 | Dove |
निम्नलिखित के लिए SQL क्वेरी लिखें:
a) उचित डेटा प्रकारों और सीमाओं के साथ Product टेबल बनाएं।
b) Product में प्राइमरी कुंजी पहचानें।
c) Product Code, Product name और price को उनके product name के अनुसार अवरोही क्रम में सूचीबद्ध करें। यदि PName समान हो, तो price के आरोही क्रम में डेटा प्रदर्शित करें।
d) Product टेबल में एक नया कॉलम Discount जोड़ें।
e) उन सभी उत्पादों के लिए UPrice के 10 प्रतिशत के रूप में Product टेबल में discount का मान गणना करें जहाँ UPrice 100 से अधिक है, अन्यथा discount 0 होगा।
f) Dove द्वारा निर्मित सभी उत्पादों की कीमत 12 प्रतिशत बढ़ाएं।
g) प्रत्येक निर्माता द्वारा निर्मित उत्पादों की कुल संख्या प्रदर्शित करें।
उपरोक्त Product टेबल में दी गई जानकारी के आधार पर निम्नलिखित क्वेरी को निष्पादित करने पर उत्पन्न आउटपुट लिखें:
h) SELECT PName, avg(UPrice) FROM Product GROUP BY Pname;
i) SELECT DISTINCT Manufacturer FROM Product;
j) SELECT COUNT (DISTINCT PName) FROM Product;
k) SELECT PName, MAX(UPrice), MIN(UPrice) FROM Product GROUP BY PName;
8. अध्याय में दी गई CARSHOWROOM डेटाबेस का उपयोग करते हुए, निम्नलिखित के लिए SQL क्वेरी लिखें:
a) INVENTORY तालिका में एक नया कॉलम Discount जोड़ें।
b) सभी कारों के लिए उपयुक्त डिस्काउंट मान निम्नलिखित को ध्यान में रखते हुए सेट करें:
$\quad$ (i) LXI मॉडल पर कोई डिस्काउंट उपलब्ध नहीं है।
$\quad$ (ii) VXI मॉडल पर 10 प्रतिशत डिस्काउंट दिया जाता है।
$\quad$ (iii) LXI मॉडल और VXI मॉडल के अलावा अन्य कारों पर 12 प्रतिशत डिस्काउंट दिया जाता है।
c) उस सबसे महंगी कार का नाम प्रदर्शित करें जिसका फ्यूल टाइप “Petrol” है।
d) Baleno कारों पर उपलब्ध औसत डिस्काउंट और कुल डिस्काउंट की गणना करें।
e) उन कारों की कुल संख्या सूचीबद्ध करें जिन पर कोई डिस्काउंट नहीं है।