MySQL - 文章リファレンス

こんにちは、未来のデータベース魔术師たち!今日は、MySQLの文章の魔法の世界に飛び込みます。コードを書いたことがない人も心配しないでください。このチュートリアルの終わりまでに、データベースの魔法をプロのように行使できるようになるでしょう!

MySQL - Statements Reference

データ定義文章

まずは、私たちのデータベース王国の基盤を築くデータ定義文章から始めましょう。これらは、データベースの構造を作成、変更、削除するために使用するコマンドです。

CREATE TABLE

図書館を建てることを想像してください。まず必要なのは書棚ですよね?MySQLでは、私たちの「書棚」はテーブルです。一つ作ってみましょう!

CREATE TABLE books (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
author VARCHAR(50),
publication_year INT
);

この文章は、「books」という名前のテーブルを作成します。以下の4つの列があります:

  • id:各書籍のユニークな識別子
  • title:書籍のタイトル(最大100文字)
  • author:書籍の著者(最大50文字)
  • publication_year:書籍の出版年

ALTER TABLE

あやまり!書籍のジャンルの列を忘れていました。心配しないで、テーブルを変更できます:

ALTER TABLE books
ADD COLUMN genre VARCHAR(30);

これにより、「books」テーブルに新しい列「genre」が追加されます。

DROP TABLE

もしあなたがもうテーブルが必要ないと判断した場合(例えば、電子書籍に切り替える場合)、テーブルを削除できます:

DROP TABLE books;

このコマンドは注意が必要です。テーブルを消すのは、書棚に火を放つようなものです。元に戻すことはできません!

データ操作文章

構造が整ったので、データを入力しましょう!

INSERT

図書館に本を追加します:

INSERT INTO books (title, author, publication_year, genre)
VALUES ('大いなる盖然性', 'F. Scott Fitzgerald', 1925, '古典');

これにより、テーブルに1冊の本が追加されます。一度に複数の本を追加することもできます:

INSERT INTO books (title, author, publication_year, genre)
VALUES
('殺しの本能', 'Harper Lee', 1960, 'フィクション'),
('1984', 'George Orwell', 1949, 'サイエンスフィクション');

SELECT

では、どのような本があるか見てみましょう:

SELECT * FROM books;

これは、「books」テーブルのすべての列(*)を取得します。より具体的に指定することもできます:

SELECT title, author FROM books WHERE publication_year < 1950;

これは、1950年以前に出版された書籍のタイトルと著者のみを取得します。

UPDATE

あやまり!「1984」は実際にはディストピアフィクションです:

UPDATE books
SET genre = 'ディストピアフィクション'
WHERE title = '1984';

これは、「1984」というタイトルの書籍のジャンルを変更します。

DELETE

例えば、1930年以前に出版されたすべての本を削除したい場合:

DELETE FROM books
WHERE publication_year < 1930;

DELETEは注意が必要です。これは永久的です!

トランザクションおよびロック文章

時には、一連の操作を一度に実行するか、全く実行しないようにする必要があります。その際にはトランザクションを使用します。

START TRANSACTION

START TRANSACTION;
INSERT INTO books (title, author, publication_year, genre)
VALUES ('プライドと偏見', 'Jane Austen', 1813, 'ロマンス');
UPDATE books SET publication_year = 1960 WHERE title = '殺しの本能';
COMMIT;

これにより、INSERTおよびUPDATEが一緒に実行されます。エラーが発生すると、どちらも効果ありません。

ROLLBACK

トランザクションの途中で考えを変えた場合:

START TRANSACTION;
DELETE FROM books WHERE publication_year < 1900;
-- あやまり、それではいけない!
ROLLBACK;

ROLLBACKは、START TRANSACTION以降に行われたすべての変更を取消します。

プリペアードステートメント

プリペアードステートメントはレシピのようです。一度設定して、異なるデータで複数回使用します。

PREPARE stmt FROM 'SELECT * FROM books WHERE author = ?';
SET @a = 'George Orwell';
EXECUTE stmt USING @a;

これは、特定の著者の本を探すためのステートメントを準備し、George Orwellに対して実行します。

組合せ文章

組合せ文章は、複数の文章を一组にまとめることができます。しばしばストアドプロシージャや関数で使用されます。

DELIMITER //
CREATE PROCEDURE CountBooks()
BEGIN
DECLARE bookCount INT;
SELECT COUNT(*) INTO bookCount FROM books;
SELECT CONCAT('図書館には ', bookCount, ' 冊の本があります。') AS Message;
END //
DELIMITER ;

CALL CountBooks();

これは、本の数を数え、メッセージを表示するプロシージャを作成します。

ストアドプログラム内の変数

ストアドプログラム内の変数は、一時的に情報を保存する小さな箱のようなものです。

DELIMITER //
CREATE PROCEDURE OldestBook()
BEGIN
DECLARE oldestYear INT;
DECLARE oldestTitle VARCHAR(100);

SELECT MIN(publication_year), title
INTO oldestYear, oldestTitle
FROM books;

SELECT CONCAT('最も古い本は ', oldestTitle, ' で、', oldestYear, '年に出版されました。') AS Message;
END //
DELIMITER ;

CALL OldestBook();

このプロシージャは、最も古い本を見つけて教えてくれます。

MySQLフロー制御文章

フロー制御文章は、コード内で決定を行うのに役立ちます。

DELIMITER //
CREATE PROCEDURE CategoryByYear(IN pub_year INT)
BEGIN
DECLARE category VARCHAR(20);
IF pub_year < 1900 THEN
SET category = '非常に古い';
ELSEIF pub_year < 2000 THEN
SET category = '古典';
ELSE
SET category = '現代';
END IF;
SELECT category AS '書籍カテゴリー';
END //
DELIMITER ;

CALL CategoryByYear(1925);

これは、出版年次に基づいて書籍をカテゴリー分けします。

MySQLカーソル文章

カーソルを使用すると、結果セットを一行ずつイテレートできます。

DELIMITER //
CREATE PROCEDURE ListBooks()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE book_title VARCHAR(100);
DECLARE cur CURSOR FOR SELECT title FROM books;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur;

read_loop: LOOP
FETCH cur INTO book_title;
IF done THEN
LEAVE read_loop;
END IF;
SELECT book_title;
END LOOP;

CLOSE cur;
END //
DELIMITER ;

CALL ListBooks();

このプロシージャは、すべての書籍タイトルを一つずつリストアップします。

MySQL条件処理文章

条件処理文章は、エラーや警告をスムーズに処理するのに役立ちます。

DELIMITER //
CREATE PROCEDURE SafeInsert(IN book_title VARCHAR(100), IN book_author VARCHAR(50))
BEGIN
DECLARE EXIT HANDLER FOR 1062
BEGIN
SELECT 'エラー:重複したエントリ' AS Message;
END;

INSERT INTO books (title, author) VALUES (book_title, book_author);
SELECT '本を正常に追加しました' AS Message;
END //
DELIMITER ;

CALL SafeInsert('大いなる盖然性', 'F. Scott Fitzgerald');

このプロシージャは、本を安全に追加し、重複する本が存在する場合にエラーメッセージを表示します。

そして、ここまででMySQLの文章の世界に初めて踏み込んだあなたです!練習すれば完璧になります。これらのコマンドを試してみてください。間もなく、データベースをプロのように管理できるようになるでしょう!

Credits: Image by storyset