トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

SQL

このエントリーをはてなブックマークに追加

[SQL]

SQL

  副問合せ(= サブクエリ)

これ、使えると便利なんだが名称と概念が結びつきにくい。例えばこんなテーブルがあるとき、

Parentテーブル
主キー 整理番号 ...
00001 12345 山田 太郎 ...
00002 12346 山田 花子 ...

Childテーブル
整理番号 HOGE PIYO ...
12345 中身が 思い ...
12346 つきません --BUG-- ...

Timeテーブル
NO YEAR ...
0001 2011 ...
0002 2012 ...
0003 2013 ...

Childテーブルの整理番号はParentテーブルの整理番号と同じ。そしてPIYOカラムに異常がある場合、Parentテーブルの主キーが何か知りたいとする。以下のSQLを実行すれば--BUG--があるデータの元がわかる。

select
  *
from
  parent
where
  "整理番号" = (
    select
      "整理番号"
    from
      child
    where
      PIYO = '--BUG--'
  )

ただこの副問合せ、括弧で入れ子になった部分が一意に定まらないと(=1レコードに定まらないと)使えない。

  IN句

括弧で囲んだ部分のSELECTが複数になる場合IN句を使うもし「--BUG--」が複数件あった場合でもこれで対応できる。

select
  *
from
  parent
where
  "整理番号" IN (
    select
      "整理番号"
    from
      child
    where
      PIYO = '--BUG--'
  )

  副問合せでテーブルを作る

同じような原理で、FROM句の後ろで括弧とSELECTを書くと、囲んだ部分がテーブル扱いになる

select
  *
from
  parent,
  ( -- 以下のSELECTで抽出した表がひとつのテーブル扱いになる
    select
      "整理番号"
    from
      child
    where
      PIYO = '--BUG--'
  )

  文字列結合

SELECTで取得した文字を整形したいときはパイプを使う

select
  HOGE || PIYO
from
  child
where
  "整理番号" = '12345'

これの出力結果は「中身が思い」となる。

  関数との組み合わせ

SQLの結果を整形してto_date()とかに入れることもできる。こうすれば結果がDate型になり捗る。

select
  to_date(YEAR || '/02/14 00:00:00', 'yyyy/mm/dd hh24:mi:ss')
from
  time
where
  no = '0001'

  ROWNUM/LIMITでクエリの実行結果を絞る

SQL実行した時の件数をしぼりたい場合OracleだとROWNUM、PostgresqlだとLIMITが使える。

-- Oracle
select
  *
from
  parent
where
  "整理番号" = '12311'
 and rownum <= 30 -- 30件までに絞る

-- Postgresql
select
  *
from
  parent
where
  "整理番号" = '12311'
limit 30 -- 30件までに絞る

Oracleの場合ROWNUMはwhere句の後ろにくるけど、PostgresqlはLIMIT自体がひとつの句だ。

  データのINSERT

単純にデータをINSERTする場合

insert into hoge_table(A, B, C) values ('FOO', 'BAR', 'BAZ');

他のテーブルからSELECTした内容をINSERTする場合

insert into hoge_table (FOO, BAR, BAZ)
select A as FOO, B as BAR, C as BAZ         -- ←順番さえ守れば名前はなんでも良い
from huga_table;

  表の結合

よくある表の結合方法としてINNER JOIN, LEFT JOIN, RIGHT JOINが挙げられるが、実際それはキッチリと結合したいときに使うものであり、以下のように楽することもできる。

-- 表 HOGEと表HUGAは同じ主キーのKEYを持つものとする
select
  *
from
  HOGE, HUGA
where
  HOGE.KEY = HUGA.KEY

以前書いたとおり、FROM句のあとにSELECT文で表を作れるのでそれらと連携するとネストした表を結合しまくって目当てのブツを手に入れられる

括弧で囲んだ表には別名をつけると良い

select
  *
from
(
  select
    *
  from
    HOGE
) THIS_TABLE, -- HOGEテーブルで捕まえた内容をTHIS_TABLEとする
(
  select
    *
  from
    HUGA
) THAT_TABLE
where
  THIS_TABLE.KEY = THAT_TABLE.KEY -- 結合とかしちゃう

お名前: コメント: