MySQL入門:基本概念と操作を理解するための初心者ガイド

MySQLの基本を学びましょう:データベース、テーブル、キー、SQLコマンド、そしてデータ作成・変更の安全な第一歩。

MySQL入門:基本概念と操作を理解するための初心者ガイド

MySQLは広く使われているオープンソースのリレーショナルデータベースです。WordPressサイト、社内ビジネスツール、SaaSアプリケーション、レポートシステム、そして古くても重要な企業ソフトウェアの背後で動作しています。データベースが初めての方にとって、MySQLは学習に適した選択肢です。なぜなら、データベースにはテーブルが含まれ、テーブルには行が含まれ、SQLは必要なデータを正確に要求するための言語であるという、核となる考え方が明確だからです。

初心者がつまずくのは、たいてい最初のSELECTではありません。問題はメンタルモデルです。スプレッドシートでは、ほとんどのセルにほぼ何でも入力できます。リレーショナルデータベースでは、最初に構造を定義する必要があります。この列は数値、これはテキスト、これは空にできない、この値は別のテーブルの行を指す、といった具合です。この構造は最初は厳しく感じるかもしれませんが、アプリケーションが後でデータを信頼できるようにするものです。


1. リレーショナルデータベース(RDBMS)の核となる概念

具体的なコマンドに入る前に、MySQLがデータを整理するために使用する構造を理解することが不可欠です。MySQLはリレーショナルモデルに従い、定義された関係によってリンクされた論理ユニットにデータを整理します。

データ階層

MySQLのデータは明確な階層で構成されています。

  1. サーバー/インスタンス: すべてのデータを管理し、クライアントリクエストを処理する実行中のソフトウェアプロセス。1台のマシンで複数の独立したサーバーを実行することもできます。
  2. データベース(またはスキーマ): 関連するオブジェクト(テーブル、ビュー、ストアドプロシージャなど)を保持するコンテナ。実際には、1つのアプリケーションまたはプロジェクトは通常、1つの専用データベースを使用します。
  3. テーブル: 実際のデータが存在する主要なストレージユニット。テーブルはスプレッドシートのように構成され、行と列で構成されています。

テーブルの構成要素

データベース構造(スキーマ)を定義するには、テーブルの構成要素を理解することが重要です。

構成要素 定義
列(フィールド) usernamepriceなどの特定のデータ属性を定義します。列は特定のデータ型(例:INTVARCHARDATE)を強制します。 user_id (INT)、product_name (VARCHAR)
行(レコード) テーブル内の単一のデータエントリまたはインスタンス。 1人のユーザーのすべてのデータを含むレコード。
スキーマ テーブル名、列の型、制約を含む、データベース構造の定義または設計図。 usersテーブルの構造を定義する設計図。

キーの重要性

キーは、関係を確立し、データの整合性を保証する特別な列(または列のグループ)です。

  • 主キー(PK): テーブル内のすべての行を一意に識別します。主キーは一意でNULL以外の値でなければなりません。高速なデータ検索に不可欠です。
  • 外部キー(FK): あるテーブルの列で、別のテーブルの主キーを参照します。外部キーはテーブル間の関係を確立し、参照整合性を強制します(例:ブログコメントが対応するブログ投稿なしには存在できないようにする)。

2. MySQLとの対話:構造化照会言語(SQL)

MySQLサーバーと通信するには、テーブルの作成、データの挿入、結果の取得など、SQL(構造化照会言語) を使用する必要があります。

SQLは汎用プログラミング言語ではなく、リレーショナルデータベースのデータ管理専用に設計された宣言型言語です。

宣言型とは、MySQLが結果を得るために取るべきすべての手順ではなく、必要な結果を記述することを意味します。次のように記述すると:

SELECT product_name, price
FROM products
WHERE category = 'Electronics';

MySQLにどのファイルブロックを読み取るか、どのインデックスパスをたどるかを指示しているわけではありません。「このカテゴリの行からこれらの列を取得してください」と言っているのです。MySQLが実行計画を決定します。そのため、テーブル設計とインデックスが後で非常に重要になるのです。それらはMySQLにより良い選択肢を提供します。

SQLコマンドは、基本的な操作のために通常2つの主要なカテゴリに分類されます。

A. データ定義言語(DDL)

DDLコマンドは、データベース構造(スキーマ)を定義するために使用されます。データベースオブジェクトの作成、変更、削除を処理します。

コマンド 目的
CREATE 新しいデータベース、テーブル、またはその他のオブジェクトを構築する。 CREATE TABLE products;
ALTER 既存のオブジェクトの構造を変更する。 ALTER TABLE products ADD COLUMN description VARCHAR(255);
DROP データベースオブジェクト(データ構造)を完全に削除する。 DROP DATABASE old_data;

