Full basic guide of SQL

सम्पूर्ण SQL गाइड: हिंदी में

सम्पूर्ण SQL गाइड: हिंदी में

SQL (Structured Query Language) डेटाबेस को मैनेज करने और उसमें डेटा में हेरफेर करने के लिए एक मानक भाषा है। यह रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) जैसे MySQL, PostgreSQL, SQL Server, Oracle आदि के साथ इंटरैक्ट करने का प्राथमिक तरीका है। इस गाइड में, हम SQL के विभिन्न पहलुओं को उदाहरणों के साथ समझेंगे।

1. SQL क्या है और इसका उपयोग क्यों किया जाता है?

SQL का मतलब है Structured Query Language (संरचित क्वेरी भाषा)। यह एक डोमेन-विशिष्ट भाषा है जिसका उपयोग रिलेशनल डेटाबेस में संग्रहीत डेटा को प्रबंधित करने और उसमें हेरफेर करने के लिए किया जाता है।

उपयोग क्यों किया जाता है:

  • डेटाबेस से डेटा पुनः प्राप्त (Retrieve) करने के लिए।
  • डेटाबेस में नया डेटा डालने (Insert) के लिए।
  • डेटाबेस में मौजूदा डेटा को अद्यतन (Update) करने के लिए।
  • डेटाबेस से डेटा हटाने (Delete) के लिए।
  • नए डेटाबेस बनाने के लिए।
  • डेटाबेस में नई टेबल बनाने के लिए।
  • डेटाबेस में स्टोर्ड प्रोसीजर और फंक्शन बनाने के लिए।
  • टेबल, प्रोसीजर और व्यू पर अनुमतियां (Permissions) सेट करने के लिए।

2. SQL में डेटाबेस और टेबल क्या हैं और कैसे बनाएं?

डेटाबेस (Database): यह संबंधित डेटा का एक संगठित संग्रह है। इसे सूचनाओं को संग्रहीत, प्रबंधित और पुनः प्राप्त करना आसान बनाने के लिए डिज़ाइन किया गया है। सोचिए यह एक फाइलिंग कैबिनेट की तरह है।

टेबल (Table): एक टेबल डेटाबेस के भीतर डेटा रखने का मुख्य ढाँचा है। यह पंक्तियों (Rows) और कॉलम (Columns) से बनी होती है। प्रत्येक कॉलम एक विशिष्ट प्रकार की जानकारी (जैसे नाम, उम्र) रखता है, और प्रत्येक पंक्ति उस जानकारी का एक रिकॉर्ड (जैसे एक व्यक्ति का विवरण) दर्शाती है। यह कैबिनेट के अंदर एक फ़ोल्डर की तरह है।

डेटाबेस कैसे बनाएं:



CREATE DATABASE मेराडेटाबेस;

    

टेबल कैसे बनाएं:

पहले आपको उस डेटाबेस को चुनना होगा जिसमें आप टेबल बनाना चाहते हैं (यह कमांड सिस्टम के अनुसार थोड़ा भिन्न हो सकता है, MySQL में USE का उपयोग होता है):



USE मेराडेटाबेस;

CREATE TABLE कर्मचारी (

    कर्मचारी_आईडी INT PRIMARY KEY,

    नाम VARCHAR(100),

    विभाग VARCHAR(50),

    वेतन DECIMAL(10, 2),

    ज्वाइनिंग_तिथि DATE

);

    

यहां, CREATE TABLE कमांड का उपयोग कर्मचारी नामक टेबल बनाने के लिए किया गया है जिसमें विभिन्न कॉलम और उनके डेटा प्रकार परिभाषित हैं। PRIMARY KEY यह सुनिश्चित करता है कि प्रत्येक कर्मचारी की आईडी अद्वितीय हो।

3. SQL में डेटा टाइप क्या हैं और कैसे उपयोग करें?

डेटा टाइप (Data Type) यह निर्दिष्ट करता है कि एक कॉलम किस प्रकार का डेटा संग्रहीत कर सकता है। सही डेटा टाइप चुनना डेटा की अखंडता और स्टोरेज क्षमता के लिए महत्वपूर्ण है।

कुछ सामान्य SQL डेटा टाइप:

  • INT या INTEGER: पूर्ण संख्याएं (जैसे 10, -5, 0)।
  • DECIMAL(p, s) या NUMERIC(p, s): निश्चित परिशुद्धता वाली दशमलव संख्याएं (जैसे 123.45)। 'p' कुल अंक हैं और 's' दशमलव के बाद के अंक हैं।
  • FLOAT या REAL: अनुमानित-संख्या वाले फ्लोटिंग-पॉइंट नंबर।
  • VARCHAR(n): परिवर्तनीय लंबाई की टेक्स्ट स्ट्रिंग (अधिकतम 'n' कैरेक्टर)।
  • CHAR(n): निश्चित लंबाई की टेक्स्ट स्ट्रिंग ('n' कैरेक्टर)।
  • TEXT: बड़ी टेक्स्ट स्ट्रिंग्स।
  • DATE: तारीख (YYYY-MM-DD)।
  • TIME: समय (HH:MM:SS)।
  • DATETIME या TIMESTAMP: तारीख और समय दोनों।
  • BOOLEAN या BOOL: सत्य (True) या असत्य (False) मान।
  • BLOB: बाइनरी लार्ज ऑब्जेक्ट (जैसे छवियाँ, फाइलें)।

उपयोग: डेटा टाइप का उपयोग CREATE TABLE या ALTER TABLE स्टेटमेंट में कॉलम को परिभाषित करते समय किया जाता है।



CREATE TABLE उत्पाद (

    उत्पाद_आईडी INT PRIMARY KEY,

    उत्पाद_नाम VARCHAR(255) NOT NULL, -- नाम खाली नहीं हो सकता

    मूल्य DECIMAL(8, 2),

    स्टॉक_मात्रा INT DEFAULT 0, -- डिफ़ॉल्ट मान 0

    निर्माण_तिथि DATE

);

    

4. SQL में क्वेरी क्या है और कैसे लिखें?

क्वेरी (Query) डेटाबेस से जानकारी का अनुरोध करने का एक तरीका है। यह SQL का सबसे आम उपयोग है। क्वेरी आपको डेटा को फ़िल्टर करने, सॉर्ट करने और एकत्रित करने की अनुमति देती है।

क्वेरी मुख्य रूप से SELECT स्टेटमेंट का उपयोग करके लिखी जाती है। आपको यह बताना होता है कि कौन से कॉलम चाहिए (SELECT), किस टेबल से चाहिए (FROM), और किन शर्तों के आधार पर चाहिए (WHERE - वैकल्पिक)।

उदाहरण क्वेरी:

आईटी विभाग के सभी कर्मचारियों के नाम और वेतन प्राप्त करें:



SELECT नाम, वेतन

FROM कर्मचारी

WHERE विभाग = 'आईटी';

    

5. SQL में SELECT स्टेटमेंट कैसे उपयोग करें?

SELECT स्टेटमेंट का उपयोग डेटाबेस की एक या अधिक टेबल से डेटा पुनः प्राप्त करने के लिए किया जाता है।

सिंटेक्स:



