【SQL】EXCEPTを駆使して、 特定の列を除外しよう!

【SQL】EXCEPTを駆使して、特定の列を除外しよう!

どうも、hosigakiです!

テーブルからデータを抽出するとき、「特定の列だけを除外して抽出したい!」って思うことはありませんか?
今日は、そんな希望を叶える演算子、EXCEPT についてご紹介します!

EXCEPTの使い方

使い方はとても簡単!
以下のように、SELECT句内で全カラム指定しつつ、EXCEPTの括弧内で除外したいカラム名を記載するだけです!

SELECT
    * EXCEPT (除外したい列1, 除外したい列2, ...)
FROM
    テーブル名


それでは、実際の使い方を見ていきましょう!

EXCEPTの利用例①

例えば、次のusersテーブルから、created_atカラムを除外して抽出するとします。

user_idnamegenderagecreated_at
1太郎男性402022-1-1
2よしお男性312022-1-1
3SAKI女性342022-1-2
4れいか女性302022-1-3
5ジム男性292022-1-3
6さやか女性302022-1-3
7ボブ男性312022-1-4
8健一男性402022-1-4
usersテーブル


この時、以下のように、EXCEPTの後ろの( )内に、created_atを記載することで、created_atカラムのみを除外することができます。

SELECT
    * EXCEPT (created_at)
FROM
    users
user_idnamegenderage
1太郎男性40
2よしお男性31
3SAKI女性34
4れいか女性30
5ジム男性29
6さやか女性30
7ボブ男性31
8健一男性40
抽出結果。created_atカラムが除外されている。

ちなみに、created_atカラムだけじゃなく、ageカラムも除外したい場合は、先ほどの( )内にageを追加するだけで、ageも除外できます!

SELECT
    * EXCEPT (created_at, age)
FROM
    users

EXCEPTの利用例②

以下二つのテーブルを内部結合し、そのレコードを抽出するとします。

user_idnamegenderage
1太郎男性40
2よしお男性31
3SAKI女性34
usersテーブル
user_idpurchase_timespurchase_amountlast_purchased_at
11090002022-8-24
213110002022-3-1
39210002022-5-3
purchase_countテーブル(user_idごとの購入数)

この時、結合したテーブルを単純に「SELECT *」で抽出すると、抽出結果にuser_idカラムが二つ入ってしまいます。
そこで、例えば以下のクエリを書くと、結合後のテーブルからuser_idカラムを除外することが可能です。

SELECT
    * EXCEPT (user_id)
FROM
    users
    INNER JOIN purchase_count
        ON users.user_id = purchase_count.user_id

ただし、実はこれだと、2つのuser_idカラムが両方とも除外されてしまうんです。

(この記事を書いているとき、「EXCEPT (purchase_count.user_id)」とテーブル名を指定したらいけるんじゃないか?と思って、BigQueryで検証したところ、エラーが起こりました。残念ながら、仕様的にこの書き方は許されないようです(;^_^A )

そこで、SELECT句内で別途user_idカラムを抽出対象として選択しておくことで、結果的にuser_idカラムを1つだけ抽出することが可能になります。

SELECT
    users.user_id,
    * EXCEPT (user_id)
FROM
    users
    INNER JOIN purchase_count
        ON users.user_id = purchase_count.user_id
user_idnamegenderagepurchase_timespurchase_amountlast_purchased_at
1太郎男性401090002022-8-24
2よしお男性3113110002022-3-1
3SAKI女性349210002022-5-3
抽出結果。purchase_countテーブルのuser_idカラムのみ除外されている。

極論を言ってしまえば、SELECT句内で一つ一つ抽出したいカラム名を書けば、同じ抽出結果を得ることができるのですが、クエリ記載に時間がかかったり、クエリが長くて可読性が落ちたりすることがありますよね(^^;

なので、もしEXCEPTが使えそうな場面があれば、積極的に使ってみるのをお勧めします!

最後まで読んでいただき、ありがとうございました!
また次の記事でお会いしましょう(^^)/

-SQL
-, , ,