整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

使用 ChatGPT 学习 SQL

使用 ChatGPT 学习 SQL

及如何使用这个惊人的工具来增强我们的SQL技能。

图片来自编辑 |微软设计师

ChatGPT可以做很多很酷的事情。其中之一是编写代码。您只需要给出正确的指示,ChatGPT 将为您完成这项工作。

如果你想学习SQL,ChatGPT是一个很好的入门资源。它可以帮助您使用自然语言创建SQL查询,解决您可能遇到的任何编码问题,甚至可以帮助您理解您不理解的预定义查询。

在本文中,我将概述如何使用 ChatGPT 学习 SQL 并精通这项宝贵的技能。

让我们一起弄清楚吧!

首先,所以...ChatGPT到底是什么?

ChatGPT是由OpenAI训练的大型语言模型。它能够根据收到的输入生成类似人类的文本,并可用于回答问题和与人进行对话。

所以基本上,我们可以利用它的知识——以及它以一种非常简单和人性化的方式告诉我们任何事情的能力——来理解SQL并从中学习。

#Step 1:设置聊天GPT

要开始使用 ChatGPT,您需要在此处注册一个帐户。



注册 ChatGPT 显示。

您必须提供您的电子邮件地址和电话号码才能开始使用 ChatGPT。

#Step 2:了解如何与 ChatGPT 交互

启用 ChatGPT 后,您应该会看到以下显示:

聊天GPT聊天显示的屏幕截图。
在下面的输入框中,我们可以编写任何内容来开始与 ChatGPT 交互。由于我会打扰她或他一段时间,我会提前道歉;)

自制动图。ChatGPT回答我的第一条消息。

#Step 3:问任何你能想象到的问题——它都会回答你。

所以现在,我们可以开始向ChatGPT询问任何事情。我将专注于学习SQL。通过使用 ChatGPT,我们可以要求 5 件主要事情来提高我们的 SQL 技能。

1. 向我们解释 SQL 中的任何概念或命令

当崩溃到一种新的编程语言时,我们通常对每个命令都有很多疑问和困惑。ChatGPT 可以通过简单的解释帮助我们理解任何命令,并根据我们的要求向我们提供尽可能多的用法示例。

让我们从 SQL 中最基本的东西开始——命令。SELECT

简要解释一下什么是命令以及如何使用它的示例SELECT

ChatGPT 回答了一个解释命令的简短答案,并给出了最基本的示例:选择 * FROMSELECT

ChatGPT 聊天的屏幕截图。

但是,我可以进一步请求命令。SELECT

向我解释什么是命令以及一些演示如何使用它的示例SELECT

如下图所示,ChatGPT 解释了该命令的基础知识,并向我们提供了一些用法示例。

ChatGPT 聊天的屏幕截图。给出更多 SELECT 命令的示例。

您可以尝试询问任何您能想到的命令,例如更具挑战性的命令,例如 .HAVING

给我一些SQL中HAVE命令的例子

ChatGPT 用几个例子来回答,如下所示:

  1. 若要查找收入高于平均工资的所有员工的姓名和薪水,可以使用如下查询:
SELECT 
     name, 
     salary
FROM employees
GROUP BY name
HAVING salary > (SELECT AVG(salary) FROM employees);

2.要查找过去一年中下过10个以上订单的所有客户的姓名,您可以使用这样的查询。

SELECT 
     name 
FROM customers 
WHERE customer_id 
IN 
(
  SELECT customer_id 
  FROM orders 
  WHERE date >=DATEADD(year, -1, GETDATE()) 
  GROUP BY customer_id 
  HAVING COUNT(*) > 10
);

当然,我们可以不断要求更多的解释和更多的例子。尝试您能想到的任何其他命令,它会立即回答。

2. 你可以问如何在SQL中做一些事情,ChatGPT会让你知道要使用什么命令(或命令)。

我可以询问如何执行特定操作,ChatGPT 会让我知道我需要使用什么命令。

