SQL trên CSV

Thả file CSV vào bên dưới — file trở thành bảng tên data. Gõ câu SQL, chạy, rồi tải kết quả về dạng CSV hoặc JSON. Mọi thứ chạy ngay trong trình duyệt; không có gì được tải lên máy chủ.

File không bao giờ rời khỏi thiết bị của bạn

Thả file CSV cần truy vấn, hoặc nhấp để chọn

CSVTXT

Công cụ này làm gì

Công cụ này biến một file CSV thành một bảng SQL có thể truy vấn được mà không cần rời khỏi trình duyệt. Thả file vào, file được nạp vào một bảng lưu trong bộ nhớ tên là data; gõ một câu SQL — hoặc bắt đầu từ một trong các ví dụ có sẵn — chạy nó, rồi tải kết quả về dạng CSV hoặc JSON.

Không có gì bị tải lên để làm việc này. Một module WebAssembly được nạp vào tab trình duyệt của bạn đọc file, dựng bảng, và chạy câu SQL của bạn hoàn toàn trên thiết bị của bạn.

Mẹo: Chưa biết bắt đầu từ đâu? Ngay khi file được nạp xong, công cụ tự chạy SELECT * FROM data LIMIT 100 để bạn thấy ngay các cột và một mẫu dữ liệu — chỉnh sửa câu truy vấn đó tại chỗ khi bạn đã biết mình cần tìm gì.

Cách sử dụng

Thả một file CSV vào công cụ. Các cột của bạn hiện ra để tham khảo nhanh, và một câu truy vấn xem trước — SELECT * FROM data LIMIT 100 — tự động chạy để bạn thấy ngay các dòng dữ liệu thật. Từ đó, chỉnh sửa ô truy vấn theo câu SQL bạn cần, hoặc nhấp vào một trong các nút ví dụ (SELECT *, COUNT / GROUP BY, WHERE, ORDER BY) để bắt đầu từ một câu truy vấn đã chạy được rồi chỉnh lại tên cột. Nhấp Chạy, xem bảng kết quả, rồi tải về dạng CSV hoặc JSON — file tải về luôn gồm đầy đủ mọi dòng khớp, dù bảng hiển thị trên màn hình chỉ dừng lại sau vài trăm dòng đầu.

SQL được hỗ trợ

Câu truy vấn chạy trên một engine SQL thật (GlueSQL) hoạt động hoàn toàn trong trình duyệt của bạn, hỗ trợ một tập con thực sự hữu ích của SQL chứ không phải toàn bộ bề mặt của một hệ như Postgres: SELECT với danh sách cột, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, các hàm tổng hợp SUM, COUNT, AVG, MIN, MAX, cùng các hàm vô hướng thông dụng và CAST. Một vài câu truy vấn ví dụ để bạn chỉnh theo cột của mình:

SELECT * FROM data WHERE age > 30
SELECT city, SUM(amount) AS total FROM data GROUP BY city ORDER BY total DESC
SELECT name, score FROM data ORDER BY score DESC LIMIT 10
SELECT category, COUNT(*) AS n FROM data GROUP BY category HAVING COUNT(*) > 5

Nếu bạn viết thứ gì đó nằm ngoài tập con này — một hàm window, một subquery lạ, một phép join với bảng thứ hai không tồn tại — câu truy vấn sẽ không chạy, và công cụ hiển thị đúng thông báo lỗi của engine thay vì đoán mò bạn muốn gì.

Cách suy luận kiểu dữ liệu của cột

File CSV không có khái niệm kiểu dữ liệu, nên trước khi câu truy vấn của bạn chạy, công cụ này quyết định từng cột một nên xử lý như số hay như chữ. Một cột chỉ trở thành kiểu số thật khi mọi giá trị trong đó đều là một số hữu hạn thuần túy — không chữ cái, không ký hiệu tiền tệ, không dư thừa gì cả. Có hai ngoại lệ khiến giá trị vẫn giữ dạng chữ dù trông giống số: một giá trị có số 0 đứng đầu mà không phải số thập phân như 0.5 (để một mã kiểu 007 không bị âm thầm biến thành 7), và một giá trị có hơn mười lăm chữ số (để một số tài khoản hay số thẻ dài không bị làm tròn). Chỉ cần một dòng trong cột đó bị bỏ trống hoặc không parse được, cả cột sẽ giữ dạng chữ, để một lỗi gõ nhầm ở một dòng không thể âm thầm làm sai ý nghĩa của SUM hay AVG trên cột đó.

Nếu bạn thực sự cần xử lý một cột dạng chữ như số cho một câu truy vấn cụ thể — chẳng hạn một cột mã mà bạn biết chắc có thể cộng được — hãy bọc nó bằng CAST(column_name AS FLOAT) thay vì trông chờ vào suy luận tự động.

