10週間ウェブ開発講座

第六週

RDBMS

RDBMS (Rlational Database Management System) とは、データをExcelのような表形式で管理するシステムのことです。
現在広く使われているMySQLやOracleなどのデータベースは、この意味でRDBMSであると言えます*1

RDBMSの操作は、通常SQL (Structured Query Language) と呼ばれる言語を介して行います。
SQL には ANSI (American National Standards Institute :米国企画協会) によって制定されている「標準SQL規格」など様々な規格がありますが、
ここでは s-tanno.com にインストールされている MySQL5.0 で使用可能な SQL について扱います。

MySQLクライアント

第五週講座の宿題を提出された方には、MySQLサーバに接続するためのアカウントが作成されています。
ここでは、ユーザ名「y_mahata」、パスワード「password」で接続するものと仮定して説明します。

MySQLサーバに接続するためには、MySQLクライアントを接続する必要があります。
第一週講座でインストールしたPuTTyを起動し、s-tanno.com にログインしてください。
ログイン後、PuTTyに次のように打ち込んでください。

mysql -u y_mahata -ppassword y_mahata_db

すると、次のような画面が表示されます。

mysql_prompt.png

ここで表示されている、「mysql>」に続いて、 SQL を打ち込むことができます。

SQL

SQL について、DDL と DML に分けて説明します。

DDL

DDL (Data Definition Language) とは、データベースの構造を定義するためのコマンドです。
「データベースの構造を定義する」というのは、具体的には次のような操作を指しています。

  • データベース/テーブル を作成する
  • データベース/テーブル を削除する
  • テーブルにカラム(項)を追加する
  • テーブルからカラム(項)を削除する
  • テーブルに制約を追加する
  • テーブルから制約を削除する

本講座では、テーブルの作成/削除のみを扱います。

テーブルの作成

次のような SQL で、テーブルを作成することができます。

DROP TABLE IF EXISTS members;
CREATE TABLE members (
  id            INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name          VARCHAR(255) NOT NULL,
  birthday      DATE,
  department_id INT
) DEFAULT CHARSET = utf8;

DROP TABLE IF EXISTS departments;
CREATE TABLE departments (
  id   INT,
  name VARCHAR(255) NOT NULL
) DEFAULT CHARSET = utf8;

「DROP TABLE IF EXISTS テーブル名;」は、「"テーブル名"で定義されたテーブルがあれば削除する」という意味です。
また、テーブル作成は、大雑把には

CREATE TABLE テーブル名 (
  カラム1  カラム1のデータ型 [カラム1の制約],
  カラム2  カラム2のデータ型 [カラム2の制約],
  ...
  カラムN  カラムNのデータ型 [カラムNの制約]
) テーブル設定;

このように記述します。

先ほどの例では、「members」と「departments」という二つのテーブルを作成しています。

「カラムのデータ型」として指定できる項目は多数存在します。 詳しくは参考資料に譲りますが、先ほどの例で使用しているものについてのみ、ここで紹介します。

型名意味
INT整数であること。
VARCHAR(X)文字列であること。X は格納できる最大文字数。
DATE日付であること。

「カラムの制約」として指定できる項目も多数存在します。
詳しくは参考資料に譲りますが、先ほどの例で使用しているものについてのみ、ここで紹介します。

制約意味
PRIMARY KEY主キー(テーブル内で重複しない値)であること。
AUTO_INCREMENTデータをINSERTする度、カラムの値が自動的に1ずつ増加すること。
NOT NULLレコードがNULL(未定義)にはならないこと。

後の DML の説明でこれらのテーブルを使用します。

DML

DML (Data Manipulation Language) とは、データベース内のデータを操作するためのコマンドです。
「データベース内のデータを操作する」というのは、具体的には次のような操作を指しています。

  • データを検索する - SELECT
  • データを挿入する - INSERT
  • データを更新する - UPDATE
  • データを削除する - DELETE

それぞれの操作について次から説明します*2

データを検索する - SELECT

次のような SQL を記述します。
「SELECT 検索したいカラム名 FROM テーブル名 (WHERE 検索条件) (LIMIT 最大検索件数)」

「()」でくくられている部分は必須ではない項目です。
また、「*」は「全てのカラム」を意味します。

mysql> SELECT * FROM members;
+----+----------+------------+---------------+
| id | name     | birthday   | department_id |
+----+----------+------------+---------------+
|  1 | y-mahata | 1983-02-16 |             1 |
|  2 | y-geshi  | 1983-01-29 |             2 |
|  3 | s-tanno  | NULL       |             3 |
|  4 | usapon   | NULL       |             4 |
+----+----------+------------+---------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM members WHERE id = 1;
+----+----------+------------+---------------+
| id | name     | birthday   | department_id |
+----+----------+------------+---------------+
|  1 | y-mahata | 1983-02-16 |             1 |
+----+----------+------------+---------------+
1 row in set (0.35 sec)
mysql> SELECT id, name FROM departments LIMIT 1;
+------+-----------------------+
| id   | name                  |
+------+-----------------------+
|    1 | ディレクトリ部        |
+------+-----------------------+
1 row in set (0.00 sec)