SELECT कॉलम1, कॉलम2, ...

FROM टेबल_नाम;

    

सभी कॉलम चुनने के लिए * का उपयोग करें:



SELECT * FROM कर्मचारी;

    

विशिष्ट कॉलम चुनें:



SELECT कर्मचारी_आईडी, नाम FROM कर्मचारी;

    

आप कॉलम के लिए उपनाम (Alias) भी दे सकते हैं:



SELECT नाम AS कर्मचारी_का_नाम, वेतन AS मासिक_वेतन FROM कर्मचारी;

    

6. SQL में WHERE क्लॉज कैसे उपयोग करें?

WHERE क्लॉज का उपयोग रिकॉर्ड्स को फ़िल्टर करने के लिए किया जाता है। यह केवल उन पंक्तियों को निकालता है जो निर्दिष्ट शर्त को पूरा करती हैं।

सिंटेक्स:



SELECT कॉलम1, कॉलम2, ...

FROM टेबल_नाम

WHERE शर्त;

    

ऑपरेटर जिनका उपयोग WHERE क्लॉज में किया जा सकता है:

  • = (बराबर)
  • <> या != (बराबर नहीं)
  • > (से बड़ा)
  • < (से कम)
  • >= (से बड़ा या बराबर)
  • <= (से कम या बराबर)
  • BETWEEN (एक सीमा के बीच)
  • LIKE (पैटर्न मिलान)
  • IN (सूची में से किसी एक मान से मेल खाता है)
  • AND (सभी शर्तें सत्य होनी चाहिए)
  • OR (कोई भी एक शर्त सत्य होनी चाहिए)
  • NOT (शर्त का उल्टा)

उदाहरण:

उन कर्मचारियों का चयन करें जिनका वेतन 50000 से अधिक है और वे 'सेल्स' विभाग में हैं:



SELECT नाम, वेतन, विभाग

FROM कर्मचारी

WHERE वेतन > 50000 AND विभाग = 'सेल्स';

    

उन कर्मचारियों का चयन करें जिनका नाम 'अ' से शुरू होता है:



SELECT नाम

FROM कर्मचारी

WHERE नाम LIKE 'अ%';

    

7. SQL में GROUP BY और HAVING क्लॉज कैसे उपयोग करें?

GROUP BY क्लॉज का उपयोग समान मान वाले पंक्तियों को समूहीकृत करने के लिए किया जाता है। यह अक्सर एग्रीगेट फ़ंक्शंस (जैसे COUNT, MAX, MIN, SUM, AVG) के साथ प्रयोग किया जाता है ताकि प्रत्येक समूह पर गणना की जा सके।

HAVING क्लॉज का उपयोग GROUP BY द्वारा बनाए गए समूहों को फ़िल्टर करने के लिए किया जाता है। WHERE क्लॉज पंक्तियों को फ़िल्टर करता है *समूहीकरण से पहले*, जबकि HAVING क्लॉज समूहों को फ़िल्टर करता है *समूहीकरण के बाद*।

उदाहरण:

प्रत्येक विभाग में कर्मचारियों की संख्या ज्ञात करें:



SELECT विभाग, COUNT(कर्मचारी_आईडी) AS कर्मचारियों_की_संख्या

FROM कर्मचारी

GROUP BY विभाग;

    

केवल उन विभागों को दिखाएं जिनमें 5 से अधिक कर्मचारी हैं:



SELECT विभाग, COUNT(कर्मचारी_आईडी) AS कर्मचारियों_की_संख्या

FROM कर्मचारी

GROUP BY विभाग

HAVING COUNT(कर्मचारी_आईडी) > 5;

    

8. SQL में JOIN कैसे उपयोग करें?

JOIN क्लॉज का उपयोग दो या अधिक टेबलों से पंक्तियों को उनके बीच संबंधित कॉलम के आधार पर संयोजित करने के लिए किया जाता है।

JOIN के प्रकार:

  • INNER JOIN: केवल उन पंक्तियों को लौटाता है जिनका दोनों टेबलों में मेल खाता मान होता है।
  • LEFT JOIN (या LEFT OUTER JOIN): बाईं टेबल से सभी पंक्तियों और दाईं टेबल से मेल खाने वाली पंक्तियों को लौटाता है। यदि कोई मेल नहीं है, तो दाईं टेबल के कॉलम के लिए NULL लौटाता है।
  • RIGHT JOIN (या RIGHT OUTER JOIN): दाईं टेबल से सभी पंक्तियों और बाईं टेबल से मेल खाने वाली पंक्तियों को लौटाता है। यदि कोई मेल नहीं है, तो बाईं टेबल के कॉलम के लिए NULL लौटाता है।
  • FULL JOIN (या FULL OUTER JOIN): जब किसी एक टेबल में मेल होता है तो सभी पंक्तियों को लौटाता है।
  • CROSS JOIN: दोनों टेबलों की पंक्तियों का कार्टेशियन गुणनफल लौटाता है (प्रत्येक पंक्ति को दूसरी टेबल की प्रत्येक पंक्ति से जोड़ा जाता है)।

उदाहरण:

मान लीजिए हमारे पास एक और टेबल विभाग_डेटा है:



CREATE TABLE विभाग_डेटा (

    विभाग_नाम VARCHAR(50) PRIMARY KEY,

    स्थान VARCHAR(100)

);

INSERT INTO विभाग_डेटा (विभाग_नाम, स्थान) VALUES

('आईटी', 'बेंगलुरु'),

('सेल्स', 'मुंबई'),

('एचआर', 'दिल्ली');

    

कर्मचारियों और उनके विभाग के स्थान को प्राप्त करने के लिए INNER JOIN:



SELECT क.नाम, क.विभाग, वि.स्थान

FROM कर्मचारी क

INNER JOIN विभाग_डेटा वि ON क.विभाग = वि.विभाग_नाम;

    

सभी कर्मचारियों को दिखाएं, और यदि उनका विभाग विभाग_डेटा में मौजूद है, तो स्थान भी दिखाएं (LEFT JOIN):



SELECT क.नाम, क.विभाग, वि.स्थान

FROM कर्मचारी क

LEFT JOIN विभाग_डेटा वि ON क.विभाग = वि.विभाग_नाम;

    

9. SQL में INSERT स्टेटमेंट कैसे उपयोग करें?

INSERT INTO स्टेटमेंट का उपयोग टेबल में नई पंक्तियाँ (रिकॉर्ड) जोड़ने के लिए किया जाता है।

सिंटेक्स 1 (कॉलम नाम निर्दिष्ट करना):



INSERT INTO टेबल_नाम (कॉलम1, कॉलम2, कॉलम3, ...)

VALUES (मान1, मान2, मान3, ...);

    

सिंटेक्स 2 (सभी कॉलम के लिए मान देना, क्रम में):



INSERT INTO टेबल_नाम

VALUES (मान1, मान2, मान3, ...); -- टेबल में कॉलम के क्रम में मान दें

    

उदाहरण:

कर्मचारी टेबल में एक नया कर्मचारी जोड़ें:



INSERT INTO कर्मचारी (कर्मचारी_आईडी, नाम, विभाग, वेतन, ज्वाइनिंग_तिथि)

