非エンジニア向け、もう外部エンジニアに頼らなくても出来る！ChatGPTでSQL文を簡単に生成する方法（MariaDB/MySQL編）

この記事では、ChatGPTを使用してMySQLに特化したSQL文を簡単かつ迅速に生成する方法を紹介します。SQL DumpからCREATE文を抽出し、パフォーマンスやSlow Queryの問題に対応する最適なSQL文を作成する方法を学びましょう。これにより、非エンジニアがエンジニアに依頼していた作業を内製化することができます。

人に依頼するしかなく、結果取得まで何時間もかかっていた作業を自分で瞬時に行うことができるようになります。
あわせてデータベースのパフォーマンスが上がらないと言った課題にも対処するための最適化方法もご紹介します。
<img src="https://azure-recipe.kc-cloud.jp/wp-content/uploads/2023/03/https___mariadb.com_wp-content_uploads_2019_11_mariadb-logo_black-transparent.png" alt="" width="790" height="197" class="alignnone size-full wp-image-18843" />

<h2>社外のエンジニアに頼らず、自分でSQL文を生成する方法（準備編）</h2>
この章では、非エンジニアがChatGPTを使うことで、エンジニアに依頼していたSQL文を自分で作れるようになるための手順を紹介します。一度設定が完了してしまえば、以後は<span>自分で効率的にデータベースから必要な情報を取得できるようになります。</span>

<span>本記事ではマーケティング担当者が、アクセス数などの取得をエンジニアに依頼するケースをベースに、具体的には以下の3つのテーブルを使用して説明します。</span>
<ol>
 	<li><strong>articlesテーブル:</strong> 記事に関する情報を格納します。
<ul>
 	<li>article_id: 記事の一意のID</li>
 	<li>title: 記事のタイトル</li>
 	<li>published_date: 記事の公開日</li>
</ul>
</li>
 	<li><strong>page_viewsテーブル:</strong> 記事の閲覧に関する情報を格納します。
<ul>
 	<li>page_view_id: ページビューの一意のID</li>
 	<li>article_id: 閲覧された記事のID</li>
 	<li>user_id: 閲覧したユーザーのID</li>
 	<li>timestamp: 閲覧した日時</li>
</ul>
</li>
 	<li><strong>usersテーブル:</strong> ユーザーに関する情報を格納します。
<ul>
 	<li>user_id: ユーザーの一意のID</li>
 	<li>age: ユーザーの年齢</li>
 	<li>occupation: ユーザーの職業</li>
</ul>
</li>
</ol>
<h3>Step1. <span>SQL Dumpを使ってCREATE文を出力してもらう</span></h3>
MySQLの場合、以下のコマンドを実行してSQL Dumpを取得できます。データの中身を含めずに取得するためにも、必ず --no-data を忘れずつけるように依頼します。
<div class="hcb_wrap">
<pre class="prism undefined-numbers lang-sql" data-lang="SQL"><code>mysqldump -u [username] -p --no-data [database_name] &gt; create_statements.sql</code></pre>
</div>
<h3 class="bg-black rounded-md mb-4">Step2. もらったファイルの中身をChatGPTに入力する</h3>
<div>例えば以下のような文章を付けて、ChatGPTに入力します。<br />
「ChatGPTに適切な文章で依頼することで、必要なSQL文を生成できます。以下にデータベースのテーブル情報を与えます」<br />
「データベースのテーブル情報を与えるので、様々な質問に答えてください。」

```sql
CREATE TABLE page_views (
page_view_id INT AUTO_INCREMENT PRIMARY KEY,
article_id INT NOT NULL,
user_id INT NOT NULL,
timestamp TIMESTAMP NOT NULL,

FOREIGN KEY (article_id) REFERENCES articles(article_id),
FOREIGN KEY (user_id) REFERENCES users(user_id),

INDEX idx_article_id (article_id),
INDEX idx_user_id (user_id),
INDEX idx_timestamp (timestamp)
);
```

<h3>Step3. 簡単なクエリを依頼する</h3>
「<span>page_viewsテーブルに対して、過去1週間の特定の記事（article_id=100）のページビュー数を取得するSQL文を生成してください</span>」

「<span>page_viewsテーブルに対して、過去1ヶ月の上位5件の記事IDを取得するSQL文を生成してください</span>」
といった依頼をChatGPTに対して投げて、結果が正しいかの確認までエンジニアに依頼します。

