DDL और DML, और डेटा प्रकार
- DDL (Data Definition Language) ढाँचा तय करता है:
CREATE,ALTER,DROP। - DML (Data Manipulation Language) पंक्तियों पर काम करता है:
INSERT,UPDATE,DELETE, औरSELECT(प्रश्न पूछना अक्सर इसी में गिना जाता है)।
MySQL के आम डेटा प्रकार
CHAR(n): तय लंबाई का टेक्स्ट; हमेशा n अक्षर (PIN कोड के लिए ठीक)।VARCHAR(n): n तक बदलती लंबाई; जितना चाहिए उतना ही (नामों के लिए ठीक)।INT: पूर्ण संख्याएँ।FLOAT/DECIMAL(p,s): दशमलव वाली संख्याएँ।DATE: 'YYYY-MM-DD'।
SQL कीवर्ड केस-सेंसिटिव नहीं; हर स्टेटमेंट अर्धविराम (;) पर ख़त्म। टेक्स्ट और तारीख़ उद्धरण चिह्न में।
कंस्ट्रेंट (प्रतिबंध)
कंस्ट्रेंट स्तंभ पर लगा नियम है जो गलत डेटा रोकता है।
NOT NULL: स्तंभ में मान होना ही चाहिए।UNIQUE: दो पंक्तियों का मान एक नहीं हो सकता।PRIMARY KEY: अनोखा और NULL नहीं; हर पंक्ति पहचानता है।DEFAULT: मान न दिया जाए तो यह लगता है।FOREIGN KEY: मान संदर्भित तालिका की प्राइमरी की में होना चाहिए।
डेटाबेस और तालिकाओं के साथ काम
CREATE DATABASE school; SHOW DATABASES; USE school; CREATE TABLE student ( RollNo INT PRIMARY KEY, Name VARCHAR(20) NOT NULL, Class CHAR(3), City VARCHAR(15) DEFAULT 'Delhi', Marks INT ); SHOW TABLES; DESCRIBE student; -- या DESC student;
ALTER TABLE
ALTER TABLE student ADD Phone CHAR(10); -- स्तंभ जोड़ो ALTER TABLE student MODIFY Name VARCHAR(30); -- प्रकार/आकार बदलो ALTER TABLE student DROP Phone; -- स्तंभ हटाओ ALTER TABLE student ADD PRIMARY KEY (RollNo); -- की जोड़ो (न हो तो) ALTER TABLE student DROP PRIMARY KEY; -- की हटाओ
DROP
DROP TABLE student; तालिका और उसका सारा डेटा हटाता है। DROP DATABASE school; पूरा डेटाबेस हटाता है।
फ़ॉरेन की उदाहरण: CREATE TABLE marks (ExamID INT PRIMARY KEY, RollNo INT, Score INT, FOREIGN KEY (RollNo) REFERENCES student(RollNo));
INSERT, UPDATE, DELETE
INSERT INTO student VALUES (1, 'Asha', '12A', 'Delhi', 92); INSERT INTO student (RollNo, Name, Marks) VALUES (2, 'Ravi', 75); -- City को DEFAULT, Class NULL UPDATE student SET Marks = Marks + 5 WHERE Marks < 60; DELETE FROM student WHERE RollNo = 2;
WHERE के बिना UPDATE और DELETE हर पंक्ति पर लगते हैं। DELETE पंक्तियाँ हटाता है पर तालिका रखता है; DROP तालिका ही हटा देता है।
SELECT: ऑपरेटर, उपनाम, DISTINCT, WHERE, IN, BETWEEN, LIKE, IS NULL
SELECT * FROM student; SELECT Name, Marks FROM student; SELECT Name, Marks + 5 AS NewMarks FROM student; -- गणना + उपनाम SELECT DISTINCT City FROM student; -- दोहराव नहीं
- ऑपरेटर: अंकगणितीय
+ - * / %; संबंधपरक= < > <= >= <>(या!=); तार्किकAND, OR, NOT। - उपनाम (alias):
ASसे स्तंभ या तालिका का अस्थायी नाम:SELECT Name AS Student FROM student S; WHERE Marks BETWEEN 60 AND 80में दोनों सिरे शामिल।WHERE City IN ('Delhi', 'Pune')यानी City सूची का कोई भी मान;NOT INउल्टा।WHERE Name LIKE 'A%': A से शुरू।'%a': a पर ख़त्म।'%sh%': sh कहीं भी।'_a%': दूसरा अक्षर a।'____': ठीक 4 अक्षर।WHERE Class IS NULL/IS NOT NULL(कभी= NULLनहीं)।
ORDER BY
SELECT * FROM student ORDER BY Marks DESC; SELECT * FROM student ORDER BY City, Name; -- पहले City, फिर हर शहर में Name
ASC (बढ़ता क्रम) डिफ़ॉल्ट है; DESC बड़े से छोटे।
एग्रीगेट फ़ंक्शन
एग्रीगेट (समूह) फ़ंक्शन कई पंक्तियों पर चलकर एक मान लौटाते हैं।
COUNT(*): पंक्तियों की संख्या।COUNT(col): col के गैर-NULL मानों की संख्या।COUNT(DISTINCT col): अलग-अलग मानों की संख्या।SUM(col),AVG(col): संख्याओं का योग और औसत।MAX(col),MIN(col): सबसे बड़ा और छोटा (टेक्स्ट और तारीख़ पर भी)।
COUNT(*) को छोड़ सब NULL छोड़ देते हैं। Marks 92, 75, 58, NULL के साथ: COUNT(*) = 4, COUNT(Marks) = 3, SUM = 225, AVG = 75।
GROUP BY और HAVING
GROUP BY किसी स्तंभ के एक जैसे मान वाली पंक्तियों का एक समूह बनाता है, और एग्रीगेट हर समूह पर एक बार चलते हैं।
SELECT City, COUNT(*), AVG(Marks) FROM student GROUP BY City;
HAVING एग्रीगेट वाली शर्त से समूह छाँटता है:
SELECT City, COUNT(*) FROM student GROUP BY City HAVING COUNT(*) >= 2;
WHERE बनाम HAVING: WHERE समूह बनने से पहले पंक्तियाँ छाँटता है और एग्रीगेट नहीं ले सकता; HAVING समूह बनने के बाद समूह छाँटता है। क्रम: SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY। SELECT के बिना-एग्रीगेट स्तंभ GROUP BY में होने चाहिए।
जॉइन: कार्टेशियन प्रोडक्ट, इक्वी-जॉइन, नेचुरल जॉइन
तालिकाएँ: STUDENT(RollNo, Name) 3 पंक्तियाँ और MARKS(RollNo, Score) 2 पंक्तियाँ।
कार्टेशियन प्रोडक्ट
SELECT * FROM student, marks;
पहली की हर पंक्ति दूसरी की हर पंक्ति से जुड़ती है: 3 × 2 = 6 पंक्तियाँ। डिग्री = 2 + 2 = 4 स्तंभ। ज़्यादातर जोड़े बेमतलब।
इक्वी-जॉइन
SELECT * FROM student S, marks M WHERE S.RollNo = M.RollNo;
केवल वे जोड़े रखता है जिनमें साझा स्तंभ बराबर हो। RollNo दो बार आता है (S.RollNo और M.RollNo)। दोनों तालिकाओं में एक ही नाम का स्तंभ हो तो तालिका उपनाम (S, M) के साथ table.column लिखें। JOIN … ON से भी यही: SELECT * FROM student JOIN marks ON student.RollNo = marks.RollNo;
नेचुरल जॉइन
SELECT * FROM student NATURAL JOIN marks;
एक ही नाम वाले सब स्तंभों पर जोड़ता है और साझा स्तंभ केवल एक बार दिखाता है।
करके देखें: अपनी कक्षा SQL में
MySQL लगाइए या कोई ऑनलाइन SQL प्लेग्राउंड (जैसे ब्राउज़र में SQLite चलाने वाला) उपयोग कीजिए। 8 दोस्तों, उनके शहर और अंकों से STUDENT बनाइए। हर प्रश्न एक क्वेरी से: 80 से ऊपर वाले; 'S' से शुरू नाम; शहर-वार औसत अंक; 2 से ज़्यादा छात्रों वाले शहर; अंकों के घटते क्रम में सब छात्र। हर क्वेरी से पहले उत्तर का अनुमान लगाइए। फिर 3D के आख़िरी कदम से मिलाइए।
मुख्य सूत्र और परिभाषाएँ
- SELECT स्तंभ FROM तालिका WHERE पंक्ति-शर्त GROUP BY स्तंभ HAVING समूह-शर्त ORDER BY स्तंभ [DESC];
- LIKE: % = कितने भी अक्षर, _ = ठीक एक
- COUNT(*) पंक्तियाँ गिने; COUNT(col), SUM, AVG, MAX, MIN NULL छोड़ें
- कार्टेशियन: पंक्तियाँ गुणा, स्तंभ जोड़ · इक्वी-जॉइन: WHERE A.k = B.k · नेचुरल जॉइन: साझा स्तंभ एक बार
हल किए गए उदाहरण
1. तालिका ITEM बनाइए: ICode (4 अक्षर, प्राइमरी की), IName (25 अक्षर तक, NOT NULL), Price (दशमलव), Qty (पूर्णांक, डिफ़ॉल्ट 0)।
CREATE TABLE item (ICode CHAR(4) PRIMARY KEY, IName VARCHAR(25) NOT NULL, Price DECIMAL(8,2), Qty INT DEFAULT 0);
2. ITEM में स्तंभ Category VARCHAR(15) जोड़िए, फिर हर कीमत 10% बढ़ाइए।
ALTER TABLE item ADD Category VARCHAR(15); UPDATE item SET Price = Price * 1.10;
3. STUDENT: (1 Asha Delhi 92), (2 Ravi Pune 75), (3 Mohan NULL 58), (4 Zoya Delhi 81), (5 Kabir Jaipur 66)। SELECT Name FROM student WHERE Marks BETWEEN 60 AND 80 ORDER BY Marks DESC; का आउटपुट?
60–80 अंक वाले: Ravi 75, Kabir 66। घटते क्रम में: Ravi, Kabir।
4. वही तालिका। SELECT COUNT(*), COUNT(City), COUNT(DISTINCT City) FROM student; का आउटपुट?
COUNT(*) = 5 पंक्तियाँ। COUNT(City) = 4 (Mohan का NULL छूटा)। COUNT(DISTINCT City) = 3 (Delhi, Pune, Jaipur)।
5. वही तालिका। 'A' या 'Z' से शुरू नाम, और दूसरे अक्षर 'a' वाले नाम की क्वेरी लिखिए।
SELECT Name FROM student WHERE Name LIKE 'A%' OR Name LIKE 'Z%'; → Asha, Zoya SELECT Name FROM student WHERE Name LIKE '_a%'; → Ravi, Kabir
6. वही तालिका। SELECT City, AVG(Marks) FROM student WHERE City IS NOT NULL GROUP BY City HAVING COUNT(*) > 1; का आउटपुट?
WHERE ने Mohan हटाया। समूह: Delhi (92, 81), Pune (75), Jaipur (66)। HAVING COUNT(*) > 1 केवल Delhi रखता है। आउटपुट: Delhi 86.5।
7. STUDENT में 5 पंक्तियाँ, 5 स्तंभ; MARKS(RollNo, Subject, Score) में 4 पंक्तियाँ। SELECT * FROM student, marks; कितनी पंक्तियाँ और स्तंभ देगा?
कार्टेशियन: पंक्तियाँ 5 × 4 = 20; स्तंभ 5 + 3 = 8।
8. हर छात्र का Name, Subject और Score दिखाने वाला इक्वी-जॉइन और उसका नेचुरल जॉइन रूप लिखिए।
SELECT S.Name, M.Subject, M.Score FROM student S, marks M WHERE S.RollNo = M.RollNo; SELECT Name, Subject, Score FROM student NATURAL JOIN marks;
आम गलतियाँ
- WHERE City IS NULL की जगह WHERE City = NULL लिखना।
- WHERE में एग्रीगेट लिखना (WHERE COUNT(*) > 2); GROUP BY के बाद HAVING लें।
- UPDATE या DELETE में WHERE भूलकर हर पंक्ति बदल देना।
- जॉइन में RollNo जैसा दोनों तालिकाओं वाला स्तंभ बिना तालिका-नाम या उपनाम के लिखना।