数据库版ChatGPT?Bytebase SQL chat初体验

1,589 阅读6分钟

背景

大家好,我是来自通信商云公司的两年半后端开发Bill,主打java,大数据,Hadoop,数据库生态开发。最近在调研一些在线的数据库管理工具,比如阿里dms,ninedata等,其中立志做国际化管理工具的bytebase吸引到了我。听说最近该公司出了数据库版的ChatGPT——“SQL chat”,也是第一时间开始了体验,看看这款对话式SQL工具是否能有效提高SQL开发能力。

准备阶段

SQL chat提供了在线网址体验,或者到其github上下载本地部署(需要提前准备nodejs环境)。

在线网址为www.sqlchat.ai/ , 默认已经连接了openai的接口,不用自己填写openai的key和接口地址了,但是如果数据库不支持公网访问其实连接不上,所以最后还是用上了本地部署版本。

通过pull到本地环境,安装pnpm,在.env文件中添加自己的openai申请的api-key以及api接口(大陆用了下图这个接口),命令行启动,即可在本地打开SQL chat页面了。

体验

1.在线版本

在线版本貌似发现有些字符返回出现乱码现象,只是体验了一下对话就没用了。

图片.png

2.本地部署版本

图片.png 打开界面,会发现UI风格很像ChatGPT的页面。左侧通过+号添加数据库实例连接,目前支持MySQL和pg。

通过下拉框切换库的时候,会弹出新的对话框。有可能是以库的元数据作为prompt,去新建会话。一个库下可以新建多个会话,并且支持上下文对话以及恢复上次会话状态。

左下角的齿轮可以打开设置,里面可以配置语言,openai的key以及api地址。

其实懂源码的话,应该可以直接改对话开始时prompt的格式,或者换一个大模型的api接口。

查询语句

在询问库里有哪些表以及哪些数据时,会给出select相关语句。点击播放键还能执行查询,这一点非常好。 图片.png

图片.png

但是执行一些语句时也是会页面崩溃。

图片.png

图片.png

增删改语句

请求新建一个表,可惜这种增删改的语句不能直接在对话里执行了。

图片.png

SQL优化

让chat给出一些SQL优化的建议,还是可以的,不过这应该是openai的能力。

图片.png

自问自答

让chat自己根据当前库表提出一些较难的SQL问题并自己解决,这是它的回答。


好的,以下是一些较难的问题,以及它们的回答:

  1. 如何在不使用 JOIN 的情况下,将两个表中的数据合并在一起?

可以使用 UNION 或 UNION ALL 操作符将两个表中的数据合并在一起。UNION 操作符会去除重复的行,而 UNION ALL 操作符不会去除重复的行。

例如,将 compdfsany 表和 test_table 表中的数据合并在一起,可以使用以下 SQL 语句:

SQL
SELECT id, name, age, address, salary FROM compdfsany
UNION ALL
SELECT c_bigserial, c_varchar, c_integer, c_text, c_money FROM test_table;
  1. 如何在 SQL 中实现递归查询?

可以使用 WITH RECURSIVE 子句实现递归查询。WITH RECURSIVE 子句可以定义一个递归查询的公共表达式,然后在查询中引用该公共表达式。

例如,假设有一个表格包含员工的 ID 和上级 ID,要查询某个员工的所有下属,可以使用以下 SQL 语句:

SQL
WITH RECURSIVE subordinates AS (
  SELECT id, name, age, address, salary
  FROM compdfsany
  WHERE id = 1 -- 假设要查询 ID 为 1 的员工的所有下属
  UNION ALL
  SELECT c.id, c.name, c.age, c.address, c.salary
  FROM compdfsany c
  JOIN subordinates s ON c.id = s."上级 ID"
)
SELECT * FROM subordinates;
  1. 如何在 SQL 中实现分页查询?

可以使用 LIMIT 和 OFFSET 子句实现分页查询。LIMIT 子句用于限制返回的行数,OFFSET 子句用于指定从哪一行开始返回。

例如,要查询 compdfsany 表中的第 11 到 20 行数据,可以使用以下 SQL 语句:

