13 điểm bởi GN⁺ 2025-02-18 | 3 bình luận | Chia sẻ qua WhatsApp

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

    1. Bắt đầu bằng mệnh đề FROM
    1. Thêm phép toán sau |> (toán tử pipe)
    1. 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)
  • Đặ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

Đ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

 
carnoxen 2025-02-18

https://github.com/tc39/proposal-pipeline-operator

Toán tử này trông khá quen mắt nhỉ

 
halfenif 2025-02-18

Xem PRQL trước rồi nhìn cú pháp pipeline của Google thì thấy hơi rối mắt.

 
GN⁺ 2025-02-18
Ý 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

    • Trước đây việc mở rộng SQL gặp khó khăn, và hàm giá trị bảng khá phức tạp
    • Giờ đây có thể dùng hàm bậc cao để tăng cường dữ liệu, dự đoán, nhóm dữ liệu, v.v.
    • Ví dụ, có thể lọc các đơn hàng sau một ngày nhất định, tổng hợp tổng chi tiêu theo từng khách hàng, sau đó lọc những khách hàng vượt một mức tiền nhất định rồi join với thông tin khách hàng
    • SQL lặp theo kiểu pipe có thể hoạt động tốt hơn cùng với GenAI
  • PRQL là một ý tưởng tương tự được biên dịch sang SQL

    • Ví dụ, có thể lọc dữ liệu hóa đơn, tính phí, rồi lọc dữ liệu có doanh thu vượt một mức nhất định
  • 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

    • Mong rằng những người triển khai SQL sẽ tập trung vào source map và các công cụ tương tự để hỗ trợ tốt hơn các cú pháp thay thế bên ngoài
    • Khi đó, mỗi dự án hoặc cá nhân có thể chọn biến thể cú pháp SQL phù hợp với mình
  • Khi cú pháp pipe lần đầu được công bố, nhóm SQLite đã thử nghiệm nó

    • Họ phát hiện ký tự pipe không phải là bắt buộc, và cú pháp vẫn hoạt động ngay cả khi ký tự pipe là tùy chọn
    • Cá nhân tôi thấy cách này nhìn đẹp hơ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

    • Dù không nhận được sự hậu thuẫn từ các tập đoàn lớn như Google, cú pháp của nó gọn gàng hơn
  • 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ự

    • Được phát triển bởi Lloyd Tabb, đồng sáng lập Looker
  • Từ sau khi dùng Kusto Query Language, tôi đã mong SQL cũng có những khả năng như thế này

    • Nếu đủ nhiều DB hỗ trợ nó như một tính năng mở rộng thì điều đó có thể xảy ra