MySQL - Insert Into Select: 初心者向けの包括ガイド

こんにちは、未来のデータベースの魔法使いさんたち!今日は、MySQLの世界に踏み込む興奮人心的な旅を楽しむことになります。特に「Insert Into Select」ステートメントの強力な機能に焦点を当てます。プログラミングの初心者でも心配ありません。私はあなたの親切なガイドとして、すべてをステップバイステップで説明します。コーヒーを淹れ、一緒に飛び込みましょう!

MySQL - Insert Into Select

MySQLのInsert Into Select ステートメント

本棚を整理していると考えてください。新しい本の山(ソースデータ)があり、すでに整理された棚(ターゲットテーブル)にそれらを追加したいとします。これがMySQLでの「Insert Into Select」ステートメントが行うことです。ソーステーブルからデータをコピーし、別のテーブルに挿入します。

基本的な構文は以下の通りです:

INSERT INTO target_table (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM source_table
WHERE condition;

以下に分解します:

  • INSERT INTO target_table:ここに新しいデータを配置します。
  • (column1, column2, ...):ターゲットテーブルの columns にデータを埋めます。
  • SELECT ...:ここからデータを取得します。
  • FROM source_table:コピー元のテーブルです。
  • WHERE condition:これはオプションですが、コピーする内容をフィルタリングします。

一つのテーブルから別のテーブルに必要なデータを挿入

実際のコードで手を試みましょう。old_booksnew_arrivalsという2つのテーブルがあるとします。old_booksからファンタジーBooksをすべてnew_arrivalsに移動したいとします。

INSERT INTO new_arrivals (title, author, genre)
SELECT title, author, genre
FROM old_books
WHERE genre = 'Fantasy';

この例では:

  • new_arrivalsに挿入し、埋めたいcolumnsを指定します。
  • old_booksから同じcolumnsを選択します。
  • ジャンルが「Fantasy」の本だけを選択します。

このクエリは、old_booksのすべてのファンタジーBooksをnew_arrivalsにコピーします。まるで魔法で新しい棚に本をテレポートするようなものです!

LIMITを使用して行を挿入

時々、すべてを一度に移動したくないときがあります。也许テストをしている、またはスペースが限られているかもしれません。その場合に便利なのがLIMITです。

INSERT INTO bestsellers (title, author, sales)
SELECT title, author, sales
FROM all_books
WHERE sales > 1000000
ORDER BY sales DESC
LIMIT 10;

このクエリは:

  • bestsellersテーブルに挿入します。
  • all_booksから売上が100万を超える本を選択します。
  • 売上で降順に並べ替えます。
  • 上位10件だけを取得します。

これはまるで、最も人気のある本だけを選んで特別な棚に並べるようなものです!

全てのカラムを一つのテーブルから別のテーブルにコピー

時々、すべてをコピーしたいときがあります。すべての詳細をコピーすることもできます。2022年の販売データをアーカイブする場合を考えます:

INSERT INTO sales_archive_2022
SELECT *
FROM current_sales
WHERE YEAR(sale_date) = 2022;

ここで起こっていることは:

  • INSERT INTOの部分でcolumnsを指定していません。
  • SELECT *を使用してすべてのcolumnsを選択しています。
  • 2022年の販売データだけをフィルタリングしています。

まるで2022年の本棚のスナップショットを撮り、新しい場所に完全に再現するようなものです。

クライアントプログラムを使用してINSERT INTO SELECTを実行

MySQLの外でこれを行う方法について話しましょう。Pythonを使用した例を示します。Pythonはデータベース操作に人気のある言語です。

import mysql.connector

# データベースに接続
mydb = mysql.connector.connect(
host="localhost",
user="yourusername",
password="yourpassword",
database="yourdatabase"
)

mycursor = mydb.cursor()

# Our INSERT INTO SELECT query
sql = """
INSERT INTO new_arrivals (title, author, genre)
SELECT title, author, genre
FROM old_books
WHERE genre = 'Fantasy'
"""

# クエリを実行
mycursor.execute(sql)

# 変更をコミット
mydb.commit()

print(mycursor.rowcount, "records inserted.")

このスクリプトは:

  1. データベースに接続します。
  2. キャラクタオブジェクトを生成してデータベースと対話します。
  3. INSERT INTO SELECTクエリを定義します。
  4. クエリを実行します。
  5. 変更をコミットします(非常に重要!)。
  6. 挿入されたレコード数を表示します。

まるでロボットアシスタントが本棚を再配置するようなものです!

結論

それで、みんな!MySQLの「Insert Into Select」の地を旅しました。基本的な概念から実用的な応用まで、すべてをカバーしました。練習は完璧を生みますので、これらのクエリを試してみてください。

以下に、私たちが議論した方法の簡単な参照表を示します:

メソッド 説明
基本的なInsert Into Select 一つのテーブルから別のテーブルにデータをコピー INSERT INTO target SELECT * FROM source
特定のカラムを挿入 特定のカラムだけをコピー INSERT INTO target (col1, col2) SELECT col1, col2 FROM source
条件付き挿入 特定の条件を満たすデータをコピー INSERT INTO target SELECT * FROM source WHERE condition
LIMITを使用した挿入 指定された行数だけをコピー INSERT INTO target SELECT * FROM source LIMIT 10
全てのカラムを挿入 カラムを指定せずに全てをコピー INSERT INTO target SELECT * FROM source
クライアントプログラムを使用 MySQLの外からInsert Into Selectを実行 Pythonの例を参照

快適なクエリを楽しんで、データベースは常に整理整頓された状態を保ちましょう!

Credits: Image by storyset