Windows+Apache+PHP+MySQL(5.0)によるWebアプリケーション

第2章 コマンドプロンプトでのMySQLの操作

 

前へ | 目次へ |次へ  | YCポータルサイト

2.3 データベース・テーブルの操作

 MySQL 4.1以上のバージョンでは、データベース名、テーブル名、フィールド名等データベースの構造を記述する文字に日本語文字コードは使わないことを強く勧めます。

(注)MySQL 4.1以上では、これらのデータベースの構造の記述にはUNICODEのutf-8コードのみが使われるようになりました。
2006年9月時点では、例えばシフトJISコードで記述したフィールド名等はutf-8コードへ変換はされません。入力を拒否されます。
詳細は、 http://www.mysql.gr.jp/frame/modules/bwiki/index.php?cmd=read&page=FAQ#content_1_40を参照してください。

■作成済みのデータベースの一覧表示

 作成済みのデータベースの一覧表示には、「SHOW DATABASES」文を使います。

mysql> SHOW DATABASES;

mysql> SHOW DATABASES;
+--------------------+
| Database      |
+--------------------+
| information_schema |
| mysql        |
| test        |
+--------------------+
3 rows in set (0.00 sec)

mysql>

■データベースの作成

 データベースの作成には、「CREATE DATABASE」文を使います。なお、MySQL 4.1以降はデータベース名に日本語(2バイト文字)コードは使わないようにします。半角の英数字のみの名前とします。

mysql> CREATE DATABASE データベース名;

