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 Email
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) उन कारों की कुल संख्या सूचीबद्ध करें जिन पर कोई डिस्काउंट नहीं है।