及如何使用這個驚人的工具來增強我們的SQL技能。
圖片來自編輯 |微軟設計師
ChatGPT可以做很多很酷的事情。其中之一是編寫代碼。您只需要給出正確的指示,ChatGPT 將為您完成這項工作。
如果你想學習SQL,ChatGPT是一個很好的入門資源。它可以幫助您使用自然語言創建SQL查詢,解決您可能遇到的任何編碼問題,甚至可以幫助您理解您不理解的預定義查詢。
在本文中,我將概述如何使用 ChatGPT 學習 SQL 并精通這項寶貴的技能。
讓我們一起弄清楚吧!
首先,所以...ChatGPT到底是什么?
ChatGPT是由OpenAI訓練的大型語言模型。它能夠根據收到的輸入生成類似人類的文本,并可用于回答問題和與人進行對話。
所以基本上,我們可以利用它的知識——以及它以一種非常簡單和人性化的方式告訴我們任何事情的能力——來理解SQL并從中學習。
要開始使用 ChatGPT,您需要在此處注冊一個帳戶。
注冊 ChatGPT 顯示。
您必須提供您的電子郵件地址和電話號碼才能開始使用 ChatGPT。
啟用 ChatGPT 后,您應該會看到以下顯示:
聊天GPT聊天顯示的屏幕截圖。
在下面的輸入框中,我們可以編寫任何內容來開始與 ChatGPT 交互。由于我會打擾她或他一段時間,我會提前道歉;)
自制動圖。ChatGPT回答我的第一條消息。
所以現在,我們可以開始向ChatGPT詢問任何事情。我將專注于學習SQL。通過使用 ChatGPT,我們可以要求 5 件主要事情來提高我們的 SQL 技能。
當崩潰到一種新的編程語言時,我們通常對每個命令都有很多疑問和困惑。ChatGPT 可以通過簡單的解釋幫助我們理解任何命令,并根據我們的要求向我們提供盡可能多的用法示例。
讓我們從 SQL 中最基本的東西開始——命令。SELECT
簡要解釋一下什么是命令以及如何使用它的示例SELECT
ChatGPT 回答了一個解釋命令的簡短答案,并給出了最基本的示例:選擇 * FROMSELECT
ChatGPT 聊天的屏幕截圖。
但是,我可以進一步請求命令。SELECT
向我解釋什么是命令以及一些演示如何使用它的示例SELECT
如下圖所示,ChatGPT 解釋了該命令的基礎知識,并向我們提供了一些用法示例。
ChatGPT 聊天的屏幕截圖。給出更多 SELECT 命令的示例。
您可以嘗試詢問任何您能想到的命令,例如更具挑戰性的命令,例如 .HAVING
給我一些SQL中HAVE命令的例子
ChatGPT 用幾個例子來回答,如下所示:
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
);
當然,我們可以不斷要求更多的解釋和更多的例子。嘗試您能想到的任何其他命令,它會立即回答。
我可以詢問如何執行特定操作,ChatGPT 會讓我知道我需要使用什么命令。
我想合并兩個表,我應該在SQL中使用什么命令?
ChatGPT 回答我使用任何連接命令,如下圖所示。
ChatGPT 聊天的屏幕截圖。解釋如何合并兩個表。
但是,我知道當行在某些特定列中具有重合的值時,我只想連接兩個表。在這種情況下,我可以再次詢問并了解我應該使用什么命令。
我想連接兩個表,只獲取在某些給定列中具有重合值的數據。
因此,ChatGPT 讓我知道只有允許我這樣做,如下圖所示:INNER JOIN
ChatGPT 聊天的屏幕截圖。解釋如何合并兩個表并僅保留重合的值。
它給了我相應的查詢:
SELECT
*
FROM table1
INNER JOIN table2
ON table1.id=table2.id
AND table1.name=table2.name;
現在讓我們想象一下,我知道我需要什么結果,但我不知道如何制定該查詢。 我可以簡單地解釋我想對 ChatGPT 做什么,它會給我一個可以遵循的結構。 因此,我可以按照 ChatGPT 的示例學習如何構建查詢。
向我解釋如何創建一個SQL查詢,該查詢計算歐洲最昂貴的城市,其中包含每個城市中不同項目的價格。
ChatGPT 立即回答我,如下圖所示。
ChatGPT 給了我一個查詢示例,并解釋了這個查詢的作用。
現在讓我們想象一下,你可以從一個生病的同事那里做工作,但你不理解他的查詢——有些人以混亂的方式編碼,或者你可能只是覺得懶惰,不想浪費很多時間理解別人的查詢。
這很正常 - 您可以使用ChatGPT來避免此任務。我們可以很容易地要求 ChatGPT 解釋給定的查詢。
假設我們想了解以下查詢的作用:
以下查詢有什么作用:[在此處插入查詢]
ChatGPT只是立即回答:
ChatGPT 聊天的屏幕截圖。它解釋了給定查詢的作用。
如上圖所示,ChatGPT 逐步解釋了此查詢的作用。
首先,它解釋了所有包含的子查詢及其作用。然后,它解釋了最終查詢以及它如何使用前面的子查詢來合并所有數據。 我們甚至可以在給定的子查詢中要求更詳細的解釋。
你能進一步解釋一下上一個查詢的第二個子查詢的作用嗎?
ChatGPT 聊天的屏幕截圖。它進一步解釋了給定查詢的第二個子查詢的作用。
正如您在上圖中觀察到的那樣,ChatGPT 詳細解釋了第二個子查詢的執行方式。
你可以用任何你能想象到的查詢來挑戰 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使用不當導致。
mysql5.0以上版本中存在一個重要的系統數據庫information_schema,通過此數據庫可訪問mysql中存在的數據庫名、表名、字段名等元數據。information_schema中有三個表成為了sql注入構造的關鍵。
SQL注入常用SQL函數
// 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語句參數采用單引號閉合。
對于字符類型注入,通常先嘗試單引號,判斷單引號是否被拼接到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執行導致報錯無法顯示信息
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語句單行注釋后需有空格,+會被解碼為空格。
主要用于定位后端sql字段在前端顯示的位置,采用聯合查詢的方式確定。注意聯合查詢前后字段需一致,這也就是我們為什么做第二步的原因。
通過下圖可知,后端查詢并回顯的字段位置為2,3位。
聯合查詢后的字段可以隨意,本次采用的是數字1到4直觀方便。
group_concat()函數用于將查詢結果拼接為字符串。
sqlmap兼容python2和python3,可以自動化檢測各類注入和幾乎所有數據庫類型。
-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
//采用#不會導致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);
//錯誤寫法
<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>
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>
slqmap手冊:https://octobug.gitbooks.io/sqlmap-wiki-zhcn/content/Users-manual/Introduction.html
sql注入詳解:http://sqlwiki.radare.cn/#/
*請認真填寫需求信息,我們會在24小時內與您取得聯系。