VALUES (101, 'राहुल कुमार', 'आईटी', 60000.00, '2024-05-15');

    

10. SQL में UPDATE स्टेटमेंट कैसे उपयोग करें?

UPDATE स्टेटमेंट का उपयोग टेबल में मौजूदा रिकॉर्ड को संशोधित करने के लिए किया जाता है।

सिंटेक्स:



UPDATE टेबल_नाम

SET कॉलम1 = मान1, कॉलम2 = मान2, ...

WHERE शर्त;

    

महत्वपूर्ण: यदि आप WHERE क्लॉज को छोड़ देते हैं, तो टेबल के *सभी* रिकॉर्ड अपडेट हो जाएंगे! हमेशा सावधानी बरतें।

उदाहरण:

कर्मचारी_आईडी 101 वाले कर्मचारी का वेतन अपडेट करें:



UPDATE कर्मचारी

SET वेतन = 65000.00

WHERE कर्मचारी_आईडी = 101;

    

सभी आईटी विभाग के कर्मचारियों का वेतन 10% बढ़ाएँ:



UPDATE कर्मचारी

SET वेतन = वेतन * 1.10

WHERE विभाग = 'आईटी';

    

11. SQL में DELETE स्टेटमेंट कैसे उपयोग करें?

DELETE स्टेटमेंट का उपयोग टेबल से मौजूदा रिकॉर्ड (पंक्तियों) को हटाने के लिए किया जाता है।

सिंटेक्स:



DELETE FROM टेबल_नाम

WHERE शर्त;

    

महत्वपूर्ण: यदि आप WHERE क्लॉज को छोड़ देते हैं, तो टेबल के *सभी* रिकॉर्ड हटा दिए जाएंगे!

उदाहरण:

कर्मचारी_आईडी 101 वाले कर्मचारी को हटाएं:



DELETE FROM कर्मचारी

WHERE कर्मचारी_आईडी = 101;

    

12. SQL में CREATE TABLE स्टेटमेंट कैसे उपयोग करें?

जैसा कि ऊपर (प्रश्न 2 में) बताया गया है, CREATE TABLE स्टेटमेंट का उपयोग डेटाबेस में एक नई टेबल बनाने के लिए किया जाता है। इसमें टेबल का नाम, कॉलम के नाम, प्रत्येक कॉलम का डेटा टाइप और वैकल्पिक रूप से कंस्ट्रेंट (जैसे PRIMARY KEY, NOT NULL, UNIQUE, FOREIGN KEY, DEFAULT) परिभाषित किए जाते हैं।

उदाहरण (कंस्ट्रेंट्स के साथ):



CREATE TABLE ऑर्डर (

    ऑर्डर_आईडी INT PRIMARY KEY AUTO_INCREMENT, -- ऑटो-इंक्रीमेंटिंग प्राइमरी की (MySQL सिंटेक्स)

    ग्राहक_आईडी INT,

    ऑर्डर_तिथि DATETIME DEFAULT CURRENT_TIMESTAMP, -- डिफ़ॉल्ट मान वर्तमान समय

    कुल_राशि DECIMAL(10, 2) NOT NULL, -- NULL नहीं हो सकता

    स्टेटस VARCHAR(20) DEFAULT 'Pending',

    FOREIGN KEY (ग्राहक_आईडी) REFERENCES ग्राहक(ग्राहक_आईडी) -- ग्राहक टेबल से लिंक

);

    

13. SQL में ALTER TABLE स्टेटमेंट कैसे उपयोग करें?

ALTER TABLE स्टेटमेंट का उपयोग मौजूदा टेबल की संरचना को संशोधित करने के लिए किया जाता है। इसका उपयोग कॉलम जोड़ने, हटाने, या संशोधित करने, या कंस्ट्रेंट जोड़ने या हटाने के लिए किया जा सकता है।

कॉलम जोड़ना:



ALTER TABLE कर्मचारी

ADD COLUMN ईमेल VARCHAR(100) UNIQUE; -- ईमेल कॉलम जोड़ें और उसे यूनिक बनाएं

    

कॉलम हटाना:



ALTER TABLE कर्मचारी

DROP COLUMN ज्वाइनिंग_तिथि;

    

कॉलम का डेटा टाइप बदलना:



ALTER TABLE कर्मचारी

MODIFY COLUMN वेतन DECIMAL(12, 2); -- वेतन कॉलम का साइज़ बदलें (सिंटेक्स भिन्न हो सकता है)

-- कुछ सिस्टम में: ALTER TABLE कर्मचारी ALTER COLUMN वेतन TYPE DECIMAL(12, 2);

    

कंस्ट्रेंट जोड़ना:



ALTER TABLE कर्मचारी

ADD CONSTRAINT chk_वेतन CHECK (वेतन > 0); -- वेतन 0 से अधिक होना चाहिए

    

14. SQL में DROP TABLE स्टेटमेंट कैसे उपयोग करें?

DROP TABLE स्टेटमेंट का उपयोग डेटाबेस से किसी मौजूदा टेबल को पूरी तरह से हटाने के लिए किया जाता है। यह टेबल की संरचना और उसमें मौजूद सभी डेटा को स्थायी रूप से हटा देता है।

सिंटेक्स:



DROP TABLE टेबल_नाम;

    

चेतावनी: इस कमांड का उपयोग बहुत सावधानी से करें, क्योंकि हटाया गया डेटा वापस नहीं लाया जा सकता (जब तक कि बैकअप न हो)।

उदाहरण:



DROP TABLE अस्थायी_डेटा; -- 'अस्थायी_डेटा' नामक टेबल को हटाएं

    

15. SQL में सबक्वेरी क्या है और कैसे उपयोग करें?

सबक्वेरी (Subquery), जिसे नेस्टेड क्वेरी या इनर क्वेरी भी कहा जाता है, एक SQL क्वेरी होती है जो दूसरी SQL क्वेरी के अंदर एम्बेड की जाती है। सबक्वेरी का परिणाम बाहरी क्वेरी द्वारा उपयोग किया जाता है।

सबक्वेरी का उपयोग SELECT, INSERT, UPDATE, या DELETE स्टेटमेंट में WHERE, SELECT, या FROM क्लॉज के भीतर किया जा सकता है।

उदाहरण (WHERE क्लॉज में):

उन कर्मचारियों को खोजें जिनका वेतन औसत वेतन से अधिक है:



SELECT नाम, वेतन

FROM कर्मचारी

WHERE वेतन > (SELECT AVG(वेतन) FROM कर्मचारी); -- सबक्वेरी औसत वेतन की गणना करती है

    

उदाहरण (FROM क्लॉज में):

प्रत्येक विभाग के औसत वेतन के आधार पर परिणाम प्राप्त करें:



SELECT विभाग_औसत.विभाग, विभाग_औसत.औसत_वेतन

FROM (SELECT विभाग, AVG(वेतन) AS औसत_वेतन

      FROM कर्मचारी

      GROUP BY विभाग) AS विभाग_औसत

WHERE विभाग_औसत.औसत_वेतन > 55000;

    

16. SQL में विंडो फंक्शन क्या हैं और कैसे उपयोग करें?