B. データ操作言語(DML)

DMLコマンドは、データベースオブジェクト(行と列)内に格納された実際のデータを管理するために使用されます。これには、基本的なCRUD(作成、読み取り、更新、削除)操作が含まれます。

コマンド 目的(CRUD)
INSERT 作成:新しいデータ行を追加する。
SELECT 読み取り:データベースからデータを取得する。
UPDATE 更新:既存のデータを変更する。
DELETE 削除:データ行を削除する。

3. 必須のデータベース操作(DDLの実践)

データを保存する前に、データベースとテーブルの構造を定義する必要があります。

ステップ1:データベースの作成

まず、新しいデータベースを作成します。データベース名は明確に、多くの場合、それが提供するアプリケーションを反映した名前にすることをお勧めします。

CREATE DATABASE inventory_management_system;

ステップ2:アクティブなデータベースの選択

作成したら、後続のコマンドでどのデータベース内で作業するかをMySQLに伝える必要があります。

USE inventory_management_system;

ステップ3:テーブルの作成

テーブルを作成するには、列名、データ型、および制約(主キーやNOT NULLなど)を定義する必要があります。

例:productsテーブル

CREATE TABLE products (
    product_id INT PRIMARY KEY AUTO_INCREMENT,
    product_name VARCHAR(100) NOT NULL,
    category VARCHAR(50),
    price DECIMAL(10, 2) NOT NULL,
    stock_quantity INT DEFAULT 0
);

例の重要なポイント:

  • INT PRIMARY KEY AUTO_INCREMENTproduct_idは一意の識別子です。MySQLは新しい行ごとにこの値を自動的にインクリメントします。
  • VARCHAR(100):最大100文字の可変長文字列を格納します。
  • NOT NULL:この列に常に値が必要であることを保証します。
  • DECIMAL(10, 2):金額値を格納します(合計10桁、小数点以下2桁)。

小さくても便利な習慣:テーブル名と列名は簡潔にしましょう。productsordersorder_itemscreated_atは、巧妙な略語よりも保守が容易です。6か月後には、数文字節約することよりも読みやすさを重視するでしょう。

また、データが意味をなすために何が真実でなければならないかを考える必要があります。すべての製品に名前が必要な場合は、NOT NULLを使用します。価格が正確なセントを保持する必要がある場合は、FLOATではなくDECIMALを使用します。行に安定した識別子が必要な場合は、主キーを使用します。これらの選択は表面的なものではありません。不正なデータが静かに侵入するのを防ぎます。

4. 必須のデータ操作(DMLの実践:CRUD)

構造が整ったら、アプリケーションデータを管理するために必要な4つのコア操作を実行できます。

