开发者工具 · 颜色 / 设计开发

SQLite 在线

浏览器内 SQL 执行/建表/查询

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 105 次使用
SQL 编辑器SQLite · 浏览器内执行
1
结果将在这里以表格呈现 —— 点「示例库」一键上手,或直接写 SQL 后 ⌘/Ctrl+Enter 运行
数据库结构
尚未建库 —— 运行 CREATE TABLE 或点「示例库」后,这里会列出全部表 / 视图及列。点列名插入,点 ✱ 取 SELECT *。
就绪 · sql.js 在浏览器内运行 SQLite,数据全程本地、不上传;点「运行」时才加载引擎
第一节

关于本工具

About

建表、插入、查询,一套 SQL 写完,发现表名拼错了。删表重来?不需要。打开这个页面,在浏览器里直接连一个 SQLite 数据库,执行任意 DDL 和 DML,结果即时返回。全部计算在本地完成,数据不上传服务器——适合调试数据模型、验证查询逻辑,或是临时分析一个 .db 文件,不必装任何客户端。

使用场景

数据迁移快速验数

凌晨两点,DBA 刚把生产库从 MySQL 迁到 PostgreSQL,业务方催着天亮前确认数据一致性。手工对账要写长脚本,表结构还不同。把两边导出的 CSV 各建一张临时表,写一联 JOIN 查差值,5 分钟出结果,不用等审批开数据库权限。

产品经理自助拉取用户画像

运营要一份「过去 30 天活跃且未付费的用户清单」,数据分析师排期要三天。产品经理把埋点日志里筛选出的 3000 个 user_id 粘贴进 SQLite,写一句 SELECT WHERE last_login > date('now', '-30 days') AND pay_status = 0,直接在浏览器拿到结果,不等排期。

面试官现场出题验证

面试后端候选人时,对方说「这个查询用 GROUP_CONCAT 配合子查询就能实现」。面试官当场打开工具,把候选人说的 SQL 敲进去,建两张 10 行数据的 demo 表,跑一遍验证结果是否符合预期。不用开电脑上的数据库客户端,也不打断面试节奏。

爬虫数据快速清洗

从三个不同网页爬了 2000 条商品信息,价格字段有的带「¥」、有的带「元」、有的是纯数字。在工具里建一张临时表导入数据,写 UPDATE 语句用 REPLACE 和 TRIM 统一格式,再写 SELECT 检查异常值,比在 Excel 里拉公式快,且操作可复现。

教学演示窗口期排课

教务老师要给 30 个班级排下学期的机房课,每个班每周 2 次课,机房只有 4 间,且不能和体育课冲突。把班级、机房、可用时段做成三张表,用 JOIN 和 NOT IN 查出所有可行组合,再按约束条件筛选,半小时排出无冲突的草表,比人工翻日历快得多。

第二节

使用指南

Getting Started

使用步骤

  1. 1在 SQL 编辑区输入建表语句(如 CREATE TABLE users(id INT, name TEXT)),点击「执行」按钮,下方表格区显示「表已创建」提示
  2. 2在编辑区输入 INSERT 语句添加数据(如 INSERT INTO users VALUES(1, 'Alice')),执行后结果区显示「影响行数:1」
  3. 3输入 SELECT 查询语句(如 SELECT * FROM users),执行后结果区以表格形式展示所有匹配记录,列名与数据类型自动对齐
  4. 4点击「清空」按钮重置编辑区内容,或点击「导出」按钮将当前查询结果下载为 CSV 文件,浏览器自动触发下载

输入输出示例