我想合并两个表,我应该在SQL中使用什么命令?

ChatGPT 回答我使用任何连接命令,如下图所示。

ChatGPT 聊天的屏幕截图。解释如何合并两个表。

但是,我知道当行在某些特定列中具有重合的值时,我只想连接两个表。在这种情况下,我可以再次询问并了解我应该使用什么命令。

我想连接两个表,只获取在某些给定列中具有重合值的数据。

因此,ChatGPT 让我知道只有允许我这样做,如下图所示:INNER JOIN


ChatGPT 聊天的屏幕截图。解释如何合并两个表并仅保留重合的值。

它给了我相应的查询:

SELECT 
    *
FROM table1
INNER JOIN table2
   ON  table1.id=table2.id
   AND table1.name=table2.name;

3. 您可以要求 ChatGPT 使用自然语言创建查询

现在让我们想象一下,我知道我需要什么结果,但我不知道如何制定该查询。 我可以简单地解释我想对 ChatGPT 做什么,它会给我一个可以遵循的结构。 因此,我可以按照 ChatGPT 的示例学习如何构建查询。

向我解释如何创建一个SQL查询,该查询计算欧洲最昂贵的城市,其中包含每个城市中不同项目的价格。

ChatGPT 立即回答我,如下图所示。


ChatGPT 给了我一个查询示例,并解释了这个查询的作用。

4.您可以询问ChatGPT,它解释了查询的工作原理。

现在让我们想象一下,你可以从一个生病的同事那里做工作,但你不理解他的查询——有些人以混乱的方式编码,或者你可能只是觉得懒惰,不想浪费很多时间理解别人的查询。

这很正常 - 您可以使用ChatGPT来避免此任务。我们可以很容易地要求 ChatGPT 解释给定的查询。

假设我们想了解以下查询的作用:

以下查询有什么作用:[在此处插入查询]

ChatGPT只是立即回答:

ChatGPT 聊天的屏幕截图。它解释了给定查询的作用。

如上图所示,ChatGPT 逐步解释了此查询的作用。

首先,它解释了所有包含的子查询及其作用。然后,它解释了最终查询以及它如何使用前面的子查询来合并所有数据。 我们甚至可以在给定的子查询中要求更详细的解释。

你能进一步解释一下上一个查询的第二个子查询的作用吗?

ChatGPT 聊天的屏幕截图。它进一步解释了给定查询的第二个子查询的作用。

正如您在上图中观察到的那样,ChatGPT 详细解释了第二个子查询的执行方式。

你可以用任何你能想象到的查询来挑战 ChatGPT!

5.您可以要求ChatGPT通过练习来挑战您。

对我来说,ChatGPT 最好的部分是要求一些练习和答案来练习和测试你的技能。它甚至可以告诉你什么时候做得好——或者没有。

你能给我一些练习SQL的练习吗

ChatGPT 的屏幕截图给了我一些练习 SQL 的练习。

现在 ChatGPT 告诉我一些要执行的问题。在这种情况下,我可以尝试解决第一个问题,并询问 ChatGPT 我的解决方案是否正确。

以下查询是否正确与上一个练习的答案正确 [插入查询]

ChatGPT 会回答并写下它是否正确以及为什么。

ChatGPT 回答我编码的查询是否正确的屏幕截图。

我可以要求前面每个示例的正确答案:

你能给我前面练习的正确答案吗?

如下图所示,ChatGPT 将为我提供所有要执行的正确查询。


??
请注意,ChatGPT 提供给我的答案和我提供的要检查的答案是完全不同的。

结论

在当今数据驱动的世界中,SQL是一项宝贵的技能。通过使用 ChatGPT 学习基础知识并练习您的技能,您可以精通 SQL。通过不断的学习和实践,您可以使用此工具继续扩展您的技能并在您的数据职业生涯中实现飞跃。

