BigQuery nay đã hỗ trợ cú pháp pipe trong SQL
(cloud.google.com)Pipe Query Syntax là gì?
- Là cú pháp mở rộng của GoogleSQL, cho phép viết truy vấn theo cấu trúc tuyến tính, dễ đọc và dễ bảo trì
- Hỗ trợ cùng các phép toán như GoogleSQL hiện có (chọn, nhóm, join, lọc, v.v.)
- Có thể tự do sắp xếp thứ tự phép toán, và viết truy vấn phức tạp mà không cần subquery lồng nhau
Standard SQL vs Pipe Query Syntax
- Standard SQL
- Phải tuân theo một thứ tự cú pháp cố định
- Khi dùng nhiều phép tổng hợp, cần CTE (Common Table Expression) hoặc subquery lồng nhau
- Phải lặp lại các cột trùng nhau trong
SELECT,GROUP BY,ORDER BY
- Pipe Query Syntax
- Có thể áp dụng toán tử pipe theo bất kỳ thứ tự nào
- Có thể thực hiện nhiều phép tổng hợp đơn giản chỉ bằng cách thêm toán tử pipe
- Chỉ cần khai báo cột một lần
Cấu trúc cơ bản của Pipe Query Syntax
-
- Bắt đầu bằng mệnh đề
FROM
- Bắt đầu bằng mệnh đề
-
- Thêm phép toán sau
|>(toán tử pipe)
- Thêm phép toán sau
-
- Nối nhiều toán tử
|>để xây dựng truy vấn theo từng bước
(ví dụ: có thể thay đổi thứ tự lọc → tổng hợp → join)
- Nối nhiều toán tử
- Đặc tính cốt lõi
- Có thể thêm toán tử pipe vào bất kỳ truy vấn nào → có thể mở rộng truy vấn GoogleSQL hiện có bằng cách gắn toán tử
|>ở cuối - Thứ tự phép toán linh hoạt → có thể áp dụng toán tử theo thứ tự mong muốn và số lần tùy ý
- Có thể dùng trong mọi môi trường hỗ trợ GoogleSQL → có thể dùng trong truy vấn, view, table-valued function, v.v.
- Có thể kết hợp với cú pháp SQL hiện có → subquery có thể viết bằng Standard SQL, còn truy vấn chính dùng cú pháp Pipe
- Có thể tham chiếu tới mọi bí danh (alias) đã được định nghĩa ở bước trước
- Có thể bắt đầu bằng mệnh đề FROM → sau đó thêm các toán tử
|>để mở rộng truy vấn dần dần
- Có thể thêm toán tử pipe vào bất kỳ truy vấn nào → có thể mở rộng truy vấn GoogleSQL hiện có bằng cách gắn toán tử
Điểm khác nhau giữa Pipe Query Syntax và Standard SQL
- Có thể bắt đầu truy vấn bằng mệnh đề
FROM - Toán tử pipe SELECT không thực hiện tổng hợp. Việc tổng hợp được thực hiện riêng bằng toán tử pipe AGGREGATE
- Lọc được thực hiện bằng toán tử pipe WHERE. Nó hợp nhất chức năng của WHERE, HAVING và QUALIFY trong Standard SQL. Có thể lọc ở bất kỳ giai đoạn nào → giúp viết truy vấn linh hoạt hơn
Ưu điểm của Pipe Query Syntax
- Có thể viết truy vấn theo đúng trình tự logic → cải thiện khả năng đọc của truy vấn
- Dễ bảo trì → có thể thực hiện các phép toán phức tạp mà không cần subquery lồng nhau
- Thứ tự phép toán linh hoạt → có thể áp dụng phép toán theo thứ tự mong muốn
- Việc lọc trực quan hơn → có thể dùng WHERE để lọc dữ liệu ở nhiều giai đoạn khác nhau
- Dễ viết truy vấn tổng hợp phức tạp hơn → có thể thực hiện tổng hợp rõ ràng bằng toán tử AGGREGATE
Hiện được hỗ trợ ở giai đoạn Pre-GA, và vẫn còn hạn chế về phạm vi hỗ trợ
3 bình luận
https://github.com/tc39/proposal-pipeline-operator
Toán tử này trông khá quen mắt nhỉ
Xem PRQL trước rồi nhìn cú pháp pipeline của Google thì thấy hơi rối mắt.
Ý kiến trên Hacker News
Cú pháp pipe của SQL đã được triển khai trên Databricks từ ngày 30 tháng 1 năm 2025
PRQL là một ý tưởng tương tự được biên dịch sang SQL
Nếu việc mở rộng cú pháp SQL tiếp tục diễn ra, độ phức tạp có thể tăng lên
Khi cú pháp pipe lần đầu được công bố, nhóm SQLite đã thử nghiệm nó
PRQL là cú pháp hướng pipe dành cho SQL DB, nhưng vì là một ngôn ngữ mới nên không có khả năng tương thích ngược với SQL
DuckDB cũng có thể dùng được
Việc phải gõ thêm ">" sau pipe có thể hơi phiền
Ngôn ngữ Malloy không phải cú pháp pipe, nhưng có cú pháp phân tích tương tự
Từ sau khi dùng Kusto Query Language, tôi đã mong SQL cũng có những khả năng như thế này