草庐IT

如何利用ChatGPT自动生成SQL语句

前端达人 2024-01-09 原文

作为一名开发者,你可能已经使用过自然语言处理(NLP)及其可能彻底改变我们与技术互动的方式。由OpenAI提供支持的文本到SQL工具是一种强大的方法,可以从自然语言文本中生成SQL语句。在本博客文章中,我们将探讨七个创造性和不寻常的示例,展示如何使用ChatGPT生成SQL语句。

1、修改现有查询语句

下面是一个示例,展示如何向Text-to-SQL提供一个现有的复杂SQL查询,并要求它进行修改:从现有的SQL查询中移除特定的结果

提示词:

Take the attached SQL query and remove all results that happened in the first quarter of 2021.

SELECT product_name, SUM(quantity) AS total_quantity_sold FROM sales WHERE date BETWEEN '2021-01-01' AND '2021-12-31' GROUP BY product_name ORDER BY total_quantity_sold DESC;”

对应的翻译(使用中文也能返回对应的预期):

请修改以下SQL语句,删除2021年第一季度的数据,并返回其他季度的数据

SELECT product_name, SUM(quantity) AS total_quantity_sold FROM sales WHERE date BETWEEN '2021-01-01' AND '2021-12-31' GROUP BY product_name ORDER BY total_quantity_sold DESC;”

生成的SQL语句:

SELECT product_name, SUM(quantity) AS total_quantity_sold
FROM sales WHERE date BETWEEN '2021-04-01' AND '2021-12-31'
GROUP BY product_name
ORDER BY total_quantity_sold DESC;

在这个例子中,我们提供了一个现有的SQL查询,该查询检索2021年全年度每种产品的总销售量。Text-to-SQL修改了SQL语句,通过更改WHERE子句中的日期范围来排除2021年第一季度的结果。

2.不仅是英文!也可以使用中文

您可以将任何语言的自然语言输入生成 SQL 查询。以下是使用中文的例子

提示词:

展示每个分类中最近一个月的产品销售数量,同时显示分类的名称和最后一次销售的日期。

生成的SQL语句:

SELECT categories.category_name, COUNT(*) AS sales_count, MAX(orders.order_date) AS last_sale_date
FROM categories
JOIN products ON categories.category_id = products.category_id
JOIN order_details ON products.product_id = order_details.product_id
JOIN orders ON order_details.order_id = orders.order_id
WHERE orders.order_date BETWEEN DATEADD(MONTH, -1, GETDATE()) AND GETDATE()
GROUP BY categories.category_name

该示例演示了Text-to-SQL的灵活性,它能够从任何语言的自然语言输入生成SQL查询。虽然文本提示是用汉语语编写的,但Text-to-SQL仍能理解并将查询转换为有效的SQL语句。该查询检索最近一个月内每个产品分类别的销售数量,以及分类别名称和最后一次销售日期。查询连接categories、products、order_details和orders表,并使用聚合函数计算每个分类别的销售数量和最后一次销售日期。结果被过滤为仅包括最近一个月的订单,并按分类别名称分组。

3、在现有的SQL查询中添加过滤

提示词

Take the attached SQL query and add a filter to show only the top 10 customers by totalspending who live in California.

“SELECT customer_name, SUM(order_total) AS total_spent FROM orders GROUP BY customer_name ORDER BY total_spent DESC;”

对应的翻译(使用中文也能返回对应的预期):

请对附加的SQL查询添加筛选条件,仅显示在加州居住且消费总额排名前10位的客户。

“SELECT customer_name, SUM(order_total) AS total_spent FROM orders GROUP BY customer_name ORDER BY total_spent DESC;”

生成的SQL语句:

SELECT customer_name, SUM(order_total) 
AS total_spent FROM orders JOIN customers 
ON orders.customer_id = customers.customer_id 
WHERE state = 'California' 
GROUP BY customer_name 
ORDER BY total_spent DESC LIMIT 10;

