सबक्वेरी के साथ MAX() का उपयोग
हाँ, LIMIT क्लॉज के बिना दूसरी सबसे बड़ी मान वाली पंक्ति चुनने के लिए सबक्वेरी में MAX() का उपयोग करें।
सिंटैक्स
SELECT MAX(yourColumn) FROM yourTableName WHERE yourColumn < (SELECT MAX(yourColumn) FROM yourTableName);
उदाहरण
1. टेबल बनाना
mysql> CREATE TABLE DemoTable (Number INT); Query OK, 0 rows affected (0.66 sec)
2. डेटा डालना
mysql> INSERT INTO DemoTable VALUES(78); mysql> INSERT INTO DemoTable VALUES(67); mysql> INSERT INTO DemoTable VALUES(92); mysql> INSERT INTO DemoTable VALUES(98); mysql> INSERT INTO DemoTable VALUES(88); mysql> INSERT INTO DemoTable VALUES(86); mysql> INSERT INTO DemoTable VALUES(89);
3. सभी रिकॉर्ड्स देखना
mysql> SELECT * FROM DemoTable;
+--------+ | Number | +--------+ | 78 | | 67 | | 92 | | 98 | | 88 | | 86 | | 89 | +--------+ 7 rows in set (0.00 sec)
4. दूसरी सबसे बड़ी संख्या (LIMIT के बिना)
mysql> SELECT MAX(Number) FROM DemoTable
WHERE Number < (SELECT MAX(Number) FROM DemoTable);
+-------------+ | MAX(Number) | +-------------+ | 92 | +-------------+ 1 row in set (0.00 sec)
तर्क समझाया गया
- आंतरिक क्वेरी:
SELECT MAX(Number) FROM DemoTable→ 98 (सबसे बड़ा) - बाहरी क्वेरी:
WHERE Number < 98→ 98 से छोटे सभी मान - बाहरी MAX(): उनमें से सबसे बड़ा → 92 (दूसरा सबसे बड़ा)
अन्य तरीके
DISTINCT के साथ (डुप्लिकेट मान होने पर)
SELECT MAX(DISTINCT Number) FROM DemoTable WHERE Number < (SELECT MAX(DISTINCT Number) FROM DemoTable);
पूरी पंक्ति प्राप्त करना (सभी कॉलम)
SELECT * FROM DemoTable
WHERE Number = (
SELECT MAX(Number) FROM DemoTable
WHERE Number < (SELECT MAX(Number) FROM DemoTable)
);
LIMIT के साथ (सरल, लेकिन LIMIT उपयोग करता है)
SELECT Number FROM DemoTable ORDER BY Number DESC LIMIT 1, 1;
यूज़र-डिफाइंड वेरिएबल (पुराने MySQL के लिए)
SET @row := 0;
SELECT Number FROM (
SELECT Number, @row := @row + 1 AS rn
FROM DemoTable ORDER BY Number DESC
) t WHERE rn = 2;
प्रदर्शन तुलना
| तरीका | पठनीयता | प्रदर्शन | डुप्लिकेट हैंडलिंग |
|---|---|---|---|
| सबक्वेरी MAX | अच्छी | अच्छी (इंडेक्स उपयोग कर सकता है) | डुप्लिकेट को एक मानता है |
| LIMIT 1,1 | सबसे सरल | अच्छी | डुप्लिकेट को अलग पंक्ति मानता है |
| ROW_NUMBER() (MySQL 8.0+) | अच्छी | अच्छी | नियंत्रण योग्य |
MySQL 8.0+ में विंडो फंक्शन
WITH Ranked AS (
SELECT Number, ROW_NUMBER() OVER (ORDER BY Number DESC) AS rn
FROM DemoTable
)
SELECT Number FROM Ranked WHERE rn = 2;