- 追加された行はこの色です。
- 削除された行はこの色です。
* データベース(MySQL) [#q184519a]
* 第9回 データベース(MySQL) [#q184519a]
この内容、あるサイトの解説記事からパクってます。順次更新しないと…
** 目次 [#k61e6e26]
#contents
** MySQLのインストール [#ba147ac1]
*** MySQLのダウンロード [#z89b3b41]
- Vine Linux 2.5 PPC 用のMySQLを入手し、インストールします。
- 必要なファイルは、たとえば以下のサイトから入手してください。
-- http://www.ring.gr.jp/pub/linux/Vine/VinePlus/2.5/RPMS/ppc/
- MySQL-3.23.53-0vl2.ppc.rpm
- MySQL-client-3.23.53-0vl2.ppc.rpm
- MySQL-devel-3.23.53-0vl2.ppc.rpm
- MySQL-shared-3.23.53-0vl2.ppc.rpm
*** MySQLのインストール [#a0940be6]
- 下記ページを参考にして、ダウンロードしたRPMをインストールします。
-- http://www.vinelinux.org/manuals/using_rpm.html
-- http://linux.shoukun.com/Vine/mysql_bbs.htm
+ たぶん(笑)、以下のようにしてインストールできます。
$ su
# rpm -ivh ファイルその1.rpm
# rpm -ivh ファイルその2.rpm
以下同様…
+ 設定ファイルを/etc/にコピーします。
$ su
# cp /usr/share/mysql/my-small.cnf /etc/my.cnf
+ 設定ファイルを編集します。
# vi /etc/my.cnf
+ [mysqld]という部分に、以下の内容を書き加えます。
[mysqld]
default-character-set=ujis
*** MySQLの起動 [#h174e01e]
+MySQLのサーバが起動しているか確認します。
$ mysqlshow
+ もし起動していたら、設定を有効にするためにいったん止めます。
$ su
# /etc/init.d/mysql stop
+ MySQLサーバを起動します。
# /etc/init.d/mysql start
+ 管理ユーザー root にパスワードを設定しておきます。
$ mysqladmin -u root password '管理パスワード'
$ mysql_install_db
*** データベースの準備 [#adebeeaa]
+ ユーザーが使うためのデータベースを作っておきます。 ここでは、データベース名を user_db としておきます。
$ mysqladmin -u root -p create user_db
Enter password: 管理パスワード
*** データベースの確認 [#d911c4a0]
+ 現在サーバー上にあるデータベースは、mysqlshowまたは、以下のコマンドで確認できます。
$ mysql -u root -p
Enter password: 管理パスワード
mysql> show databases;
+----------+
| Database |
+----------+
| mysql |
| test |
| user_db |
+----------+
3 rows in set (0.00 sec)
mysql> exit
Bye
*** 一般ユーザーの作成 [#l27a767a]
+ 普段データベースを利用するための一般ユーザーを作ります。 ここでは、ユーザー名を db_user とします。
$ mysql -u root -p
Enter password: 管理パスワード
mysql> grant all on *.* to db_user@localhost identified by 'ユーザパスワード';
mysql> flush privileges;
mysql> exit
Bye
*** データベースの設計 [#n077741d]
+ 郵便番号データベース
+ 「旧番号, 新番号, 都道府県名, 市区郡町村名, 町村字名」という レコードを持つ郵便番号データベースを作成してみましょう。
+ yubin_euc.csvをダウンロードします。
+ 「head yubin_euc.csv」や「tail yubin_euc.csv」というコマンドで内容 を確認してみましょう。
"907-14","907-1432","沖縄県","八重山郡竹富町","古見"
"907-15","907-1543","沖縄県","八重山郡竹富町","崎山"
"907-14","907-1431","沖縄県","八重山郡竹富町","高那"
"907-11","907-1101","沖縄県","八重山郡竹富町","竹富"
"907-14","907-1434","沖縄県","八重山郡竹富町","南風見"
"907-14","907-1433","沖縄県","八重山郡竹富町","南風見仲"
"907-17","907-1751","沖縄県","八重山郡竹富町","波照間"
"907-15","907-1544","沖縄県","八重山郡竹富町","鳩間"
"907-18","907-1800","沖縄県","八重山郡与那国町","以下に掲載がない場合"
"907-18","907-1801","沖縄県","八重山郡与那国町","与那国"
+ ここから、以下のようなデータベースを作ります。
旧番号 新番号 都道府県名 市区郡町村名 町村字名
060 060-0041 北海道 札幌市中央区 大通東
154 154-0002 東京都 世田谷区 下馬
468 468-0039 愛知県 名古屋市天白区 西入町
907-18 907-1801 沖縄県 八重山郡与那国町 与那国
*** テーブルの作成 [#p02b143c]
+ 関係データベースへデータを登録するには、 まずデータの“入れ物”を作らなければなりません。 この“入れ物”のことを「テーブル」(表)と呼びます。
+ 個々のデータは横一列に行として並びます(レコードという)。 それぞれのレコードには、項目として表の縦の並び(カラムやフィールドという)があります。
*** テーブルの設計 [#za37fe53]
+ 今回は、以下のようなテーブルを作ります。 データベースでは、まずテーブルを作ってから、 データを登録していきます。テーブルの名前は zipcode としておきます。
zipcode
名称 内容 型 属性
oldzip 旧番号 text
newzip 新番号 text 空欄不可
pref 都道府県名 text
city 市区郡町村名 text
addr 町字名 text 空欄不可
+ 「型」というのは、そのカラムに入るデータの形式のことで、必ず定義します。
+ テーブルの設計は、データベース構築の肝です。興味があれば、 「正規化」と呼ばれるデータベースの論理設計手法を勉強してみてください。
*** データベースに接続する [#vd331545]
+ MySQLはサーバーですので、ユーザーとしてログインして利用します。セットアップの時に作成したアカウント(ユーザ名 db_user)を使います。
$ mysql -u db_user -p
Enter password: ユーザパスワード
mysql>
+ 「 mysql> 」という文字を、プロンプト といい、 MySQLが命令を待っている状態です。 この後に、SQL文を打ち込み、データベースを操作します。
+ まずは、あらかじめ作成したデータベースを選択します(データベース名はuser_db)。
mysql> use user_db;
Database changed
mysql>
+ 以上でデータベースが操作できるようになりました。今後、「MySQLにSQL文を発行する」時は、この手順で接続しておきます。なお、切断(終了)する時は以下のようにタイプします。
mysql> exit
Bye
** SQLによるテーブル操作 [#r1a6eff6]
+ SQLは標準のデータベース言語であり、 MySQLをはじめ AccessからOracleまで、ほとんどのデータベースは SQLによる命令文で動きます。
*** テーブルを作成する [#n6e40d7e]
+ データベースにテーブルを作ります。 上記の構成でテーブルを作成するには、以下のSQLコマンドをタイプします。
+ SQL文は、セミコロン(;)を打つまでが1行と認識されます。 例のように、長い命令を途中で改行して入力することが可能です。
mysql> use user_db;
mysql> create table zipcode(
-> oldzip text,
-> newzip text not null,
-> pref text,
-> city text,
-> addr text not null
-> );
Query OK, 0 rows affected (0.00 sec)
+ SQLでコマンドを打つことを、「SQL文を発行する」といいます。
+ 正しくテーブルが作られたか、確認してみましょう。
mysql> show fields from zipcode;
+---------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+------+------+-----+---------+-------+
| oldzip | text | YES | | NULL | |
| newzip | text | | | | |
| pref | text | YES | | NULL | |
| city | text | YES | | NULL | |
| addr | text | | | | |
+---------+------+------+-----+---------+-------+
5 rows in set (0.00 sec)
+ 基本は、MySQLにログイン → データベース選択 → テーブル名を指定して作業 という流れとなります。
*** (テーブルの削除のしかた) [#t3b90999]
+ テーブルの削除方法
mysql> drop table zipcode;
+ データを作成する - INSERT文
+ テーブルにデータ(レコード)を作成するには 「インサート(INSERT)文」を使います。
mysql> insert into zipcode
-> (oldzip,newzip,pref,city,addr)
-> values('154','154-0002','東京都','世田谷区','下馬');
Query OK, 1 rows affected (0.03 sec)
+ 同様にして、以下のデータを登録してください。
旧番号 新番号 都道府県名 市区郡町村名 町村字名
060 060-0041 北海道 札幌市中央区 大通東
154 154-0002 東京都 世田谷区 下馬
468 468-0039 愛知県 名古屋市天白区 西入町
907-18 907-1801 沖縄県 八重山郡与那国町 与那国
*** データを表示する - SELECT文 [#n52a4635]
+ 前項で登録したデータを表示してみます。テーブルからレコードを取り出すには、「セレクト(SELECT)文」を使います。
【基本構文】 select フィールド名 from テーブル名 ;
+ 郵便番号と都道府県のみ選択して表示します。
mysql> select newzip,pref from zipcode;
+----------+--------+
| newzip | pref |
+----------+--------+
| 060-0041 | 北海道 |
| 154-0002 | 東京都 |
| 468-0039 | 愛知県 |
| 907-1801 | 沖縄県 |
+----------+--------+
4 rows in set (0.00 sec)
+ すべてのフィールドを表示する場合は、*記号で代用できます。
mysql> select * from zipcode;
*** データの一括投入 [#q39fc2f4]
+ 郵便番号データは、各県数千件のデータになるので、INSERT文での手作業での登録は現実的ではありません。
+ そこで一気に流し込みを行ないます。ファイルは、適当な場所に yubin_euc.csv として置いておきます。
mysql> load data infile '/置いてある場所/yubin_euc.csv'
-> into table zipcode fields terminated by ',';
Query OK, 121622 rows affected (0.78 sec)
Records: 121622 Deleted: 0 Skipped: 0 Warnings: 0
+ レコードの登録件数は、以下のSQLコマンドで確認できます。
mysql> select count(*) from zipcode;
+----------+
| count(*) |
+----------+
| 121622 |
+----------+
1 row in set (0.00 sec)
** データの検索 [#x11e21c9]
+ テーブル操作のSQL文を使ってみます。データベースの肝の部分です。 あらかじめMySQLにログインしてからデータベースを選択しておいてください。
*** データを検索する - WHERE句 [#ud942bc7]
+ テーブルからデータ(レコード)を検索するには 「セレクト(SELECT)文」を使います。そこにWHERE句で条件文をつけると、 条件にマッチするデータのみ表示できます。
【基本構文】 select フィールド名 from テーブル名 where 条件式 ;
複数の行に分けて書くこともできます。
select フィールド名
from テーブル名
where 条件式 ;
+ 古い郵便番号が「468」の、すべてのフィールドを表示する。
select * from zipcode where oldzip='468' ;
+ 市区名が「世田谷区」の、新番号と町村名を表示する。
select newzip,addr
from zipcode
where city='世田谷区' ;
+ 以下のようにすると、条件にマッチするレコードの件数が分かります。
select count(*)
from zipcode
where pref='鳥取県' ;
+ 以下のように「リミット(LIMIT)句」を使うと、表示する件数を限定できます。 県名が「鳥取県」の、すべてのフィールドを、50件表示する。
select *
from zipcode
where pref='鳥取県'
limit 50;
*** ちょっと高度な検索 [#j5acc262]
+ 都道府県名が「滋賀県」 かつ 市区名が「草津市」
select *
from zipcode
where pref='滋賀県' && city='草津市' ;
+ 市区郡町村名が「渋谷区」 または 「新宿区」
select *
from zipcode
where city='渋谷区' || city='新宿区' ;
+ 市区郡町村名に「日高」が含まれる(likeは文字列比較、%はワイルドカード)
select *
from zipcode
where city like '%日高%';
*** 応用問題 [#w6929d86]
+ 「東京都町田市」の郵便番号の一覧を検索しなさい。
+ 「東京都町田市玉川学園」の郵便番号を検索しなさい。
+ 旧郵便番号が「223」だった地区の住所を検索しなさい。
+ 町字名(addr)が、「日吉町」である地区の一覧を検索しなさい。
+ 住所のどこかに「中田」の入っている地名の一覧を検索しなさい。
+ 時間のあまった人は自由課題。適当な検索の例題を考えてみて。
+ 問題を解いて結果を確認したら、SQL文をメールで送ってください。 おしまい。