本示例提供了一个现有的SQL查询,用于检索每个客户的消费总额。使用Text-to-SQL,我们可以修改SQL语句,添加一个筛选条件,仅显示住在加利福尼亚州的前10位客户。通过连接订单和客户表,并添加一个筛选条件,按州过滤,我们可以只检索住在加利福尼亚州的客户,然后通过消费总额将结果限制为前10位。

4、提供数据库结构,生成查询

提示词

“This is my Schema
CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  customer_name VARCHAR(50),
  address VARCHAR(100),
  city VARCHAR(50),
  state VARCHAR(50),
  zip_code VARCHAR(10)
);
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  order_date DATE,
  customer_id INT,
  order_total DECIMAL(10,2),
  FOREIGN KEY (customer_id) REFERENCES customers (customer_id)
);

CREATE TABLE order_details (
  order_id INT,
  product_name VARCHAR(50),
  quantity INT,
  price DECIMAL(10,2),
  PRIMARY KEY (order_id, product_name),
  FOREIGN KEY (order_id) REFERENCES orders (order_id)
);

Write a SQL statement that retrieves the customer name,
order date, product name, and quantity for all orders
where the order total is greater than $1,000 and
the product name contains the word "chair".

对应的翻译(使用中文也能返回对应的预期):

“这是我的数据库结构
CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  customer_name VARCHAR(50),
  address VARCHAR(100),
  city VARCHAR(50),
  state VARCHAR(50),
  zip_code VARCHAR(10)
);
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  order_date DATE,
  customer_id INT,
  order_total DECIMAL(10,2),
  FOREIGN KEY (customer_id) REFERENCES customers (customer_id)
);

CREATE TABLE order_details (
  order_id INT,
  product_name VARCHAR(50),
  quantity INT,
  price DECIMAL(10,2),
  PRIMARY KEY (order_id, product_name),
  FOREIGN KEY (order_id) REFERENCES orders (order_id)
);

编写一条SQL语句,检索所有订单中客户名称、订单日期、产品名称和数量,
其中订单总额大于$1,000且产品名称包含单词“chair”。

生成的SQL语句:

SELECT customers.customer_name, orders.order_date, order_details.product_name, order_details.quantity
FROM customers
JOIN orders ON customers.customer_id = orders.customer_id
JOIN order_details ON orders.order_id = order_details.order_id
WHERE orders.order_total > 1000 AND order_details.product_name LIKE '%chair%';

在这个例子中,我们提供了数据库模式,并要求Text-to-SQL编写一条SQL语句,检索所有订单中客户名称、订单日期、产品名称和数量,其中订单总额大于$1,000且产品名称包含单词“chair”。利用数据库模式,Text-to-SQL可以确定客户、订单和订单细节表之间的关系,并编写一条SQL语句,连接这些表并检索所需的数据。

5. 按日期范围过滤数据

提示词

Show me all orders between January 1, 2022 and March 1, 2022.

对应的翻译(使用中文也能返回对应的预期):

显示 2022 年 1 月 1 日至 2022 年 3 月 1 日之间的所有订单。

生成的SQL语句:

SELECT * FROM orders WHERE order_date BETWEEN '2022-01-01' AND '2022-03-01';

这个例子展示了如何使用Text-to-SQL生成一个按照特定日期范围筛选数据的SQL语句。在这个例子中,SQL语句检索2022年1月1日至2022年3月1日之间下的所有订单。订单表包含了每个订单的信息,包括订单日期、客户名称和产品信息。

6. 不仅仅是 SELECT - 还可以Update

提示词

Update the price of all products in the electronics category by 10%.

对应的翻译(使用中文也能返回对应的预期):

使用 SQL 更新电子产品分类是electronics的价格,并将价格提高10%。

生成的SQL语句:

UPDATE products SET price = price * 1.1 WHERE category = 'electronics';

这个例子展示了如何使用Text-to-SQL生成一个更新表中数据的SQL语句。在这个例子中,SQL语句更新电子产品分类中所有产品的价格,并提高价格的百分比为10%。通过在WHERE子句中指定分类,我们可以只针对需要更新的产品进行更新。