输入输出说明
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER); INSERT INTO users VALUES (1, 'Alice', 30), (2, 'Bob', 25); SELECT * FROM users;id | name | age 1 | Alice| 30 2 | Bob | 25常规:建表 + 插入 + 查询三步走,验证工具能否完整执行多语句 SQL 脚本
SELECT 'Hello, world!' AS greeting;greeting Hello, world!常规:无表查询,验证工具对纯表达式(字符串常量)的 SQL 支持
CREATE TABLE t (a INTEGER); INSERT INTO t VALUES (NULL); SELECT * FROM t WHERE a IS NULL;a NULL边界:NULL 值处理,验证 IS NULL 条件是否正常返回空行
SELECT 1/0;Error: division by zero边界:除零错误,验证工具是否抛出 SQLite 原生错误信息而非静默返回空
SELECT 'abc' || 123;abc123边界:字符串拼接与隐式类型转换,验证 SQLite 自动将数字转为字符串的行为
CREATE TABLE t (x TEXT); INSERT INTO t VALUES ('abc'); SELECT * FROM t WHERE x = 'ABC';x abc易错:SQLite 默认大小写不敏感(BINARY 除外),新手常误以为 'abc' ≠ 'ABC' 导致查询无结果
SELECT datetime('now');2025-04-08 14:30:15(示例值,实际为当前 UTC 时间)易错:datetime 函数返回 UTC 时间而非本地时间,用户常误以为得到的是浏览器时区时间

常见错误对照

1.SQL 语句末尾缺少分号

✗ 错误SELECT * FROM users SELECT * FROM orders
✓ 修复SELECT * FROM users; SELECT * FROM orders;

SQLite 要求每条完整语句以分号结束,否则解析器会认为语句未完成,导致后续语句被忽略或报错。

2.表名或列名用了 SQL 保留字未加引号

✗ 错误CREATE TABLE order (id INT, name TEXT)
✓ 修复CREATE TABLE "order" (id INT, name TEXT);

order 是 SQL 保留关键字(ORDER BY),直接用作表名会引发语法错误。用双引号括起来可避免冲突。

3.字符串值用了双引号而非单引号

✗ 错误SELECT * FROM users WHERE name = "Alice"
✓ 修复SELECT * FROM users WHERE name = 'Alice';

SQL 标准中,双引号用于标识符(表名/列名),字符串字面量必须用单引号。双引号包裹字符串在某些模式下会被当作标识符。

4.INSERT 语句的列数与值数不匹配

✗ 错误INSERT INTO users (id, name, age) VALUES (1, 'Bob')
✓ 修复INSERT INTO users (id, name, age) VALUES (1, 'Bob', 25);

SQLite 编译阶段会检查列数与值个数是否一致,不一致直接报错。多列时易遗漏某字段。

5.UPDATE 或 DELETE 忘记加 WHERE 条件

✗ 错误UPDATE users SET age = 30
✓ 修复UPDATE users SET age = 30 WHERE id = 1;

不加 WHERE 会更新/删除表中所有行,这是 SQL 新手最常犯的破坏性错误。养成先写 WHERE 再写 SET 的习惯。

6.字符串比较时忽略大小写敏感性

✗ 错误SELECT * FROM users WHERE name = 'alice' -- 期望匹配 'Alice'
✓ 修复SELECT * FROM users WHERE name COLLATE NOCASE = 'alice';

SQLite 默认比较是大小写敏感的(BINARY)。要忽略大小写需显式指定 COLLATE NOCASE 或使用 LIKE(默认不区分 ASCII 大小写)。

7.在 GROUP BY 中使用了未聚合的列

✗ 错误SELECT name, age, COUNT(*) FROM users GROUP BY age
✓ 修复SELECT age, COUNT(*) FROM users GROUP BY age;

GROUP BY 后 SELECT 中的非聚合列必须出现在 GROUP BY 子句中,否则 SQLite 会随机取该列的值(取决于实现),结果不可预测。

8.误用 = 而非 == 或 IS 判断 NULL

✗ 错误SELECT * FROM users WHERE name = NULL
✓ 修复SELECT * FROM users WHERE name IS NULL;

SQL 中 NULL 表示未知值,任何与 NULL 的比较(=、<>)结果都是 NULL(假)。判断空值必须用 IS NULL 或 IS NOT NULL。

第三节

工作原理

How It Works

核心公式

SELECT column1, aggregate_func(column2) FROM table_name WHERE condition GROUP BY column1 HAVING group_condition ORDER BY column3 LIMIT n;

变量说明

  • column1分组或选择的列名
  • aggregate_func聚合函数如 COUNT, SUM, AVG
  • table_name已创建的表名
  • condition行级过滤条件
  • group_condition分组后过滤条件
  • column3排序依据列
  • n返回行数上限

