SELECT role FROM crew; を実行すると、「研究員」「パイロット」「エンジニア」といった役職が、乗組員の人数ぶんだけ同じ言葉が何度も並びます。「アマテラスにはどんな役職の種類があるか」だけを知りたいとき、この結果は少し見づらくないでしょうか?
役職の「種類」が知りたいだけなら、同じ言葉が何度も並ぶ必要はありませんよね。SQLには、この「重複」をきれいに取り除いてくれる便利な仕組みがあります。
DISTINCTで重複を取り除く
まずは、重複ありのままの結果を見てみましょう。
SELECT role FROM crew;
| role |
|---|
| エンジニア |
| パイロット |
| 医師 |
| 医師 |
| 研究員 |
| パイロット |
| エンジニア |
| 研究員 |
| エンジニア |
| パイロット |
10人分の役職がそのまま並び、同じ役職が何度も繰り返されています。ここで DISTINCT を使うと、重複を1つにまとめてくれます。
SELECT DISTINCT role FROM crew;
| role |
|---|
| エンジニア |
| パイロット |
| 医師 |
| 研究員 |
10行あった結果が、種類の数である4行にまとまりました。DISTINCTはSELECTのすぐ後ろに1つ書くだけで使えます。「アマテラスにはどんな出身地があるか」を知りたければ SELECT DISTINCT home FROM crew; という具合に、列を変えて同じように使えます。
AS で列に別名をつける
次は、結果の見出し(列名)を分かりやすくする方法です。crew テーブルの列名は英語ですが、結果を表示するときに日本語の見出しをつけたいこともあります。そんなときは AS を使います。
SELECT name AS 名前, role AS 役職 FROM crew;
| 名前 | 役職 |
|---|---|
| ユミ | エンジニア |
| ケンジ | パイロット |
| サクラ | 医師 |
| ハルト | 医師 |
| レイ | 研究員 |
| ミドリ | パイロット |
| ソラ | エンジニア |
| トウマ | 研究員 |
| アカリ | エンジニア |
| リョウ | パイロット |
見出しが name ・ role ではなく、名前 ・ 役職 に変わっているのが分かりますか。AS は「これを、こういう名前で呼んでください」という別名(エイリアス)をつける命令です。もとの crew テーブルの列名自体が変わるわけではなく、その結果を表示するときだけの呼び名が変わる、という点に注意してください。
DISTINCTとASは、組み合わせて使うこともできます。
SELECT DISTINCT role AS 役職の種類 FROM crew;
このように書けば、「役職の種類」という分かりやすい見出しで、重複のない一覧を確認できます。
SELECT DISTINCT role FROM crew; と SELECT role AS 役職 FROM crew; は、それぞれ何をする命令でしょう?
答えを見る
DISTINCT は role の値の重複を取り除いて、種類だけを一覧にします。AS は role という列に「役職」という別名をつけて、結果の見出しを分かりやすくします。役割がまったく違う命令なので、混同しないようにしましょう。
DISTINCTで重複を消す感覚、ASで見出しを変える感覚——どちらもSQL DIVERで実際に打って確かめてみましょう。SELECT DISTINCT home FROM crew; や SELECT age AS 年齢 FROM crew; のように、少しずつ書き方を変えて試すのがおすすめです。
DISTINCTは「かぶりをなくす」、ASは「呼び名を変える」。似た見た目の命令が増えてきたけど、役割さえ覚えれば怖くないよ。次は、SELECT句の中で計算までしちゃう技を紹介するね!