SQLを勉強し始めて、最初に解説される構文が「SELECT」や「FROM」です。
シンプルだからこそ、何ができるかをしっかり把握しておきたいところ。
初めて勉強する時、初めて勉強した後の復習にご利用ください。
初心者はSELECT句でできることを4つ覚えればOK!
初心者の方にとっては、SQLでクエリを書き始める時の最初に書くキーワードとして、SELECT句があります。
その覚え方でも構わないんですが、もう一歩踏み込むと「アウトプットするカラムを指定するところ」と説明できます。
- SELECT句でできること4つ
- 抽出対象のテーブルからカラムを指定してデータを抽出できる。
- データを抽出する時、四則演算を含めた様々な加工をした結果で抽出できる。
- 抽出結果のカラムに別の名前を付けることができる。
- 重複除去した結果を抽出することができる。
4つだけではありますが、ステップアップする上で難しい書き方も登場してきます。
いきなり難しいものが登場しても覚えきれないので、所々、勉強を後回しにしながら説明しますね。
最初に演習用サンプルデータを説明します
実際にデータを取り扱って演習するために、サンプルデータを用意します。
今回は手っ取り早く、クエリの最初に下記のテキストを貼り付けましょう。
最初は理解できないはずなので、魔法の呪文としてコピペしてください。
-- サンプルデータ -- ここから
WITH sample AS (
SELECT * FROM UNNEST(ARRAY<STRUCT<fruit_id INT64, fruit_name STRING, fruit_price NUMERIC>>[
(1, "apple", 100),
(2, "orange", 80),
(3, "banana", 120),
(4, "lemon", 80)
])
)
-- サンプルデータ -- ここまで
このサンプルデータは、Excelやスプレッドシートで言うとこんな形になっています。
4種類のフルーツと、その価格のデータが入っています。
fruit_id | fruit_name | fruit_price |
---|---|---|
1 | apple | 100 |
2 | orange | 80 |
3 | banana | 120 |
4 | lemon | 80 |
抽出したいカラムを指定する方法をマスターしよう
「SELECT」句でできること4つの内の1つ目、カラムを指定してデータを抽出する方法から習得しましょう。
サンプルデータを使った演習で解説します。
抽出対象データソースのカラムをそのまま全部抽出できる
「SELECT」の後ろ、「FROM」の前までに「*」(半角アスタリスク)を指定することで、全部のカラムを抽出する指示を表します。
「FROM sample」の部分は、「FROM」句の解説記事で紹介するので、当記事を読み解く中では理解を後回しにしましょう。
-- 演習01
SELECT * FROM sample
前述のサンプルデータのコピペテキストと組み合わせるとこうなります。
-- サンプルデータ -- ここから
WITH sample AS (
SELECT * FROM UNNEST(ARRAY<STRUCT<fruit_id INT64, fruit_name STRING, fruit_price NUMERIC>>[
(1, "apple", 100),
(2, "orange", 80),
(3, "banana", 120),
(4, "lemon", 80)
])
)
-- サンプルデータ -- ここまで
-- 演習01
SELECT * FROM sample
次の演習からはサンプルデータのコピペは省略しますね。
実際にクエリを実行した結果がこちら。
前述の表で示した通り、サンプルデータに含まれる全てのデータが抽出されています。
特定のカラムを抽出できる
「SELECT」の後ろに、抽出したいカラム名を指定することで、全部のカラムでなく、特定のカラムのみを指定して抽出することもできます。
-- 演習02
SELECT fruit_name FROM sample
実際にクエリを実行した結果がこちら。
演習01で抽出した時の「fruit_name」カラムだけが抽出されています。
特定の複数カラムを抽出できる
抽出したいカラムが複数ある時は、「,」(半角カンマ)でカラム名を区切ることで、複数カラムの抽出を行うことができます。
-- 演習03
SELECT fruit_id, fruit_name FROM sample
実際にクエリを実行した結果がこちら。
演習01で抽出した時の「fruit_id」と「fruit_name」のカラムだけが抽出されています。
ちなみに、全部のカラムを指定すれば、「*」(半角アスタリスク)を指定した時と同じ結果になります。
「*」で書けば、クエリが短くなり、クエリを読む時「そのまま全部抽出」という意味がすぐに伝わります。
一方、カラムを一つ一つ指定すれば、順番を変えたり、後述するような細かな調整もできます。
どちらもメリットがある書き方なので、両方の書き方を覚えておきましょう。
一部を除いた全部のカラムを抽出できる
演習01では、「*」(半角アスタリスク)と指定することで、全部のカラムを抽出することができました。
全部のカラムの内、一部のカラムだけを取り除いた結果を抽出することもできます。
その場合は「*」(半角アスタリスク)の後ろに、「EXCEPT」、「(」(半角括弧)、取り除きたいカラム名、「)」(半角括弧)、と指定することで実現します。
-- 演習04
SELECT * EXCEPT (fruit_price) FROM sample
実際にクエリを実行した結果がこちら。
取り除きたいカラムが複数ある時は、「,」(半角カンマ)でカラム名を区切ることで、複数カラムを取り除くことができます。
-- 演習05
SELECT * EXCEPT (fruit_id, fruit_price) FROM sample
実際にクエリを実行した結果がこちら。
初心者の内は積極的に使うことはないですが、たくさんクエリを書いていく内に、段々と使うようになっていくと思います。
最初は「こんな方法もある」と覚えておいて、たくさんのカラムを指定することに疲れてきたら思い出して使ってみる、くらいの感覚で構いません。
ビジネスで色々なテーブルを取り扱っていく内に、カラムの数が10や20、100や200のテーブルも扱うことになるでしょうから、こういった指定方法も覚えておくと楽ができます。
カラム指定に関する余談
わざわざ解説するほどではない解説や、勉強し始めたばかりの方が触れるには早い解説を、簡単に紹介します。
色々書き換えて試してみて、できることを確認してみるのも良いでしょう。
同じカラムを何度も指定することもできます。
SELECT fruit_name, fruit_name, fruit_name, fruit_name FROM sample
「*」で全部のカラムを指定した後に、カラムを追加指定することもできます。
SELECT *, fruit_name FROM sample
「EXCEPT」を使った後にもカラムを追加指定することもできます。
SELECT * EXCEPT (fruit_name), fruit_name FROM sample
逆に、表示するカラムが無くなってしまうような指定はエラーになります。
SELECT * EXCEPT (fruit_id, fruit_name, fruit_price) FROM sample
SELECT * expands to zero columns after applying EXCEPT at [12:8]
「.」(半角ドット)を使うと、「.」の左側と「.」の右側とで修飾関係を示します。
SELECT sample.fruit_name FROM sample
この例では、「.」の左側(sample)の中にある、「.」の右側(fruit_name)を示す表記になっています。
「SELECT」句を勉強する段階では使うことはありませんが、今後、「JOIN」や「STRUCT」を勉強する段階になれば登場する表記です。
JOIN句を解説する記事へのリンクを設置予定
STRUCTを解説する記事へのリンクを設置予定
抽出したいデータを加工することができることを覚えておこう
「SELECT」句でできること4つの内の2つ目です。
完璧にマスターしようとすると大変なので、最初の内は「そういうこともできる」というポイントだけ覚えておきましょう。
計算結果を抽出できる
四則演算も可能です。
-- 演習06
SELECT
fruit_price,
fruit_price + 3,
fruit_price - 10,
fruit_price * 2,
fruit_price / 2
FROM sample
実際にクエリを実行した結果がこちら。
「+」(半角プラス)、「-」(半角ハイフン)、「/」(半角スラッシュ)は普段使う演算子と同じで、足し算、引き算、割り算を意味しています。
四則演算での「*」(半角アスタリスク)ですが、これは掛け算を意味しています。
全部のカラムを指定する時にも「*」を使いますが、計算式の中で使うことで、SQL側で「*」を掛け算として解釈してくれます。
最初の内は、同じ記号で別々の意味を持つことに苦戦するかもしれませんが、計算式になっているかいないかは直感的に判断できるでしょうから、すぐに慣れるでしょう。
ちなみに、カラム名が無くても大丈夫です。
SELECT
fruit_name,
fruit_price,
"円",
1,
"個"
FROM sample
「”」(半角ダブルクォーテーション)に関しては、データ型を説明する記事にて解説します。
データ型を解説する記事へのリンクを設置予定
SELECT
"フルーツの名前:" || fruit_name
FROM sample
四則演算とは少し違いますが、「|」(半角縦棒)を2個連続で書くと、左側の文字列の後ろに右側の文字列を連結することができます。
頻繁に使うわけではありませんが、時折見かけることになるでしょう。
なお、割り算をする時に「0」で割ってしまうとエラーになります。
SELECT fruit_price / 0 FROM sample
division by zero: 100 / 0
特殊な処理結果を抽出できる
「SELECT」句を学びたての段階では難しい話になりますが、SQLでは「関数」という特殊処理を行ってくれる機能があります。
試しに、下記演習09のクエリを実行してみてください。
-- 演習07
SELECT
FORMAT("%04d", fruit_id),
UPPER(fruit_name)
FROM sample
実際にクエリを実行した結果がこちら。
「FORMAT」という関数を使うことで、「fruit_id」をゼロ埋め4桁のテキストに変換しています。
「UPPER」という関数を使うことで、「fruit_name」を英大文字に変換しています。
他にも様々な関数があり、使いこなすことができれば様々な形に変換できます。
関数について詳しく学びたい方はこちらの記事もご覧ください。
関数を解説する記事へのリンクを設置予定
全ての関数をマスターしようとすると大変です。
初心者の内は、「関数」という特殊処理を使えることだけ覚えておいて、よく使う関数から一つずつ覚えていくのが良いでしょう。
たくさんのクエリに触れ、勉強し、経験を積む内に、使ったことが無い関数であっても調べて使うことができるようになります。
抽出結果のカラムに別の名前を付けることができる
四則演算や関数で変換した結果、カラム名が「f0_」のように変わっていることにお気づきでしたでしょうか。
「SELECT」句でできること3つ目では、表示するカラム名を操作する方法をご紹介します。
抽出結果のカラムの名前を書き換えることができる
抽出するカラム名の後に、「AS」句を書いて、その後ろに表示させたい名前を書くことで、アウトプットされるカラム名を操作できます。
-- 演習08
SELECT fruit_price AS fruit_price_excluding_tax FROM sample
実際にクエリを実行した結果がこちら。
「fruit_price」というカラムが、「fruit_price_excluding_tax」というカラム名になって表示されました。
このように、アウトプットされるカラムの名前を操作できます。
なお、「AS」は省略することができます。
省略されたクエリを見かけても、「AS」が省略されているものと見抜けるようになっておきましょう。
SELECT fruit_price fruit_price_excluding_tax FROM sample
加工された結果に対してもカラムの名前を書き換えることができる
ここまでご覧いただいた流れからご推察いただけているかもしれませんが、四則演算や関数で演算した結果に対しても名前を付けることができます。
-- 演習09
SELECT fruit_price * 1.1 AS fruit_price_including_tax FROM sample
実際にクエリを実行した結果がこちら。
ただ名前を書き換えるだけなので、勉強し始めた頃はあまり重要に感じないかもしれません。
しかし、ビジネスでクエリを書いていると、自分以外の他のメンバーにクエリを見てもらう場面が多く発生します。
その時、分かりやすいカラム名を付けていることが重要で、良い名前を付けてないと読んでくれないこともあります。
可読性を解説する記事へのリンクを設置予定
クエリの読みやすさは奥深いもので、中級者にステップアップする上で大事なポイントです。
後々、難しいクエリを書けるようになった時にご一読ください。
重複除去した結果を抽出することができる
「SELECT」句でできること4つの最後の4つ目です。
他の3つとはちょっと毛色が違うところなので、人によっては難しさを感じるかもしれません。
特定のカラムを重複除去して抽出できる
抽出したレコードで値の重複を除去したい場面では、「DISTINCT」を使います。
「SELECT」と抽出カラム名の間に、「DISTINCT」と指定してください。
-- 演習10
SELECT DISTINCT fruit_price FROM sample
実際にクエリを実行した結果がこちら。
「80」が2件で重複していたところが1件にまとまり、重複除去できています。
特定の複数カラムを重複除去して抽出できる
「DISTINCT」を指定しつつ複数カラムを指定した時、その組み合わせ全体での重複除去が行われます。
-- 演習11
SELECT DISTINCT fruit_name, fruit_price FROM sample
実際にクエリを実行した結果がこちら。
「fruit_price」では重複がありましたが、「fruit_name」と組み合わせた結果では重複が無いため、「80」がそのまま抽出されます。
ちなみに、勉強を進める内に「GROUP BY」句を覚えることになりますが、「DISTINCT」を使わずとも「GROUP BY」を使えば同じことができます。
GROUP BY句を解説する記事へのリンクを設置予定
「GROUP BY」句でできることは非常に重要なので、初心者の内は「DISTINCT」を覚えずとも何とかなるんですが、この機会にしっかり覚えておくことをおすすめします。
理由は、「GROUP BY」句を使いこなせるようになる中で、「DISTINCT」が再登場し、その時に慣れ親しんだ状態の方が勉強しやすいからです。
振り返り
お疲れさまでした。
難しいキーワードも登場していますが、勉強を後回しにして良いところは後回しにして、どんどん次の勉強へ進んでいきましょう。
次に勉強するのは「FROM」句です。
FROM句を解説する記事へのリンクを設置予定