跳到正文

用 SQL 查询 CSV

SQL over CSV

在浏览器里对拖进来的 CSV 或 TSV 跑 SQL——SELECT、WHERE、GROUP BY/HAVING、ORDER BY、LIMIT、CASE,以及两表 JOIN——语法就印在页面上。

拖入一个 CSV,在浏览器里用 SQL 查询它,什么都不用装,什么都不上传。两个文件就能 JOIN。支持的语法印在页面上,它回答“为什么那样写不行”比错误信息更快。

🔒 完全在你的浏览器里运行sqlquerycsvanalysis

把 CSV 或 TSV 文件拖到这里(多个也行)

在这个标签页里读取,不会上传。能认出韩文版、日文版、中文版和西文版 Excel 存出来的文件(CP949、Shift_JIS、GBK、Windows-1252)。

SQL

支持的语法

SELECT [DISTINCT] 列, 表达式 [AS 别名], 表.* , *
FROM 表 [别名]
[ [INNER|LEFT] JOIN 表 [别名] ON 条件 ]      -- 最多两张表
[WHERE 条件]
[GROUP BY 表达式, …] [HAVING 条件]
[ORDER BY 表达式|别名|序号 [ASC|DESC], …]
[LIMIT n [OFFSET m]]

条件:  = <> < <= > >=   AND OR NOT   IN (…)   LIKE 'Seoul%'   BETWEEN a AND b   IS [NOT] NULL
表达式: + - * / %   ||(拼接字符串)   CASE WHEN … THEN … ELSE … END   CAST(x AS INTEGER|REAL|TEXT)
聚合:  COUNT(*) COUNT(DISTINCT x) SUM AVG MIN MAX GROUP_CONCAT(x, ',')
函数:  UPPER LOWER LENGTH TRIM LTRIM RTRIM SUBSTR(s, 起点, 长度) LEFT RIGHT REPLACE INSTR CONCAT
       COALESCE IFNULL NULLIF IIF(条件, a, b) ROUND(x, 位数) ABS FLOOR CEIL SQRT POWER MOD TYPEOF
名字:  中文列名可以直接用;名字里有空格就写成 "名字" 或 `名字`   -- 注释, /* 注释 */

NULL 在任何比较里都不为真,LIKE 不区分大小写,除以零得到 NULL。在聚合查询里,不在 GROUP BY 中的列取该组第一行的值,和 SQLite 一样。没有子查询,也没有窗口函数。

文件在这个标签页里读取,不会上传。列的类型是从文件里推断出来的,所以数字列按数字比较,文本列按字母顺序比较。

怎么用

  1. 拖入一个或多个文件

    每个文件成为一张以文件名命名的表。名字不好打的话,在编辑器上方的列表里改名。

  2. 写查询

    SELECT、WHERE、带 HAVING 的 GROUP BY、ORDER BY、LIMIT、CASE 和两表 JOIN。Ctrl+Enter 运行。输入框下面的示例按钮会针对你自己的表名填入一条能跑的查询。

  3. 读错误位置

    失败的查询会报出解析器停下的行和列,那通常在实际错误之后一个记号的位置。

  4. 导出结果

    导出为带 BOM 的 CSV 给 Excel,或者导出为 JSON 给任何读 JSON 的东西。

常见问题

支持子查询和窗口函数吗?

不支持。这是为本站写的一个 SQL 子集,不是编译成 WebAssembly 的 SQLite:带 WHERE、GROUP BY、HAVING、ORDER BY、LIMIT、CASE 的 SELECT,加上两表 JOIN,仅此而已。语法面板就是那份精确的清单。

我的数据会到服务器上吗?

不会。解析器和求值器都在这个标签页里运行。这是功能集比真正的数据库小的原因,也是你可以把它指向一个你绝不会上传的文件的原因。

能用中文列名吗?

能,直接用。带空格的名字需要引号——双引号或者反引号都行。

错误信息是韩文的

查询引擎的二十五条解析和求值信息只有韩文,因为每一条都在测试里逐字断言。编辑器旁边的语法面板是双语的,覆盖同样的内容。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。