Lệnh Create View trong MySQL
Trong bài viết này chúng ta sử dụng lệnh Create View trong MySQL để tạo mới một View trong Database, hoặc thay thế nội dung của view có sẵn.
Về cơ bản lệnh này sẽ phải kết hợp với câu lệnh Select để lấy kết quả từ nhiều table đổ vào trong View. Mỗi khi có thay đổi ở các bảng đó thì data trong View cũng sẽ thay đổi theo.
1. Giới thiệu lệnh Create View trong MySQL
Lệnh Create View sẽ tạo ra một View mới trong Database, sau đây là cú pháp:
CREATE [OR REPLACE] VIEW [db_name.]view_name [(column_list)] AS select-statement;
Ý nghĩa của các từ khóa như sau:
Bài viết này được đăng tại [free tuts .net]
Từ khóa Create View cho thấy bạn đang muốn tạo một View mới có tên là view_name, năm trong database db_name.
Nếu bạn dùng thêm từ khóa Or Replace thay thì nó sẽ thay thế View có tên là view_name bằng nội dung SQL mới. Nếu view_name chưa tồn tại thì nó sẽ tạo view mới.
Column_list là danh sách các cột sẽ được đặt tên lại. Nếu bạn không truyền vào thì nó sẽ lấy tên cột mặc định của các table.
Select-statement chính là câu lệnh Select trả về danh sách dữ liệu sẽ được lưu vào trong View. Bạn có thể sử dụng kết hợp các lệnh Join, Order By, Limit, ... miễn là nó trả về kết quả là danh sách dữ liệu.
Theo mặc định thì lệnh Create View sẽ tạo mới một view nằm trong DB hiện tại đang kết nối. Nhưng nếu bạn muốn chỉ định rõ DB nào thì sẽ đặt nó ở vị trí của db_name.
2. Cách sử dụng lệnh Create View trong MySQL
Hãy làm một vài ví dụ để hiểu rõ hơn lệnh này.
Ví dụ 1: Tạo một view đơn giản
Hãy xem cấu trúc của table orderdetails như trong hình dưới đây.
Bây giờ mình sẽ viết một View lưu trữ doanh thu của mỗi đơn hàng, bằng cách sử dụng lệnh Select kết hợp Group By.
CREATE VIEW salePerOrder AS SELECT orderNumber, SUM(quantityOrdered * priceEach) total FROM orderDetails GROUP by orderNumber ORDER BY total DESC;
Để kiểm tra View đã xuất hiện chưa thì hãy sử dụng lệnh sau:
SHOW TABLES;
Lệnh này sẽ hiển thị danh sách tất cả các table đang có trong DB hiện tai. Vì View cũng là table nên cũng sẽ xuất hiện trong đó.
Ngoài ra, để xem chi tiết đâu là table và đâu là view thì bạn sử dụng lệnh sau:
SHOW FULL TABLES;
Kết quả lệnh này như sau:
Bây giờ nếu bạn muốn xem tổng doanh thu của mỗi đơn hàng thì chỉ cần truy vấn trong View SalePerOrder mà đã tạo ở trên.
SELECT * FROM salePerOrder;
Kết quả dạng như sau:
Ví dụ 2: Tạo mới một View từ một View khác
Nghe có vẻ kì lạ phải không? Thực tế bạn có thể tạo mới một view với dữ liệu được lấy từ một View khác.
Giả sử mình muốn lấy danh sách những đơn hàng có giá trị hơn 6000, lúc này chỉ cần lấy trong view salesPerOrder mà ta đã tạo ở trên là được.
CREATE VIEW bigSalesOrder AS SELECT orderNumber, ROUND(total,2) as total FROM salePerOrder WHERE total > 60000;
Bây giờ dữ liệu trong view bigSalesOrder chính là những đơn hàng có doanh thu hơn 6000. Hãy thử chạy một câu truy vấn xem sao.
SELECT orderNumber, total FROM bigSalesOrder;
Ví dụ 3: Tạo View với lệnh Join
Hãy xem ví dụ dưới đây, mình tạo ra một view có tên là customerOrders để lưu trữ thông tin khách hàng và tổng số tiền mà khách hàng đã mua. Mình đã JOIN 3 bảng gồm: orderDetails
, orders
và customers
CREATE OR REPLACE VIEW customerOrders AS SELECT orderNumber, customerName, SUM(quantityOrdered * priceEach) total FROM orderDetails INNER JOIN orders o USING (orderNumber) INNER JOIN customers USING (customerNumber) GROUP BY orderNumber;
Bây giờ sử dụng lệnh Select trong view customerOrders
là được.
SELECT * FROM customerOrders ORDER BY total DESC;
Kết quả tham khảo:
Ví dụ 4: Tạo View với truy vấn con
Trong ví dụ dưới đây mình có sử dụng cấu trúc truy vấn con để tạo ra View.
CREATE VIEW aboveAvgProducts AS SELECT productCode, productName, buyPrice FROM products WHERE buyPrice > ( SELECT AVG(buyPrice) FROM products) ORDER BY buyPrice DESC;
* Lời kết: Như vậy bản chất của lệnh Select trong View là không quan trọng, bởi View chỉ quan tâm kết quả mà lệnh Select trả về, còn việc nó kết hợp với bao nhiêu lệnh khác đi nữa thì nó không quan tâm.
Như vậy là mình đã hướng dẫn xong cách sử dụng lệnh Create View trong MySQL, đây là lệnh dùng để tạo ra một View mới hoặc thay thế nội dung cho một view có sẵn.