Không có gì rời khỏi trình duyệt của bạn

Cả việc nạp file CSV thành bảng lẫn việc chạy câu SQL trên đó đều diễn ra qua một module WebAssembly chạy bên trong tab trình duyệt của bạn. Không có bước tải lên, không có server nào giữ bản sao file của bạn, và không phụ thuộc vào kết nối internet một khi trang và WebAssembly đã tải xong — dữ liệu của bạn ở lại trên thiết bị của bạn từ lúc thả file đến lúc tải kết quả về.

Giới hạn

Công cụ này xử lý được file tới 50 MB và 1.000.000 dòng. Một file vượt quá một trong hai giới hạn này sẽ bị từ chối ngay từ đầu kèm thông báo rõ ràng, trước khi bất kỳ bảng nào được dựng hay truy vấn nào được thử, để bạn không phải chờ một tab trình duyệt âm thầm hết bộ nhớ.

Bước tiếp theo

Nếu bạn chỉ cần đổi định dạng CSV mà không muốn viết SQL, CSV sang JSONJSON sang CSV lo phần chuyển đổi định dạng đơn giản, còn CSV sang Excel biến file của bạn thành một workbook XLSX thật sự, mở trực tiếp được trong Excel hay Google Sheets.

Câu hỏi thường gặp

Bảng được đặt tên là gì, và tôi có đổi tên được không?
Bảng luôn có tên là data — mọi câu truy vấn bạn viết nên bắt đầu bằng FROM data. Không có tùy chọn đổi tên, nhưng vì bảng chỉ tồn tại trong suốt phiên làm việc của bạn, cái tên cố định đó chỉ đơn giản là quy ước để viết truy vấn, không phải một cài đặt bạn cần quản lý.
Công cụ này hỗ trợ những phần nào của SQL?
Một tập con thực sự hữu ích, chạy trên nền engine GlueSQL: SELECT với danh sách cột, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, các hàm tổng hợp thông dụng SUM, COUNT, AVG, MIN, MAX, cùng một số hàm phổ biến và CAST. Đây không phải là một Postgres hay MySQL đầy đủ, nên các cú pháp phức tạp hơn — hàm window, subquery ở vị trí lạ, một vài kiểu join — có thể không được nhận diện. Nếu bạn viết thứ gì đó nằm ngoài tập con này, bạn sẽ nhận lại đúng thông báo lỗi của engine thay vì một kết quả sai lặng lẽ, nên bạn luôn biết chắc câu truy vấn có được hiểu đúng hay không.
File CSV của tôi có bị tải lên đâu để chạy các truy vấn này không?
Không. Cả việc nạp file của bạn thành bảng lẫn việc chạy câu SQL trên đó đều diễn ra qua một module WebAssembly bên trong tab trình duyệt, hoàn toàn trên thiết bị của bạn. File của bạn không bao giờ được gửi tới server, và không có gì trong nội dung file rời khỏi máy của bạn ở bất kỳ thời điểm nào.
Vì sao cột trông giống số của tôi lại bị xem là chữ thay vì số?
Một cột chỉ trở thành kiểu số thật khi mọi giá trị trong đó đều là một số hữu hạn thuần túy, không có số 0 đứng đầu (trừ số thập phân kiểu 0.5) và không quá mười lăm chữ số — nhằm bảo vệ những giá trị như mã kiểu 007 hay số tài khoản dài khỏi bị diễn giải lại một cách âm thầm. Chỉ cần một dòng trong cột đó bị bỏ trống, không phải số, hoặc phá vỡ một trong các quy tắc trên, cả cột sẽ được giữ ở dạng chữ để không có gì bị sai lệch. Bạn vẫn có thể xử lý nó như số bên trong một câu truy vấn bằng cách bọc lại, ví dụ CAST(column_name AS FLOAT).
Tôi có thể truy vấn hoặc JOIN hai file CSV cùng lúc không?
Chưa được. Mỗi phiên làm việc chỉ nạp một file CSV vào bảng duy nhất tên data, nên một câu truy vấn chỉ có thể đọc từ bảng đó — không có file thứ hai để join vào. Thả một file mới sẽ thay thế bảng hiện tại chứ không cộng thêm vào.
Có giới hạn về kích thước file được truy vấn không?
Có — tối đa 50 MB và 1.000.000 dòng. Một file vượt quá một trong hai giới hạn này sẽ bị từ chối kèm thông báo rõ ràng trước khi bất kỳ truy vấn nào chạy, thay vì để tab trình duyệt của bạn bị treo hoặc hết bộ nhớ giữa chừng.