让我知道 ChatGPT 是否通过其他一些好的功能让您感到惊讶。我会在评论中读到你!:D

数据总是有更好的想法 - 相信它。


原文标题:Using ChatGPT to Learn SQL

原文链接:https://www.kdnuggets.com/2023/04/chatgpt-learn-sql.html

作者:Josep Ferrer

编译:LCR

Javascript无法直接访问SqlServer数据库的,但可以使用浏览器的“执行SQL”功能查询数据库,将查询结果保存在浏览器变量中,然后在Javascript代码中引用这些变量即可。在浏览器的项目管理器中,新建执行SQL步骤,设置好SqlServer数据库连接参数,以及Sql查询语句和引用变量值。

Sqlserver连接参数及查询语句


在Javascript代码输入框中,点击鼠标右键选择Sql查询结果中对应的字段,这样就把Sql查询结果赋值给Javascript变量了。

Javascript引用Sqlserver查询结果


在网页填表步骤中,可直接引用Javascript变量的值。

Javascript变量的应用


提示:如果把Sql语句改为Install,则可以构建把Javascript变量插入到Sqlserver数据库的方案。

背景

京东SRC(Security Response Center)收录大量外部白帽子提交的sql注入漏洞,漏洞发生的原因多为sql语句拼接和Mybatis使用不当导致。

2 手工检测

2.1 前置知识

mysql5.0以上版本中存在一个重要的系统数据库information_schema,通过此数据库可访问mysql中存在的数据库名、表名、字段名等元数据。information_schema中有三个表成为了sql注入构造的关键。

1)infromation_schema.columns:

  • table_schema 数据库名
  • table_name 表名
  • column_name 列名

2)information_schema.tables

  • table_schema 数据库名
  • table_name 表名

3)information_schema.schemata

  • schema_name 数据库名

SQL注入常用SQL函数

  • length(str) :返回字符串str的长度
  • substr(str, pos, len) :将str从pos位置开始截取len长度的字符进行返回。注意这里的pos位置是从1开始的,不是数组的0开始
  • mid(str,pos,len) :跟上面的一样,截取字符串
  • ascii(str) :返回字符串str的最左面字符的ASCII代码值
  • ord(str) :将字符或布尔类型转成ascll码
  • if(a,b,c) :a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0

2.2 注入类型

2.2.1 参数类型分类

  • 整型注入
    例如?id=1,其中id为注入点,类型为int类型。
  • 字符型注入
    例如?id=”1”,其中id为注入点,类型为字符型,要考虑闭合后端sql语句中的引号。

2.2.2 注入方式分类

  • 盲注
  • 布尔盲注:只能从应用返回中推断语句执行后的布尔值。
  • 时间盲注:应用没有明确的回显,只能使用特定的时间函数来判断,例如sleep,benchmark等。
  • 报错注入:应用会显示全部或者部分的报错信息
  • 堆叠注入:有的应用可以加入 ; 后一次执行多条语句
  • 其他

2.3 手动检测步骤(字符型注入为例)

 // sqli vuln code
            Statement statement=con.createStatement();
            String sql="select * from users where username='" + username + "'";
            logger.info(sql);
            ResultSet rs=statement.executeQuery(sql);
// fix code 如果要使用原始jdbc,请采用预编译执行
            String sql="select * from users where username=?";
            PreparedStatement st=con.prepareStatement(sql);

使用未预编译原始jdbc作为demo,注意此demo中sql语句参数采用单引号闭合。

2.3.1 确定注入点

对于字符类型注入,通常先尝试单引号,判断单引号是否被拼接到SQL语句中。推荐使用浏览器扩展harkbar作为手工测试工具。https://chrome.google.com/webstore/detail/hackbar/ginpbkfigcoaokgflihfhhmglmbchinc

正常页面应该显示如下:

admin后加单引号导致无信息回显,原因是后端sql执行报错,说明引号被拼接至SQL语句中