mysql> CREATE DATABASE db_hanbai_kanri;
Query OK, 1 row affected (0.00 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database      |
+--------------------+
| information_schema |
| db_hanbai_kanri  |
| mysql        |
| test        |
+--------------------+
4 rows in set (0.00 sec)

mysql>

■データベースの削除

 データベースの削除には、「DROP DATABASE」文を使います。

mysql> DROP DATABASE データベース名;

mysql> CREATE DATABASE db_test;
Query OK, 1 row affected (0.00 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database      |
+--------------------+
| information_schema |
| db_hanbai_kanri   |
| db_test       |
| mysql        |
| test        |
+--------------------+
5 rows in set (0.00 sec)

mysql> DROP DATABASE db_test;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database      |
+--------------------+
| information_schema |
| db_hanbai_kanri   |
| mysql        |
| test        |
+--------------------+
4 rows in set (0.02 sec)

mysql>

■利用するデータベースの設定・変更

 利用するデータベースを新たに設定したり、別のデータベースに変更するには「USE」文を使います。

mysql> USE データベース名;

mysql> USE db_hanbai_kanri;
Database changed
mysql>

■テーブルの作成

 テーブルの作成には、SQLコマンドの「CREATE TABLE」文を使います。

 なお、MySQL 4.1以降は、テーブル名、フィールド名は半角英数字のみを使用し、2バイト系の日本語文字は使わないようにします。

mysql> CREATE TABLE テーブル名(フィールド定義);

 フィールドは列あるいはカラムともいいますが、以下フィールドと呼びます。フィールド定義は以下のように記述します。ここでは、オプションを省略した最も単純な例を示します。フィールド名と型の間は半角スペースで区切ります。次のフィールド名の定義に移る場合は半角カンマで区切ります。最後に、主キー(プライマリーキー:PRIMARY KEY)を定義します。フィールド名nはPRIMARY KEYとするフィールド名を記入します。

(
 フィールド名1 型1,
 フィールド名2 型2,
 フィールド名3 型3,
 PRIMARY KEY(フィールド名n)
)

 ここでは、以下のテーブル「tbl_shouhin_hyou」を作成します。

フィールド名 主キー 説明
shouhin_code CHAR(4) 商品コード
shouhin_mei CHAR(16)   商品名
tanka INTEGER   単価

mysql> USE db_hanbai_kanri;
Database changed
mysql> CREATE TABLE tbl_shouhin_hyou
-> (
-> shouhin_code char(4),
-> shouhin_mei  char(16),
-> tanka     integer,
-> primary key(shouhin_code)
-> );
Query OK, 0 rows affected (0.13 sec)

mysql>

■作成済みテーブルの確認

 作成済みのテーブルの一覧表示には、「SHOW TABLES」文を使います。

mysql> SHOW TABLES;

mysql> SHOW TABLES;
+---------------------------+
| Tables_in_db_hanbai_kanri |
+---------------------------+
| tbl_shouhin_hyou      |
+---------------------------+
1 row in set (0.02 sec)

mysql>

■テーブルのフィールド一覧表示

 テーブルのフィールド一覧を表示するには、「SHOW FIELDS FROM」文を使います。

mysql> SHOW FIELDS FROM テーブル名;

mysql> SHOW FIELDS FROM tbl_shouhin_hyou;
+--------------+----------+------+-----+---------+-------+
| Field     | Type   | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+-------+
| shouhin_code | char(4) | NO  | PRI |     |    |
| shouhin_mei | char(16) | YES |   | NULL  |    |
| tanka    | int(11) | YES |   | NULL  |    |
+--------------+----------+------+-----+---------+-------+
3 rows in set (0.41 sec)

mysql>

■テーブルの削除

 テーブルを削除するには、「DROP TABLE IF EXISTS」文を使います。

mysql> DROP TABLE IF EXISTS テーブル名;

mysql> CREATE TABLE tbl_test
  -> (
  -> id INTEGER,
  -> name CHAR(20),
  -> PRIMARY KEY(id)
  -> );
Query OK, 0 rows affected (0.07 sec)

mysql> SHOW TABLES;
+---------------------------+
| Tables_in_db_hanbai_kanri |
+---------------------------+
| tbl_shouhin_hyou     |
| tbl_test         |
+---------------------------+
2 rows in set (0.00 sec)

mysql> DROP TABLE IF EXISTS tbl_test;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+---------------------------+
| Tables_in_db_hanbai_kanri |
+---------------------------+
| tbl_shouhin_hyou      |
+---------------------------+
1 row in set (0.02 sec)


mysql>

■テーブルへのデータ入力

 テーブルへデータを入力するには、SQLコマンドの「INSERT INTO」文を使います。テーブルへデータを入力するとレコードが順次追加されます。レコードは行あるいはロウとも呼ばれますが、以下レコードと呼びます。

mysql> INSERT INTO テーブル名
     (
       フィールド名1,
        フィールド名2,
        :
      )
      VALUES
      (
        値1,
        値2,
        :
      )

 ただし、入力データに日本語(2バイト系文字コード)を使用する場合は、INSERT文を実行する前に、「SET NAMES sjis」を入力する必要があります。
 実際には、USE文でデータベースを選択した直後に一度、「SET NAMES sjis」を入力しておけば十分です。

(注)「SET NAMES 文字コード名」は、クライアントとデータベースサーバ間の文字コードの整合を取るためのSQL文です。ここでは、クライアントとしてWindows OSが提供している「コマンドプロンプト」を使用しているので、「コマンドプロンプト」で入出力に使用されているシフトJISコードで整合をとることとします。

mysql> SET NAMES sjis;
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO tbl_shouhin_hyou
  -> (
  ->  shouhin_code,
  ->  shouhin_mei,
  ->  tanka
  -> )
  -> VALUES
  -> (
  ->  '1001',
  ->  '田舎御膳',
  ->  1000
  -> );
Query OK, 1 row affected (0.07 sec)

mysql>

 ちなみに、「SET NAMES sjis」を入力しないで、上記INSERT文を実施すると、以下のようなエラーメッセージが表示され、正常にデータが入力されません。

mysql> insert into tbl_shouhin_hyou
-> (shouhin_code,
-> shouhin_mei,
-> tanka
-> )
-> values
-> (
-> '1001',
-> '田舎御膳',
-> 1000
-> );
ERROR 1406 (22001): Data too long for column 'shouhin_mei' at row 1

■テーブルの全レコードの一覧表示

 テーブルの全レコードを一覧表示するには、「SELECT * FROM」文を使います。「*」はワイルドカードといい、「全て」を意味します。ここでは、テーブルの全てのフィールドを選択して表示しなさいという意味になります。

mysql> SELECT * FROM テーブル名;

mysql> SELECT * FROM tbl_shouhin_hyou;
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1001     | 田舎御膳  | 1000 |
+--------------+-------------+-------+
1 row in set (0.00 sec)

mysql>

 最初のレコードのデータが正常にテーブルに入力されていることが確認できます。

 ちなみに、ここで一度MySQLクライアントを終了し、再起動し、「SET NAMES sjis」を入力しないで、上記SELECT文を実行すると、以下のように、文字化けし表示されてしまいます。

mysql> USE db_hanbai_kanri;
Database changed
mysql> SELECT * FROM tbl_shouhin_hyou;
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1001     | ナトシヒク戝キ  | 1000 |
+--------------+-------------+-------+
4 rows in set (0.00 sec)

mysql>

■ファイルに記述したSQL文の実行

 INSERT INTO文のような数行にわたるSQL分をコマンドプロンプト(MySQLクライアント)から入力するのはなかなか大変です。そこでSQL文をあらかじめ、テキストファイルに記述しておき、そのファイルをコマンドプロンプトから読み込んで実行する方法があります。「\.」コマンドを使います。

mysql> \. ファイル名

 たとえば、以下のテキストファイルを「insert01.sql」のファイル名で作成し、「D:\mysql\販売管理」フォルダに保存しておきます。「D:\mysql\販売管理」フォルダは、カレントディレクトリです。

テキストファイル「insert01.sql」の内容:

INSERT INTO tbl_shouhin_hyou
   (shouhin_code,shouhin_mei,tanka)
   VALUES ('1002' ,'山の幸御膳',1200);
INSERT INTO tbl_shouhin_hyou
   (shouhin_code,shouhin_mei,tanka)
   VALUES ('1003' ,'海の幸御膳',1400);
INSERT INTO tbl_shouhin_hyou
   (shouhin_code,shouhin_mei,tanka)
   VALUES ('1004' ,'松竹梅御膳',1800);

 テキストファイル「insert01.sql」を読みこんだ実施結果は、次のようになります。

mysql> \. insert01.sql
Query OK, 1 row affected (0.06 sec)

Query OK, 1 row affected (0.03 sec)

Query OK, 1 row affected (0.03 sec)

mysql> SELECT * FROM tbl_shouhin_hyou;
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1001     | 田舎御膳  | 1000 |
| 1002     | 山の幸御膳 | 1200 |
| 1003     | 海の幸御膳 | 1400 |
| 1004     | 松竹梅御膳 | 1800 |
+--------------+-------------+-------+
4 rows in set (0.03 sec)

mysql>

■レコードの修正

 入力済みのレコードの一部のフィールドの値を修正(更新)するには、SQLコマンドの「UPDATE」文を使います。

mysql> UPDATE  テーブル名
       SET    フィールド名1 = 値1,
              フィールド名2 = 値2,
              :
       WHERE 更新条件;

 実行例を以下に示します。

mysql> UPDATE tbl_shouhin_hyou
-> SET shouhin_mei = '地方御前'
-> WHERE shouhin_code = '1001';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> SELECT * FROM tbL_shouhin_hyou;
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1001     | 地方御前  | 1000 |
| 1002     | 山の幸御膳 | 1200 |
| 1003     | 海の幸御膳 | 1400 |
| 1004     | 松竹梅御膳 | 1800 |
+--------------+-------------+-------+
4 rows in set (0.00 sec)

mysql>

■レコードの削除

 入力済みのレコードを削除するには、SQLコマンドの「DELETE」文を使います。

mysql> DELETE FROM  テーブル名
           WHERE  条件式;

 実行例を以下に示します。

mysql> DELETE FROM tbl_shouhin_hyou
-> WHERE shouhin_code = '1004';
Query OK, 1 row affected (0.06 sec)

mysql> SELECT * FROM tbl_shouhin_hyou;
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1001     | 地方御前  | 1000 |
| 1002     | 山の幸御膳 | 1200 |
| 1003     | 海の幸御膳 | 1400 |
+--------------+-------------+-------+
3 rows in set (0.00 sec)

mysql>

 shouhin_codeの値が「1004」のレコードが削除されたのが確認できます。

■レコードの参照

 テーブルに格納したデータ(レコード)を参照(検索、抽出などの表現も使う)する場合には、SQLコマンドの「SELECT」文を使います。SELECT文はもっともよく使うSQLコマンドです。このような操作は問い合わせ(query)とも言います。

SELECT    フィールド名1,フィールド名2,  ・・
FROM     テーブル名
WHERE    条件式
ORDER BY フィールド名;

 いくつかの例を示します。参照するテーブルは、次の「tbl_商品表2」です。

「tbl_shouhin_hyou2」
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1001     | 田舎御膳  | 1000 |
| 1002     | 山の幸御膳 | 1200 |
| 1003     | 海の幸御膳 | 1500 |
| 1004     | 七福神御膳 | 3000 |
| 1005     | 松竹梅御膳 | 2000 |
| 1006     | 鶴亀御膳   | 2500 |
+--------------+-------------+-------+

 テーブルのすべてのフィールドとすべてのレコードのデータを参照する場合は、以下のSELECT文を使います。「*」はワイルドカードですべてのフィールド名を意味します。

mysql> SELECT * FROM tbl_shouhi_hyou2;
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1001     | 田舎御膳  | 1000 |
| 1002     | 山の幸御膳 | 1200 |
| 1003     | 海の幸御膳 | 1500 |
| 1004     | 七福神御膳 | 3000 |
| 1005     | 松竹梅御膳 | 2000 |
| 1006     | 鶴亀御膳   | 2500 |
+--------------+-------------+-------+
6 rows in set (0.02 sec)

mysql>

 一部のフィールド名のみを表示する場合は、次のようなSELECT文を使います。

mysql> SELECT shouhi_code,shouhin_mei FROM tbl_shouhin_hyou2;
+--------------+-------------+
| shouhin_code | shouhin_mei |
+--------------+-------------+
| 1001     | 田舎御膳  |
| 1002     | 山の幸御膳 |
| 1003     | 海の幸御膳 |
| 1004     | 七福神御膳 |
| 1005     | 松竹梅御膳 |
| 1006     | 鶴亀御膳   |
+--------------+-------------+
6 rows in set (0.00 sec)

mysql>

 条件にあったレコードのみを参照(抽出)する場合は、次のようにSELECT文にWHERE句を使います。

mysql> select * from tbl_shouhin_hyou2 where tanka >= 2000;
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1004     | 七福神御膳 | 3000 |
| 1005     | 松竹梅御膳 | 2000 |
| 1006     | 鶴亀御膳   | 2500 |
+--------------+-------------+-------+
3 rows in set (0.02 sec)

mysql>

 条件に「and」を使い、複数の条件を満たすレコードを参照する場合のSELECT文です。

mysql> SELECT shouhin_mei,tanka FROM tbl_shouhin_hyou2
  -> WHERE tanka<1500 and shouhin_code>= '1002';
+-------------+-------+
| shouhin_mei | tanka |
+-------------+-------+
| 山の幸御膳 | 1200 |
+-------------+-------+
1 row in set (0.03 sec)

mysql>

 次に、条件式にあいまい条件や、範囲指定を用いる例を示します。参照するテーブルは、次の「tbl_商品表3」です。

「tbl_shouhin_hyou3」
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1001     | 田舎定食  | 1000 |
| 1002     | 山の幸定食 | 1200 |
| 1003     | 海の幸定食 | 1500 |
| 1004     | 七福神御膳 | 3000 |
| 1005     | 松竹梅御膳 | 2000 |
| 1006     | 鶴亀御膳   | 2500 |
+--------------+-------------+-------+

 文字列の部分一致条件を使う場合は、LIKE演算子とワイルドカード文字「%」(半角)を使います。ワイルドカード文字「%」は0文字以上の任意の文字列を意味します。次の例は末尾が「定食」となる商品名を含むレコードを参照します。いわゆる後方一致検索です。

mysql> SELECT * FROM tbl_shouhin_hyou3
  -> WHERE shouhin_mei LIKE '%定食';
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1001     | 田舎定食  | 1000 |
| 1002     | 山の幸定食 | 1200 |
| 1003     | 海の幸定食 | 1500 |
+--------------+-------------+-------+
3 rows in set (0.03 sec)

mysql>

 前方一致検索の場合は、「LIKE '山%'」のようにします。

mysql> SELECT * FROM tbl_shouhin_hyou3
  -> WHERE shouhin_mei LIKE '山%';
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1002     | 山の幸定食 | 1200 |
+--------------+-------------+-------+
1 row in set (0.00 sec)

mysql>

 商品名に「幸」の文字が含まれるレコードを参照する場合は、「LIKE '%幸%'」とします。

mysql> SELECT * FROM tbl_shouhin_hyou3
  -> WHERE shouhin_mei LIKE '%幸%';
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1002     | 山の幸定食 | 1200 |
| 1003     | 海の幸定食 | 1500 |
+--------------+-------------+-------+
2 rows in set (0.00 sec)

mysql>

 特定の長さの文字列に一致する条件を指定する場合は、ワイルドカード文字「_」(半角のアンダーバー)を使います。冒頭が「鶴亀」で4文字の商品名を含むレコードを参照する場合は、「LIKE '鶴亀_ _'」とします。(「_ _」は2個連続した半角のアンダーバーの意味です。ここでは分かりやすいように、間に半角スペースを挿入していますが、SQL文では、半角スペースは入れません)

mysql> SELECT * FROM tbl_shouhin_hyou3
  -> WHERE shouhin_mei LIKE '鶴亀__';
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1006     | 鶴亀御膳   | 2500 |
+--------------+-------------+-------+
1 row in set (0.00 sec)

mysql>

 いくつかの特定の値に一致する場合の条件式には、IN演算子を使います。「1000」あるいは「1500」のいずれかに一致する場合という条件式は、「IN(1000,1500)」と記述します。

mysql> SELECT shouhin_mei,tanka FROM tbl_shouhin_hyou3
  -
> WHERE tanka IN(1000,1500);
+-------------+-------+
| shouhin_mei | tanka |
+-------------+-------+
| 田舎定食  | 1000 |
| 海の幸定食 | 1500 |
+-------------+-------+
2 rows in set (0.41 sec)

mysql>

 また、2000から2500までの間の任意の値に一致する条件式は、BETWEEN演算子を使います。

mysql> SELECT shouhin_code,shouhin_mei FROM tbl_shouhin_hyou3
  -> WHERE tanka BETWEEN 2000 and 2500;
+--------------+-------------+
| shouhin_code | shouhin_mei |
+--------------+-------------+
| 1005     | 松竹梅御膳 |
| 1006     | 鶴亀御膳  |
+--------------+-------------+
2 rows in set (0.00 sec)

mysql>

■データの並べ替え(ソート)

 あるフィールド名の値に注目してデータの並べ替えを行うには、「ORDER BY」句を使います。次の例は、参照したレコードを単価の値の昇順に並べて表示しています。

mysql> SELECT * FROM tbl_shouhin_hyou2 ORDER BY tanka;
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1001     | 田舎御膳  | 1000 |
| 1002     | 山の幸御膳 | 1200 |
| 1003     | 海の幸御膳 | 1500 |
| 1005     | 松竹梅御膳 | 2000 |
| 1006     | 鶴亀御膳   | 2500 |
| 1004     | 七福神御膳 | 3000 |
+--------------+-------------+-------+
6 rows in set (0.02 sec)

mysql>

 降順に並べ替える場合は、「DESC」オプションを使います。

mysql> SELECT * FROM tbl_shouhin_hyou2 ORDER BY tanka DESC;
+--------------+-------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+-------------+-------+
| 1004     | 七福神御膳 | 3000 |
| 1006     | 鶴亀御膳   | 2500 |
| 1005     | 松竹梅御膳 | 2000 |
| 1003     | 海の幸御膳 | 1500 |
| 1002     | 山の幸御膳 | 1200 |
| 1001     | 田舎御膳  | 1000 |
+--------------+-------------+-------+
6 rows in set (0.00 sec)

mysql>

■集約関数

 参照したレコードの特定のフィールド名に着目して、そのフィールド名の値が数値の場合、最大値、最小値、平均値などの演算を行うことができます。このような演算を行う関数を集約関数あるいは集合関数と呼びます。

 次の例は、「単価」フィールドの平均値を計算しています。

mysql> SELECT AVG(tanka) FROM tbl_shouhin_hyou2;
+------------+
| avg(tanka) |
+------------+
| 1866.6667 |
+------------+
1 row in set (0.03 sec)

mysql>

 参照した(条件にあった)レコード数を計数することもできます。

mysql> SELECT COUNT(*) FROM tbl_shouhin_hyou2;
+----------+
| COUNT(*) |
+----------+
|     6|
+----------+
1 row in set (0.02 sec)

mysql>

 

■グループ化

 あるフィールド名に着目し、その値が同じレコードを部分集合としてグループ化することができます。一般には、その部分集合ごとにある演算を行います。

 次のテーブル「tbl_商品」を参照することとします。

「tbl_shouhin」
+--------------+--------------+----------------+------+
| shouhin_code | hinmoku    | hinmei     | tanka|
+--------------+--------------+----------------+------+
| 110      | せんべい   | 塩せんべい   | 200 |
| 120      | せんべい   | えびせんべい  | 300 |
| 130      | せんべい   | のりせんべい  | 350 |
| 210      | チョコレート | 板チョコ    | 200 |
| 220      | チョコレート | 棒ョコ     | 250 |
| 310      | つまみ    | つまみ詰め合せ | 500 |
+--------------+--------------+----------------+------+

 次の例では、フィールド名「品目」に着目し、同じ「品目」の値のレコードをグループ化し、各グループのレコード数を計数しています。

mysql> SELECT hinmoku,COUNT(*) FROM tbl_shouhin GROUP BY hinmoku;
+--------------+----------+
| hinmoku   | COUNT(*) |
+--------------+----------+
| せんべい   |     3 |
| つまみ    |     1 |
| チョコレート |     2 |
+--------------+----------+
3 rows in set (0.03 sec)

mysql>

 次の例は、グループごとの単価の合計値を計算しています。

mysql> SELECT hinmoku,SUM(tanka) FROM tbl_shouhin GROUP BY hinmoku;
+--------------+-----------+
| hinmoku   | SUM(tanka)|
+--------------+-----------+
| せんべい   |    850 |
| つまみ    |    500 |
| チョコレート |    450 |
+--------------+-----------+
3 rows in set (0.05 sec)

mysql>

 また、グループごとの演算結果についてある条件にあったグループのみを参照(抽出)することができます。この場合はWHERE句でなくHAVING句を使います。

mysql> SELECT hinmoku,SUM(tanka) FROM tbl_shouhin GROUP BY hinmoku
  
-> HAVING SUM(tanka) > 800;
+----------+-----------+
| hinmoku | SUM(tanka)|
+----------+-----------+
| せんべい |     850|
+----------+-----------+
1 row in set (0.00 sec)

mysql>

■表結合と相関名

 データの正規化により作成されたテーブルは冗長性のない合理的な構造となりますが、逆に人間にはわかりにくいものとなっています。そこで、実際の利用では、正規化により分割されたテーブルを結合して、わかりやすくします。これを表結合といいます。

 次のテーブル「tbl_uriage_meisai」とテーブル「tbl_shouhin1」を例にとります。

「tbl_uriage_meisai」
+-------------+--------------+-------+
| denpyo_code | shouhin_code | kosuu |
+-------------+--------------+-------+
| 1101     | 100     |  100 |
| 1101     | 110     |  150 |
| 1120     | 120     |  80 |
| 1128     | 130     |  100 |
+-------------+--------------+-------+
4 rows in set (0.00 sec)

「tbl_shouhin1」
+--------------+--------------+-------+
| shouhin_code | shouhin_mei | tanka |
+--------------+--------------+-------+
| 100     | チョコレート |  200 |
| 110     | キャンディ  |  300 |
| 120     | せんべい   |  250 |
| 130     | ケーキ    |  400 |
+--------------+--------------+-------+
4 rows in set (0.00 sec)

 テーブル「tbl_uriage_meisai」には「shouhin_code」はありますが、第2正規化を行っているので、商品名は別途テーブル「tbl_shouhin1」を参照しないとわかりません。
 たとえば、テーブル「tbl_uriage_meisai」の「shouhin_code」='100'の商品名は、「tbl_shouhin1」の「shouhin_code」='100'のレコードの「shouhin_mei」を参照して、「チョコレート」であることがわかります。テーブル「tbl_uriage_meisai」の「shouhin_code」フィールドのとなりに、「shouhin_mei」フィールドがあると、人間にとってわかりやすくなります。

そこで、テーブル「tbl_uriage_meisai」とテーブル「tbl_shouhin1」を結合させることを考えます。

 この場合、自然結合のための「NATURAL JOIN」句を使います。

mysql> SELECT * FROM tbl_uriage_meisai NATURAL JOIN tbl_shouhin1;
+--------------+-------------+-------+--------------+-------+
| shouhin_code | denpyo_code | kosuu | shouhin_mei | tanka |
+--------------+-------------+-------+--------------+-------+
| 100     | 1101    | 100  | チョコレート |  200 |
| 110     | 1101    | 150  | キャンディ  |  300 |
| 120     | 1120    | 80  | せんべい   |  250 |
| 130     | 1128    | 100  | ケーキ    |  400 |
+--------------+-------------+-------+--------------+-------+
4 rows in set (0.38 sec)

 同じような表結合は、等結合を用いたSELECT文でも記述できます。

mysql> SELECT tbl_uriage_meisai.denpyo_code,
  ->    tbl_uriage_meisai.shouhin_code,
  ->    tbl_uriage_meisai.kosuu,
  ->    tbl_shouhin1.shouhin_mei,
  ->    tbl_shouhin1.tanka
  -> FROM tbl_uriage_meisai,tbl_shouhin1
  -> WHERE tbl_uriage_meisai.shouhin_code
  ->    = tbl_shouhin1.shouhin_code;
+-------------+--------------+-------+--------------+-------+
| denpyo_code | shouhin_code | kosuu | shouhin_mei | tanka |
+-------------+--------------+-------+--------------+-------+
| 1101    | 100     |  100 | チョコレート |  200 |
| 1101    | 110     |  150 | キャンディ  |  300 |
| 1120    | 120     |  80 | せんべい   |  250 |
| 1128    | 130     |  100 | ケーキ    |  400 |
+-------------+--------------+-------+--------------+-------+
4 rows in set (0.02 sec)

 複数のテーブルのフィールド名を混在して使用する場合は、どのテーブルのどのフィールド名かが分かるように、「テーブル名.フィールド名」のようにテーブル名とフィールド名を「.」(半角ピリオド)で結合した表記を使います。

 ただ、このような表記では、表記が長くわかりづらくなるので、「相関名」を使ってより簡単に表記することができます。相関名とはたとえば、テーブル「tbl_uriage_meisai」を1文字のアルファベット「M」で表記するような方法です。相関名は、FROM句内で、テーブル名の後に半角スペース1個以上で区切って相関名となるアルファベットを挿入することで定義します。

mysql> SELECT M.denpyou_code,
  ->    M.shouhin_code,
  ->    M.kosuu,
  ->    S.shouhin_mei,
  ->    S.tanka
  -> FROM tbl_uriage_meisai M,tbl_shouhin1 
  -> WHERE M.shouhin_code = S.shouhin_code;

+-------------+--------------+-------+--------------+-------+
| denpyo_code | shouhin_code | kosuu | shouhin_mei | tanka |
+-------------+--------------+-------+--------------+-------+
| 1101    | 100     |  100 | チョコレート |  200 |
| 1101    | 110     |  150 | キャンディ  |  300 |
| 1120    | 120     |  80 | せんべい   |  250 |
| 1128    | 130     |  100 | ケーキ    |  400 |
+-------------+--------------+-------+--------------+-------+
4 rows in set (0.02 sec)

■副問い合わせ

 MySQLの4.0版以前では、副問い合わせ(サブクエリ)はサポートしていないようです。

 

■ビュー

 MySQLの4.0版以前では、ビュー(VIEW)はサポートしていないようです。

 


前へ | 目次へ |次へ  | YCポータルサイト

執筆 山田豊通
更新日: 2006年9月13日