SQL
SELECT * FROM compdfsany
ORDER BY id
LIMIT 10 OFFSET 10;
  1. 如何在 SQL 中实现全文搜索?

可以使用全文搜索引擎,如 PostgreSQL 中的全文搜索引擎,来实现全文搜索。全文搜索引擎可以对文本数据进行分词、索引和搜索,从而实现高效的全文搜索。

例如,要在 compdfsany 表中搜索包含关键词 "John" 的记录,可以使用以下 SQL 语句:

SQL
SELECT * FROM compdfsany
WHERE to_tsvector('english', name || ' ' || address) @@ to_tsquery('english', 'John');
  1. 如何在 SQL 中实现多表关联查询时的性能优化?

可以使用索引、合适的 JOIN 类型、合适的查询顺序等方法来优化多表关联查询的性能。具体的优化方法需要根据具体的查询场景来确定。

例如,如果要查询 compdfsany 表和 test_table 表中的数据,可以使用 INNER JOIN 或 LEFT JOIN,然后根据查询条件添加索引,以提高查询性能。

  1. 如何在 SQL 中实现数据的备份和恢复?

可以使用 PostgreSQL 中的 pg_dump 和 pg_restore 工具来实现数据的备份和恢复。pg_dump 工具可以将数据库中的数据导出为 SQL 文件,pg_restore 工具可以将 SQL 文件中的数据恢复到数据库中。

例如,要备份 compdfsany 表中的数据,可以使用以下命令:

bash
pg_dump -U postgres -t compdfsany -f compdfsany.sql mydb

要恢复数据,可以使用以下命令:

bash
pg_restore -U postgres -d mydb compdfsany.sql
  1. 如何在 SQL 中实现数据的加密和解密?

可以使用 PostgreSQL 中的加密函数,如 pgp_sym_encrypt 和 pgp_sym_decrypt 函数,来实现数据的加密和解密。这些函数可以使用对称加密算法对数据进行加密和解密。

例如,要将 compdfsany 表中的 salary 列进行加密,可以使用以下 SQL 语句:

SQL
UPDATE compdfsany SET salary = pgp_sym_encrypt(salary::text, 'mykey');

要将加密后的数据进行解密,可以使用以下 SQL 语句:

SQL
SELECT pgp_sym_decrypt(salary, 'mykey')::numeric FROM compdfsany;
  1. 如何在 SQL 中实现数据的压缩和解压缩?

可以使用 PostgreSQL 中的压缩函数,如 gzip 和 zlib 函数,来实现数据的压缩和解压缩。这些函数可以使用压缩算法对数据进行压缩和解压缩。

例如,要将 compdfsany 表中的 address 列进行压缩,可以使用以下 SQL 语句:

SQL
UPDATE compdfsany SET address = gzip(address::bytea);

要将压缩后的数据进行解压缩,可以使用以下 SQL 语句:

SQL
SELECT gzip_decompress(address)::text FROM compdfsany;
  1. 如何在 SQL 中实现数据的去重和合并?

可以使用 DISTINCT 关键字和 UNION 或 UNION ALL 操作符来实现数据的去重和合并。DISTINCT 关键字可以去除重复的行,UNION 或 UNION ALL 操作符可以将多个查询结果合并在一起。

例如,要查询 compdfsany 表中不重复的地址,可以使用以下 SQL 语句:

SQL
SELECT DISTINCT address FROM compdfsany;

要将 compdfsany 表和 test_table 表中的数据合并在一起,并去除重复的行,可以使用以下 SQL 语句:

SQL
SELECT id, name, age, address, salary FROM compdfsany
UNION
SELECT c_bigserial, c_varchar, c_integer, c_text, c_money FROM test_table;
  1. 如何在 SQL 中实现数据的转换和格式化?

可以使用 CAST 和 CONVERT 函数来实现数据的转换和格式化。CAST 函数可以将一个数据类型转换为另一个数据类型,CONVERT 函数可以将一个数据类型转换为另一个数据类型,并指定格式。


看的出来支持的SQL语句还是很丰富的。

总结

对话式SQL可能还是用于查询和分析数据时比较实用,如果能在chat里支持执行增删改操作就更好了。