1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WITH句を使用してテーブルを作成せずにSQLの動作を確認する

Posted at

状況

・SQL(SELECT文)の動作検証したい。
・SELECT文の動きを実際に見せて後輩や部下にSQLを教えたい。
・けど、実際にテーブルを作成してデータもインサートするのはするのはめんどくさい。。。

みたいな状況ってないでしょうか。私は結構よくあります。
こんな時、WITH句を使用すると便利です。

そもそもWITH句って何?

WITH句を知らない、あるいは知っているけどほとんど使用したことがない、という人向けに簡単に解説。
一言でいうと、SELECT文の結果に名前を付けることでSQL文の記述を簡単にすることができる構文。

構文
with <名前> as (select)
with tableC as (
    select * 
    from tableA A
    inner join tableB B
    on A.colA = B.colA
)
select colA, sum(bolB)
from tableC
group by colA

使い方はこんな感じ。
tableAとtableBをjoinした結果にtableCという名前を付けることで、
WITH句に続くSQLで、tableCを実際のテーブルっぽく扱うことができる。

WITH句でテーブルを作らずにSELECT文の動作を検証

いよいよ本題。
通常SELECT文の動作を検証しようと思うと、create tableを使ってテーブルを作成し、inesrtで必要なデータを入れる必要がある。
しかし、SELECT文の動きを検証したいだけの時にわざわざテーブル作るのは面倒。
削除し忘れて後で上司に怒られたりするのも嫌。
そこでWITH句を使い、中のSELECT文でunionを使用することで、疑似的なテーブルを作成する。
それを本物のテーブルっぽく扱うことで、SELECT文の動作検証ができる。

with users as (
    select 1 user_id, '佐藤' user_name, 20 age, '男' sex
    union
    select 2, '鈴木', 24, '女'
    union
    select 3, '田中', 22, '女'
    union
    select 4, '山本', 31, '男'
    union
    select 5, '高橋', 28, '男'
)
select sex, max(age) max_age
from users
group by sex;

結果

sex max_age
31
24

こんな感じで、実際にはusersというテーブルは作成していなくても、
あたかもそういうテーブルが存在するような感じでselect文の動作を確認することができる。

補足

・上の例はPostgreSQLで検証してます。
・Oracleの場合、ダミーレコードを作成する場合は from dual が必要。
・unionのところはunion allでも可。件数多いときはunion allの方がいいかも。
・あくまでSELECT文の結果を確認するためのテクニック。
速度とか実行計画は一切あてにならないので、
速度まで含めて検証したい場合はきちんとテーブルとインデックスを作りましょう。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?