विंडो फ़ंक्शंस (Window Functions) एक प्रकार के फ़ंक्शन हैं जो पंक्तियों के एक सेट (एक "विंडो") पर गणना करते हैं जो वर्तमान पंक्ति से किसी तरह संबंधित होती हैं। एग्रीगेट फ़ंक्शंस के विपरीत (जो GROUP BY के साथ उपयोग किए जाने पर पंक्तियों को एक सिंगल आउटपुट पंक्ति में कोलैप्स कर देते हैं), विंडो फ़ंक्शंस प्रत्येक पंक्ति के लिए उसका मान बनाए रखते हैं।

विंडो फ़ंक्शंस OVER() क्लॉज का उपयोग करते हैं, जिसमें विभाजन (PARTITION BY) और क्रम (ORDER BY) निर्दिष्ट किया जा सकता है।

सामान्य विंडो फ़ंक्शंस: ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD(), SUM() OVER (...), AVG() OVER (...), आदि।

उदाहरण:

प्रत्येक विभाग के भीतर कर्मचारियों को उनके वेतन के अनुसार रैंक दें:



SELECT

    नाम,

    विभाग,

    वेतन,

    RANK() OVER (PARTITION BY विभाग ORDER BY वेतन DESC) AS विभाग_रैंक

FROM कर्मचारी;

    

प्रत्येक कर्मचारी के वेतन की तुलना उसी विभाग के औसत वेतन से करें:



SELECT

    नाम,

    विभाग,

    वेतन,

    AVG(वेतन) OVER (PARTITION BY विभाग) AS विभाग_का_औसत_वेतन

FROM कर्मचारी;

    

17. SQL में स्टोरेड प्रोसीजर और फंक्शन कैसे बनाएं?

स्टोर्ड प्रोसीजर (Stored Procedure) SQL स्टेटमेंट्स का एक तैयार सेट होता है जिसे डेटाबेस में संग्रहीत किया जाता है और नाम से कॉल किया जा सकता है। यह कोड को दोबारा उपयोग करने, प्रदर्शन में सुधार करने और सुरक्षा बढ़ाने में मदद करता है। स्टोर्ड प्रोसीजर पैरामीटर ले सकते हैं और मान लौटा भी सकते हैं (आउटपुट पैरामीटर के माध्यम से)।

फंक्शन (Function) भी SQL कोड का एक नामित ब्लॉक होता है, लेकिन यह हमेशा एक मान लौटाता है और आमतौर पर सीधे SQL एक्सप्रेशन में उपयोग किया जा सकता है।

स्टोर्ड प्रोसीजर बनाना (MySQL सिंटेक्स):



DELIMITER //

CREATE PROCEDURE Getकर्मचारीByविभाग (IN विभाग_नाम VARCHAR(50))

BEGIN

    SELECT * FROM कर्मचारी WHERE विभाग = विभाग_नाम;

END //

DELIMITER ;

-- प्रोसीजर कॉल करना:

CALL Getकर्मचारीByविभाग('आईटी');

    

फंक्शन बनाना (MySQL सिंटेक्स):



DELIMITER //

CREATE FUNCTION Getकुलकर्मचारी ()

RETURNS INT

DETERMINISTIC -- यदि फंक्शन समान इनपुट के लिए हमेशा समान आउटपुट देता है

BEGIN

    DECLARE कुल INT;

    SELECT COUNT(*) INTO कुल FROM कर्मचारी;

    RETURN कुल;

END //

DELIMITER ;

-- फंक्शन कॉल करना:

SELECT Getकुलकर्मचारी();

    

18. SQL में डेटाबेस डिज़ाइन के सिद्धांत क्या हैं?

एक अच्छा डेटाबेस डिज़ाइन डेटा की सटीकता, स्थिरता और कुशलता सुनिश्चित करता है। मुख्य सिद्धांतों में शामिल हैं:

  • डेटा रिडंडेंसी (Data Redundancy) को कम करना: एक ही जानकारी को कई जगहों पर स्टोर करने से बचें। नॉर्मलाइजेशन इसमें मदद करता है।
  • डेटा इंटीग्रिटी (Data Integrity) सुनिश्चित करना: सुनिश्चित करें कि डेटा सटीक और सुसंगत है। इसके लिए कंस्ट्रेंट्स (PRIMARY KEY, FOREIGN KEY, NOT NULL, CHECK, UNIQUE) का उपयोग करें।
  • डेटा स्वतंत्रता (Data Independence): एप्लिकेशन को डेटा स्टोरेज संरचना या स्थान में बदलाव से यथासंभव अप्रभावित रहना चाहिए।
  • कुशल डेटा एक्सेस (Efficient Data Access): डिज़ाइन ऐसा होना चाहिए कि सामान्य प्रश्नों और कार्यों को कुशलता से निष्पादित किया जा सके। इंडेक्स का उपयोग महत्वपूर्ण है।
  • स्केलेबिलिटी (Scalability): डिज़ाइन को भविष्य में डेटा और उपयोगकर्ताओं की बढ़ती मात्रा को संभालने में सक्षम होना चाहिए।
  • सुरक्षा (Security): अनधिकृत एक्सेस से डेटा की सुरक्षा के लिए डिज़ाइन में उपाय शामिल होने चाहिए।
  • स्पष्टता और सरलता (Clarity and Simplicity): टेबल और संबंधों को समझना और बनाए रखना आसान होना चाहिए।

19. SQL में नॉर्मलाइजेशन क्या है और कैसे करें?

नॉर्मलाइजेशन (Normalization) रिलेशनल डेटाबेस में डेटा रिडंडेंसी को कम करने और डेटा इंटीग्रिटी में सुधार करने के लिए टेबलों को व्यवस्थित करने की एक प्रक्रिया है। यह बड़ी टेबलों को छोटी, अधिक प्रबंधनीय टेबलों में विभाजित करके और उनके बीच संबंध स्थापित करके किया जाता है।

नॉर्मलाइजेशन के मुख्य रूप (Normal Forms):

  • पहला नॉर्मल फॉर्म (1NF):
    • प्रत्येक कॉलम में केवल एटॉमिक (अविभाज्य) मान होने चाहिए।
    • कोई रिपीटिंग ग्रुप नहीं होना चाहिए।
    • प्रत्येक पंक्ति अद्वितीय होनी चाहिए (आमतौर पर प्राइमरी की द्वारा)।
  • दूसरा नॉर्मल फॉर्म (2NF):
    • 1NF में होना चाहिए।
    • कोई पार्शियल डिपेंडेंसी नहीं होनी चाहिए (सभी नॉन-की एट्रिब्यूट पूरी प्राइमरी की पर निर्भर होने चाहिए, न कि उसके किसी हिस्से पर)। यह केवल कंपोजिट प्राइमरी की वाली टेबलों पर लागू होता है।
  • तीसरा नॉर्मल फॉर्म (3NF):
    • 2NF में होना चाहिए।
    • कोई ट्रांजिटिव डिपेंडेंसी नहीं होनी चाहिए (नॉन-की एट्रिब्यूट किसी अन्य नॉन-की एट्रिब्यूट पर निर्भर नहीं होने चाहिए)।
  • बॉयस-कॉड नॉर्मल फॉर्म (BCNF): 3NF का एक सख्त रूप।