</div>
<h3>Step4. 実行環境を設定してもらう</h3>
3までの手順が完了したら、十分なセキュリティ対策がされている状態のAdminerやphpMyAdminなどGUI経由でSQLが実行できる環境を用意してもらい、実行します。また、エンジニアにはread onlyアカウントなど、間違って操作しても影響が無い設定をしてもらう必要があります。
<h2>エンジニアに頼らず、自分でSQL文を生成する方法（<span>実践編</span>）</h2>
ここまで完了したら、あとはChatGPTに対して求める情報をお願いするだけです。

以下のように実際取得することがあるであろう内容をベースに紹介します。
<ol>
 	<li>特定の記事がどの時間帯や年齢層に読まれているかを把握し、ターゲット層に合わせたコンテンツ作成やプロモーションを実施できます。</li>
 	<li>記事Aと記事Bの読者層の違いを理解し、異なる層に対して適切な記事を提供することができます。</li>
 	<li>過去のアクセス傾向から人気のあるジャンルを特定し、読者が関心を持つであろう記事を作成することができます。</li>
</ol>
<strong>
「ここ1週間の〇〇という記事がどんな時間帯に読まれているか、どんな年齢層のユーザーに読まれているか」</strong>

```sql
-- 時間帯別のアクセス数
SELECT
    HOUR(timestamp) AS hour,
    COUNT(*) AS view_count
FROM
    page_views
JOIN
    articles ON page_views.article_id = articles.article_id
WHERE
    articles.title = '特定の記事タイトル' AND
    timestamp &gt;= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)
GROUP BY
    hour
ORDER BY
    hour;

-- 年齢層別のアクセス数
SELECT
    users.age,
    COUNT(*) AS view_count
FROM
    page_views
JOIN
    articles ON page_views.article_id = articles.article_id
JOIN
    users ON page_views.user_id = users.user_id
WHERE
    articles.title = '特定の記事タイトル' AND
    timestamp &gt;= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)
GROUP BY
    users.age
ORDER BY
    users.age;
```

<strong>AとBの2つの記事に対して、ユーザーにどんな違いがあるか？</strong>

```sql
-- 記事Aと記事Bのユーザーの違い
SELECT
    users.occupation,
    COUNT(DISTINCT CASE WHEN articles.title = '記事A' THEN page_views.user_id END) AS user_count_article_A,
    COUNT(DISTINCT CASE WHEN articles.title = '記事B' THEN page_views.user_id END) AS user_count_article_B
FROM
    page_views
JOIN
    articles ON page_views.article_id = articles.article_id
JOIN
    users ON page_views.user_id = users.user_id
WHERE
    articles.title IN ('記事A', '記事B')
GROUP BY
    users.occupation
ORDER BY
    users.occupation;
```

過去のアクセス傾向からどんな記事を書けばいいかをデータベースの情報を参考にしたい
```sql
-- アクセス数が多い記事のジャンル
SELECT
    articles.genre,
    COUNT(*) AS view_count
FROM
    page_views
JOIN
    articles ON page_views.article_id = articles.article_id
WHERE
    articles.published_date &gt;= DATE_SUB(CURRENT_DATE, INTERVAL 3 MONTH)
GROUP BY
    articles.genre
ORDER BY
    view_count DESC
LIMIT 5;
```

<h2>ChatGPTと協力することでできること</h2>
上記以外にもChatGPTを活用することで以下のようなことが出来ます。
<h3>パフォーマンスアップ、Slow query対策</h3>
手順としては以下のような流れになりますが、実際にSlow queryやパフォーマンスに問題あるクエリを投げることで、それぞれ具体的に何をしたらいいか教えてくれます。<span>パフォーマンス向上やSlow Query対策を実施することで、データベースの応答速度が改善され、全体のシステムパフォーマンスが向上します。これは、結果としてユーザー体験の向上につながります。</span>
<ol>
 	<li><strong>適切なインデックスを設定する</strong>
<ul>
 	<li>WHERE句やJOIN句で使われるカラムにインデックスを設定して、検索速度を向上させます。</li>
 	<li>MySQLでは、EXPLAINコマンドを使って、クエリの実行計画を調べることができます。</li>
</ul>
</li>
 	<li><strong>必要なカラムのみを取得する</strong>
<ul>
 	<li>SELECT句で必要なカラムだけを指定し、データ転送量を削減します。</li>
 	<li>これにより、クエリのパフォーマンスが向上します。</li>
</ul>
</li>
 	<li><strong>分析対象のデータを絞り込む</strong>
