データベース

目次
MySQL
Java と MySQL
C API と MySQL
PHP と MySQL
perl と MySQL

  1. MySQL (以下の説明は,すべてサーバ上での操作)  詳細については,MySQL のマニュアルを参考にしてください.

    1. MySQL への接続と切断
      shell> mysql -h host -u user -p   // 接続
      mysql> ・・・・・
      mysql> QUIT   // 切断				
    2. データベースの作成,選択,および,削除
      mysql> CREATE DATABASE base;   // 作成
      mysql> USE base   // データベース base の選択
      mysql> DROP DATABASE base;   // 削除				
    3. テーブルの作成
      mysql> CREATE TABLE gakuseki (No INT(9) NOT NULL PRIMARY KEY,
          -> name VARCHAR(50) NOT NULL, math INT(3));
      mysql> SHOW TABLES;   // 存在するテーブルのリストの表示
      出力結果:
        +----------------+
        | Tables_in_base |
        +----------------+
        | gakuseki       |
        +----------------+
      mysql> DESCRIBE gakuseki;   // テーブル gakuseki の定義内容の表示
      出力結果:
        +-------+-------------+------+-----+---------+-------+
        | Field | Type        | Null | Key | Default | Extra |
        +-------+-------------+------+-----+---------+-------+
        | No    | int(9)      |      | PRI | 0       |       |
        | name  | varchar(50) |      |     |         |       |
        | math  | int(3)      | YES  |     | NULL    |       |
        +-------+-------------+------+-----+---------+-------+
      				
    4. テーブルへのデータの読み込み  テーブルへデータを読み込む方法として,二つの方法があります.一つは,ファイルから読み込む方法です.ファイルから読み込む場合は,1 行に 1 レコードの形式でタブで区切った値を記述したテキストファイルを作成します.次のコマンドでは,以下の内容を持ったテキストファイル「test1.txt」を使用しています.
        111111111	山田	10
        555555555	佐藤	50				
      mysql> LOAD DATA LOCAL INFILE "test1.txt" INTO TABLE gakuseki;
      mysql> SELECT * FROM gakuseki;				
      出力結果:
        +-----------+------+------+
        | No        | name | math |
        +-----------+------+------+
        | 111111111 | 山田 |   10 |
        | 555555555 | 佐藤 |   50 |
        +-----------+------+------+ 				
        次に,以下の内容を持ったテキストファイル「test2.txt」をロードするコマンドを入力すると,結果は以下のようになります.test2.txt の内容はテーブルの後ろに付け加えられますが,既にあるデータと同じキーを持ったデータは,無視されます.
        222222222	鈴木	20
        333333333	山本	30
        111111111	山田	10				
      mysql> LOAD DATA LOCAL INFILE "test2.txt" INTO TABLE gakuseki;
      mysql> SELECT * FROM gakuseki;				
      出力結果:
        +-----------+------+------+
        | No        | name | math |
        +-----------+------+------+
        | 111111111 | 山田 |   10 |
        | 555555555 | 佐藤 |   50 |
        | 222222222 | 鈴木 |   20 |
        | 333333333 | 山本 |   30 |
        +-----------+------+------+				
        次に INSERT コマンドを利用してデータを追加した結果を示します.INSERT コマンドを利用した場合は,既にあるデータと同じキーのデータを入力しようとするとエラーになってしまいます.
      mysql> INSERT INTO gakuseki VALUES(444444444,'杉山',40);
      mysql> SELECT * FROM gakuseki;			
      出力結果:
        +-----------+------+------+
        | No        | name | math |
        +-----------+------+------+
        | 111111111 | 山田 |   10 |
        | 555555555 | 佐藤 |   50 |
        | 222222222 | 鈴木 |   20 |
        | 333333333 | 山本 |   30 |
        | 444444444 | 杉山 |   40 |
        +-----------+------+------+ 				
      mysql> INSERT INTO gakuseki VALUES(222222222,'佐藤',40); → エラー				
    5. レコードの削除
      mysql> SELECT * FROM gakuseki;				
      削除前:
        +-----------+------+------+
        | No        | name | math |
        +-----------+------+------+
        | 111111111 | 山田 |   10 |
        | 555555555 | 佐藤 |   50 |
        | 222222222 | 鈴木 |   20 |
        | 333333333 | 山本 |   30 |
        | 444444444 | 杉山 |   40 |
        +-----------+------+------+				
      mysql> DELETE FROM gakuseki WHERE No=222222222;
      mysql> SELECT * FROM gakuseki;				
      削除後:
        +-----------+------+------+
        | No        | name | math |
        +-----------+------+------+
        | 111111111 | 山田 |   10 |
        | 555555555 | 佐藤 |   50 |
        | 333333333 | 山本 |   30 |
        | 444444444 | 杉山 |   40 |
        +-----------+------+------+				
    6. レコード内のデータの修正  修正する方法としては,基本的に,二つあります.一つは,「DELETE FROM gakuseki;」コマンドによって,テーブル内の全データを削除した後,修正したファイルから読み直す方法です.あと一つは,以下に示す UPDATE コマンドを使う方法です.
      mysql> SELECT * FROM gakuseki;			
      修正前:
        +-----------+------+------+
        | No        | name | math |
        +-----------+------+------+
        | 111111111 | 山田 |   10 |
        | 555555555 | 佐藤 |   50 |
        | 333333333 | 山本 |   30 |
        | 444444444 | 杉山 |   40 |
        +-----------+------+------+			
      mysql> UPDATE gakuseki SET math=100 WHERE No=111111111;
      mysql> SELECT * FROM gakuseki;			
      修正後:
        +-----------+------+------+
        | No        | name | math |
        +-----------+------+------+
        | 111111111 | 山田 |  100 |
        | 555555555 | 佐藤 |   50 |
        | 333333333 | 山本 |   30 |
        | 444444444 | 杉山 |   40 |
        +-----------+------+------+				
    7. カラムの追加,削除
      mysql> SELECT * FROM gakuseki;			
      追加前:
        +-----------+------+------+
        | No        | name | math |
        +-----------+------+------+
        | 222222222 | 鈴木 |   20 |
        | 333333333 | 山本 |   30 |
        | 111111111 | 山田 |   10 |
        +-----------+------+------+			
      mysql> ALTER TABLE gakuseki ADD eng INT(3) AFTER name;
      mysql> SELECT * FROM gakuseki;			
      追加後:
        +-----------+------+------+------+
        | No        | name | eng  | math |
        +-----------+------+------+------+
        | 222222222 | 鈴木 | NULL |   20 |
        | 333333333 | 山本 | NULL |   30 |
        | 111111111 | 山田 | NULL |   10 |
        +-----------+------+------+------+ 			
      mysql> ALTER TABLE gakuseki DROP eng;
      mysql> SELECT * FROM gakuseki;			
      削除後:
        +-----------+------+------+
        | No        | name | math |
        +-----------+------+------+
        | 222222222 | 鈴木 |   20 |
        | 333333333 | 山本 |   30 |
        | 111111111 | 山田 |   10 |
        +-----------+------+------+				

  2. Java と MySQL

      ODBC( Open DataBase Connectivity )とは,異なるシステム間の違いを隠蔽し,データベースをアクセスするための単一のシステムレベル・インターフェイスを実現しようとするものであり,Microsoft が提唱しました.同様に,JDBC( Java Database Connectivity )は,Java プログラムからデータベースにアクセスするために考案された統一インターフェイスです.多くのデータベースは,JDBC を提供していますが,Access のように提供していないデータベースも存在します.その場合は,JDBC-ODBC ブリッジを使用します.

      たとえば,Windows マシン上の JAVA プログラムから,サーバ上にある MySQL を利用するためには,Windows マシンに MySQL 用の JDBC をインストールしてやる必要があります(サーバ上で利用するためには,サーバにも JDBC をインストールする必要がある).MySQL のホームページよりダウンロードし,解凍すると,バージョンが 3.0.14 の場合,以下に示すような JDBC が生成されます( Windows の場合).
    mysql-connector-java-3.0.14-production-bin.jar			
      この JDBC を適当なフォルダ( c:\jdk1.3.1\lib とする)におき,CLASSPATH を次のように修正してやれば,JAVA プログラムで MySQL を利用できるようになります.
    CLASSPATH=.;c:\jdk1.3.1\lib\mysql-connector-java-3.0.14-production-bin.jar			
      JAVA プログラムでは,以下に示すような方法で,使用する JDBC ドライバを指定して MySQL に接続し,データベースを使用することになります.
    import java.io.*;
    import java.sql.*;
    
    public class Test {
    
    	public static void main(String args[]) {
    
    		Connection Con;
    					// JDBCドライバの登録
    		try {
    			Class.forName("com.mysql.jdbc.Driver").newInstance();
    		}
    		catch (Exception e1) {
    			System.out.println("Driver Error: " + e1.toString());
    		}
    					// データベースへの接続
    					// getConnection(データベース名, ユーザ名, パスワード)
    		try {
    			Con = DriverManager.getConnection("jdbc:mysql://cs-www/mysql?useUnicode=true&characterEncoding=sjis", "ユーザ名", "パスワード");
    
    					// +++++SQLの作成+++++
    					//   ・・・・・
    
    					// 接続を切る
    			Con.close();
    		}
    		catch (SQLException e2) {
    			System.out.println("SQLException: " + e2.getMessage()); 
    			System.out.println("SQLState: " + e2.getSQLState()); 
    			System.out.println("VendorError: " + e2.getErrorCode()); 
    		}
    	}
    }
    			
      ただし,上述の設定だけでは上のプログラムは動作しません.前もって,MySQL に対するユーザの登録を行っておく必要があります.この文書,および,java.sql パッケージに関する説明においては,以下に示す MySQL のコマンドによって,ユーザ suganuma には,root と同じ権限が与えられているものとします.
    mysql> GRANT ALL PRIVILEGES ON *.* TO suganuma@"133.88.%.%"
        -> IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
    mysql> GRANT ALL PRIVILEGES ON *.* TO suganuma@localhost
        -> IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
    mysql> FLUSH PRIVILEGES;			
      基本的に,上記のプログラムは,CGI としても動作します.JAVA のプログラムを CGI として利用する方法としては,たとえば,以下に示すような shell script から JAVA プログラムを起動する方法が考えられます.
    #!/bin/bash
    CLASSPATH=.:/usr/java/j2sdk1.4.2_05/lib/mysql-connector-java-3.0.14-production-bin.jar
    export CLASSPATH               # クラスパスの設定
    export LANG=ja_JP.eucJP        # 日本語環境の設定
    echo Content-type: text/plain  # HTTP header
    echo                           # HTTP header
    java Test | nkf -s             # SQLを実行し,結果をShift JISに変換			

  3. C API と MySQL

      C API(Application Program Interface)コードは,MySQL とともに配布されています.C API コードは mysqlclient ライブラリに格納され,C プログラムはこのコードを使用してデータベースにアクセスできます.

      以下に示すのは,C 言語を使って,プログラムと同じコンピュータ(OS : Linux)にある MySQL データベースにアクセスした例です.詳細については,MySQL のマニュアルの「MySQL API」の章を参考にしてください.

      このプログラムをコンパイルする際には,以下に示すように,ライブラリの場所と名前を示すオプションが必要です(場所は,インストールした状況によって異なる).
    gcc test.c -L/usr/lib/mysql -lmysqlclient -lz			
      このプログラムを実行すると,テーブル gakuseki の内容が
    +-----------+------+------+
    | No        | name | math |
    +-----------+------+------+
    | 222222222 | 鈴木 |   20 |
    | 333333333 | 山本 |   30 |
    | 111111111 | 山田 |   10 |
    +-----------+------+------+ 			
    であった場合,以下のような出力が得られます.
    222222222 鈴木 20
    333333333 山本 30
    111111111 山田 10			
    [プログラム test.c]
    #include <mysql/mysql.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
    	int i1, sw;
    	char query[100] = "SELECT * FROM gakuseki";
    	MYSQL *d_mysql = NULL;
    	MYSQL_RES *result;
    	MYSQL_ROW row;
    					// 初期設定と接続
    					// MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
    					// const char *user, const char *passwd, const char *db,
    					// unsigned int port, const char *unix_socket,
    					// unsigned long client_flag) 
    	d_mysql = mysql_init(d_mysql);
    	d_mysql = mysql_real_connect(d_mysql, "localhost", "xxxxx", "*****", "base", 0, NULL, 0);
    	if (!d_mysql)
    	{
    		printf("***error***  接続に失敗しました\n");
    		exit(1);
    	}
    					// SQL 文の実行
    	sw = mysql_real_query(d_mysql, query, strlen(query));
    	if (sw != 0) {
    		printf("***error***  SELECT 文の実行に失敗しました\n");
    		mysql_free_result(result);   // 結果セットに割り当てたメモリを解放
    		exit(1);
    	}
    					// 正常にデータを取得したクエリ(SELECT,SHOW,DESCRIBE,EXPLAIN)
    					// については,mysql_store_result() または mysql_use_result() を
    					// 呼び出す必要がある
    	result = mysql_store_result(d_mysql);
    					// 結果の表示
    					// mysql_fetch_row(result) : 結果セットの次のレコードを取得します.
    					// mysql_store_result() を呼び出した後に mysql_fetch_row() を
    					// 使用する場合,取得するレコードが残っていなければ NULL を返します.
    	while (row = mysql_fetch_row(result)) {
    		for (i1 = 0; i1 < mysql_num_fields(result); i1++)
    			printf("%s ", row[i1]);
    		printf("\n");
    	}
    					// 接続を切る
    	mysql_free_result(result);   // 結果セットに割り当てたメモリを解放
    	mysql_close(d_mysql);
    
    	return 0;
    }			

  4. PHP と MySQL

      以下に示すのは,PHP を使って,MySQL データベースにアクセスした例です.詳細については,PHP マニュアルや MySQL のマニュアルを参考にしてください.このファイル test1.php を表示すると,テーブル gakuseki の内容が
    +-----------+------+------+
    | No        | name | math |
    +-----------+------+------+
    | 222222222 | 鈴木 |   20 |
    | 333333333 | 山本 |   30 |
    | 111111111 | 山田 |   10 |
    +-----------+------+------+ 			
    であった場合,以下のようになります.
    222222222 鈴木 20
    333333333 山本 30
    111111111 山田 10			
      なお,表示されているページのソースを表示すると,以下のようになります.
    <HTML>
    	<HEAD>
    		<TITLE>Test PHP&MySQL</TITLE>
    	</HEAD>
    	<BODY>
    		222222222 鈴木 20 <BR>
    		333333333 山本 30 <BR>
    		111111111 山田 10 <BR>
    	<BODY>
    <HTML>			
    [ファイル test1.php]( PHP 標準関数を使用した場合)
    <HTML>
    	<HEAD>
    		<TITLE>Test PHP&MySQL</TITLE>
    	</HEAD>
    	<BODY>
    <?php
    					// MySQLへの接続
    	$db = mysql_connect("localhost", "xxxxx", "*****");
    					// 使用するデータベースの指定
    	mysql_select_db("base", $db);
    					// SQL文の実行
    	$result = mysql_query("SELECT * FROM gakuseki", $db);
    	while ($row = mysql_fetch_row($result)) {
    		printf("    ");
    		foreach ($row as $value)
    			printf("%s ", $value);
    		printf("<BR>\n");
    	}
    					// 結果の解放
    	mysql_free_result ($result);
    					// 接続を切る
    	mysql_close ($db);
    ?>
    	<BODY>
    <HTML>
    			
      上の例に示したように,PHP の標準関数を使用すると,データベースの種類を変えようとした場合(たとえば,PostgreSQL に変えようとした場合)は,プログラムのかなりの部分を書き直す必要があります.しかし,次に示すファイル test2.php のように PEAR ( PHP Extension and Application Repository )を使用すると,最小箇所の変更で済ますことができます.詳細については,PEAR マニュアルを参考にしてください.

    [ファイル test2.php]( PEAR を使用した場合)
    <HTML>
    	<HEAD>
    		<TITLE>Test PHP&MySQL</TITLE>
    	</HEAD>
    	<BODY>
    <?php
    	include "DB.php";
    					// MySQLデータベースへ接続
    					// connect("データベースの種類://ユーザ:パスワード@ホスト/データベース名");
    					// 種類: MySQL="mysql", PostgreSQL="pgsql", MS SQL-Server="mssql", ODBC="odbc"
    	$dsn = "mysql://xxxxx:*****@localhost/base";
    	$db  = DB::connect($dsn);
    					// SQL文の実行
    	$result = $db->query("SELECT * FROM gakuseki");
    	while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
    		printf("    ");
    		foreach ($row as $value)
    			printf("%s ", $value);
    		printf("<BR>\n");
    	}
    					// 結果の解放
    	$result->free();
    					// 接続を切る
    	$db->disconnect();
    ?>
    	<BODY>
    <HTML>			

  5. perl と MySQL

      以下に示すのは,CGI として perl を使って,MySQL データベースにアクセスした例です.詳細については,MySQL のマニュアルを参考にしてください.この CGI を使用すると,テーブル gakuseki の内容が
    +-----------+------+------+
    | No        | name | math |
    +-----------+------+------+
    | 222222222 | 鈴木 |   20 |
    | 333333333 | 山本 |   30 |
    | 111111111 | 山田 |   10 |
    +-----------+------+------+ 			
    であった場合,以下のようになります.
    222222222 鈴木 20
    333333333 山本 30
    111111111 山田 10			
    [プログラム perl.pl]
    #!/usr/bin/perl
    
    use DBI;
    # データベース名の読込
    
    read(STDIN, $DB_name, $ENV{'CONTENT_LENGTH'});
    
    # HTTPヘッダの送信
    
    print "Content-type: text/plain\n\n";
    
    # データベースに接続
    
    $DB = DBI->connect("DBI:mysql:".$DB_name.":localhost", "xxxxx", "*****",
                       {RaiseError => 0, PrintError => 1});
    if (!$DB) {
    	print "接続できませんでした!\n";
    	print "   Error No : ".DBI->err."\n";
    	print "   Message : ".DBI->errstr."\n";
    	exit;
    }
    
    # SQL の実行
    
    $result = $DB->prepare("SELECT * FROM gakuseki");
    if (!$result->execute) {
    	print "SQLの実行に失敗しました!\n";
    	print "   Error No : ".$result->err."\n";
    	print "   Message : ".$result->errstr."\n";
    	exit;
    }
    
    while (@rec = $result->fetchrow_array) {
    	print "     ";
    	for ($i1 = 0; $i1 < $result->{NUM_OF_FIELDS}; $i1++) {
    		print $rec[$i1]." ";
    	}
    	print "\n";
    }
    
    $result->finish;
    
    # 切断
    
    $DB->disconnect;
    
    exit;
    			

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引