कैसे करें: नॉर्मलाइजेशन नियमों का पालन करते हुए टेबलों को छोटी टेबलों में तोड़कर और उनके बीच FOREIGN KEY संबंध स्थापित करके किया जाता है।

उदाहरण (1NF से 3NF):

मान लीजिए शुरुआत में टेबल ऐसी है:



    प्रोजेक्ट_डेटा (प्रोजेक्ट_आईडी, कर्मचारी_आईडी, प्रोजेक्ट_नाम, कर्मचारी_नाम, विभाग, विभाग_स्थान)

    

यह 1NF में है (मान लें एटॉमिक मान हैं)। लेकिन इसमें पार्शियल (कर्मचारी_नाम केवल कर्मचारी_आईडी पर निर्भर है) और ट्रांजिटिव (विभाग_स्थान विभाग पर निर्भर है, जो कर्मचारी_आईडी पर निर्भर है) डिपेंडेंसी हैं।

नॉर्मलाइज्ड टेबल्स (3NF):



    कर्मचारी (कर्मचारी_आईडी, कर्मचारी_नाम, विभाग_आईडी*)

    विभाग (विभाग_आईडी, विभाग_नाम, विभाग_स्थान)

    प्रोजेक्ट (प्रोजेक्ट_आईडी, प्रोजेक्ट_नाम)

    प्रोजेक्ट_असाइनमेंट (प्रोजेक्ट_आईडी*, कर्मचारी_आईडी*)

    

(यहाँ * फॉरेन की दर्शाता है)

20. SQL में डीनॉर्मलाइजेशन क्या है और कैसे करें?

डीनॉर्मलाइजेशन (Denormalization) नॉर्मलाइजेशन के विपरीत प्रक्रिया है। इसमें प्रदर्शन को बेहतर बनाने के लिए जानबूझकर एक टेबल में रिडंडेंसी डाली जाती है। अक्सर, बहुत अधिक नॉर्मलाइज्ड डेटाबेस में जानकारी प्राप्त करने के लिए कई JOIN ऑपरेशन की आवश्यकता होती है, जो धीमा हो सकता है।

डीनॉर्मलाइजेशन में अक्सर उपयोग की जाने वाली जानकारी को उसी टेबल में कॉपी करना शामिल होता है ताकि JOIN की आवश्यकता कम हो जाए।

कब करें:

  • जब क्वेरी प्रदर्शन एक महत्वपूर्ण चिंता का विषय हो।
  • जब डेटा अक्सर पढ़ा जाता है लेकिन कम बार अपडेट किया जाता है।
  • जब अतिरिक्त स्टोरेज स्पेस और रिडंडेंसी के प्रबंधन की लागत स्वीकार्य हो।

कैसे करें:

  • टेबलों को संयोजित करना।
  • रिडंडेंट कॉलम जोड़ना (जैसे, ऑर्डर टेबल में ग्राहक का नाम शामिल करना, भले ही वह ग्राहक टेबल में हो)।
  • गणना किए गए मानों को संग्रहीत करना (जैसे, ऑर्डर आइटम टेबल में प्रत्येक पंक्ति के लिए कुल मूल्य संग्रहीत करना)।

सावधानी: डीनॉर्मलाइजेशन से डेटा असंगतता का खतरा बढ़ जाता है, क्योंकि एक ही जानकारी को कई स्थानों पर अपडेट करना पड़ सकता है।

21. SQL में क्वेरी ऑप्टिमाइजेशन कैसे करें?

क्वेरी ऑप्टिमाइजेशन (Query Optimization) SQL क्वेरी को अधिक कुशलता से चलाने की प्रक्रिया है ताकि वे कम संसाधनों (समय, सीपीयू, मेमोरी, I/O) का उपयोग करें और तेजी से परिणाम दें।

तकनीकें:

  • सही इंडेक्स का उपयोग करें: WHERE, JOIN, ORDER BY, और GROUP BY क्लॉज में उपयोग किए जाने वाले कॉलम पर इंडेक्स बनाएं।
  • केवल आवश्यक कॉलम चुनें: SELECT * का उपयोग करने से बचें, खासकर बड़ी टेबलों के लिए।
  • WHERE क्लॉज को प्रभावी बनाएं: फिल्टर को यथासंभव जल्दी लागू करें। सुनिश्चित करें कि WHERE क्लॉज में शर्तें सर्चेबल आर्गुमेंट्स (SARGable) हैं (यानी वे इंडेक्स का उपयोग कर सकती हैं)। उदाहरण के लिए, कॉलम पर फ़ंक्शन लगाने से बचें (WHERE YEAR(तिथि_कॉलम) = 2024 के बजाय WHERE तिथि_कॉलम >= '2024-01-01' AND तिथि_कॉलम < '2025-01-01' का उपयोग करें)।
  • JOIN को ऑप्टिमाइज़ करें: सुनिश्चित करें कि जॉइन किए गए कॉलम पर इंडेक्स हैं और उनका डेटा टाइप समान है। अनावश्यक जॉइन से बचें।
  • सबक्वेरी के बजाय JOIN का उपयोग करें (जहां उपयुक्त हो): अक्सर JOIN अधिक कुशल होते हैं।
  • EXISTS या NOT EXISTS का उपयोग करें: IN या NOT IN की तुलना में ये अक्सर सबक्वेरी के साथ बेहतर प्रदर्शन करते हैं, खासकर बड़ी सूचियों के लिए।
  • अस्थायी टेबलों का उपयोग करें: जटिल क्वेरी में मध्यवर्ती परिणामों को संग्रहीत करने के लिए।
  • क्वेरी प्लान का विश्लेषण करें (EXPLAIN): समझें कि डेटाबेस आपकी क्वेरी को कैसे निष्पादित कर रहा है और बाधाओं की पहचान करें।
  • डेटाबेस आँकड़े (Statistics) अपडेट रखें: ऑप्टिमाइज़र इन आँकड़ों का उपयोग सबसे अच्छा क्वेरी प्लान चुनने के लिए करता है।

22. SQL में इंडेक्स क्या हैं और कैसे उपयोग करें?

इंडेक्स (Index) एक डेटाबेस ऑब्जेक्ट है जो टेबल पर डेटा पुनर्प्राप्ति कार्यों की गति में सुधार करता है। यह एक किताब के पीछे इंडेक्स की तरह काम करता है - यह आपको डेटा को जल्दी से खोजने की अनुमति देता है बिना पूरी टेबल को स्कैन किए।

इंडेक्स एक या अधिक कॉलम पर बनाए जाते हैं। जब आप उस कॉलम पर फ़िल्टर (WHERE), सॉर्ट (ORDER BY), या जॉइन (JOIN) करते हैं, तो डेटाबेस इंडेक्स का उपयोग करके आवश्यक पंक्तियों को तेज़ी से ढूंढ सकता है।

