DBeaver导出数据时需手动启用“使用自定义SQL”并编写带WHERE的完整SELECT语句,才能实现在数据库端过滤;默认表导出或顶部过滤框条件无效,且SQL语法须严格匹配目标库规则,WHERE字段应尽量使用索引列以避免全表扫描。

导出前直接加 WHERE 条件,不是导出后再过滤
导出时加过滤条件,本质是让 DBeaver 在执行导出前,用一条带 WHERE 的 SELECT 语句去拉数据,而不是先全量查出来再本地筛。这能显著减少内存占用、避免导出无用行,也防止敏感字段意外流出。
关键点在于:这个功能只在「表级导出」或「查询结果导出」中生效,且必须手动启用「使用自定义 SQL」选项;默认的“导出整张表”模式不走 WHERE,它会忽略你输在顶部过滤框里的条件。
- 右键某张表 → 选择
导出数据 - 在导出向导第一页,格式选
SQL或CSV都行,但下一步前务必勾选使用自定义 SQL - 点击
下一步后,在「SQL 查询」输入框里写完整语句,例如:SELECT * FROM orders WHERE status = 'shipped' AND create_time >= '2026-01-01' - 确认字段映射无误,继续完成导出
导出查询结果时,顶部过滤框的条件不参与导出
很多人在结果集表格上方的过滤框(那个带漏斗图标的输入框)里写了 status='active',以为导出会自动带上——不会。那个过滤框只影响当前视图显示,和导出动作完全解耦。
如果你已经跑完一个复杂查询,又想只导出其中一部分,有两个可靠做法:
- 把原查询复制出来,手动加上
WHERE子句,再右键该结果集 →导出数据→ 勾选使用自定义 SQL,粘贴修改后的语句 - 或者更干脆:在 SQL 编辑器里重写带条件的查询,执行后直接导出结果集(此时仍需勾选
使用自定义 SQL才能保留 WHERE)
注意:导出数据 对话框里没有“复用当前视图过滤”的开关,别找。
WHERE 条件里字段名大小写和引号要严格匹配数据库规则
DBeaver 不做 SQL 语法重写,它把你在自定义 SQL 框里写的原样发给数据库执行。所以字段名大小写、字符串是否单引号、日期格式等,必须和目标库实际要求一致,否则导出会报错或漏数据。
- PostgreSQL / Oracle:字段名默认小写,若建表时用了双引号大写(如
"OrderID"),WHERE 里也得写成"OrderID" = 123 - MySQL:默认不区分大小写,但字段含空格或关键字时必须用反引号,例如:
`order date` > '2026-01-01' - 所有数据库:字符串值必须用单引号,
status="active"是错的,会报语法错误 - 时间字段比较建议用标准 ISO 格式(
'2026-11-03'),避免因数据库时区或格式设置导致范围偏差
导出大量数据时,WHERE 条件最好配合索引字段
导出本身不慢,慢的是数据库执行那条 SELECT。如果 WHERE 条件里用的是没索引的字段(比如 description LIKE '%error%'),可能触发全表扫描,导出卡住、超时,甚至拖垮线上库。
检查方法很简单:把你的导出 SQL 复制到 SQL 编辑器里,右键 → 执行执行计划(Explain Plan)。重点看 type 或 Scan Type 列是不是 ALL 或 index —— 出现 ALL 就得优化。
- 优先用主键、时间戳、状态码这类高选择性字段做过滤起点
- 避免在 WHERE 里对字段做函数操作,例如
DATE(create_time) = '2026-11-03'会失效索引,改成create_time >= '2026-11-03' AND create_time - 导出前先用
SELECT COUNT(*)验证条件返回行数是否合理,防止误写成笛卡尔积或百万级结果
真正容易被忽略的是:导出对话框里那个「使用自定义 SQL」复选框,默认是不勾选的,而且位置靠前、字体小——一不留神就跳过,然后发现导出内容不对,再回头折腾半天。

















