整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          使用 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/#/


          作者:羅宇(物流安全小分隊)


          主站蜘蛛池模板: 波多野结衣精品一区二区三区 | 在线视频一区二区三区三区不卡| 无码国产亚洲日韩国精品视频一区二区三区| 国产精品资源一区二区| 中文字幕一区二区区免| 海角国精产品一区一区三区糖心| 精品无码综合一区| 亚洲AV噜噜一区二区三区| 中文字幕亚洲一区| 精品在线视频一区| 伊人久久大香线蕉AV一区二区 | 国产SUV精品一区二区四| 国产内射999视频一区| 亚洲国产一区二区视频网站| 一本大道在线无码一区| 无码精品国产一区二区三区免费 | 精品女同一区二区三区在线| 日韩精品无码Av一区二区| 国产成人无码精品一区在线观看| 一区二区三区四区精品| 国产人妖视频一区二区| 韩日午夜在线资源一区二区 | 亚洲视频一区在线观看| 国内偷窥一区二区三区视频| 一区二区三区四区电影视频在线观看| 久久蜜桃精品一区二区三区| 中文字幕视频一区| 亚洲一区无码中文字幕乱码| 久久久久人妻精品一区二区三区| 国产免费一区二区视频| 日韩精品乱码AV一区二区| 无码日韩精品一区二区免费暖暖| 日本中文字幕一区二区有码在线| 日韩人妻无码一区二区三区| 99精品国产高清一区二区三区| 伊人色综合一区二区三区| 人妻体体内射精一区二区| 男女久久久国产一区二区三区| 国产精品一区二区久久精品涩爱| 亚洲精品色播一区二区| 精品91一区二区三区|