<ul>
 	<li>適切な期間や条件を指定して、処理すべきデータ量を減らします。</li>
 	<li>これにより、クエリの実行時間が短縮されます。</li>
</ul>
</li>
 	<li><strong>集約やソートの処理を効率化する</strong>
<ul>
 	<li>GROUP BY句やORDER BY句を適切に使用して、処理を効率化します。</li>
 	<li>MySQLでは、インデックスを利用したソートや、ファイルソートを避けるように最適化が可能です。</li>
</ul>
</li>
</ol>
<h3>ChatGPTと出来ること</h3>
<span>パフォーマンス向上やSlow Query対策だけでなく、ChatGPTは以下のようなデータベース管理やデータ分析に関するタスクもサポートします。
</span>ChatGPTと協力することで、データベース管理やデータ分析に関するさまざまなタスクを効果的に実行できます。以下に、クエリ生成やパフォーマンス改善以外の用途をいくつか示します。
<ol>
 	<li><strong>データモデリング:
</strong>ChatGPTにデータモデリングのアドバイスを求めることができます。例えば、正規化の適用や適切なデータ型の選択、インデックス設計などについての助言を得ることができます。</li>
 	<li><strong>クエリチューニング: </strong>
既存のSQLクエリのパフォーマンスを向上させるために、ChatGPTにアドバイスを求めることができます。例えば、サブクエリをJOINに変換する方法や、適切なインデックスの使用などについての指示を得ることができます。</li>
 	<li><strong>データ分析: </strong>
ChatGPTにデータの傾向やパターンについての分析を依頼することができます。例えば、特定の条件下でのデータの分布や、異常値の検出、相関関係の特定などについての分析を行ってもらうことができます。</li>
 	<li><strong>データベースの最適化:</strong>
データベース全体のパフォーマンスや効率を向上させるための最適化方法について、ChatGPTにアドバイスを求めることができます。例えば、ストレージエンジンの選択や、パーティショニングの設計、キャッシュ設定などについての提案を得ることができます。</li>
 	<li><strong>トラブルシューティング:</strong>
データベースに関連する問題やエラーが発生した場合、ChatGPTに原因と解決策を尋ねることができます。例えば、ロックやデッドロックの解決方法、データの整合性問題の修正方法などについてのアドバイスを受けることができます。</li>
 	<li><strong>ドキュメント生成:</strong>
ChatGPTにデータベースやデータモデルのドキュメントを生成してもらうことができます。適切な説明や図表を含むドキュメントを生成することで、データベース管理や開発の効率を向上させることができます。</li>
 	<li><strong>データセキュリティ: </strong>
ChatGPTにデータベースのセキュリティ対策についてのアドバイスを求めることができます。例えば、アクセス権限の設定やデータ暗号化、監査ログの設定などについての提案を得ることができます。</li>
 	<li><strong>バックアップとリカバリ:</strong>
データベースのバックアップ戦略やリカバリ手順について、ChatGPTに指南を求めることができます。定期的なバックアップのスケジュール設定や、異常発生時のリカバリ方法に関する助言を得ることができます。</li>
 	<li><strong>データベースマイグレーション:</strong>
異なるデータベースシステムへの移行に関するアドバイスや手順を、ChatGPTに尋ねることができます。データ変換やスキーマ変更、移行後のテストや検証方法などについての情報を提供してもらえます。</li>
 	<li><strong>学習リソース:</strong>
データベース管理やデータ分析のスキルを向上させたい場合、ChatGPTにおすすめの学習リソースやトピックを尋ねることができます。書籍、オンラインコース、チュートリアル、ブログ記事など、適切なリソースを提案してもらえます。</li>
</ol>
<span>これらのタスクをChatGPTと協力して取り組むことで、データベース管理やデータ分析に関連する作業の効率や品質を向上させることができます。また、様々な問題や課題に対して迅速かつ適切な解決策を提案してもらえることで、業務の円滑化にも寄与します。</span>
<h2>まとめ</h2>
この記事を通じて、SQL DumpからCREATE文を出力し、ChatGPTを利用してMySQLに特化したSQL文を作成する手順や、パフォーマンス向上やSlow Query対策のためのSQL文の最適化方法について紹介しました。これらの知識を活用して、データベース管理の効率を向上させ、より効果的な活動が実施できます。

最後に、ChatGPTのようなAI技術を活用することで、非技術者もデータベース操作ができるようになり、より多くの人がデータ分析や意思決定に参加できるようになります。これにより、組織全体でデータ駆動の文化が育まれ、より良い意思決定が可能になります。