2015年7月23日
psql の引数には,使いたいデータベースを指定できるので,
psql dbnyumonを実行して,データベース dbnyumon に接続しましょう。
dbnyumon に何もテーブルがないことを,テーブルの情報を調べる psql のコマンドで, 確認してみます。
dbnyumon=> \d
リレーションがありません。 ( No relations found. )
なお,今回も受講者全員が同じ名前のデータベースを利用しますが, その実体は受講者毎に異なっています。 そのため,他の人が作ったテーブル等は自分のデータベースからは見えません。
テーブルを作成するには,テーブルにどんな列を用意するか,また列に入れるデータの型や制約条件をどうするか,などを決める必要があります。 これらをスキーマ (schema) と呼びます。 スキーマは,いわばデータの入れ物であるテーブルの「骨格」です。
CREATE TABLE テーブル名 (列名 型, 列名 型, ...)
dbnyumon=> CREATE TABLE yasai (namae varchar) ; CREATE TABLE dbnyumon=> \d リレーションの一覧 スキーマ | 名前 | 型 | 所有者 ---------+-------+---------+-------- (user) | yasai | テーブル | (user) (1 行) dbnyumon=> \d yasai テーブル "(user).yasai" カラム | 型 | 修飾語 --------+-------------------+-------- namae | character varying |
dbnyumon=> CREATE TABLE kudamono (namae varchar, nedan int) ; CREATE TABLE dbnyumon=> \d リレーションの一覧 スキーマ | 名前 | 型 | 所有者 ----------+----------+----------+-------- (user) | kudamono | テーブル | konno (user) | yasai | テーブル | konno (2 行) dbnyumon=> \d kudamono テーブル "(user).kudamono" カラム | 型 | 修飾語 --------+-------------------+-------- namae | character varying | nedan | integer |
DROP TABLE テーブル名
dbnyumon=> DROP TABLE yasai ;実行後,
\d
コマンドで結果を確かめてください。
psql コマンドには SQL のヘルプを見るコマンド \h
がありますので,
\h insert
などで適宜,書式を確認してください。
操作の結果は,必ず SELECT 文で確認してください。
INSERT INTO テーブル名 (列名1, 列名2,列名3 ...) VALUES (値1,値2,値3 ...)
INSERT INTO kudamono (namae,nedan) VALUES ('banana', 280); INSERT INTO kudamono (namae,nedan) VALUES ('budo', 350); SELECT * FROM kudamono;
UPDATE テーブル名 SET 列名1 = 値1, 列名2 = 値2, ... WHERE 検索条件
UPDATE kudamono SET nedan = 300 WHERE namae = 'banana';
DELETE FROM テーブル名 WHERE 検索条件
DELETE FROM kudamono WHERE namae = 'budo';
PostgreSQL の psql には,ファイルの内容をデータベースのテーブルに挿入し
たり,逆にテーブルの内容をファイルに書き出すために,コマンド
\copy
が用意されていますので,この授業ではこちらを使います。
\copy
コマンドの書式は
\copy テーブル名 from ファイル名
です。この場合,ファイルの中身は,
各列がタブ文字で区切られた表形式になっている必要があります。
ファイル名として,パス名を指定することも可能です。
copy
は SQL コマンドではありません
から,行末の ; が不要であることも注意しておきましょう。
4 banana 5 ichigo 6 nashiまた,次の SQL コマンドで,二つの列を有するテーブル shina が作成済みであるとします。
CREATE TABLE shina ( code varchar, shohin varchar );テーブル shina にファイル banana の中身を挿入するには,
dbnyumon=> \copy shina from /pub/db_a/bananaとします。 ここで
dbnyumon=>
は,もちろん,データベース dbnyumon を利用している際の psql コマンドが表示するプロンプトです。
結果は次のようになります。
dbnyumon=> SELECT * from shina ; code | shohin ------+-------- 4 | banana 5 | ichigo 6 | nashi (3 行)
\copy
コマンドはテーブルにファイルの内容を新たに追加します。
そのため,既にデータが入っているテーブルを新しいデータで置き換えたい場合には,
予め DELETE でデータを全て削除するか,
DROP TABLE, CREATE TABLE でテーブルを作り直しておく必要があります。
\copy
を実行します。
\copy テーブル名 from ファイル名 delimiter '区切り文字'
7|kaki 8|kuriこれをテーブル shina に入れるには
\copy shina from /pub/db_a/kaki delimiter '|'
とします。
\copy
コマンドを実行するときに from の代わりに to を指定すれば,
データベースのテーブルからファイルにデータを書き出すことができます。
lemon 9 pineapple 10これを先ほどのテーブル shina に入れることを考えましょう。 単純に
dbnyumon=> \copy shina from /pub/db_a/lemonとすると,次の実行結果のとおり,列 code に商品(果物)の名前が入り, 列 shohin にコード(数字)が入ることになってしまいます。
dbnyumon=> SELECT * from shina ; code | shohin -----------+-------- 4 | banana 5 | ichigo 6 | nashi 7 | kaki 8 | kuri lemon | 9 pineapple | 10 (7 行)
このような場合,予め UNIX のコマンドを使って,
/pub/db_a/lemon の中身を加工してから,\copy
コマンドを実行すればいいです。
例えば,UNIX のコマンド行で (psql を一度終了する)
gawk '{print $2, $1}' /pub/db_a/lemon >rlemon
を実行すれば,中身が9 lemon 10 pineappleであるファイル rlemon が出来上がります。 ここで,gawk の出力における列の区切りが,デフォルトでは (特に指定しない場合には)空白であることに注意してください。 このため,ファイル rlemon 内の列は空白で区切られます。
その後,psql を起動して,
\copy shina from rlemon delimiter ' '
とすれば,列の区切り文字が空白であると解釈されて,各列に正しくデータが入ります。
テキストファイルの中から特定の列を取り出したり,列の順番を入れ替えるには
awk が使えますし,特定の行のみを取り出すには grep が使えます。
これらの出力をファイルに入れたければ,
リダイレクト (>
) が使えます。
これらの UNIX コマンドの使い方を忘れていたら, 本授業前半の資料を参照してください。
shohin varchar
nedan int
imo 100
ninjin 110
tomato 390
このファイルの各行には, 新郵便番号と配達順がタブ文字区切りで格納されている。 (less コマンドで確認せよ)
このファイルの内容を,
psql の \
copy コマンドを使って,すべてデータベースに入れなさい。
格納先のテーブル名は junban とする。
テーブル junban は
次の列(列名・型)を持つこととする。
code varchar junjo int
このファイルの各列は
自治体コード,旧郵便番号,新郵便番号, 都道府県(カナ),市町村(カナ),町名区分(カナ), 都道府県(漢字),市町村(漢字),町名区分(漢字)を表している。
自治体コード,新郵便番号,市町村(漢字),町名区分(漢字)
\
copyコマンドを使ってデータベースに入れなさい。
格納先のテーブル名は main とする。 main は,自治体コード,新郵便番号,市町村(漢字),町名区分(漢字)を 格納するために,次の列 (名前・型) を持つこととする。
code varchar zip varchar city varchar chomei varchar