इंडेक्स के प्रकार (उदाहरण):

  • B-Tree इंडेक्स: सबसे आम प्रकार, अधिकांश प्रकार के प्रश्नों के लिए अच्छा है।
  • हैश इंडेक्स: केवल इक्वेलिटी तुलना (=) के लिए बहुत तेज़, लेकिन रेंज क्वेरी (>, <) के लिए उपयुक्त नहीं।
  • फुल-टेक्स्ट इंडेक्स: टेक्स्ट डेटा के भीतर शब्दों या वाक्यांशों को खोजने के लिए।
  • यूनिक इंडेक्स: सुनिश्चित करता है कि इंडेक्स किए गए कॉलम में डुप्लिकेट मान न हों (PRIMARY KEY स्वचालित रूप से एक यूनिक इंडेक्स बनाता है)।
  • कंपोजिट इंडेक्स: एक से अधिक कॉलम पर बनाया गया इंडेक्स।

इंडेक्स कैसे बनाएं:



CREATE INDEX idx_कर्मचारी_विभाग ON कर्मचारी (विभाग);

    

कंपोजिट इंडेक्स कैसे बनाएं:



CREATE INDEX idx_कर्मचारी_विभाग_वेतन ON कर्मचारी (विभाग, वेतन);

    

इंडेक्स कैसे हटाएं:



DROP INDEX idx_कर्मचारी_विभाग ON कर्मचारी;

    

नुकसान: इंडेक्स स्टोरेज स्पेस लेते हैं और INSERT, UPDATE, DELETE ऑपरेशन को धीमा कर सकते हैं क्योंकि इंडेक्स को भी अपडेट करना पड़ता है। इसलिए, केवल आवश्यक कॉलम पर ही इंडेक्स बनाएं।

23. SQL में क्वेरी प्लान कैसे विश्लेषित करें?

क्वेरी प्लान (Query Plan), जिसे एक्ज़ीक्यूशन प्लान भी कहा जाता है, उन चरणों का क्रम है जो डेटाबेस मैनेजमेंट सिस्टम (DBMS) एक SQL क्वेरी को निष्पादित करने के लिए उपयोग करने की योजना बनाता है। क्वेरी प्लान का विश्लेषण करना क्वेरी ऑप्टिमाइजेशन का एक महत्वपूर्ण हिस्सा है, क्योंकि यह दिखाता है कि डेटाबेस डेटा तक कैसे पहुंच रहा है (जैसे, फुल टेबल स्कैन बनाम इंडेक्स सीक), टेबल को कैसे जॉइन किया जा रहा है, और कहाँ समय लग रहा है।

अधिकांश DBMS क्वेरी प्लान देखने के लिए एक कमांड प्रदान करते हैं, आमतौर पर EXPLAIN या EXPLAIN PLAN

उदाहरण (MySQL/PostgreSQL):



EXPLAIN SELECT क.नाम, वि.स्थान

FROM कर्मचारी क

JOIN विभाग_डेटा वि ON क.विभाग = वि.विभाग_नाम

WHERE क.वेतन > 60000;

    

विश्लेषण में क्या देखें:

  • एक्सेस विधि (Access Method): क्या यह Full Table Scan कर रहा है या Index Scan/Seek? फुल टेबल स्कैन अक्सर धीमे होते हैं।
  • जॉइन विधि (Join Method): कौन सी जॉइन एल्गोरिथ्म (जैसे Nested Loop, Hash Join, Merge Join) का उपयोग किया जा रहा है?
  • अनुमानित बनाम वास्तविक पंक्तियाँ (Estimated vs. Actual Rows): क्या ऑप्टिमाइज़र का अनुमान सटीक है? यदि नहीं, तो आँकड़े पुराने हो सकते हैं।
  • फ़िल्टरिंग (Filtering): शर्तें कब और कैसे लागू की जा रही हैं?
  • सॉर्टिंग और ग्रुपिंग (Sorting and Grouping): क्या महंगे सॉर्ट ऑपरेशन हो रहे हैं?

प्लान को समझकर, आप पहचान सकते हैं कि कहाँ इंडेक्स की आवश्यकता है, क्वेरी को कैसे फिर से लिखा जा सकता है, या क्या डेटाबेस आँकड़ों को अपडेट करने की आवश्यकता है।

24. SQL में सुरक्षा के लिए क्या उपाय हैं?

डेटाबेस सुरक्षा अत्यंत महत्वपूर्ण है। SQL और डेटाबेस वातावरण में सुरक्षा सुनिश्चित करने के लिए कई उपाय हैं:

  • प्रमाणीकरण (Authentication): सुनिश्चित करें कि केवल अधिकृत उपयोगकर्ता ही डेटाबेस तक पहुंच सकें। मजबूत पासवर्ड नीतियों का उपयोग करें।
  • प्राधिकरण (Authorization): उपयोगकर्ताओं को केवल वही करने की अनुमति दें जो उनके काम के लिए आवश्यक है। GRANT और REVOKE कमांड का उपयोग करके न्यूनतम विशेषाधिकार (Principle of Least Privilege) का सिद्धांत लागू करें। भूमिका-आधारित एक्सेस कंट्रोल (RBAC) का उपयोग करें।
  • एसक्यूएल इंजेक्शन (SQL Injection) से बचाव: यह सबसे आम हमलों में से एक है। इससे बचने के लिए पैरामीटराइज़्ड क्वेरीज़ (Prepared Statements) या स्टोर्ड प्रोसीजर का उपयोग करें। उपयोगकर्ता इनपुट को कभी भी सीधे SQL क्वेरी में न जोड़ें। इनपुट को हमेशा सैनिटाइज़ या वैलिडेट करें।
  • डेटा एन्क्रिप्शन (Data Encryption): संवेदनशील डेटा को स्टोर करते समय (Encryption at Rest) और नेटवर्क पर संचारित करते समय (Encryption in Transit - SSL/TLS) एन्क्रिप्ट करें।
  • ऑडिटिंग (Auditing): डेटाबेस गतिविधियों, विशेष रूप से संवेदनशील डेटा तक पहुँच या संशोधनों को लॉग करें। इससे संदिग्ध गतिविधि का पता लगाने और जांच करने में मदद मिलती है।
  • नियमित बैकअप (Regular Backups): डेटा हानि की स्थिति में रिकवरी के लिए नियमित रूप से डेटाबेस का बैकअप लें और बैकअप को सुरक्षित स्थान पर रखें।
  • सॉफ़्टवेयर अपडेट (Software Updates): DBMS और ऑपरेटिंग सिस्टम को नवीनतम सुरक्षा पैच के साथ अपडेट रखें।
  • नेटवर्क सुरक्षा (Network Security): फ़ायरवॉल का उपयोग करके डेटाबेस सर्वर तक नेटवर्क पहुँच को प्रतिबंधित करें।
  • डिफ़ॉल्ट सेटिंग्स बदलना: डिफ़ॉल्ट उपयोगकर्ता नाम, पासवर्ड और पोर्ट नंबर बदलें।

25. SQL में एसक्यूएल इंजेक्शन क्या है और कैसे रोकें?

एसक्यूएल इंजेक्शन (SQL Injection) एक सुरक्षा भेद्यता है जिसमें हमलावर एप्लिकेशन के माध्यम से डेटाबेस में दुर्भावनापूर्ण SQL कोड इंजेक्ट करता है। यह तब होता है जब एप्लिकेशन उपयोगकर्ता द्वारा प्रदान किए गए इनपुट को बिना उचित रूप से सैनिटाइज़ या एस्केप किए सीधे SQL क्वेरी में शामिल कर देता है।