select * from users where username='admin'  #正常sql
select * from users where username='admin'' #admin'被带入sql执行导致报错无法显示信息

2.3.2 判断字段数

mysql中使用order by 进行排序,不仅可以是字段名也可以是字段序号。所以可以用来判断表中字段数,order by 超过字段个数的数字就会报错。

判断字段数

当order by 超过4时会报错,所以此表共四个字段。

后端所执行的sql语句

select * from users where username='admin' order by 1-- '

此处我们将原本username的值admin替换为admin’ order by 1 —+,其中admin后的单引号用于闭合原本sql语句中的前引号,—+用于注释sql语句中的后引号。—后的+号主要作用是提供一个空格,sql语句单行注释后需有空格,+会被解码为空格。

2.3.3 确定回显位置

主要用于定位后端sql字段在前端显示的位置,采用联合查询的方式确定。注意联合查询前后字段需一致,这也就是我们为什么做第二步的原因。

通过下图可知,后端查询并回显的字段位置为2,3位。

联合查询后的字段可以随意,本次采用的是数字1到4直观方便。

2.3.4 利用information_schema库实现注入

group_concat()函数用于将查询结果拼接为字符串。

  • 查看存在数据库

  • 查看当前数据库中的表

  • 查看指定表中字段

  • 利用以上获取信息读取users表中username和password

3 自动化检测

3.1 sqlmap 使用

sqlmap兼容python2和python3,可以自动化检测各类注入和几乎所有数据库类型。

3.1.1 常用命令

-u  可能存在注入的url链接
-r读取http数据包
--data 指定post数据
--cookie 指定cookie
--headers 指定http头 如采用token认证的情况下
--threads 指定线程数
--dbms 指定后端的数据库
--os 指定后端的操作系统类型
--current-user 当前用户
--users 所有用户
--is-dba 是否是dba
--sql-shell 交互式的sqlshell
-p指定可能存在注入点的参数
--dbs 穷举系统存在的数据库
-D指定数据库
--tables 穷举存在的表
-T指定表
--column 穷举字段
-C指定字段
--dump dump数据

直接检测
其中—cookie用于指定cookie,—batch 自动化执行,—dbms指定数据库类型

检测结果

读取系统中存在数据库
—dbs读取当前用户下的数据库

读取指定库下的表
-D java_sec_code —tables

dump users表数据
-D java_sec_code -T users —dump

4 进阶

4.1 Mybatis注入

1)$错误使用导致注入

//采用#不会导致sql注入,mybatis会使用预编译执行
    @Select("select * from users where username=#{username}")
    User findByUserName(@Param("username") String username);
//采用$作为入参可导致sql注入
    @Select("select * from users where username='${username}'")
    List<User> findByUserNameVuln01(@Param("username") String username);

2)模糊查询拼接

//错误写法
  <select id="findByUserNameVuln02" parameterType="String" resultMap="User">
        select * from users where username like '%${_parameter}%'
    </select>

 //正确写法
 <select id="findByUserNameVuln02" parameterType="String" resultMap="User">
        select * from users where username like concat(‘%’,#{_parameter}, ‘%’)  
    </select>

3)order by 注入

order by 后若使用#{}会导致报错,因为#{}默认添加引号会导致找不到字段从而报错。

   //错误写法 
<select id="findByUserNameVuln03" parameterType="String" resultMap="User">
        select * from users
        <if test="order !=null">
            order by ${order} asc
        </if>
    </select>
//正确写法 id指字段id 此表字段共四个 所以id为1-4
    <select id="OrderByUsername" resultMap="User">
        select * from users order by id asc limit 1
    </select>

以上测试均在本地进行,请勿未授权进行渗透测试

5 文章及资料推荐

slqmap手册:https://octobug.gitbooks.io/sqlmap-wiki-zhcn/content/Users-manual/Introduction.html
sql注入详解:http://sqlwiki.radare.cn/#/


作者:罗宇(物流安全小分队)