A. 作成:データの挿入(INSERT

productsテーブルに新しい行を追加するには、値を提供する列を指定します。

INSERT INTO products (product_name, category, price, stock_quantity)
VALUES ('Laptop Pro X1', 'Electronics', 1200.00, 50);

INSERT INTO products (product_name, price)
VALUES ('Office Chair Ergonomic', 150.99); -- stock_quantityはデフォルト値(0)を使用

B. 読み取り:データの取得(SELECT

SELECT文は、間違いなく最も強力で頻繁に使用されるコマンドです。特定の条件に基づいてデータを取得します。

-- テーブルからすべての列とすべての行を取得
SELECT * FROM products;

-- 特定の製品の製品名と価格のみを取得
SELECT product_name, price
FROM products
WHERE category = 'Electronics';

-- 在庫が少ない(10未満)製品を取得
SELECT product_id, product_name
FROM products
WHERE stock_quantity < 10
ORDER BY price DESC;

ヒント: 特に本番環境では、パフォーマンスを向上させるために、SELECT *を使用する代わりに、必要な列を常に指定してください(SELECT product_name...)。

初期の練習では、アプリケーションが質問する方法で質問してみてください。

-- 製品一覧ページに何を表示できるか?
SELECT product_id, product_name, price
FROM products
WHERE stock_quantity > 0
ORDER BY product_name;

-- どの製品を補充する必要があるか?
SELECT product_id, product_name, stock_quantity
FROM products
WHERE stock_quantity <= 5
ORDER BY stock_quantity ASC;

ここでSQLが役立つと感じ始めるでしょう。単にテーブルの内容をダンプしているのではありません。保存された行を答えに変えているのです。

C. 更新:既存データの変更(UPDATE

UPDATE文を使用すると、既存の行の値を変更できます。

警告: 常にWHERE句を含めてください。WHERE句を省略すると、テーブルのすべての行が変更されます。

-- 'Laptop Pro X1'の価格を5%上げる
UPDATE products
SET price = price * 1.05
WHERE product_name = 'Laptop Pro X1';

-- 製品ID 2の在庫数を更新
UPDATE products
SET stock_quantity = 25
WHERE product_id = 2;

D. 削除:データの削除(DELETE

DELETE文は、テーブルから行全体を削除します。

警告: UPDATEと同様に、WHERE句を省略すると、テーブルからすべてのレコードが削除され、多くの場合、元に戻せないデータ損失が発生します。

-- 在庫がゼロの製品を削除
DELETE FROM products
WHERE stock_quantity = 0;

-- 主キーで特定の製品を削除(最も安全な方法)
DELETE FROM products
WHERE product_id = 10;

5. 小さな実世界モデル

ほとんどの実際のアプリケーションは、複数のテーブルを使用します。小さな店を想像してみてください。顧客名、製品名、注文日、数量を1つの巨大なテーブルに入れることもできますが、すぐに重複と不整合なデータが発生します。1人の顧客が10回注文した場合、そのメールアドレスを10回入力しますか?製品名が変更された場合、何百もの古い行を更新しますか?

より一般的な設計は、概念を分離します。

CREATE TABLE customers (
    customer_id INT PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(255) NOT NULL,
    full_name VARCHAR(100) NOT NULL
);

CREATE TABLE orders (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    customer_id INT NOT NULL,
    ordered_at DATETIME NOT NULL,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

CREATE TABLE order_items (
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT NOT NULL,
    PRIMARY KEY (order_id, product_id),
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

このレイアウトは重要なことを示しています。顧客は複数の注文を持つことができ、注文は複数の製品を含むことができます。order_itemsテーブルは、注文と製品の間の橋渡し役です。このパターンは、ユーザーとロール、投稿とタグ、請求書と明細項目など、あらゆる場所で見られます。

それらの関係を読み取るには、JOINを使用します。

SELECT
    o.order_id,
    c.email,
    p.product_name,
    oi.quantity
FROM orders AS o
JOIN customers AS c ON c.customer_id = o.customer_id
JOIN order_items AS oi ON oi.order_id = o.order_id
JOIN products AS p ON p.product_id = oi.product_id
WHERE o.order_id = 1001;

結合が最初は奇妙に感じられても心配しないでください。重要な考え方は単純です。各テーブルは1種類のものを格納し、キーを使用すると、より完全な答えが必要なときにそれらを接続できます。

6. 初心者が早期に学ぶべき安全習慣

最も安全なMySQLユーザーは、最も多くの構文を暗記しているユーザーではありません。破壊的なコマンドの前に一時停止するユーザーです。

UPDATEまたはDELETEを実行する前に、最初に一致するSELECTを実行します。

SELECT product_id, product_name
FROM products
WHERE category = 'Discontinued';

結果セットが正しそうなら、変更します。

DELETE FROM products
WHERE category = 'Discontinued';

本番環境では、多くのチームがリスクの高い作業をトランザクションでラップします。

START TRANSACTION;

UPDATE products
SET stock_quantity = 0
WHERE category = 'Seasonal';

-- コミットする前に結果を確認。
SELECT product_id, product_name, stock_quantity
FROM products
WHERE category = 'Seasonal';

COMMIT;

COMMITの前に何かが間違っているように見える場合は、代わりにROLLBACKを使用します。トランザクションは、リレーショナルデータベースが非常に有用であり続ける理由の1つです。関連する変更を一緒に成功または失敗させることができます。

5. まとめと次のステップ

このガイドでは、MySQLリレーショナルモデルの基本的な理解を提供しました。データがデータベースとテーブルに整理され、SQLが管理のための標準言語であることを学びました。4つの必須操作をカバーしました。

操作 SQLコマンド
構造の定義 CREATEALTERDROP
データの作成 INSERT
データの読み取り SELECT
データの更新 UPDATE
データの削除 DELETE

MySQLの旅を続ける

これらの基本を確立したので、実際のアプリケーション開発と管理に不可欠な、より複雑なトピックに取り組む準備ができました。

  1. インストールと設定: MySQLをローカルにインストールし、クライアントツール(MySQL Workbenchやコマンドラインクライアントなど)を使用して接続する方法を学びます。
  2. 高度なクエリ: JOIN操作(複数のテーブルからデータを結合するため)、サブクエリ、集計関数(SUMAVGCOUNT)などの概念を学びます。
  3. セキュリティとユーザー管理: ユーザーの作成、特定の権限の割り当て(GRANT)、データベースインスタンスの保護方法を理解します。
  4. データベースメンテナンス: インデックス作成、パフォーマンス最適化、定期的なバックアップ戦略などの重要なトピックを探求します。