示例

表 sales 有 product, amount 两列。查询每种产品总销售额超过 100 的前 2 种产品:SELECT product, SUM(amount) AS total FROM sales GROUP BY product HAVING total > 100 ORDER BY total DESC LIMIT 2。假设数据:('A',50),('A',60),('B',30),('B',40),('C',200)。分组后 A=110, B=70, C=200;HAVING 过滤掉 B;排序后 C(200), A(110);LIMIT 2 返回 C 和 A。

输入 SQL 语句SQL 词法 / 语法解析与校验WASM SQLite引擎执行输出结果集返回行 / 列建表 / 插入DDL / DML 语句内存数据库临时存储查询 / 修改
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
我粘贴了一个 SQL 文件进去,怎么没反应?

本工具只接受手动输入或粘贴的 SQL 语句,不支持上传 .sql 文件。如果文件很大(超过几百 KB),浏览器可能因内存限制卡顿。建议用文本编辑器打开文件,复制建表语句和 INSERT 语句分批粘贴执行,每次执行不超过 10000 行。

为什么我建的表里中文显示成乱码?

SQLite 默认以 UTF-8 存储文本,如果粘贴的 SQL 语句本身不是 UTF-8 编码(比如从 Windows 记事本另存为 ANSI 的 .sql 文件),中文就会变成乱码。解决办法:把 SQL 语句用 UTF-8 编码重新保存,或用带编码转换的编辑器(如 VS Code、Notepad++)转成 UTF-8 再粘贴。本工具界面本身是 UTF-8,不负责转换外部编码。

我执行 SELECT 查出来 10 万行,结果区只显示 100 行,是没查全吗?

查询结果默认只显示前 100 行,这是为了防止浏览器卡死。底部的「导出 CSV」按钮会导出全部查询结果(无行数限制),导出后再用 Excel 或文本编辑器查看完整数据。如果想在页面上看更多行,可以在 SQL 里加 LIMIT 500 自己控制返回条数。

为什么我写的 INSERT 语句执行成功了,但查不到数据?

最常见的原因是 INSERT 之后没有 COMMIT。SQLite 默认每个 INSERT 语句自动提交,但如果使用了 BEGIN...COMMIT 包裹多条 INSERT,必须手动执行 COMMIT 才能持久化。另外检查是否插到了不同表:建表语句和 INSERT 语句里的表名大小写要完全一致,SQLite 区分大小写。

这个工具能处理 .db 文件吗?

不能。本工具是纯浏览器端运行,无法读取你电脑本地的 .db 或 .sqlite 文件。只能把 SQL 语句(建表、插入、查询)粘贴到输入框里执行。如果你有 .db 文件,建议先用 SQLite 命令行或 DB Browser 打开,把里面的结构用 .dump 导出成 SQL 文本,再粘贴到本工具里运行。

我执行了 DROP TABLE,能撤销吗?

不能撤销。SQLite 不支持闪回或事务回滚已提交的 DDL(数据定义语言)操作。DROP TABLE 一旦执行,表结构和数据立即永久删除。建议在操作重要数据前先用 CREATE TABLE temp_xxx AS SELECT * FROM xxx 备份到临时表,或把建表语句先复制到记事本保存。

为什么我写的 JOIN 查询报错说表不存在?

常见原因:表名拼写错误或大小写不一致(SQLite 对表名大小写敏感);表在当前数据库会话中还没创建(建表语句执行顺序不对);或者 JOIN 的表名之间忘了加逗号或 JOIN 关键字。建议先执行 .tables(本工具支持)查看当前所有表名,核对后再写 JOIN。

这个工具和 SQLite 命令行比,慢很多吗?

对于小于 10 万行的数据,速度差异几乎感觉不到。本工具底层用的是 WASM 编译的 SQLite,执行效率接近原生。但浏览器内存上限(通常 2GB)和 GC(垃圾回收)会导致超大结果集(百万行)的聚合查询比命令行慢 2-3 倍。如果处理几百万行数据,建议用命令行工具。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