Chạy nhiều câu lệnh SELECT trong một khối lệnh MySQL
Sử dụng DELIMITER để thay đổi ký tự kết thúc câu lệnh (mặc định là ;), cho phép thực thi nhiều truy vấn trong một khối (batch), thường dùng trong stored procedure, trigger hoặc script SQL.
1. Tạo bảng 1 (DemoTable1) - Engine MyISAM
mysql> CREATE TABLE DemoTable1 (
Title TEXT
) ENGINE=MyISAM;
mysql> INSERT INTO DemoTable1 VALUES
('The database MySQL is less popular than MongoDB'),
('Java language uses MySQL database'),
('Node.js uses the MongoDB');
2. Tạo bảng 2 (DemoTable2)
mysql> CREATE TABLE DemoTable2 (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
mysql> INSERT INTO DemoTable2 VALUES (),(),(),(),(),(),(),(),();
3. Thực thi 2 SELECT cùng lúc với DELIMITER
mysql> DELIMITER // mysql> SELECT * FROM DemoTable1; SELECT * FROM DemoTable2; // mysql> DELIMITER ;
4. Kết quả: Hai tập kết quả riêng biệt
+-------------------------------------------------+ | Title | +-------------------------------------------------+ | The database MySQL is less popular than MongoDB | | Java language uses MySQL database | | Node.js uses the MongoDB | +-------------------------------------------------+ 3 rows in set (0.00 sec) +----+ | Id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | +----+ 9 rows in set (0.03 sec)
Giải thích:
DELIMITER //: Đổi dấu kết thúc từ;sang//- Các câu lệnh phân cách bằng
;bên trong khối //kết thúc khối, thực thi tất cảDELIMITER ;: Khôi phục mặc định
Lưu ý:
- Chỉ hoạt động trong client dòng lệnh (mysql client) hoặc script .sql
- Không dùng được trong ứng dụng (PHP, Java, Python...) - mỗi driver xử lý 1 câu lệnh
- Trong ứng dụng, chạy từng
SELECTriêng biệt hoặc dùng multi-query (mysqli::multi_query)
Cách hiện đại hơn (MySQL 8.0+): Sử dụng CTE hoặc stored procedure thay vì DELIMITER cho logic phức tạp.