MySQL - 文章リファレンス
こんにちは、未来のデータベース魔术師たち!今日は、MySQLの文章の魔法の世界に飛び込みます。コードを書いたことがない人も心配しないでください。このチュートリアルの終わりまでに、データベースの魔法をプロのように行使できるようになるでしょう!
データ定義文章
まずは、私たちのデータベース王国の基盤を築くデータ定義文章から始めましょう。これらは、データベースの構造を作成、変更、削除するために使用するコマンドです。
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