खतरे:

  • डेटा चोरी (संवेदनशील जानकारी निकालना)।
  • डेटा संशोधन या विलोपन।
  • प्रशासकीय कार्यों तक पहुंच।
  • डेटाबेस सर्वर पर नियंत्रण।

उदाहरण (भेद्य कोड):

मान लीजिए एप्लिकेशन उपयोगकर्ता नाम और पासवर्ड के आधार पर उपयोगकर्ता को लॉग इन करता है:



-- (यह कोड केवल उदाहरण के लिए है, इसे वास्तविक एप्लिकेशन में उपयोग न करें)

String userName = request.getParameter("username");

String password = request.getParameter("password");

String query = "SELECT * FROM users WHERE username = '" + userName + "' AND password = '" + password + "'";

// इस क्वेरी को निष्पादित करें...

    

यदि कोई हमलावर उपयोगकर्ता नाम के रूप में ' OR '1'='1 डालता है, तो क्वेरी बन जाएगी:



SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'कुछ भी';

    

चूंकि '1'='1' हमेशा सत्य होता है, WHERE क्लॉज सत्य हो जाएगा और हमलावर बिना सही पासवर्ड के लॉग इन कर सकता है (या डेटा निकाल सकता है, अगर क्वेरी अलग है)।

कैसे रोकें:

  • पैरामीटराइज़्ड क्वेरीज़ (Prepared Statements) का उपयोग करें: यह सबसे प्रभावी तरीका है। इसमें SQL कोड और डेटा को अलग रखा जाता है। डेटाबेस ड्राइवर सुनिश्चित करता है कि इनपुट को डेटा के रूप में माना जाए, न कि निष्पादन योग्य कोड के रूप में।
    
    
    // Java उदाहरण (JDBC)
    
    String query = "SELECT * FROM users WHERE username = ? AND password = ?";
    
    PreparedStatement pstmt = connection.prepareStatement(query);
    
    pstmt.setString(1, userName);
    
    pstmt.setString(2, password);
    
    ResultSet rs = pstmt.executeQuery();
    
                
  • स्टोर्ड प्रोसीजर का उपयोग करें: ये भी पैरामीटराइज़ेशन प्रदान करते हैं और इंजेक्शन को रोकते हैं यदि सही ढंग से उपयोग किए जाएं।
  • इनपुट एस्केपिंग (Input Escaping): यदि पैरामीटराइज़ेशन संभव नहीं है, तो उपयोगकर्ता इनपुट में विशेष SQL वर्णों (जैसे ', ", \) को एस्केप करें। हालांकि, यह कम सुरक्षित है और इसे सही ढंग से करना मुश्किल हो सकता है।
  • इनपुट वैलिडेशन (Input Validation): स्वीकार्य इनपुट के लिए सख्त नियम लागू करें (जैसे, उपयोगकर्ता नाम में केवल अक्षर और अंक हों)। यह अकेले पर्याप्त नहीं है, लेकिन एक अतिरिक्त सुरक्षा परत प्रदान करता है।
  • न्यूनतम विशेषाधिकार (Least Privilege): एप्लिकेशन जिस डेटाबेस उपयोगकर्ता खाते का उपयोग करता है, उसे केवल आवश्यक न्यूनतम अनुमतियां दें।

26. SQL में उपयोगकर्ता अनुमतियां कैसे मैनेज करें?

SQL में उपयोगकर्ता अनुमतियों (User Permissions) को प्रबंधित करने के लिए GRANT और REVOKE कमांड का उपयोग किया जाता है। यह सुनिश्चित करता है कि उपयोगकर्ता केवल उन डेटाबेस ऑब्जेक्ट्स (टेबल, व्यू, प्रोसीजर आदि) और क्रियाओं (SELECT, INSERT, UPDATE, DELETE आदि) तक ही पहुँच सकें जिनके लिए वे अधिकृत हैं।

उपयोगकर्ता बनाना (उदाहरण MySQL):



CREATE USER 'नया_उपयोगकर्ता'@'localhost' IDENTIFIED BY 'एक_मजबूत_पासवर्ड';

    

अनुमतियां देना (GRANT):

किसी उपयोगकर्ता को विशिष्ट टेबल पर SELECT और INSERT की अनुमति देना:



GRANT SELECT, INSERT ON मेराडेटाबेस.कर्मचारी TO 'नया_उपयोगकर्ता'@'localhost';

    

किसी उपयोगकर्ता को डेटाबेस की सभी टेबलों पर सभी अनुमतियां देना (सावधानी से उपयोग करें):



GRANT ALL PRIVILEGES ON मेराडेटाबेस.* TO 'एडमिन_उपयोगकर्ता'@'localhost';

    

किसी उपयोगकर्ता को स्टोर्ड प्रोसीजर निष्पादित करने की अनुमति देना:



GRANT EXECUTE ON PROCEDURE मेराडेटाबेस.Getकर्मचारीByविभाग TO 'नया_उपयोगकर्ता'@'localhost';

    

अनुमतियां वापस लेना (REVOKE):

किसी उपयोगकर्ता से INSERT अनुमति वापस लेना:



REVOKE INSERT ON मेराडेटाबेस.कर्मचारी FROM 'नया_उपयोगकर्ता'@'localhost';

    

किसी उपयोगकर्ता से सभी अनुमतियां वापस लेना:



REVOKE ALL PRIVILEGES ON मेराडेटाबेस.* FROM 'एडमिन_उपयोगकर्ता'@'localhost';

    

भूमिकाएं (Roles): अधिकांश आधुनिक DBMS भूमिकाओं का समर्थन करते हैं। आप अनुमतियों का एक सेट एक भूमिका को सौंप सकते हैं, और फिर उस भूमिका को उपयोगकर्ताओं को सौंप सकते हैं। इससे अनुमति प्रबंधन आसान हो जाता है, खासकर बड़ी संख्या में उपयोगकर्ताओं के लिए।



-- भूमिका बनाना (उदाहरण PostgreSQL/SQL Server)

CREATE ROLE रीड_ओनली;

-- भूमिका को अनुमति देना

GRANT SELECT ON ALL TABLES IN SCHEMA public TO रीड_ओनली;

-- भूमिका उपयोगकर्ता को सौंपना

GRANT रीड_ओनली TO 'नया_उपयोगकर्ता';

    

अतिरिक्त महत्वपूर्ण SQL विषय

27. व्यूज (Views) क्या हैं और कैसे उपयोग करें?

व्यू (View) एक वर्चुअल टेबल होती है जो एक संग्रहीत SQL क्वेरी के परिणाम सेट पर आधारित होती है। व्यू में अपना डेटा संग्रहीत नहीं होता है; यह अंतर्निहित टेबलों से डेटा को डायनामिक रूप से प्राप्त करता है जब व्यू को क्वेरी किया जाता है।

उपयोग:

  • जटिलता को सरल बनाना: जटिल क्वेरी (जैसे कई जॉइन वाली) को एक सरल व्यू के पीछे छिपा सकते हैं।
  • सुरक्षा: उपयोगकर्ताओं को पूरी टेबल के बजाय केवल विशिष्ट कॉलम या पंक्तियों तक पहुंच प्रदान कर सकते हैं।
  • डेटा स्वतंत्रता: यदि अंतर्निहित टेबल की संरचना बदलती है, तो व्यू को संशोधित किया जा सकता है ताकि बाहरी एप्लिकेशन प्रभावित न हों (कुछ हद तक)।
  • पठनीयता: अक्सर उपयोग की जाने वाली क्वेरी को एक नाम दे सकते हैं।

व्यू बनाना:



CREATE VIEW आईटी_कर्मचारी_व्यू AS

SELECT कर्मचारी_आईडी, नाम, वेतन

FROM कर्मचारी

WHERE विभाग = 'आईटी';

    

व्यू का उपयोग करना:

व्यू को एक नियमित टेबल की तरह क्वेरी किया जा सकता है:



SELECT नाम FROM आईटी_कर्मचारी_व्यू WHERE वेतन > 60000;

    

व्यू हटाना:



DROP VIEW आईटी_कर्मचारी_व्यू;

    

28. ट्रांजैक्शन (Transactions) क्या हैं?

ट्रांजैक्शन (Transaction) एक या एक से अधिक SQL स्टेटमेंट्स का एक तार्किक कार्य इकाई (Logical Unit of Work) है जिसे पूर्ण रूप से या बिल्कुल नहीं निष्पादित किया जाता है। यदि ट्रांजैक्शन के भीतर कोई भी स्टेटमेंट विफल होता है, तो उस ट्रांजैक्शन के सभी परिवर्तनों को रोल बैक (अंडू) कर दिया जाता है, जिससे डेटाबेस अपनी मूल स्थिति में वापस आ जाता है। यदि सभी स्टेटमेंट सफल होते हैं, तो परिवर्तन स्थायी रूप से सहेजे जाते हैं (COMMIT)।

ट्रांजैक्शन ACID गुणों का पालन करते हैं:

  • Atomicity (परमाणुता): सभी ऑपरेशन एक इकाई के रूप में होते हैं - या तो सभी सफल होते हैं, या कोई भी नहीं।
  • Consistency (संगति): ट्रांजैक्शन डेटाबेस को एक वैध स्थिति से दूसरी वैध स्थिति में लाता है।
  • Isolation (अलगाव): समवर्ती ट्रांजैक्शन एक-दूसरे के काम में हस्तक्षेप नहीं करते हैं। प्रत्येक ट्रांजैक्शन ऐसे चलता है जैसे वह सिस्टम में अकेला चल रहा हो।
  • Durability (स्थायित्व): एक बार ट्रांजैक्शन कमिट हो जाने के बाद, उसके परिवर्तन स्थायी होते हैं, भले ही सिस्टम फेल हो जाए।

ट्रांजैक्शन कंट्रोल कमांड्स:

  • START TRANSACTION (या BEGIN TRANSACTION): एक नया ट्रांजैक्शन शुरू करता है।
  • COMMIT: ट्रांजैक्शन में किए गए सभी परिवर्तनों को स्थायी रूप से सहेजता है।
  • ROLLBACK: ट्रांजैक्शन शुरू होने के बाद से किए गए सभी परिवर्तनों को अंडू करता है।
  • SAVEPOINT: ट्रांजैक्शन के भीतर एक बिंदु सेट करता है जिस पर आप बाद में रोल बैक कर सकते हैं।

उदाहरण:

बैंक खाते A से खाते B में पैसे ट्रांसफर करना:



START TRANSACTION;

-- खाते A से 1000 घटाएं

UPDATE खाते

SET बैलेंस = बैलेंस - 1000

WHERE खाता_नंबर = 'A123';

-- खाते B में 1000 जोड़ें

UPDATE खाते

SET बैलेंस = बैलेंस + 1000

WHERE खाता_नंबर = 'B456';

-- जांचें कि क्या कोई समस्या हुई (उदाहरण के लिए, क्या बैलेंस निगेटिव हो गया)

-- यदि सब ठीक है, तो कमिट करें

COMMIT;

-- यदि कोई समस्या हुई (उदाहरण के लिए, एरर हैंडलिंग ब्लॉक में)

-- ROLLBACK;

    

29. ट्रिगर्स (Triggers) क्या हैं और कैसे उपयोग करें?

ट्रिगर (Trigger) एक विशेष प्रकार का स्टोर्ड प्रोसीजर होता है जो किसी टेबल पर एक विशिष्ट घटना (Event) होने पर स्वचालित रूप से निष्पादित होता है। ये घटनाएं आमतौर पर डेटा मैनिपुलेशन लैंग्वेज (DML) स्टेटमेंट होती हैं: INSERT, UPDATE, या DELETE

ट्रिगर का उपयोग अक्सर डेटा अखंडता बनाए रखने, ऑडिट लॉग बनाने, या जटिल व्यावसायिक नियमों को लागू करने के लिए किया जाता है।

ट्रिगर को घटना से पहले (BEFORE) या बाद (AFTER) चलने के लिए सेट किया जा सकता है।

उदाहरण (MySQL सिंटेक्स):

एक ऑडिट लॉग टेबल बनाएं:



CREATE TABLE कर्मचारी_ऑडिट (

    ऑडिट_आईडी INT AUTO_INCREMENT PRIMARY KEY,

    कर्मचारी_आईडी INT,

    परिवर्तित_कॉलम VARCHAR(50),

    पुराना_मान VARCHAR(255),

    नया_मान VARCHAR(255),

    परिवर्तन_समय TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);

    

एक ट्रिगर बनाएं जो कर्मचारी का वेतन अपडेट होने के बाद ऑडिट लॉग में एंट्री करे:



DELIMITER //

CREATE TRIGGER कर्मचारी_वेतन_अपडेट_ऑडिट

AFTER UPDATE ON कर्मचारी

FOR EACH ROW

BEGIN

    -- केवल तभी लॉग करें जब वेतन बदला हो

    IF OLD.वेतन <> NEW.वेतन THEN

        INSERT INTO कर्मचारी_ऑडिट (कर्मचारी_आईडी, परिवर्तित_कॉलम, पुराना_मान, नया_मान)

        VALUES (OLD.कर्मचारी_आईडी, 'वेतन', OLD.वेतन, NEW.वेतन);

    END IF;

END //

DELIMITER ;

    

अब, जब भी कर्मचारी टेबल में किसी पंक्ति का वेतन UPDATE होगा, तो यह ट्रिगर स्वचालित रूप से चलेगा और कर्मचारी_ऑडिट टेबल में एक रिकॉर्ड डाल देगा।

सावधानी: ट्रिगर जटिलता बढ़ा सकते हैं और डिबग करना मुश्किल हो सकता है। उनका उपयोग सावधानी से किया जाना चाहिए।


यह SQL गाइड आपको SQL की मूल और उन्नत अवधारणाओं को समझने में मदद करेगी। अभ्यास करते रहें!

टिप्पणियाँ

इस ब्लॉग से लोकप्रिय पोस्ट

JavaScript basic to advance guide

Tool Room Lath Machine: A Complete Guide

html Post Creator introduction