在线SQL - IDE、编辑器、编译器、解释器

在线练习SQL:在浏览器中针对真实的SQLite数据库建表、插入数据并运行查询,结果以表格显示。

SQLite 3 (sql.js) · 在浏览器中运行,代码绝不会发送到我们的服务器。
main.sqlSQL
输出

            
        
Ctrl/⌘ + Enter 运行

在线 SQL 编译器的功能(IDE、编辑器 & 解释器)

免费在线编写、运行和测试 SQL 代码。本页面集在线 SQL IDE、代码编辑器、编译器和解释器于一体:输入代码,点击“运行”,立即查看输出。一切都在浏览器中运行,无需安装,也无需注册账号。

  • 即时运行代码: SQLite 3 (sql.js),首次加载后一秒内即可输出结果。
  • 代码编辑器: 语法高亮、行号、括号匹配和自动补全括号。
  • 清晰的错误提示: 错误信息和警告会显示在输出面板中,与在您自己的电脑上一样。
  • 全屏: Ctrl/⌘ + Shift + F,可调节字号,支持并排或堆叠布局,面板大小可调。
  • 自动保存: 代码保存在您的浏览器中;可一键下载为 main.sql 或复制。
  • 放心尝试: 时间限制和“停止”按钮可终止无限循环。
  • 私密: SQL 运行时在您的设备上运行,代码绝不会被上传。
  • 深色模式 以及键盘快捷键:Ctrl/⌘ + Enter 运行代码。
  • 免费: 无需注册,不限使用次数。

学习其他编程语言

如何使用SQL在线编译器

  1. 在编辑器中编写 SQL。可以在同一个脚本中创建表(CREATE TABLE)、添加数据(INSERT)并查询数据(SELECT)。语句之间用分号分隔。
  2. 点击运行,或使用 Ctrl + Enter(Mac 上为 ⌘ + Enter)。
  3. 每条返回行的语句都会按顺序显示为各自独立的结果表,下方带有行数。NULL 值会如实标注。如果没有任何语句返回行,则会显示一条简短的确认信息。
  4. 选择 5、15 或 60 秒的时间限制,这对失控的递归查询很有用。停止会立即取消查询。

SQLite 引擎很小,远不到 1 MB,因此几乎瞬间就能加载完成。重置示例会恢复示例的员工表结构,main.sql 则下载当前脚本。

查询在您自己浏览器的 Web Worker 中运行。SQL 和数据都不会上传或保存到我们的服务器上。编辑器会把上一次的脚本保存在浏览器的本地存储中,不会存放在其他任何地方。

支持的功能

该编译器通过 sql.js 运行 SQLite 3,sql.js 是编译成 WebAssembly 的 SQLite C 库。它是真正的关系型数据库引擎,而不是模拟器。

  • DDL 和 DML:CREATE TABLE、CREATE INDEX、CREATE VIEW、INSERT、UPDATE、DELETE、约束、外键和触发器。
  • 查询:连接、子查询、GROUP BY/HAVING、UNION、CASE,以及公用表表达式,包括 WITH RECURSIVE。
  • 窗口函数,例如 ROW_NUMBER()、RANK()、LAG(),以及用 SUM() OVER (...) 计算的累计总和。
  • 内置函数,用于文本(substr、upper、replace)、数字和日期(date、strftime)。

限制:

  • 每次运行都是全新的空内存数据库。表不会在多次运行之间保留,所以请把 CREATE 和 INSERT 语句放在脚本的开头。
  • 它是 SQLite,而不是 MySQL 或 PostgreSQL。大多数标准 SQL 都能运行,但特定厂商的功能,如存储过程、GRANT、MySQL 的 AUTO_INCREMENT 关键字或 PostgreSQL 的 SERIAL 类型则不行。
  • 较大的结果集会显示前 1,000 行,并同时显示总行数。
  • 无法连接外部数据库,也不能打开自己的 .db 文件。

SQL速查表

CREATE TABLE orders (
  id       INTEGER PRIMARY KEY,
  customer TEXT NOT NULL,
  amount   REAL,
  placed   TEXT DEFAULT (date('now'))
);

INSERT INTO orders (customer, amount) VALUES
  ('Ada', 120.0), ('Ada', 35.5), ('Grace', 80.0);

WITH totals AS (
  SELECT customer, SUM(amount) AS spent, COUNT(*) AS n
  FROM orders
  GROUP BY customer
)
SELECT customer, spent, n
FROM totals
WHERE spent >= 50 AND n <> 0
ORDER BY spent DESC;
任务SQL
自动编号的主键id INTEGER PRIMARY KEY
筛选行WHERE price BETWEEN 10 AND 20
模式匹配WHERE name LIKE 'A%'
连接文本first || ' ' || last
分页LIMIT 10 OFFSET 20
替换 NULLCOALESCE(phone, 'n/a')
插入或更新INSERT ... ON CONFLICT(id) DO UPDATE SET ...

小提示

  • 用 sqlite_master 列出已创建的对象:SELECT name, sql FROM sqlite_master;
  • 用 EXPLAIN QUERY PLAN SELECT ... 查看查询是否使用了索引。
  • SQLite 采用灵活的类型:声明为 INTEGER 的列仍然可以存储文本。如果需要强制类型,请添加 CHECK 约束,或使用 STRICT 表。
  • 外键只有在 PRAGMA foreign_keys = ON; 之后才会被强制执行。
  • 查询又长又乱?分享之前,先用 SQL格式化把它整理干净。
提示:把重复的插入语句包在 BEGIN; … COMMIT; 之间。用递归 CTE 生成测试数据,是为练习而快速向表中填入成千上万行数据的好办法。

常见问题

这里使用的是哪种 SQL 方言?

SQLite 3。它与标准 SQL 非常接近,因此很适合学习 SELECT、连接、分组和窗口函数。MySQL、PostgreSQL 或 SQL Server 特有的语法可能需要做些小改动。

我的数据会被保存吗?

不会。每次运行都会创建一个新的内存数据库,运行一结束就会被删除。只有编辑器中的 SQL 文本会被记住,保存在浏览器本地。

我可以一次运行多个查询吗?

可以。用分号分隔它们即可。语句按顺序运行,每条返回行的语句都会生成各自的结果表。

我也可以用其他语言练习吗?

可以。试试 Python在线编译器,其中 Python 内置的 sqlite3 模块同样可用;或者浏览我们所有的开发者工具。

更新于

已复制到剪贴板