কম্পিউটার টিউটোরিয়াল

MySQL-এ সাবকোয়েরি থেকে SELECT করে DELETE করা

MySQL-এ একই টেবিল থেকে সাবকোয়েরি দিয়ে ডিলিট করতে ডেরাইভড টেবিল (derived table) ব্যবহার করতে হয়, কারণ MySQL একই টেবিলকে একসাথে রিড এবং রাইট করতে দেয় না।

টেবিল ও ডেটা তৈরি

mysql> CREATE TABLE DemoTable1947 (Id INT, Name VARCHAR(20));

mysql> INSERT INTO DemoTable1947 VALUES
    (101, 'Chris'), (102, 'David'), (103, 'Mike'), (104, 'Bob'), (105, 'Sam');

ডেটা যাচাই

mysql> SELECT * FROM DemoTable1947;
+------+-------+
| Id   | Name  |
+------+-------+
|  101 | Chris |
|  102 | David |
|  103 | Mike  |
|  104 | Bob   |
|  105 | Sam   |
+------+-------+

সাবকোয়েরি দিয়ে প্রথম ৩টি সারি ডিলিট

mysql> DELETE FROM DemoTable1947
    WHERE Id IN (
        SELECT * FROM (
            SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3
        ) AS t
    );

ব্যাখ্যা:

  • ইননার সাবকোয়ারী: SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3 — প্রথম ৩টি Id (101, 102, 103)।
  • SELECT * FROM (...) AS t — ডেরাইভড টেবিল (এলিয়াস t বাধ্যতামূলক)।
  • বাইরের DELETE ... WHERE Id IN (...) — সাবকোয়ারী ফলাফল ব্যবহার করে ডিলিট।

আউটপুট: Query OK, 3 rows affected (0.00 sec)

ডিলিটের পর

mysql> SELECT * FROM DemoTable1947;
+------+------+
| Id   | Name |
+------+------+
|  104 | Bob  |
|  105 | Sam  |
+------+------+

MySQL 8.0+ এ CTE ব্যবহার (আরও পঠনীয়)

WITH to_delete AS (
    SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3
)
DELETE FROM DemoTable1947 WHERE Id IN (SELECT Id FROM to_delete);

সতর্কতা

  • MySQL-এ DELETE FROM t WHERE id IN (SELECT id FROM t ...) সরাসরি দিলে ERROR 1093 (HY000): You can't specify target table 't' for update in FROM clause এরর আসে।
  • ডেরাইভড টেবিল বা CTE ব্যবহার করে এই সীমাবদ্ধতা বাইপাস করা হয়।
  1. MySQL সাবকোয়েরি FROM ক্লজে ব্যবহারের পদ্ধতি

  2. MySQL-এ শেষ ১০টি সারি কীভাবে বের করবেন?

  3. MySQL-এ WHERE ক্লজে AND ব্যবহার করে নির্দিষ্ট রেকর্ড ডিলিট করা

  4. MySQL-এ INSERT INTO SELECT এবং UNION দিয়ে একাধিক রো ইনসার্ট করা