ここでは詳しくは扱いませんが、複数のテーブルを同時に扱いたい場合があります。
その場合は結合(join)という機能を使います。

次の SQL は結合のサンプルです。
membersテーブルとdepartmentsテーブルを併せて表示しています。

mysql> SELECT * FROM members INNER JOIN departments ON members.department_id = departments.id;
+----+----------+------------+---------------+------+-----------------------+
| id | name     | birthday   | department_id | id   | name                  |
+----+----------+------------+---------------+------+-----------------------+
|  1 | y-mahata | 1983-02-16 |             1 |    1 | ディレクトリ部        |
|  2 | y-geshi  | 1983-01-29 |             2 |    2 | 美女部                |
|  3 | s-tanno  | NULL       |             3 |    3 | 神部                  |
|  4 | usapon   | NULL       |             4 |    4 | 漫画部                |
+----+----------+------------+---------------+------+-----------------------+

データを挿入する - INSERT

次のような SQL を記述します。
「INSERT INTO テーブル名 (カラム1, カラム2, ..., カラムN) VALUES (カラム1に対応する値, カラム2に対応する値, ..., カラムNに対応する値, )」

mysql> INSERT INTO departments (id, name) VALUES (1, 'ディレクトリ部');
mysql> INSERT INTO departments (id, name) VALUES (2, '美女部');
mysql> INSERT INTO departments (id, name) VALUES (3, '神部');
mysql> INSERT INTO departments (id, name) VALUES (4, '漫画部');

mysql> INSERT INTO members (name, birthday, department_id) VALUES ('y-mahata', '1983-02-16', 1);
mysql> INSERT INTO members (name, birthday, department_id) VALUES ('y-geshi', '1983-01-29', 2);
mysql> INSERT INTO members (name, department_id) VALUES ('s-tanno', 3);
mysql> INSERT INTO members (name, department_id) VALUES ('usapon', 4);

データを更新する - UPDATE

次のような SQL を記述します。
「UPDATE テーブル名 SET カラム名 = 新しい値 (WHERE 検索条件)」

「()」でくくられている部分は必須ではない項目です。
ただし、多くの UPDATE は検索条件を付けた上で実行されます*3

mysql> SELECT id FROM members WHERE name = 'usapon';
+----+
| id |
+----+
|  4 |
+----+
1 row in set (0.00 sec)

mysql> UPDATE members SET name = 'usami' WHERE id = 4;

データを削除する - DELETE

次のような SQL を記述します。
「DELETE FROM テーブル名 (WHERE 検索条件)」

「()」でくくられている部分は必須ではない項目です。
ただし、多くの DELETE は検索条件を付けた上で実行されます*4

mysql> DELETE FROM members WHERE id = 1;

落ち穂拾い

DDL でも DML でもないコマンドで、便利なものをいくつか紹介します。

  • describe テーブル名; => テーブル定義を表示します。
  • show create table テーブル名; => テーブル定義をより詳細に表示します。
  • show tables; => テーブル一覧を表示します。

実際にコマンドを打ち、表示される内容を確かめてみてください。

宿題

あなたが所属する企業を表現するテーブル群を作成してください。
おそらく、次のようなテーブルが必要になるはずです。

  • 従業員テーブル
  • 事業部テーブル
  • 事業所テーブル
  • 役職テーブル
  • (その他)

テーブル群の作成後、いくつかサンプルデータを投入した上で、次のデータを参照するSELECT文を作成してください*5

  • xxという名前の社員を従業員テーブルから探し出すSELECT文
  • xxという事業所に所属する社員を探し出すSELECT文
  • xxという名前の社員が所属する事業部を探し出すSELECT文

テーブル群を作成するために書いた「CREATE TABLE」文と、それぞれの「SELECT」文を「6th_week_homework.html」というファイルにまとめ、
http://y-mahata.s-tanno.com/6th_week_homework.html で参照可能な場所に置いてください(URL中の y-mahata の箇所は自分のIDに置き換えてください)。

参考資料


*1 RDBMSの定義は難しく、しばしば議論の対象となります。詳しくはWikipediaなどを参照してください。
*2 主なものだけを取り上げます。興味がある場合は、参考資料を参照してください。
*3 付けない場合は全ての行のカラムが変更されます。
*4 付けない場合は全ての行が削除されます。
*5 この宿題をこなすためには、JOIN について調べる必要があるはずです。

添付ファイル: filemysql_prompt.png 125件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-04-28 (火) 18:09:28 (495d)