作为一名开发者,你可能已经使用过自然语言处理(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_soldFROM sales WHERE date BETWEEN '2021-04-01' AND '2021-12-31'GROUP BY product_nameORDER 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_dateFROM categoriesJOIN products ON categories.category_id = products.category_idJOIN order_details ON products.product_id = order_details.product_idJOIN orders ON order_details.order_id = orders.order_idWHERE 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 SchemaCREATE 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 orderswhere the order total is greater than $1,000 andthe 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.quantityFROM customersJOIN orders ON customers.customer_id = orders.customer_idJOIN order_details ON orders.order_id = order_details.order_idWHERE 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_valueFROM 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

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