成用于报表查询使用的 SQL 查询语句

提示词

Generate a SQL query to retrieve data for a custom report that shows the total revenue for each product category in the past quarter,along with the number of orders and the average order value.The data should be sorted by total revenue in descending order.

对应的翻译(使用中文也能返回对应的预期):

请生成一条SQL查询语句,检索过去一个季度每个产品类别的总收入、订单数和平均订单价值,数据应按总收入降序排序,以用于自定义报告。

生成的SQL语句:

SELECT categories.category_name, 
SUM(order_details.quantity * order_details.price) AS total_revenue, 
COUNT(DISTINCT orders.order_id) AS num_orders, 
AVG(orders.order_total) AS avg_order_value
FROM categories 
JOIN products ON categories.category_id = products.category_id 
JOIN order_details ON products.product_id = order_details.product_id 
JOIN orders ON order_details.order_id = orders.order_id 
WHERE orders.order_date BETWEEN DATEADD(QUARTER, -1, GETDATE()) AND GETDATE()
GROUP BY categories.category_name 
ORDER BY total_revenue DESC;

在本示例中,我们请求Text-to-SQL生成一个SQL查询,以检索用于自定义报告的数据,该报告显示过去一个季度每个产品类别的总收入、订单数和平均订单价值。该查询连接categories、products、order_details和orders表,并使用聚合函数计算每个类别的总收入、订单数和平均订单价值。结果被过滤为仅包括过去季度的订单,并按总收入降序排序。这个查询可以用于生成一个自定义报告,帮助企业跟踪其按产品类别的销售情况。

8. 将其用于代码审查——了解复杂查询的功能

提示词

Explain in natural language what this SQL query does:
SELECT department_name, AVG(salary) AS avg_salary, COUNT(*) AS num_employees 
FROM employees 
JOIN departments ON employees.department_id = departments.department_id 
GROUP BY department_name 
HAVING AVG(salary) > 50000 AND COUNT(*) > 10 
ORDER BY avg_salary DESC;

对应的翻译(使用中文也能返回对应的预期):

请使用通俗易懂的语言解释以下SQL查询的作用:
SELECT department_name, AVG(salary) AS avg_salary, COUNT(*) AS num_employees 
FROM employees 
JOIN departments ON employees.department_id = departments.department_id 
GROUP BY department_name 
HAVING AVG(salary) > 50000 AND COUNT(*) > 10 
ORDER BY avg_salary DESC;

执行后的结果

这个 SQL 查询从 employees 和 departments 表中检索出员工的薪资和部门名称。它使用 JOIN 子句将两个表连接起来,以便将相应的员工分配到其所在的部门。使用 GROUP BY 子句按部门分组,计算每个部门的平均薪资和员工数量。使用 HAVING 子句过滤掉平均薪资小于 50000 和员工数量少于 10 的部门。最后,使用 ORDER BY 子句将结果按平均薪资降序排序,以便更容易看到薪资最高的部门。这个查询可以帮助管理层了解每个部门的平均薪资和规模,以便做出更好的管理决策。

结束

Text-to-SQL 是一种强大的工具,不仅可以将自然语言文本转换成 SQL 语句,还可以修改现有的 SQL 查询。

今天的分享就到这里,感谢你的阅读,希望能够帮助到你,文章创作不易,如果你喜欢我的分享,别忘了点赞转发,让更多有需要的人看到,最后别忘记关注「前端达人」,你的支持将是我分享最大的动力,后续我会持续输出更多内容,敬请期待。

原文:
https://www.eversql.com/7-unusual-uses-of-chat-gpt-for-text-to-sql-and-sql-queries/

作者:Oded Valin

非直接翻译,有自行改编和添加部分,翻译水平有限,难免有疏漏,欢迎指正

有关如何利用ChatGPT自动生成SQL语句的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  6. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  7. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  8. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  9. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  10. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

随机推荐