如何使用SQL在线编译器
- 在编辑器中编写 SQL。可以在同一个脚本中创建表(
CREATE TABLE)、添加数据(INSERT)并查询数据(SELECT)。语句之间用分号分隔。 - 点击运行,或使用 Ctrl + Enter(Mac 上为 ⌘ + Enter)。
- 每条返回行的语句都会按顺序显示为各自独立的结果表,下方带有行数。
NULL值会如实标注。如果没有任何语句返回行,则会显示一条简短的确认信息。 - 选择 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 |
| 替换 NULL | COALESCE(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 模块同样可用;或者浏览我们所有的开发者工具。
更新于