MySQL में, VALUES
कथन तालिका के रूप में एक या अधिक पंक्तियों का एक सेट देता है। मूल रूप से, यह SQL मानक के अनुसार एक टेबल वैल्यू कंस्ट्रक्टर है, जो एक स्टैंडअलोन SQL स्टेटमेंट के रूप में भी कार्य करता है।
VALUES
स्टेटमेंट को MySQL 8.0.19 में पेश किया गया था।
सिंटैक्स
आधिकारिक वाक्य रचना इस प्रकार है:
VALUES row_constructor_list [ORDER BY column_designator] [LIMIT number]
row_constructor_list:
ROW(value_list)[, ROW(value_list)][, ...]
value_list:
value[, value][, ...]
column_designator:
column_index
उदाहरण
यह कैसे काम करता है यह दिखाने के लिए यहां एक सरल उदाहरण दिया गया है:
VALUES ROW(1, 2, 3), ROW(4, 5, 6);
परिणाम:
+----------+----------+----------+ | column_0 | column_1 | column_2 | +----------+----------+----------+ | 1 | 2 | 3 | | 4 | 5 | 6 | +----------+----------+----------+
परिणामी स्तंभों को परोक्ष रूप से column_0
. नाम दिया गया है , column_1
, column_2
, और इसी तरह, हमेशा 0
. से शुरू होता है ।
हम देख सकते हैं कि प्रत्येक ROW()
पंक्ति निर्माता खंड परिणामी तालिका में एक नई पंक्ति में परिणाम देता है।
प्रत्येक ROW()
कोष्ठकों में संलग्न एक या अधिक अदिश मानों की एक मान सूची होती है। एक मान किसी भी MySQL डेटा प्रकार या एक अदिश मान का समाधान करने वाले व्यंजक का शाब्दिक अर्थ हो सकता है।
इसलिए हम निम्न कार्य भी कर सकते हैं:
VALUES ROW("Black", "Cat"), ROW("Yellow", "Dog");
परिणाम:
+----------+----------+ | column_0 | column_1 | +----------+----------+ | Black | Cat | | Yellow | Dog | +----------+----------+
या इस तरह की चीजें:
VALUES
ROW(CURDATE(), DATE_ADD(CURDATE(), INTERVAL 10 YEAR)),
ROW(CURTIME(), DATE_ADD(CURTIME(), INTERVAL 2 HOUR));
परिणाम:
+---------------------+---------------------+ | column_0 | column_1 | +---------------------+---------------------+ | 2022-02-17 00:00:00 | 2032-02-17 00:00:00 | | 2022-02-17 09:30:46 | 2022-02-17 11:30:46 | +---------------------+---------------------+
ORDER BY
खंड
सिंटैक्स ORDER BY
. के उपयोग की अनुमति देता है परिणाम आदेश देने के लिए खंड। हालांकि, मैंने पाया है कि ORDER BY
क्लॉज उस सिस्टम पर अपेक्षित रूप से काम नहीं करता है जिसके खिलाफ मैंने इसे चलाने का प्रयास किया है।
यहां बताया गया है कि यह कैसे चाहिए काम (MySQL प्रलेखन के अनुसार):
VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY column_1;
परिणाम:
+----------+----------+----------+ | column_0 | column_1 | column_2 | +----------+----------+----------+ | 1 | -2 | 3 | | 4 | 6 | 8 | | 5 | 7 | 9 | +----------+----------+----------+
लेकिन जिन दो प्रणालियों पर मैंने उस कथन को चलाया था (Ubuntu 20.04.3 पर MySQL 8.0.26 और MacOS मोंटेरी पर MySQL 8.0.27 Homebrew), ORDER BY
खंड बिल्कुल काम नहीं करता है। शायद यह एक बग है।
LIMIT
खंड
हम LIMIT
. का उपयोग कर सकते हैं आउटपुट वाली पंक्तियों की संख्या को सीमित करने के लिए क्लॉज:
VALUES
ROW('Black', 'Cat'),
ROW('Yellow', 'Dog'),
ROW('Aqua', 'Fish')
LIMIT 2;
परिणाम:
+----------+----------+ | column_0 | column_1 | +----------+----------+ | Black | Cat | | Yellow | Dog | +----------+----------+
एक SELECT
के साथ कथन
हम VALUES
. का भी उपयोग कर सकते हैं SELECT
. के अंदर स्टेटमेंट कथन, मानो VALUES
टेबल कंस्ट्रक्टर एक वास्तविक टेबल थे:
SELECT
PetName,
PetType
FROM
(VALUES
ROW(1, "Fluffy", "Cat"),
ROW(2, "Bark", "Dog"),
ROW(3, "Gallop", "Horse")
) AS Pets(PetId, PetName, PetType)
WHERE PetId = 2;
परिणाम:
+---------+---------+ | PetName | PetType | +---------+---------+ | Bark | Dog | +---------+---------+
ROW()
खाली नहीं हो सकता
एक पंक्ति कंस्ट्रक्टर खाली नहीं हो सकता, जब तक कि इसे INSERT
. में स्रोत के रूप में उपयोग नहीं किया जा रहा हो बयान।
यदि हम एक खाली पंक्ति कंस्ट्रक्टर का उपयोग करने का प्रयास करते हैं तो यहां क्या होता है:
VALUES ROW();
परिणाम:
ERROR 3942 (HY000): Each row of a VALUES clause must have at least one column, unless when used as source in an INSERT statement.
ROW()
शून्य मान हो सकते हैं
हालांकि पंक्ति निर्माता खाली नहीं हो सकते हैं, लेकिन उनमें शून्य मान हो सकते हैं:
VALUES ROW(null, null);
परिणाम:
+----------+----------+ | column_0 | column_1 | +----------+----------+ | NULL | NULL | +----------+----------+
प्रत्येक ROW()
मानों की संख्या समान होनी चाहिए
प्रत्येक ROW()
उसी में VALUES
स्टेटमेंट की वैल्यू लिस्ट में मानों की संख्या समान होनी चाहिए।
इसलिए, हम ऐसा नहीं कर सकते:
VALUES ROW(1, 2), ROW(3);
परिणाम:
ERROR 1136 (21S01): Column count doesn't match value count at row 2
VALUES
का उपयोग करना डेटा डालने के लिए
हम VALUES
. का उपयोग कर सकते हैं INSERT
. के संयोजन में कथन और REPLACE
तालिका में डेटा सम्मिलित करने के लिए कथन।
उदाहरण:
INSERT INTO Pets VALUES
ROW(9, 3, 1, 'Woof', '2020-10-03'),
ROW(10, 4, 5, 'Ears', '2022-01-11');
इसने Pets
. नामक तालिका में दो पंक्तियाँ सम्मिलित कीं . यह मानता है कि तालिका पहले से मौजूद है।
अब हम SELECT
. का उपयोग कर सकते हैं तालिका में नए मान देखने के लिए कथन:
SELECT * FROM Pets
WHERE PetId IN (9, 10);
परिणाम:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 9 | 3 | 1 | Woof | 2020-10-03 | | 10 | 4 | 5 | Ears | 2022-01-11 | +-------+-----------+---------+---------+------------+
उपरोक्त INSERT
कथन निम्नलिखित करने के बराबर है:
INSERT INTO Pets VALUES
(9, 3, 1, 'Woof', '2020-10-03'),
(10, 4, 5, 'Ears', '2022-01-11');
टेबल बनाते समय
VALUES
स्टेटमेंट का इस्तेमाल CREATE TABLE … SELECT
. में सोर्स टेबल की जगह पर भी किया जा सकता है और CREATE VIEW … SELECT
बयान।
यहां एक उदाहरण दिया गया है:
CREATE TABLE t1 VALUES ROW(1,2,3), ROW(4,5,6);
SELECT * FROM t1;
परिणाम:
+----------+----------+----------+ | column_0 | column_1 | column_2 | +----------+----------+----------+ | 1 | 2 | 3 | | 4 | 5 | 6 | +----------+----------+----------+
हम यह भी कर सकते हैं:
CREATE TABLE t2 SELECT * FROM (VALUES ROW(1,2,3), ROW(4,5,6)) AS v;
SELECT * FROM t2;
परिणाम:
+----------+----------+----------+ | column_0 | column_1 | column_2 | +----------+----------+----------+ | 1 | 2 | 3 | | 4 | 5 | 6 | +----------+----------+----------+
वे दो CREATE TABLE
कथन ऐसा करने के समान हैं:
CREATE TABLE t3 SELECT * FROM t2;
SELECT * FROM t3;
परिणाम:
+----------+----------+----------+ | column_0 | column_1 | column_2 | +----------+----------+----------+ | 1 | 2 | 3 | | 4 | 5 | 6 | +----------+----------+----------+
इस मामले में, मैंने t2
. का इस्तेमाल किया स्रोत तालिका के रूप में तालिका, VALUES
. में मान प्रदान करने के बजाय बयान।