अध्याय 8 संरचित क्वेरी भाषा (SQL) का परिचय
“डेटाबेस प्रबंधन के तार्किक और भौतिक पहलुओं के बीच एक स्पष्ट और सुस्पष्ट सीमा प्रदान करने का उद्देश्य ही सम्बन्धात्मक मॉडल पर हुए अनुसंधान कार्य का सबसे महत्वपूर्ण प्रेरणा-बिंदु था।”
– ई. एफ. कॉड
8.1 परिचय
हमने पिछले अध्याय में सम्बन्धात्मक डेटाबेस प्रबंधन प्रणाली (RDBMS) और उसके उद्देश्य के बारे में सीखा है। बहुत-सी RDBMS हैं—जैसे MySQL, Microsoft SQL Server, PostgreSQL, Oracle आदि—जो हमें सम्बन्धों से युक्त एक डेटाबेस बनाने और एक या अधिक सम्बन्धों को कुशल पूछताछ के लिए जोड़ने की अनुमति देती हैं ताकि उस डेटाबेस पर डेटा संग्रहीत, पुनः प्राप्त और हेरफेर किया जा सके। इस अध्याय में हम सीखेंगे कि MySQL का उपयोग करके डेटाबेस कैसे बनाया, भरा और पूछताछ की जाती है।
8.2 संरचित पूछताछ भाषा (SQL)
फ़ाइल प्रणाली के मामले में डेटा तक पहुँचने के लिए अनुप्रयोग प्रोग्राम लिखने पड़ते हैं। परंतु डेटाबेस प्रबंधन प्रणालियों के लिए विशेष प्रकार की प्रोग्रामिंग भाषाएँ होती हैं, जिन्हें पूछताछ भाषा कहा जाता है, जिनका उपयोग डेटाबेस से डेटा तक पहुँचने के लिए किया जा सकता है। संरचित पूछताछ भाषा (SQL) सबसे लोकप्रिय पूछताछ भाषा है जिसका उपयोग प्रमुख सम्बन्धात्मक डेटाबेस प्रबंधन प्रणालियाँ—जैसे MySQL, ORACLE, SQL Server आदि—करती हैं।
SQL सीखना आसान है क्योंकि इसके कथनों में वर्णनात्मक अंग्रेज़ी शब्द होते हैं और यह केस-सेंसिटिव नहीं है। हम SQL का उपयोग करके एक डेटाबेस को कुशल और आसान तरीके से बना सकते हैं और उससे संवाद कर सकते हैं। SQL का लाभ यह है कि हमें यह निर्दिष्ट नहीं करना पड़ता कि डेटाबेस से डेटा कैसे प्राप्त करना है। बल्कि, हम केवल यह बताते हैं कि क्या निकालना है, और बाकी SQL खुद कर देता है। यद्यपि इसे क्वेरी भाषा कहा जाता है, SQL केवल क्वेरी करने से कहीं अधिक कर सकता है। SQL डेटा की संरचना को परिभाषित करने, डेटाबेस में डेटा को संचालित करने, बाधाएँ घोषित करने और हमारी आवश्यकताओं के अनुसार विभिन्न तरीकों से डेटाबेस से डेटा पुनः प्राप्त करने के लिए कथन प्रदान करता है।
इस अध्याय में हम सीखेंगे कि MySQL को RDBMS सॉफ़्टवेयर के रूप में उपयोग करके एक डेटाबेस कैसे बनाया जाता है। हम एक डेटाबेस बनाएँगे जिसे Student Attendance (चित्र 7.5) कहा जाता है, जिसे हमने पिछले अध्याय में पहचाना था। हम यह भी सीखेंगे कि डेटाबेस को डेटा से कैसे भरा जाता है, उसमें डेटा को कैसे संचालित किया जाता है और SQL क्वेरीज़ के माध्यम से डेटाबेस से डेटा कैसे प्राप्त किया जाता है।
8.2.1 MySQL इंस्टॉल करना
MySQL एक ओपन सोर्स RDBMS सॉफ़्टवेयर है जिसे आधिकारिक वेबसाइट https://dev.mysql.com/downloads से आसानी से डाउनलोड किया जा सकता है। MySQL इंस्टॉल करने के बाद, MySQL सेवा प्रारंभ करें। mysql> प्रॉम्प्ट (चित्र 8.1) का प्रदर्शन इस बात का संकेत है कि MySQL हमारे लिए SQL कथन दर्ज करने के लिए तैयार है।
MySQL में SQL कथन लिखते समय कुछ नियमों का पालन करना होता है
गतिविधि 8.1
LibreOffice Base का अन्वेषण करें और इसकी तुलना MySQL से करें:
- SQL केस-इंसेंसिटिव है। इसका मतलब है कि name और NAME SQL के लिए समान हैं।
- हमेशा SQL स्टेटमेंट्स को सेमीकोलन (;) से समाप्त करें।
- बहु-पंक्ति वाले SQL स्टेटमेंट्स दर्ज करने के लिए, हम पहली पंक्ति के बाद ‘;’ नहीं लिखते। हम अगली पंक्ति जारी रखने के लिए एंटर दबाते हैं। तब प्रॉम्प्ट mysql> बदलकर ‘->’ हो जाता है, जो दर्शाता है कि स्टेटमेंट अगली पंक्ति में जारी है। अंतिम पंक्ति के बाद ‘;’ डालें और एंटर दबाएँ।
8.3 MySQL में डेटा प्रकार और बाधाएँ
चित्र 8.1: MySQL शेल
हम जानते हैं कि एक डेटाबेस एक या अधिक संबंधों से बना होता है और प्रत्येक संबंध (तालिका) गुणों (कॉलम) से बना होता है। प्रत्येक गुण का एक डेटा प्रकार होता है। हम प्रत्येक संबंध के गुण के लिए बाधाएँ भी निर्दिष्ट कर सकते हैं।
गतिविधि 8.2
MySQL में समर्थित अन्य डेटा प्रकार कौन-से हैं? क्या पूर्णांक और फ्लोट डेटा प्रकार के अन्य रूप भी हैं?
8.3.1 गुण का डेटा प्रकार
डेटा प्रकार दर्शाता है कि किसी गुण में किस प्रकार का डेटा मान हो सकता है। गुण का डेटा प्रकार यह तय करता है कि उस गुण के डेटा पर कौन-से संचालन किए जा सकते हैं। उदाहरण के लिए, संख्यात्मक डेटा पर अंकगणितीय संचालन किए जा सकते हैं लेकिन वर्ण डेटा पर नहीं। MySQL में सामान्यतः प्रयुक्त डेटा प्रकार संख्यात्मक प्रकार, दिनांक और समय प्रकार, और स्ट्रिंग (वर्ण और बाइट) प्रकार हैं जैसा कि तालिका 8.1 में दिखाया गया है।
सोचिए और विचार कीजिए
क्या आप ऐसा कोई गुणधर्म सोच सकते हैं जिसके लिए निश्चित लंबाई की स्ट्रिंग उपयुक्त हो?
तालिका 8.1 MySQL में प्रायः प्रयुक्त डेटा प्रकार
| डेटा प्रकार | विवरण |
|---|---|
| CHAR $(n)$ | वर्ण प्रकार के डेटा की लंबाई $\mathrm{n}$ निर्दिष्ट करता है, जहाँ $\mathrm{n}$ 0 से 255 तक कोई भी मान हो सकता है। CHAR निश्चित लंबाई की होती है, अर्थात् CHAR (10) घोषित करने से 10 वर्णों के लिए स्थान आरक्षित किया जाता है। यदि डेटा में 10 वर्ण नहीं हैं (उदाहरण के लिए, ‘city’ में चार वर्ण हैं), तो MySQL शेष 6 वर्णों को दाहिनी ओर से रिक्त स्थान भरकर पूरा करता है। |
| VARCHAR( $n)$ | वर्ण प्रकार के डेटा की लंबाई ‘$n$’ निर्दिष्ट करता है, जहाँ $\mathrm{n}$ 0 से 65535 तक कोई भी मान हो सकता है। लेकिन CHAR के विपरीत, VARCHAR परिवर्तनीय-लंबाई का डेटा प्रकार है। अर्थात् VARCHAR (30) घोषित करने से अधिकतम 30 वर्ण संग्रहीत किए जा सकते हैं, लेकिन वास्तविक आवंटित बाइट्स दर्ज की गई स्ट्रिंग की लंबाई पर निर्भर करेंगे। इसलिए VARCHAR (30) में ‘city’ केवल 4 वर्ण संग्रहीत करने के लिए आवश्यक स्थान घेरेगी। |
| INT | INT एक पूर्णांक मान निर्दिष्ट करता है। प्रत्येक INT मान 4 बाइट संग्रहण घेरता है। पूर्णांक प्रकार में अनुमत मानों की सीमा -2147483648 है; इससे बड़े मानों के लिए हमें 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 उत्पन्न करेंगे?
8.3.2 Constraints
Constraints कुछ विशेष प्रकार की प्रतिबंधाएँ होती हैं जो किसी attribute में आ सकने वाले डेटा मानों पर लगाई जाती हैं। इनका उपयोग डेटा की शुद्धता और विश्वसनीयता सुनिश्चित करने के लिए किया जाता है। यद्यपि, किसी table के प्रत्येक attribute के लिए constraint परिभाषित करना अनिवार्य नहीं है। Table 8.2 विभिन्न SQL constraints की सूची देता है।
Table 8.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 के मान को संदर्भित करता है। |
8.4 SQL for Data Definition
SQL relation schemas को परिभाषित करने, relation schemas को संशोधित करने और relations को हटाने के लिए commands प्रदान करता है। इन्हें Data Definition Language (DDL) कहा जाता है, जिसके माध्यम से relations का समुच्चय निर्दिष्ट किया जाता है, जिनमें उनका schema, प्रत्येक attribute के लिए डेटा प्रकार, constraints के साथ-साथ security और access से संबंधित authorizations शामिल होते हैं।
डेटा परिभाषा create कथन से शुरू होती है। यह कथन डेटाबेस और उसकी तालिकाओं (संबंधों) को बनाने के लिए प्रयोग किया जाता है। डेटाबेस बनाने से पहले, हमें यह स्पष्ट होना चाहिए कि डेटाबेस में कितनी तालिकाएँ हैं, प्रत्येक तालिका में कौन-कौन स्तंभ (गुण) हैं और प्रत्येक स्तंभ का डेटा प्रकार क्या है। इसी प्रकार हम संबंध स्कीमा तय करते हैं।
8.4.1 CREATE Database
डेटाबेस बनाने के लिए, हम CREATE DATABASE कथन का उपयोग करते हैं जैसा कि निम्नलिखित syntax में दिखाया गया है:
Student Attendance नामक डेटाबेस बनाने के लिए, हम mysql प्रॉम्प्ट पर निम्नलिखित कमांड टाइप करेंगे।
mysql> CREATE DATABASE Studentattendance;
Query OK, 1 row affected $(0.02 \mathrm{sec})$
**
गतिविधि 8.3
कथन show database; टाइप करें। क्या यह Student Attendance डेटाबेस का नाम दिखाता है?
8.4.2 CREATE Table
StudentAttendance डेटाबेस बनाने के बाद, हमें इस डेटाबेस में संबंध (tables) परिभाषित करने होंगे और प्रत्येक संबंध के लिए गुणों को उनके डेटा प्रकारों के साथ निर्दिष्ट करना होगा। यह CREATE TABLE कथन का उपयोग करके किया जाता है।
सिंटैक्स:
CREATE TABLE tablename(
attributename1 datatype constraint,
attributename2 datatype constraint,
:
attributenameN datatype constraint);
Create Table कथन के संबंध में निम्नलिखित बिंदुओं का ध्यान रखना महत्वपूर्ण है:
- $\mathrm{N}$ संबंध की डिग्री है, जिसका अर्थ है कि table में $\mathrm{N}$ कॉलम हैं।
- Attribute name table में कॉलम का नाम निर्दिष्ट करता है।
- Datatype वह डेटा प्रकार निर्दिष्ट करता है जो एक attribute रख सकता है।
- Constraint किसी attribute के मानों पर लगाए गए प्रतिबंधों को इंगित करता है। डिफ़ॉल्ट रूप से, प्रत्येक attribute NULL मान ले सकता है, primary key को छोड़कर।
आइए टेबल STUDENT के ऐट्रिब्यूट्स के डेटा टाइप्स और उनके कंस्ट्रेन्ट्स को पहचानते हैं, यदि कोई हो। यह मानते हुए कि कक्षा में अधिकतम 100 विद्यार्थी हैं और रोल नंबर 1 से 100 तक क्रमबद्ध हैं, हम जानते हैं कि RollNumber ऐट्रिब्यूट के मानों को संग्रहित करने के लिए 3 अंक पर्याप्त हैं। इसलिए, इस ऐट्रिब्यूट के लिए डेटा टाइप INT उपयुक्त है। विद्यार्थियों के नामों (SName) में कुल वर्ण भिन्न हो सकते हैं। यह मानते हुए कि नाम में अधिकतम 20 वर्ण हैं, हम SName कॉलम के लिए VARCHAR(20) का उपयोग करते हैं। SDateofBirth ऐट्रिब्यूट के लिए डेटा टाइप DATE है और यह मानते हुए कि स्कूल अभिभावक का 12 अंकों का आधार नंबर GUID के रूप में उपयोग करता है, हम GUID को CHAR(12) के रूप में घोषित कर सकते हैं क्योंकि आधार नंबर निश्चित लंबाई का होता है और हम GUID पर कोई गणितीय संचालन नहीं करने वाले हैं।
तालिका 8.3, 8.4 और 8.5 क्रमशः संबंधों STUDENT, GUARDIAN और ATTENDANCE के प्रत्येक ऐट्रिब्यूट के लिए चुने गए डेटा टाइप और कंस्ट्रेन्ट दिखाती हैं।
तालिका 8.3 संबंध STUDENT के ऐट्रिब्यूट्स के लिए डेटा टाइप्स और कंस्ट्रेन्ट्स
| Attribute Name | Data expected to be stored | Data type | Constraint |
|---|---|---|---|
| RollNumber | अधिकतम 3 अंकों की संख्यात्मक मान | INT | PRIMARY KEY |
| SName | अधिकतम 20 वर्णों की परिवर्तनीय लंबाई की स्ट्रिंग | VARCHAR(20) | NOT NULL |
| SDateofBirth | दिनांक मान | DATE | NOT NULL |
| GDID | 12 अंकों की संख्यात्मक मान | CHAR(12) | FOREIGN KEY |
तालिका 8.4 संबंध GUARDIAN के ऐट्रिब्यूट्स के लिए डेटा टाइप्स और कंस्ट्रेन्ट्स
| विशेषता नाम | संग्रहीत होने वाला डेटा | डेटा प्रकार | बाध्यता |
|---|---|---|---|
| GUID | 12 अंकों वाली आधार संख्या वाली संख्यात्मक मान | CHAR (12) | PRI MARY KEY |
| GName | अधिकतम वर्णों की परिवर्तनीय लंबाई वाली स्ट्रिंग | VARCHAR (20) | NOT NULL |
| GPhone | 10 अंकों वाली संख्यात्मक मान | CHAR(10) | NULL UNIQUE |
| GAddress | 30 वर्णों के आकार की परिवर्तनीय लंबाई वाली स्ट्रिंग | VARCHAR(30) | NOT NULL |
तालिका 8.5 संबंध ATTENDANCE की विशेषताओं के लिए डेटा प्रकार और बाध्यताएं।
| विशेषता नाम | संग्रहीत होने वाला डेटा | डेटा प्रकार | बाध्यता |
|---|---|---|---|
| AttendanceDate | दिनांक मान | DATE | PRIMARY KEY* |
| RollNumber | अधिकतम 3 अंकों वाली संख्यात्मक मान | I NT | PRIMARY KEY* FOREIGN KEY |
| AttendanceStatus | उपस्थित के लिए ‘P’ और अनुपस्थित के लिए ‘A’ | CHAR(1) | NOT NULL |
*का अर्थ है संयुक्त प्राथमिक कुंजी का भाग
एक बार डेटा प्रकार और बाध्यताओं की पहचान हो जाने के बाद, आइए सरलीकरण के लिए विशेषता नाम के साथ बाध्यता निर्दिष्ट किए बिना तालिकाएं बनाते हैं। हम विशेषताओं पर बाध्यताओं को शामिल करना खंड 8.4.4 में सीखेंगे।
उदाहरण 8.1 तालिका STUDENT बनाएं।
तालिका 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 कथन एक ही पंक्ति में पूर्ण नहीं हो सकता।
सोचिए और विचार कीजिए
क्या हम संपर्क संख्या (मोबाइल, लैंडलाइन) के लिए CHAR या VARCHAR डेटा प्रकार रख सकते हैं?
8.4.3 DESCRIBE Table
हम पहले से बनाई गई तालिका की संरचना को describe कथन का उपयोग करके देख सकते हैं।
गतिविधि 8.4
अन्य दो संबंध GUARDIAN और ATTENDENCE को तालिका 8.4 और 8.5 में दिए गए डेटा प्रकारों के अनुसार बनाइए और उनकी संरचना देखिए। इन दोनों तालिकाओं में कोई भी बाधा न जोड़ें।
वाक्य रचना:
DESCRIBE tablename;
MySQL तालिका का विवरण प्राप्त करने के लिए DESCRIBE के संक्षिप्त रूप DESC को भी समर्थन देता है। संबंध STUDENT की संरचना के बारे में विवरण प्राप्त करने के लिए हम DESC या DESCRIBE के बाद तालिका का नाम लिख सकते हैं:
mysql>DESC STUDENT;
| Fleld | Tyoe | $\mathrm{Null}$ | Key | Default | Extra |
|---|---|---|---|---|---|
| Rol I Number | int | NO | PRI | NULL | |
| SName | varchar(20) | YES | NULL | ||
| SDateofBirth | date | YES | NULL | ||
| GUID | char(12) | YES | NULL |
4 पंक्तियाँ सेट में (0.06 sec)
show table कमांड अब तालिका STUDENT को लौटाएगा:
mysqI > SHOW TABLES;
| Tables_in_studentattendence |
|---|
| student |
8.4.4 ALTER Table
एक टेबल बनाने के बाद हमें यह अहसास हो सकता है कि हमें कोई attribute जोड़ना या हटाना है, या किसी मौजूदा attribute का datatype बदलना है, या attribute में constraint जोड़ना है। ऐसे सभी मामलों में हमें alter statement का उपयोग करके टेबल की संरचना बदलनी या संशोधित करनी होती है।
Syntax:
ALTER TABLE tablename ADD/ Modify/DROP attributel, attribute2,..
(A) एक relation में primary key जोड़ना
आइए अब Activity 8.4 में बनाई गई tables को संशोधित करें। नीचे दिया गया MySQL statement GUARDIAN relation में primary key जोड़ता है:
mysql> ALTER TABLE GUARDIAN ADD PRI MARY KEY (GUID);
Query OK, O rows affected (1.14 sec)
Records: O Duplicates: O Warnings: 0
अब आइए ATTENDANCE relation में primary key जोड़ें। इस relation की primary key एक composite key है जो दो attributes - AttendanceDate और RollNumber से बनी है।
mysql> ALTER TABLE ATTENDANCE
$\qquad$ -> ADD PRIMARY KEY(AttendanceDate,
$\qquad$ -> RollNumber);
Query OK, 0 rows affected (0.52 sec)
Records: 0 Duplicates: 0 Warnings: 0
(B) एक relation में foreign key जोड़ना
एक बार primary keys जोड़ देने के बाद अगला कदम relation में foreign keys जोड़ना है (यदि कोई हों)। एक relation में multiple foreign keys हो सकते हैं और प्रत्येक foreign key एक single attribute पर परिभाषित होता है। किसी relation में foreign key जोड़ते समय निम्नलिखित बिंदुओं का ध्यान रखना होता है:
- संदर्भित संबंध पहले से ही बनाया जा चुका होना चाहिए।
- संदर्भित गुण संदर्भित संबंध की प्राथमिक कुंजी का हिस्सा होना चाहिए।
- संदर्भित और संदर्भित करने वाले गुणों के डेटा प्रकार और आकार समान होने चाहिए।
वाक्य रचना:
ALTER TABLE table name ADD FOREIGN KEY(attribute name) REFERENCES referenced_table_name (attribute name);
आइए अब STUDENT तालिका में विदेशी कुंजी जोड़ें। तालिका 8.3 दिखाती है कि गुण GUID (संदर्भित करने वाला गुण) एक विदेशी कुंजी है और यह तालिका GUARDIAN (तालिका 8.4) के गुण GUID (संदर्भित गुण) को संदर्भित करता है। इसलिए, STUDENT संदर्भित करने वाली तालिका है और GUARDIAN संदर्भित तालिका है।
mysql> ALTER TABLE STUDENT
$\qquad$ -> ADD FOREIGN KEY(GUID) REFERENCES
$\qquad$ -> GUARDIAN(GUID);
Query OK, 0 rows affected (0.75 sec)
Records: 0 Duplicates: 0 Warnings: 0
(C) मौजूदा गुण में UNIQUE बाधा जोड़ना
GUARDIAN तालिका में, गुण GPhone पर UNIQUE बाधा है जिसका अर्थ है उस स्तंभ में कोई भी दो मान समान नहीं होने चाहिए।
वाक्य रचना:
ALTER TABLE table name ADD UNIQUE (attribute name);
आइए अब GUARDIAN तालिका के गुण GPhone के साथ UNIQUE बाधा जोड़ें जैसा कि तालिका 8.4 में दिखाया गया है।
mysql> ALTER TABLE GUARDIAN
$\qquad$ -> ADD UNIQUE(GPhone);
Query OK, 0 rows affected (0.44 sec)
Records: 0 Duplicates: 0 Warnings: 0
गतिविधि 8.5
ATTENDANCE तालिका में विदेशी कुंजी जोड़ें (संदर्भित करने वाली और संदर्भित तालिकाओं की पहचान करने के लिए चित्र 8.1 का उपयोग करें)।
(D) किसी मौजूदा तालिका में एक विशेषता जोड़ना
कभी-कभी हमें किसी तालिका में एक अतिरिक्त विशेषता जोड़ने की आवश्यकता हो सकती है। इसे नीचे दी गई वाक्य-रचना का उपयोग करके किया जा सकता है:
ALTER TABLE table_name ADD attribute_name DATATYPE;
मान लीजिए स्कूल के प्रधानाचार्य ने कुछ जरूरतमंद छात्रों को छात्रवृत्ति देने का निर्णय लिया है, जिसके लिए अभिभावक की आय जानना आवश्यक है। लेकिन स्कूल ने अब तक तालिका GUARDIAN में आय विशेषता नहीं रखी है। इसलिए, डेटाबेस डिज़ाइनर को अब तालिका GUARDIAN में INT डेटा प्रकार की एक नई विशेषता income जोड़ने की आवश्यकता है।
mysql> ALTER TABLE GUARDIAN
$\qquad$ -> ADD income INT;
Query OK, 0 rows affected (0.47 sec)
Records: 0 Duplicates: 0 Warnings: 0
(E) किसी विशेषता का डेटा प्रकार संशोधित करना
हम निम्नलिखित ALTER कथन का उपयोग करके किसी तालिका की मौजूदा विशेषताओं के डेटा प्रकारों को संशोधित कर सकते हैं।
वाक्य-रचना:
ALTER TABLE table_name MODIFY attribute DATATYPE;
मान लीजिए हमें GUARDIAN तालिका की विशेषता GAddress का आकार $\operatorname{VARCHAR}(30)$ से $\operatorname{VARCHAR}(40)$ करना है। MySQL कथन होगा:
mysql> ALTER TABLE GUARDIAN
$\qquad$ -> MODIFY GAddress VARCHAR(40);
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
सोचिए और विचार कीजिए
आय विशेषता में न्यूनतम और अधिकतम आय मान क्या हो सकते हैं यदि डेटा प्रकार INT है?
(F) किसी विशेषता की बाधा संशोधित करना
जब हम एक टेबल बनाते हैं, तो डिफ़ॉल्ट रूप से प्रत्येक attribute NULL मान लेता है, सिवाय उस attribute के जिसे primary key के रूप में परिभाषित किया गया है। हम alter statement का उपयोग करके किसी attribute की constraint को NULL से NOT NULL में बदल सकते हैं।
Syntax:
ALTER TABLE table_name MODIFY attribute DATATYPE NOT NULL;
**
टेबल GUARDIAN से attribute income को हटाने के लिए (8.4), हम निम्नलिखित MySQL statement लिख सकते हैं:
mysql> ALTER TABLE GUARDIAN DROP income;
Query OK, 0 rows affected (0.42 sec)
Records: 0 Duplicates: 0 Warnings: 0
(I) टेबल से primary key हटाना
जब हम कोई टेबल बनाते हैं, तो हमने गलत primary key specify किया हो सकता है। ऐसे में, हमें टेबल के मौजूदा primary key को drop करना होगा और एक नया primary key add करना होगा।
Syntax:
ALtER TABLE table_name DROP PRIMARY KEY;
टेबल GUARDIAN का primary key हटाने के लिए (Table 8.4), हम निम्नलिखित MySQL statement लिखते हैं:
mysql> ALTER TABLE GUARDIAN DROP PRIMARY KEY;
Query OK, 0 rows affected (0.72 sec)
Records: 0 Duplicates: 0 Warnings: 0
**
2) DROP वक्तव्य द्वारा आपके द्वारा बनाए गए टेबल या डेटाबेस को हटा दिया जाएगा। इसलिए आप अध्याय के अंत में DROP वक्तव्य लगा सकते हैं।
8.5 डेटा हेरफेर के लिए SQL
पिछले खंड में हमने StudentAttendance नामक डेटाबेस बनाया जिसमें तीन संबंध STUDENT, GUARDIAN और ATTENDANCE हैं। जब हम कोई टेबल बनाते हैं, तो केवल उसकी संरचना बनती है लेकिन टेबल में कोई डेटा नहीं होता। टेबल में रिकॉर्ड भरने के लिए INSERT वक्तव्य का प्रयोग किया जाता है। इसी प्रकार, टेबल के रिकॉर्ड को SQL डेटा हेरफेर वक्तव्यों का उपयोग करके हटाया या अद्यतन किया जा सकता है।
डेटाबेस का उपयोग करके डेटा हेरफेर का अर्थ है डेटाबेस में मौजूदा डेटा की पुनर्प्राप्ति (पहुँच), नए डेटा का सम्मिलन, मौजूदा डेटा को हटाना या मौजूदा डेटा में संशोधन करना।
8.5.1 रिकॉर्ड का सम्मिलन
INSERT INTO वक्तव्य का उपयोग टेबल में नए रिकॉर्ड सम्मिलित करने के लिए किया जाता है। इसका वाक्य रचना है:
INSERT INTO tablename
VALUES(value 1, value 2,….);
यहाँ value 1 विशेषता 1 के अनुरूप है, value 2 विशेषता 2 के अनुरूप है और आगे भी ऐसे ही। ध्यान दें कि यदि INSERT वक्तव्य में मानों की संख्या टेबल में कुल विशेषताओं की संख्या के ठीक बराबर है, तो हमें सम्मिलन वक्तव्य में विशेषता नाम निर्दिष्ट करने की आवश्यकता नहीं है।
सावधानी: जब विदेशी कुंजी वाली टेबल में रिकॉर्ड भर रहे हों, तो सुनिश्चित करें कि संदर्भित टेबल्स में रिकॉर्ड पहले ही भरे जा चुके हैं।
आइए हम Student Attendance डेटाबेस में कुछ रिकॉर्ड्स डालें। हम पहले GUARDIAN टेबल में रिकॉर्ड्स डालेंगे क्योंकि इसमें कोई विदेशी कुंजी नहीं है। हम Table 8.6 में दिए गए रिकॉर्ड्स डालने जा रहे हैं।
Table 8.6 GUARDIAN टेबल में डाले जाने वाले रिकॉर्ड्स
| GUID | GName | GPhone | GAddress |
|---|---|---|---|
| 444444444444 | अमित आहूजा | 5711492685 | G-35, अशोक विहार, दिल्ली |
| 111111111111 | बाइचुंग भूटिया | 7110047139 | फ्लैट नं. 5, दार्जिलिंग अपार्टमेंट, शिमला |
| 101010101010 | हिमांशु शाह | 9818184855 | 26/77, वेस्ट पटेल नगर, अहमदाबाद |
| 333333333333 | डैनी डिसूजा | S-13, अशोक विलेज, दमन | |
| 466444444666 | सुजाता पी. | 7802983674 | HNO-13, B-ब्लॉक, प्रीत विहार, मदुरै |
नीचे दिया गया कथन टेबल में पहला रिकॉर्ड डालता है।
mysql> INSERT INTO GUARDIAN
$\qquad$ -> VALUES (444444444444, ‘अमित आहूजा’,
$\qquad$ -> 5711492685, ‘G-35, अशोक विहार, दिल्ली’);
Query OK, 1 row affected (0.01 sec)
हम डाले गए रिकॉर्ड्स को देखने के लिए SQL कथन SELECT * from table name का उपयोग कर सकते हैं। SELECT कथन को अगले खंड में समझाया जाएगा।
mysql> SELECT * from GUARDIAN;
| GUID | GName | Gphone | GAddress |
|---|---|---|---|
| 444444444444 | अमित आहूजा | 5711492685 | G-35, अशोक विहार, दिल्ली |
यदि हम किसी टेबल में केवल कुछ attributes के लिए मान देना चाहते हैं (यह मानते हुए कि अन्य attributes में NULL या कोई अन्य default मान होगा), तो हमें प्रत्येक डेटा मान के साथ attribute का नाम निम्नलिखित INSERT INTO statement के syntax में दिखाए अनुसार लिखना होगा।
Syntax:
INSERT INTO tablename (column1, column2, …)
VALUES (value1, value2, …);
टेबल 8.6 के चौथे रिकॉर्ड को डालने के लिए जहाँ GPhone नहीं दिया गया है, हमें अन्य तीन fields में मान डालने होंगे (GPhone को टेबल creation के समय default रूप से NULL सेट किया गया था)। इस स्थिति में, हमें उन attributes के नाम specify करने होंगे जिनमें हम मान डालना चाहते हैं। मानों को उसी क्रम में देना होगा जिस क्रम में attributes INSERT command में लिखे गए हैं।
Activity 8.6
टेबल 8.6 की शेष 3 पंक्तियों को टेबल GUARDIAN में डालने के लिए SQL statements लिखें।
mysql> INSERT INTO GUARDIAN(GUID, GName, GAddress)
$\qquad$ -> VALUES (333333333333, ‘Danny Dsouza’,
$\qquad$ -> ‘S -13, Ashok Village, Daman’ );
Query OK, 1 row affected (0.03 sec)
**
तालिका 8.7 STUDENT तालिका में डाले जाने वाले रिकॉर्ड
| RollNumber | SName | SDateofBirth | GUID |
|---|---|---|---|
| 1 | अथर्व आहूजा | 2003-05-15 | 444444444444 |
| 2 | डेज़ी भूटिया | 2002-02-28 | 11111111111 |
| 3 | तालीम शाह | 2002-02-28 | |
| 4 | जॉन डिसूज़ा | 2003-08-18 | 33333333333 |
| 5 | अली शाह | 2003-07-05 | 101010101010 |
तालिका 8.7 का पहला रिकॉर्ड डालने के लिए हम निम्नलिखित MySQL कथन लिखते हैं
mysql> INSERT INTO STUDENT
$\qquad$ -> VALUES(1,‘अथर्व आहूजा’,‘2003-05-15’,
$\qquad$ -> 444444444444);
Query OK, 1 row affected (0.11 sec)
या
mysql> INSERT INTO STUDENT (RollNumber, SName,
$\qquad$ -> SDateofBirth, GUID)
$\qquad$ -> VALUES (1,‘अथर्व आहूजा’,‘2003-05-15’,
$\qquad$ -> 444444444444);
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * from STUDENT;
| RollNumber | SName | SDateofBirth | GUID |
|---|---|---|---|
| 1 | अथर्व आहूजा | 2003-05-15 | 444444444444 |
1 row in set (0.00 sec)
अब तालिका 8.7 का तीसरा रिकॉर्ड डालते हैं जिसमें GUID NULL है। याद रखें कि GUID इस तालिका की विदेशी कुंजी है और इसलिए NULL मान ले सकती है। इसलिए GUID के लिए NULL मान रखकर निम्नलिखित कथन का उपयोग कर रिकॉर्ड डाल सकते हैं:
याद रखें कि दिनांक “YYYY-MM-DD” प्रारूप में संग्रहीत होती है।
mysql> INSERT INTO STUDENT
$\qquad$ -> VALUES(3, ‘तालीम शाह’,‘2002-02-28’,
$\qquad$ -> NULL);
Query OK, 1 row affected (0.05 sec)
mysq q >SELECT * from STUDENT;
| RollNumber | SName | SDateofBirth | GUID |
|---|---|---|---|
| 1 | Atharv Ahuja | 2003-05-15 | 444444444444 |
| 3 | Taleem Shah | 2002-02-28 | NULL |
2 पंक्तियाँ सेट में (0.00 sec)
हमें उपरोक्त MySQL कथन में NULL लिखना पड़ा क्योंकि जब कॉलम नाम नहीं दे रहे होते हैं, तो हमें सभी कॉलमों के लिए मान देने होते हैं। अन्यथा, यदि हमें केवल कुछ विशेष गुणों के लिए डेटा डालना है, तो हमें मानों के साथ-साथ गुणों के नाम भी देने होते हैं, जैसा कि अगले क्वेरी में दिखाया गया है:
गतिविधि 8.7
तालिका 8.7 की शेष 4 पंक्तियों को STUDENT तालिका में डालने के लिए SQL कथन लिखें।
mysql> INSERT INTO STUDENT (RollNumber, SName,
$\qquad$ -> SDateofBirth) VALUES (3, ‘Taleem Shah’,’
$\qquad$ -> 2002-02-28’);
Query OK, 1 पंक्ति प्रभावित हुई (0.05 sec)
उपरोक्त कथन में हम DBMS को सूचित कर रहे हैं कि उल्लेखित कॉलमों के लिए संगत मान डाले जाएँ और GUID को NULL मान दिया जाएगा।
mysql> SELECT * from STUDENT;
| RollNumber | SName | SDateofBirth | GUID |
|---|---|---|---|
| 1 | Atharv Ahuja | 2003-05-15 | 444444444444 |
| 3 | Taleem Shah | 2002-02-28 | NULL |
2 पंक्तियाँ सेट में (0.00 sec)
सोचें और विचार करें
- उपरोक्त में से कौन-सा सिंटैक्स प्रयोग किया जाना चाहिए जब हमें यह सुनिश्चित नहीं हो कि मानों को तालिका में किस क्रम (कॉलम के सन्दर्भ में) में डाला जाना है?
- क्या हम समान रोल नंबर वाले दो रिकॉर्ड डाल सकते हैं?
8.6 डेटा क्वेरी के लिए SQL
अब तक हमने सीखा है कि डेटाबेस कैसे बनाया जाता है और डेटा को कैसे संग्रहित और हेरफेर किया जाता है। हम डेटा को डेटाबेस में संग्रहित करने में रुचि रखते हैं क्योंकि भविष्य में डेटाबेस से डेटा को जिस भी तरह चाहें पुनः प्राप्त करना आसान होता है। स्ट्रक्चर्ड क्वेरी लैंग्वेज (SQL) में MySQL डेटाबेस (या किसी अन्य RDBMS) में कई तालिकाओं में संग्रहित डेटा को प्राप्त करने के लिए कुशल तंत्र होते हैं। उपयोगकर्ता SQL कमांड दर्ज करता है जिन्हें क्वेरी कहा जाता है जिनमें डेटा प्राप्त करने के लिए विशिष्ट आवश्यकताएँ दी जाती हैं। SQL स्टेटमेंट SELECT डेटाबेस की तालिकाओं से डेटा प्राप्त करने के लिए प्रयोग किया जाता है और इसे क्वेरी स्टेटमेंट भी कहा जाता है।
8.6.1 SELECT स्टेटमेंट
SQL स्टेटमेंट SELECT डेटाबेस की तालिकाओं से डेटा प्राप्त करने के लिए प्रयोग किया जाता है और आउटपुट भी तालिका के रूप में प्रदर्शित किया जाता है।
सिंटैक्स:
SELECT attribute1, attribute2, …
FROM table_name
WHERE condition
यहाँ, attribute 1, attribute $2, \ldots$ तालिका table_name के कॉलम नाम हैं जिनसे हम डेटा प्राप्त करना चाहते हैं। FROM क्लॉज हमेशा SELECT क्लॉज के साथ लिखा जाता है क्योंकि यह उस तालिका का नाम निर्दिष्ट करता है जिससे डेटा प्राप्त किया जाना है। WHERE क्लॉज वैकल्पिक है और निर्दिष्ट शर्त(ओं) को पूरा करने वाले डेटा को प्राप्त करने के लिए प्रयोग किया जाता है।
उदाहरण 8.2 रोल नंबर 2 वाले छात्र का नाम और जन्म तिथि प्रदर्शित करने के लिए, हम निम्नलिखित क्वेरी लिखते हैं:
mysql> SELECT SName, SDateofBirth
$\qquad$ -> FROM STUDENT
$\qquad$ -> WHERE RollNumber = 1;
| SName | SDateofBirth |
|---|---|
| अथर्व आहूजा | 2003-05-15 |
सोचिए और विचार कीजिए
क्या आप दैनिक जीवन के ऐसे उदाहरण सोच सकते हैं जहाँ डेटाबेस में डेटा संग्रहित करना और उसे क्वेरी करना उपयोगी हो सकता है?
8.6.2 डेटाबेस OFFICE का उपयोग करके क्वेरींग
विभिन्न संगठन डेटा को सारणियों के रूप में संग्रहित करने के लिए डेटाबेस बनाए रखते हैं। आइए किसी संगठन के डेटाबेस OFFICE पर विचार करें जिसमें EMPLOYEE, DEPARTMENT आदि कई संबंधित सारणियाँ हैं। डेटाबेस में प्रत्येक EMPLOYEE किसी DEPARTMENT को आवंटित होता है और उसका विभाग संख्या (DeptId) EMPLOYEE सारणी में विदेशी कुंजी के रूप में संग्रहित होती है। आइए सारणी ‘EMPLOYEE’ के लिए कुछ डेटा को सारणी 8.8 में दिखाए गए अनुसार लें और डेटा पुनःप्राप्त करने के लिए SELECT कथन लागू करें:
सारणी 8.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
$\qquad$ -> FROM EMPLOYEE;
| EmpNo |
|---|
| 101 |
| 102 |
| 103 |
| 104 |
| 105 |
| 106 |
| 107 |
| 108 |
| 109 |
| 110 |
10 rows in set (0.41 sec)
सभी कर्मचारियों का कर्मचारी संख्या और कर्मचारी नाम प्रदर्शित करने के लिए, हम निम्नलिखित क्वेरी लिखते हैं:
mysql> SELECT EmpNo, Ename
$\qquad$ -> FROM EMPLOYEE;
| EmpNo | Ename |
|---|---|
| 101 | आलिया |
| 102 | कृतिका |
| 103 | शब्बीर |
| 104 | गुरप्रीत |
| 105 | जोसेफ |
| 106 | सान्या |
| 107 | वर्गीस |
| 108 | नचाओबी |
| 109 | दारिभा |
| 110 | तान्या |
(B) कॉलम का नाम बदलना
यदि हम आउटपुट दिखाते समय किसी कॉलम का नाम बदलना चाहते हैं, तो हम क्वेरी में उपनाम ‘AS’ का उपयोग कर ऐसा कर सकते हैं:
सभी कर्मचारियों के लिए आउटपुट में कर्मचारी नाम को नाम के रूप में प्रदर्शित करें।
mysql> SELECT EName AS Name
$\qquad$-> FROM EMPLOYEE;
| Name |
|---|
| आलिया |
| कृतिका |
| शब्बीर |
| गुरप्रीत |
| जोसेफ |
| सान्या |
| वर्गीस |
| नचाओबी |
| दारिभा |
| तान्या |
उदाहरण 8.3 सभी कर्मचारियों के नाम उनके वार्षिक वेतन (वेतन*12) के साथ प्रदर्शित करें। क्वेरी परिणाम प्रदर्शित करते समय EName को नाम के रूप में नाम बदलें।
mysql> SELECT EName AS Name, Salary*12
$\qquad$ -> FROM EMPLOYEE;
| नाम | वेतन*12 |
|---|---|
| आलिया | 120000 |
| कृतिका | 720000 |
| शब्बीर | 540000 |
| गुरप्रीत | 228000 |
| जोसेफ | 408000 |
| सान्या | 576000 |
| वर्गीस | 180000 |
| नचाओबी | 348000 |
| डारिभा | 504000 |
| तान्या | 600000 |
ध्यान दें कि आउटपुट में वार्षिक वेतन कॉलम के लिए Salary*12 कॉलम नाम के रूप में प्रदर्शित होता है। आउटपुट टेबल में हम उस कॉलम को वार्षिक वेतन के रूप में नाम देने के लिए उपनाम (alias) का उपयोग कर सकते हैं जैसा नीचे दिखाया गया है:
mysql> SELECT Ename AS Name, Salary*12 AS
$\qquad$ -> ‘Annual Salary’
$\qquad$ -> FROM EMPLOYEE;
नाम
| वार्षिक वेतन | |
|---|---|
| आलिया | 120000 |
| कृतिका | 720000 |
| शब्बीर | 540000 |
| गुरप्रीत | 228000 |
| जोसेफ | 408000 |
| सान्या | 576000 |
| वर्गीस | 180000 |
| नचाओबी | 348000 |
| डारिभा | 504000 |
| तान्या | 600000 |
नोट:
i) वार्षिक वेतन को डेटाबेस टेबल में एक नई कॉलम के रूप में नहीं जोड़ा जाएगा। यह केवल क्वेरी के आउटपुट को प्रदर्शित करने के लिए है।
ii) यदि एक उपनाम वाले कॉलम नाम में खाली स्थान हो जैसे कि वार्षिक वेतन के मामले में, तो इसे उद्धरण चिह्नों में लिखा जाना चाहिए जैसे ‘वार्षिक वेतन’।
(C) DISTINCT Clause
डिफ़ॉल्ट रूप से, SQL क्वेरी के माध्यम से प्राप्त सभी डेटा को आउटपुट के रूप में दिखाता है। हालाँकि, डुप्लिकेट मान हो सकते हैं। जब SELECT स्टेटमेंट DISTINCT क्लॉज़ के साथ संयुक्त होता है, तो यह दोहराव के बिना रिकॉर्ड (विशिष्ट रिकॉर्ड) लौटाता है। उदाहरण के लिए, कर्मचारी के विभाग संख्या को प्राप्त करते समय डुप्लिकेट मान हो सकते हैं क्योंकि कई कर्मचारी एक ही विभाग में नियुक्त होते हैं। सभी कर्मचारियों के लिए अद्वितीय विभाग संख्या प्रदर्शित करने के लिए, हम नीचे दिखाए अनुसार DISTINCT का उपयोग करते हैं:
mysql> SELECT DISTINCT DeptId
$\qquad$ -> FROM EMPLOYEE;
| DeptId |
|---|
| D02 |
| D01 |
| D04 |
| D03 |
| D05 |
(D) WHERE Clause
WHERE क्लॉज़ का उपयोग उन डेटा को प्राप्त करने के लिए किया जाता है जो कुछ निर्दिष्ट शर्तों को पूरा करते हैं। OFFICE डेटाबेस में, एक से अधिक कर्मचारी एक ही वेतन पा सकते हैं। विभाग संख्या D01 में कार्यरत कर्मचारियों के विशिष्ट वेतन प्रदर्शित करने के लिए, हम निम्नलिखित क्वेरी लिखते हैं जिसमें उस कर्मचारी को चुनने की शर्त निर्दिष्ट की गई है जिसका विभाग संख्या D01 है, WHERE क्लॉज़ का उपयोग करके:
mysql> SELECT DISTINCT Salary
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE Deptid=‘D01’;
जैसा कि कॉलम DeptId स्ट्रिंग प्रकार का है, इसके मान उद्धरण चिह्नों में लिखे जाते हैं (‘D01’)।
| Salary |
|---|
| 60000 |
| 45000 |
| 15000 |
उपरोक्त उदाहरण में हमने WHERE क्लॉज़ में = ऑपरेटर का प्रयोग किया है। हम अन्य संबंधात्मक ऑपरेटरों (<, <=, >, >=, !=) का भी प्रयोग कर सकते हैं ताकि शर्तें निर्दिष्ट की जा सकें। लॉजिकल ऑपरेटर AND, OR और NOT का प्रयोग WHERE क्लॉज़ के साथ कई शर्तों को जोड़ने के लिए किया जाता है।
उदाहरण 8.4 उन सभी कर्मचारियों को प्रदर्शित करें जो 5000 से अधिक कमाते हैं और DeptId D04 वाले विभाग में कार्यरत हैं।
mysql> SELECT *
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE Salary > 5000 AND DeptId = ‘D04’;
| EmpNo | Ename | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 104 | Gurpreet | 19000 | 565 | D04 |
| 109 | Daribha | 42000 | NULL | D04 |
उदाहरण 8.5 निम्नलिखित क्वेरी Aaliya को छोड़कर सभी कर्मचारियों के रिकॉर्ड प्रदर्शित करती है।
mysql> SELECT *
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE NOT Ename = ‘Aaliya’;
| EmpNo | Ename | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 102 | Kritika | 60000 | 123 | D01 |
| 103 | Shabbir | 45000 | 566 | D01 |
| 104 | Gurpreet | 19000 | 565 | D04 |
| 105 | Joseph | 34000 | 875 | D03 |
| 106 | Sanya | 48000 | 695 | D02 |
| 107 | Vergese | 15000 | NULL | D01 |
| 108 | Nachaobi | 29000 | NULL | D05 |
| 109 | Daribha | 42000 | NULL | D04 |
| 110 | Tanya | 50000 | 467 | D05 |
सोचिए और विचार कीजिए
यदि उपरोक्त क्वेरी में हम “Aaliya” को “AALIYA” या “aaliya” या “AaLIYA” लिखें तो क्या होगा? क्या क्वेरी समान आउटपुट देगी या त्रुटि उत्पन्न करेगी?
उदाहरण 8.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 |
गतिविधि 8.8
उदाहरण 8.6 में दी गई क्वेरी और निम्नलिखित क्वेरी द्वारा उत्पन्न आउटपुट की तुलना कीजिए और OR तथा AND ऑपरेटरों के बीच अंतर कीजिए।
SELECT *
FROM EMPLOYEE
WHERE Salary > 5000 OR
$\qquad$ Dept I =20;
उपरोक्त क्वेरी एक रेंज को परिभाषित करती है जिसे 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 |
नोट: BETWEEN ऑपरेटर मानों की एक रेंज को परिभाषित करता है जिसमें कॉलम मान के पड़ने पर ही शर्त सत्य होती है।
उदाहरण 8.7 निम्नलिखित क्वेरी उन सभी कर्मचारियों का विवरण प्रदर्शित करती है जो या तो DeptId D01, D02 या D04 में कार्यरत हैं।
mysql> SELECT *
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE DeptId = ‘D01’ OR DeptId = ‘D02’ OR
$\qquad$ -> DeptId = ‘D04’;
| EmpNo | Ename | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 101 | Aaliya | 10000 | 234 | D02 |
| 102 | Kritika | 60000 | 123 | D01 |
| 103 | Shabbir | 45000 | 566 | D01 |
| 104 | Gurpreet | 19000 | 565 | D04 |
| 106 | Sanya | 48000 | 695 | D02 |
| 107 | Vergese | 15000 | NULL | D01 |
| 109 | Daribha | 42000 | NULL | D04 |
(E) MEMBERSHIP OPERATOR IN
IN ऑपरेटर एक मान की तुलना मानों के समूह से करता है और true लौटाता है यदि वह मान उस समूह से संबंधित है। उपरोक्त क्वेरी को IN ऑपरेटर का उपयोग करके नीचे दिखाए अनुसार पुनः लिखा जा सकता है:
mysql> SELECT *
-> FROM EMPLOYEE
-> WHERE DeptId IN (‘D01’, ‘D02’ , ‘D04’);
| EmpNo | Ename | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 101 | Aaliya | 10000 | 234 | D02 |
| 102 | Kritika | 60000 | 123 | D01 |
| 103 | Shabbir | 45000 | 566 | D01 |
| 104 | Gurpreet | 19000 | 565 | D04 |
| 106 | Sanya | 48000 | 695 | D02 |
| 107 | Vergese | 15000 | NULL | D01 |
| 109 | Daribha | 42000 | NULL | D04 |
उदाहरण 8.8 निम्नलिखित क्वेरी उन सभी कर्मचारियों का विवरण प्रदर्शित करती है जो विभाग संख्या D01 या D02 में कार्यरत नहीं हैं।
mysql> SELECT *
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE DeptId NOT IN(‘D01’, ‘D02’);
| EmpNo | Ename | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 104 | Gurpreet | 19000 | 565 | D04 |
| 105 | Joseph | 34000 | 875 | D03 |
| 108 | Nachaobi | 29000 | NULL | D05 |
| 109 | Daribha | 42000 | NULL | D04 |
| 110 | Tanya | 50000 | 467 | D05 |
नोट: यहाँ हमें NOT को IN के साथ संयोजित करना होता है क्योंकि हमें DeptId D01 और D02 के अलावा सभी रिकॉर्ड प्राप्त करने हैं।
(F) ORDER BY क्लॉज
ORDER BY क्लॉज डेटा को किसी निर्दिष्ट कॉलम के संबंध में एक क्रमबद्ध (व्यवस्थित) रूप में प्रदर्शित करने के लिए प्रयोग की जाती है। डिफ़ॉल्ट रूप से, ORDER BY निर्दिष्ट कॉलम के मानों के आरोही क्रम में रिकॉर्ड प्रदर्शित करता है। रिकॉर्ड्स को अवरोही क्रम में प्रदर्शित करने के लिए उस कॉलम के साथ DES (अर्थात् descending) कीवर्ड लिखना होता है।
उदाहरण 8.9 निम्नलिखित क्वेरी सभी कर्मचारियों का विवरण उनके वेतन के आरोही क्रम में प्रदर्शित करती है।
mysql> SELECT *
$\qquad$ -> 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 |
उदाहरण 8.10 निम्नलिखित क्वेरी सभी कर्मचारियों का विवरण उनके वेतन के अवरोही क्रम में प्रदर्शित करती है।
mysql> SELECT *
$\qquad$ -> 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 |
(G) NULL मानों को संभालना
SQL एक विशेष मान NULL का समर्थन करता है जो गुम या अज्ञात मान को दर्शाने के लिए प्रयोग होता है। उदाहरण के लिए, address नामक तालिका में village स्तंभ शहरों के लिए कोई मान नहीं रखेगा। इसलिए, ऐसे अज्ञात मानों को दर्शाने के लिए NULL का प्रयोग किया जाता है। यह ध्यान रखना महत्वपूर्ण है क NULL 0 (शून्य) से भिन्न होता है। साथ ही, NULL मान के साथ कोई भी अंकगणितीय संक्रिया NULL देती है। उदाहरण: $5+$ NULL $=$ NULL क्योंकि NULL अज्ञात है इसलिए परिणाम भी अज्ञात है। किसी स्तंभ में NULL मान की जाँच करने के लिए हम IS NULL का प्रयोग करते हैं।
गतिविधि 8.9
निम्न दो क्वेरीज़ को चलाइए और पता लगाइए कि यदि हम ORDER BY खंड में दो स्तंभ दें तो क्या होगा:
SELECT *
FROM EMPLOYEE
ORDER BY Salary,Bonus
desc;
उदाहरण 8.11 निम्न क्वेरी उन सभी कर्मचारियों का विवरण दिखाती है जिन्हें कोई बोनस नहीं दिया गया है। इसका तात्पर्य है कि bonus स्तंभ खाली होगा।
mysql> SELECT *
$\qquad$ -> 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 |
उदाहरण 8.12 निम्न क्वेरी उन सभी कर्मचारियों के नाम दिखाती है जिन्हें बोनस दिया गया है। इसका तात्पर्य है कि bonus स्तंभ खाली नहीं होगा।
mysql> SELECT EName
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE Bonus IS NOT NULL;
| EName |
|---|
| आलिया |
| कृतिका |
| शब्बीर |
| गुरप्रीत |
| जोसेफ |
| सान्या |
| तान्या |
(H) सबस्ट्रिंग पैटर्न मिलान
कई बार ऐसी स्थितियाँ आती हैं जब हम वास्तविक पाठ या मान से मिलान करके क्वेरी नहीं करना चाहते। बल्कि, हम केवल कुछ वर्णों या मानों का स्तंभ मानों में मिलान खोजने में रुचि रखते हैं। उदाहरण के लिए, ‘T’ से शुरू होने वाले नामों को खोजना या ‘60’ से शुरू होने वाले पिन कोड खोजना। इसे सबस्ट्रिंग पैटर्न मिलान कहा जाता है। हम ऐसे पैटर्नों का मिलान = ऑपरेटर का उपयोग नहीं कर सकते क्योंकि हम सटीक मिलान नहीं खोज रहे हैं। SQL LIKE ऑपरेटर प्रदान करता है जिसे WHERE खंड के साथ उपयोग किया जा सकता है ताकि किसी स्तंभ में निर्दिष्ट पैटर्न खोजा जा सके।
LIKE ऑपरेटर निम्नलिखित दो वाइल्डकार्ड वर्णों का उपयोग करता है:
- % (प्रतिशत) — शून्य, एक या अनेक वर्णों को दर्शाने के लिए प्रयुक्त
- _ (अंडरस्कोर) — एक एकल वर्ण को दर्शाने के लिए प्रयुक्त
उदाहरण 8.13 निम्नलिखित क्वेरी उन सभी कर्मचारियों का विवरण प्रदर्शित करती है जिनके नाम ‘K’ से शुरू होते हैं।
mysql> SELECT *
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE Ename LIKE ‘K%’;
| EmpNo | Ename | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 102 | कृतिका | 60000 | 123 | D01 |
उदाहरण 8.14 निम्नलिखित क्वेरी उन सभी कर्मचारियों का विवरण प्रदर्शित करती है जिनके नाम ‘a’ पर समाप्त होते हैं।
mysql> SELECT *
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE Ename LIKE ‘%a’;
| EmpNo | Ename | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 101 | Aaliya | 10000 | 234 | D02 |
| 102 | Kritika | 60000 | 123 | D01 |
| 106 | Sanya | 48000 | 695 | D02 |
| 109 | Daribha | 42000 | NULL | D04 |
| 110 | Tanya | 50000 | 467 | D05 |
उदाहरण 8.15 निम्नलिखित क्वेरी उन सभी कर्मचारियों का विवरण प्रदर्शित करती है जिनके नाम में ठीक 5 अक्षर हों और कोई भी अक्षर से शुरू हों लेकिन उसके बाद ‘ANYA’ हो।
mysql> SELECT *
$\qquad$ -> FROM EMPLOYEE
$\qquad$ _-> WHERE Ename LIKE ‘ANYA’;
| EmpNo | Ename | Salary | Bonus | DeptId |
|---|---|---|---|---|
| 106 | Sanya | 48000 | 695 | D02 |
| 110 | Tanya | 50000 | 467 | D05 |
सोचिए और विचार कीजिए
जब हम अपने मोबाइल फोन में संपर्क सूची में किसी संपर्क के नाम का पहला अक्षर टाइप करते हैं, तो उस अक्षर वाले सभी नाम प्रदर्शित होते हैं। क्या आप इस प्रक्रिया के साथ SQL कथन को संबंधित कर सकते हैं? अन्य वास्तविक जीवन की स्थितियों की सूची बनाइए जहाँ आप SQL कथन को कार्यरत देख सकते हैं। $\rightarrow$ FROM EMPLOYEE
उदाहरण 8.16 निम्नलिखित क्वेरी उन सभी कर्मचारियों के नाम प्रदर्शित करती है जिनके नाम में ‘se’ उपनाम के रूप में होता है।
mysql> SELECT Ename
$\qquad$ -> FROM EMPLOYEE
$\qquad$ -> WHERE Ename LIKE ‘%se%’;
| Ename |
|---|
| Joseph |
| Vergese |
उदाहरण 8.17 निम्नलिखित क्वेरी उन सभी कर्मचारियों के नाम प्रदर्शित करती है जिनमें दूसरे अक्षर के रूप में ‘a’ है।
mysql> SELECT EName
$\qquad$ -> FROM EMPLOYEE
$\qquad$ _-> WHERE Ename LIKE ‘a%’;
| EName |
|---|
| Aaliya |
| Sanya |
| Nachaobi |
| Daribha |
| Tanya |
8.7 डेटा अद्यतन और विलोपन
डेटा का अद्यतन और विलोपन भी SQL डेटा मैनिपुलेशन के भाग हैं। इस खंड में, हम इन दो डेटा मैनिपुलेशन विधियों को लागू करने जा रहे हैं।
8.7.1 डेटा अद्यतन
हमें किसी तालिका में मौजूदा रिकॉर्ड्स की एक या अधिक कॉलमों के मानों में बदलाव करने की आवश्यकता हो सकती है। उदाहरण के लिए, हमें पते, फोन नंबर या नाम की वर्तनी आदि में कुछ बदलावों की आवश्यकता हो सकती है। मौजूदा डेटा में ऐसे संशोधन करने के लिए UPDATE स्टेटमेंट का उपयोग किया जाता है।
व्याकरण:
UPDATE table_name
SET attribute1 = value1, attribute2 = value2, …
WHERE condition;
STUDENT तालिका 8.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 कथन का उपयोग करके अद्यतन कर सकते हैं। मान लीजिए, अभिभावक (तालिका 8.6) जिसका GUID 466444444666 है, ने पता ‘WZ - 68, Azad Avenue, Bijnour, MP’ और फोन नंबर ‘9010810547’ में बदलने का अनुरोध किया है।
mysql> UPDATE GUARDIAN
$\qquad$ -> SET GAddress = ‘WZ - 68, Azad Avenue,
$\qquad$ -> 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 | Amit Ahuja | 5711492685 | G-35, Ashok vihar, Delhi |
| 111111111111 | Baichung Bhutia | 7110047139 | Flat no. 5, Darjeeling Appt., Shimla |
| 101010101010 | Himanshu Shah | 9818184855 | 26/77, West Patel Nagar, Ahmedabad |
| 333333333333 | Danny Dsouza | NULL | S -13, Ashok Village, Daman |
| 466444444666 | Sujata P. | 9010810547 | WZ - 68, Azad Avenue, Bijnour, MP |
8.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 | Atharv Ahuja | 2003-05-15 | 444444444444 |
| 3 | Taleem Shah | 2002-02-28 | 101010101010 |
| 4 | John Dsouza | 2003-08-18 | 333333333333 |
| 5 | Ali Shah | 2003-07-05 | 101010101010 |
| 6 | Manika P. | 2002-03-10 | 466444444666 |
सावधानी: UPDATE कथन की तरह, तालिका में रिकॉर्ड हटाते समय DELETE कथन का उपयोग करते समय हमें WHERE खंड को शामिल करने में सावधान रहना होगा। अन्यथा, तालिका में सभी रिकॉर्ड हट जाएंगे।
सारांश
- डेटाबेस संबंधित तालिकाओं का संग्रह होता है। MySQL एक ‘रिलेशनल’ DBMS है। एक तालिका पंक्तियों और स्तंभों का संग्रह होता है, जहाँ प्रत्येक पंक्ति एक रिकॉर्ड होता है और स्तंभ रिकॉर्ड्स की विशेषता का वर्णन करते हैं।
- SQL अधिकांश RDBMS के लिए मानक भाषा है। SQL केस असंवेदी होती है।
- CREATE DATABASE कथन का उपयोग एक नए डेटाबेस को बनाने के लिए किया जाता है।
- USE कथन का उपयोग निर्दिष्ट डेटाबेस को सक्रिय डेटाबेस बनाने के लिए किया जाता है।
- CREATE TABLE कथन का उपयोग एक तालिका बनाने के लिए किया जाता है।
- CREATE TABLE कथन में प्रत्येक attribute का एक नाम और एक datatype होना चाहिए।
- ALTER TABLE कथन का उपयोग तालिका की संरचना में बदलाव करने के लिए किया जाता है जैसे स्तंभों को जोड़ना, हटाना या datatype बदलना।
- तालिका नाम के साथ DESC कथन तालिका की संरचना दिखाता है।
- INSERT INTO कथन का उपयोग तालिका में रिकॉर्ड डालने के लिए किया जाता है।
- UPDATE कथन का उपयोग तालिका में मौजूदा डेटा को संशोधित करने के लिए किया जाता है।
- DELETE कथन का उपयोग तालिका में रिकॉर्ड हटाने के लिए किया जाता है।
- SELECT कथन का उपयोग एक या अधिक डेटाबेस तालिकाओं से डेटा पुनः प्राप्त करने के लिए किया जाता है।
- SELECT * FROM table_name उस तालिका के सभी attributes से डेटा प्रदर्शित करता है।
- WHERE clause किसी query में शर्त(ें) लागू करने के लिए उपयोग किया जाता है।
- DISTINCT clause दोहराव को समाप्त करने और मानों को केवल एक बार प्रदर्शित करने के लिए उपयोग किया जाता है।
- BETWEEN ऑपरेटर सीमा मानों सहित मानों की सीमा को परिभाषित करता है।
- IN ऑपरेटर उन मानों को चुनता है जो दिए गए मानों की सूची में किसी मान से मेल खाते हैं।
- NULL मानों की जाँच IS NULL और IS NOT NULL का उपयोग करके की जा सकती है।
- ORDER BY clause SQL query के परिणाम को निर्दिष्ट attribute मानों के संदर्भ में आरोही या अवरोही क्रम में प्रदर्शित करने के लिए उपयोग किया जाता है। डिफ़ॉल्ट आरोही क्रम होता है।
- LIKE clause पैटर्न मिलान के लिए उपयोग किया जाता है। % और _ दो वाइल्ड कार्ड वर्ण हैं। प्रतिशत (%) प्रतीक शून्य या अधिक वर्णों को दर्शाने के लिए उपयोग किया जाता है। अंडरस्कोर ( $_$ ) प्रतीक एकल वर्ण को दर्शाने के लिए उपयोग किया जाता है।
अभ्यास
1. निम्नलिखित क्लॉज़ों को उनके संबंधित कार्यों से मिलान कीजिए।
| ALTER | एक टेबल में मान सम्मिलित करें |
|---|---|
| UPDATE | कॉलम पर प्रतिबंध |
| DELETE | टेबल परिभाषा |
| INSERT INTO | किसी कॉलम का नाम बदलें |
| CONSTRAINTS | टेबल में मौजूदा जानकारी अपडेट करें |
| DESC | टेबल से मौजूदा पंक्ति हटाएँ |
| CREATE | डेटाबेस बनाएँ |
2. निम्नलिखित कोड स्निपेट के संदर्भ में उपयुक्त उत्तर चुनिए।
CREATE TABLE student ( student_id INT, gender C̄HAR(1), PRI MARY KEY (student_id) $1 ;$ a) student टेबल की डिग्री क्या होगी?
CREATE TABLE student (
$\qquad$ name CHAR(30),
$\qquad$ student_id INT,
$\qquad$ gender CHAR(1),
$\qquad$ PRIMARY KEY (student_id)
);
a) student टेबल की डिग्री क्या होगी?
i) 30
ii) 1
iii) 3
iv) 4
b) उपरोक्त कोड स्निपेट में ’name’ क्या दर्शाता है?
i) एक टेबल
ii) एक पंक्ति
iii) एक कॉलम
iv) एक डेटाबेस
c) निम्नलिखित SQL स्टेटमेंट के बारे में क्या सत्य है?
SelecT * fROM student;
i) ‘student’ टेबल की सामग्री प्रदर्शित करता है
ii) ‘student’ टेबल के कॉलम नाम और सामग्री प्रदर्शित करता है
iii) गलत केस इस्तेमाल होने के कारण त्रुटि देता है
iv) केवल ‘student’ टेबल के कॉलम नाम प्रदर्शित करता है
d) निम्नलिखित क्वेरी का आउटपुट क्या होगा?
INSERT INTO student
VALUES (“Suhana”, 109,’ F’),
VALUES (“Rivaan”,102,’ M’),
VALUES (“Atharv”,103,’ M’),
VALUES (“Rishika”,105,‘F’),
VALUES (“Garvit”,104,’ M’),
VALUES (“Shaurya”,109,’ M’);
i) त्रुटि
ii) कोई त्रुटि नहीं
iii) कंपाइलर पर निर्भर करता है
iv) क्वेरी का सफल समापन
e) निम्नलिखित क्वेरी में कितनी पंक्तियाँ हटाई जाएँगी?
DELETE student
WHERE student_id=109;
i) 1 पंक्ति
ii) वे सभी पंक्तियाँ जहाँ छात्र आईडी 109 के बराबर है
iii) कोई पंक्ति नहीं हटेगी
iv) 2 पंक्तियाँ
3. रिक्त स्थान भरें:
a) _______ यह घोषित करता है कि एक तालिका में इंडेक्स दूसरी तालिका में इंडेक्स से संबंधित है। $
i) प्राइमरी की
ii) फॉरेन की
iii) कंपोज़िट की
iv) सेकेंडरी की
b) सिलेक्ट क्वेरी में एस्टरिक (*) चिह्न ________ पुनः प्राप्त करता है
i) तालिका से सभी डेटा
ii) केवल प्राइमरी की का डेटा
iii) NULL डेटा
iv) उल्लेखित में से कोई नहीं
4. निम्नलिखित MOVIE डेटाबेस पर विचार करें और इस आधार पर SQL क्वेरीज़ के उत्तर दें।
| MovieID | MovieName | Category | ReleaseDate | ProductionCost | BusinessCost |
|---|---|---|---|---|---|
| 001 | Hindi_Movie | Musical | 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) फिल्मों की जानकारी उनके कॉलम नामों का उल्लेख किए बिना प्राप्त करें।
b) केवल MovieID, MovieName और BusinessCost दिखाते हुए फिल्मों द्वारा किया गया व्यवसाय सूचीबद्ध करें।
c) फिल्मों की विभिन्न श्रेणियों की सूची बनाएं।
d) प्रत्येक फिल्म का शुद्ध लाभ उसकी ID, नाम और शुद्ध लाभ दिखाते हुए ज्ञात करें।
$($ संकेत: शुद्ध लाभ $=$ व्यवसाय लागत - निर्माण लागत $)$ सुनिश्चित करें कि नए कॉलम का नाम NetProfit रखा गया है। क्या यह कॉलम अब MOVIE संबंध का हिस्सा है? यदि नहीं, तो ऐसे कॉलमों के लिए कौन-सा नाम गढ़ा जाता है? आप उस फिल्म के लाभ के बारे में क्या कह सकते हैं जो अभी तक रिलीज़ नहीं हुई है? क्या आपके क्वेरी परिणाम में लाभ शून्य के रूप में दिखाया गया है?
e) उन सभी फिल्मों की सूची बनाएं जिनकी निर्माण लागत 80,000 से अधिक और $1,25,000$ से कम है, जिसमें ID, नाम और निर्माण लागत दिखाई जाए।
f) उन सभी फिल्मों की सूची बनाएं जो कॉमेडी या एक्शन श्रेणी में आती हैं।
g) उन फिल्मों की सूची बनाएं जो अभी तक रिलीज़ नहीं हुई हैं।
5. मान लीजिए आपके स्कूल प्रबंधन ने कक्षा XI और कक्षा XII के छात्रों के बीच क्रिकेट मैच आयोजित करने का निर्णय लिया है। प्रत्येक कक्षा के छात्रों को चार टीमों में से किसी एक में शामिल होने के लिए कहा गया है - टीम टाइटन, टीम रॉकर्स, टीम मैग्नेट और टीम हरिकेन। गर्मियों की छुट्टियों के दौरान इन टीमों के बीच विभिन्न मैच आयोजित किए जाएंगे। अपने खेल शिक्षक की निम्नलिखित कार्यों में सहायता करें:
a) एक डेटाबेस “Sports” बनाएं।
b) निम्नलिखित विचारों के साथ एक तालिका “TEAM” बनाएं:
i) इसमें TeamID नामक एक कॉलम होना चाहिए जो 1 से 9 के बीच का पूर्णांक मान संग्रहीत करे, जो किसी टीम की अद्वितीय पहचान को दर्शाता है।
ii) प्रत्येक TeamID के साथ उसका संबद्ध नाम (TeamName) होना चाहिए, जो न्यूनतम 10 वर्णों की एक स्ट्रिंग हो।
c) टेबल-स्तरीय कंस्ट्रेन्ट का उपयोग कर TeamID को प्राइमरी कुंजी बनाएँ।
d) SQL कमांड का उपयोग कर TEAM टेबल की संरचना दिखाएँ।
e) छात्रों की प्राथमिकताओं के अनुसार नीचे दी गई चार टीमें बनाई गईं। इन चार पंक्तियों को TEAM टेबल में सम्मिलित करें:
पंक्ति 1: (1, Team Titan)
पंक्ति 2: (2, Team Rockers)
पंक्ति 3: (3, Team Magnet)
पंक्ति 4: (4, Team Hurricane)
f) TEAM टेबल की सामग्री दिखाएँ।
g) अब नीचे दी गई दूसरी टेबल बनाएँ। MATCH_DETAILS और दी गई टेबल के अनुसार डेटा सम्मिलित करें। प्रत्येक गुणधर्म के लिए उपयुक्त डोमेन और कंस्ट्रेन्ट चुनें।
Table: MATCH_DETAILS
| MatchID | MatchDate | FirstTeamID | SecondTeamID | FirstTeamScore | SecondTeamScore |
|---|---|---|---|---|---|
| M1 | 2018-07-17 | 1 | 2 | 90 | 86 |
| M2 | 2018-07-18 | 3 | 4 | 45 | 48 |
| M3 | 2018-07-19 | 1 | 3 | 78 | 56 |
| M4 | 2018-07-19 | 2 | 4 | 56 | 67 |
| M5 | 2018-07-20 | 1 | 4 | 32 | 87 |
| M6 | 2018-07-21 | 2 | 3 | 67 | 51 |
h) MATCH_DETAILS टेबल में विदेशी कुंजी (foreign key) कंस्ट्रेन्ट का उपयोग करें जिसका संदर्भ TEAM टेबल से हो, ताकि MATCH_DETAILS टेबल में केवल उन्हीं टीमों के स्कोर दर्ज हों जो TEAM टेबल में मौजूद हैं।
6. दो संबंधों (TEAM, MATCH_DETAILS) वाले स्पोर्ट्स डेटाबेस का उपयोग कर, निम्नलिखित संबंधीय बीजगणितीय क्वेरीज़ के उत्तर दें।
a) उन सभी मैचों का MatchID प्राप्त करें जहाँ दोनों टीमों ने 70 से अधिक रन बनाए हैं।
b) उन सभी मैचों का MatchID प्राप्त करें जहाँ FirstTeam ने 70 से कम रन बनाए हैं लेकिन SecondTeam ने 70 से अधिक रन बनाए हैं।
c) उन मैचों का MatchID और तारीख ज्ञात करें जो Team 1 द्वारा खेले गए और Team 1 ने जीते।
d) उन मैचों का MatchID ज्ञात करें जो Team 2 द्वारा खेले गए लेकिन Team 2 ने नहीं जीते।
e) TEAM संबंध में, संबंध का नाम T_DATA में बदलें। साथ ही, गुणधर्म TeamID और TeamName को क्रमशः T_ID और T_NAME में बदलें।
7. निम्नलिखित आदेशों के बीच अंतर बताएं:
a) ALTER और UPDATE
b) DELETE और DROP
8. STUDENT_PROJECT नामक एक डेटाबेस बनाएं जिसमें निम्नलिखित तालिकाएं हों। उपयुक्त डेटा प्रकार चुनें और आवश्यक बाधाएं लागू करें।
तालिका: STUDENT
| RollNo | Name | Stream | Section | RegistrationID |
|---|
- Stream कॉलम में मान या तो Science, Commerce, या Humanities हो सकते हैं।
- Section कॉलम में मान या तो I या II हो सकते हैं।
तालिका: PROJECT_ASSIGNED
तालिका: PROJECT
| ProjectID | ProjectName | SubmissionDate | TeamSize | GuideTeacher |
|---|
a) इन तालिकाओं में उपयुक्त डेटा भरें।
b) निम्नलिखित के लिए SQL क्वेरीज़ लिखें।
c) विज्ञान स्ट्रीम के छात्रों के नाम खोजें।
d) तीनों तालिकाओं की प्राइमरी कुंजियाँ क्या होंगी?
e) तीनों संबंधों की फॉरेन कुंजियाँ क्या हैं?
f) उन सभी छात्रों के नाम खोजें जो ‘Commerce stream’ कक्षा में पढ़ रहे हैं और एक ही शिक्षक द्वारा मार्गदर्शित हैं, भले ही उन्हें अलग-अलग प्रोजेक्ट सौंपे गए हों।
9. एक संगठन $A B C$ अपने कर्मचारियों और उनके आश्रितों के बारे में निम्नलिखित विवरण दर्ज करने के लिए एक डेटाबेस EMP-DEPENDENT रखता है।
Employee(AadhaarNo, Name, Address, Department, EmpID)
DEPENDENT (EmpID, DependentName, Relationship)
EMP-DEPENDENT डेटाबेस का उपयोग करके निम्नलिखित SQL क्वेरीज़ के उत्तर दें:
a) उन कर्मचारियों के नाम उनके आश्रितों के नामों के साथ खोजें।
b) किसी विभाग, मान लीजिए ‘PRODUCTION’ में कार्यरत कर्मचारी का विवरण खोजें।
c) उन कर्मचारियों के नाम खोजें जिनका कोई आश्रित नहीं है।
d) उन कर्मचारियों के नाम खोजें जो ‘SALES’ विभाग में कार्यरत हैं और जिनके ठीक दो आश्रित हैं।
10. एक दुकान जिसका नाम Wonderful Garments है और जो स्कूल यूनिफॉर्म बेचती है, वह नीचे दिए गए SCHOOL_UNIFORM डेटाबेस को बनाए रखती है। इसमें दो संबंध शामिल हैं — UNIFORM और PRICE। उन्होंने UNIFORM संबंध के लिए UniformCode को प्राइमरी कुंजी बनाया। आगे, उन्होंने PRICE संबंध के लिए UniformCode और Size को समग्र कुंजियाँ बनाईं। डेटाबेस स्कीमा और डेटाबेस स्थिति का विश्लेषण करके, निम्नलिखित विसंगतियों को दूर करने के लिए SQL क्वेरीज़ निर्दिष्ट करें।
क) PRICE संबंध में एक ऐट्रिब्यूट है जिसका नाम Price है। भ्रम से बचने के लिए, SQL क्वेरी लिखें ताकि संबंध PRICE का नाम बदलकर COST कर दिया जाए।
UNIFORM
| UCode | UName | UColor |
|---|---|---|
| 1 | Shirt | White |
| 2 | Pant | Grey |
| 3 | Skirt | Grey |
| 4 | Tie | Blue |
| 5 | Socks | Blue |
| 6 | Belt | Blue |
PRICE
| UCode | Size | Price |
|---|---|---|
| 1 | M | 500 |
| 1 | L | 580 |
| 1 | XL | 620 |
| 2 | M | 810 |
| 2 | L | 890 |
| 2 | XL | 940 |
| 3 | M | 770 |
| 3 | L | 830 |
| 3 | XL | 910 |
| 4 | S | 150 |
| 4 | L | 170 |
| 5 | S | 180 |
| 5 | L | 210 |
| 6 | M | 110 |
| 6 | L | 140 |
| 6 | XL | 160 |
ख) मेसर्स वन्डरफुल गारमेंट्स लाल रंग के, मीडियम साइज़ के ₹100 प्रति नैपकिन भी रखते हैं। यह रिकॉर्ड COST तालिका में डालें।
ग) जब आपने उपरोक्त क्वेरी का उपयोग कर डेटा डाला, तो आप UNIFORM संबंध में उसका विवरण दर्ज किए बिना हैंडकर्चीफ़ के मान डालने में सक्षम हुए। ऐसी व्यवस्था बनाएँ ताकि COST तालिका में डेटा तभी दर्ज किया जा सके जब वह पहले से UNIFORM तालिका में मौजूद हो।
घ) आगे, आप किसी आइटम को नया UCode तभी दे पाएँ जब उसका एक वैध UName हो। SCHOOL UNIFORM डेटाबेस में उपयुक्त कंस्ट्रेन्ट जोड़ने के लिए क्वेरी लिखें।
ङ) तालिका को ALTER करें ताकि यह कंस्ट्रेन्ट जोड़ी जा सके कि किसी आइटम की कीमत हमेशा शून्य से अधिक हो।