SQLの副問合せについてメモ。

SQL文の副問い合わせについて

他のSQL文の条件に使用する為のデータをSELECTで取得する事を副問い合わせという。

WHERE句

上記例のSQLの場合、table2_name 内zip_codeをSELECTし、その結果をtable1_name のzip_code検索に利用している。処理でtable2_nameのレコードを1つ1つ取得してtable2_nameの条件検索に…などという面倒臭い事をせずとも、1つのSQLで完結出来る。(※赤字部分のSELECTが副問い合わせ)

select * from table1_name where zip_code = ( select zip_code from table2_name );

ただ、上記例だと1つのカラムしか条件に加えられないので、複数カラムを条件として指定する場合には、下記のような書き方になる。

select * from table1_name where ( zip_code, id ) = ( select zip_code, id from table2_name );

SELECT文で指定するカラムを設定し、WHERE文の条件を()で囲んであげればいい。どれだけ増えても一緒で、同じ書き方で増やしてあげればいい。当然だがカラム数とタイプは同一でなければエラーになる。

もちろん、副問い合わせ側のSQLも通常のSQLのようにWHERE,LIMIT,OFFSET等で絞り込み可なので、細かい検索が可能。

FROM句

副問い合わせの結果を仮想テーブルとして扱い、その仮想テーブルに対してクエリを実行、結果を出力出来る。

select * from ( select zip_code, id from table2_name );

赤字のクエリ結果を仮想テーブルとして扱うので、zip_code, idのカラムがあるテーブルとしてさらにクエリ出来る。

この前まで「postgreSQLではFROM句が使えない」と恥ずかしい勘違いをしていたが、どうやらpostgreSQLでFROM句の副問い合わせを使う場合、「仮想テーブル」に名前を付けてあげないと駄目なようだ。(※8バージョンにて。もしかしたら9とかでは改善されているのかも…後日確認し、覚えていたら修正)postgreSQLのそういう融通が利かないところ、嫌いじゃない。MySQLは結構端折ったりするんだよな。

select * from ( select zip_code, id from table2_name ) as virtual_table;

赤字部分が仮想テーブルに名前をつけているところ。MySQLは名前を付けて無くても動作するようだ。

シェアする

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

フォローする