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)