SELECT文の応用、5回

テーブルへのデータ一括登録

〜タブ区切りテキストファイルからデータベースへ
\copy テーブル名 from ファイル名 [csv]

〜データベースからファイルへ
\copy テーブル名 to ファイル名 [csv]

csvオプションを指定すると、カンマ区切りテキストが利用できる

少し複雑な検索

where句による絞込み検索

sdate が 2004/12/20 の nycard の件数を検索する。

sample=> select count(*) from nycard where sdate = '2004/12/20';
 count
------
     4
 (1 row)
テーブルを組み合わせた検索
sample=> select addressbook.name, nycard.sdate from addressbook, nycard where addressbook.id = nycard.id;
   name      |   sdate
-------------+---------------
 鈴木 太郎   |  2004-12-20
 田中 次郎   |  2004-12-20
 山本 花子   |  2004-12-20
 ああ ああ   |  2004-12-20
 いい いい   |  2005-12-15
 うう うう   |  2005-12-15
 (6 rows)
グループ化

group by を使うと結果をグループごとにまとめることができる。

sample=> select sdate from nycard group by sdate;
 sdate
-----------
 2004-12-20
 2005-12-15
 (2 rows)
件数

件数も表示してみよう。

sample=> select count(*),sdate from nycard group by sdate;
 count  |  sdate
--------+-----------
    2   | 2005-12-15
    4   | 2004-12-20
 (2 rows)
条件追加

条件を追加してみよう。count が 3 よりも大きいものを抜き出してみる。

sample=> select count(*),sdate from nycard group by sdate having count(*) > 3;
 count  |  sdate
--------+-----------
    4   | 2004-12-20
 (2 rows)
ソート

ソートして表示してみよう

select id,name from addressbook order by id;
 id    |    name
-------+----------
   1   | 鈴木 太郎
   2   | ああ ああ
   3   | いい いい
   4   | うう うう
 (4 rows)

降順にソートしてみる

select id,name from addressbook order by id desc;
検索結果の一部取り出し

検索結果がすごく多いとき、limit を使って一部取り出す

select id,name from addressbook order by id limit 5;
部分一致

列の完全一致ではなく、部分一致のデータを、「like 〜」「similar to 〜」で検索できる

like の場合

  • "%":0文字以上の文字列
  • "_":任意の1文字
select id,name from addressbook where name like '%太郎';
id    |    name
-------+----------
   1   | 鈴木 太郎
 (1 rows)

select id,name from addressbook where name like '%木%';
id    |    name
-------+----------
   1   | 鈴木 太郎
 (1 rows)

similar to の場合

  • "%":0文字以上の文字列
  • "_":任意の1文字
  • "|":二者択一
  • "*":直前文字列の0回以上の繰り返し
  • "+":直前文字列の1回以上の繰り返し
  • "()":文字列によるグループ化
select id,name from addressbook where name similar to  '%(鈴木|ああ)%';
id    |    name
-------+----------
   1   | 鈴木 太郎
   2   | 鈴木 太郎
 (2 rows)