* 第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文をメールで送ってください。 おしまい。