アマテラスの司令官から「乗組員の“名前”と“役職”だけ確認したい、給与とか年齢は今はいらない」と頼まれました。前回の SELECT * FROM crew; のままで応えられるでしょうか?
* はすべての列を持ってきてしまいます。今回のように「必要な列だけ」が欲しいときは、* の使いどころではありません。SELECT句の書き方を、少しだけ変えてみましょう。
必要な列だけを名指しする
* の代わりに、欲しい列の名前を直接書くことができます。名前と役職だけを取り出したいときは、こう書きます。
SELECT name, role FROM crew;
結果はこうなります。
| name | role |
|---|---|
| ユミ | エンジニア |
| ケンジ | パイロット |
| サクラ | 医師 |
| ハルト | 医師 |
| レイ | 研究員 |
| ミドリ | パイロット |
| ソラ | エンジニア |
| トウマ | 研究員 |
| アカリ | エンジニア |
| リョウ | パイロット |
age も home も salary も、結果には現れていません。SELECT句にカンマ区切りで並べた列だけが返ってくる、というのが基本のルールです。列が1つだけ欲しければ、SELECT name FROM crew; のようにカンマなしで1つだけ書けば十分です。
列は「書いた順番」で返ってくる
もうひとつ大事なポイントがあります。結果に並ぶ列の順序は、テーブルでの元の並び順ではなく、SELECT句に書いた順番になるということです。
先ほどとは逆に、役職を先に書いてみましょう。
SELECT role, name FROM crew;
| role | name |
|---|---|
| エンジニア | ユミ |
| パイロット | ケンジ |
| 医師 | サクラ |
| 医師 | ハルト |
| 研究員 | レイ |
| パイロット | ミドリ |
| エンジニア | ソラ |
| 研究員 | トウマ |
| エンジニア | アカリ |
| パイロット | リョウ |
crew テーブルでは name の方が role より左にありますが、結果では role が先頭に来ています。SELECT句は「テーブルの並びをそのまま出す」のではなく、「この順番で見せてほしい」という自分の希望を伝える場所なのです。
なぜ「必要な列だけ」取るのか
「どうせ全部見えるなら * でいいのでは?」と思うかもしれません。しかし、実際の現場では、必要な列だけを指定することがとても大切にされています。
理由は主に2つあります。ひとつは読みやすさ。結果に不要な列が並んでいると、本当に見たい情報が埋もれてしまいます。もうひとつは効率。テーブルの列が数十個もあるような大きなシステムでは、使わない列まで毎回取り出すと、それだけ余計な時間がかかってしまいます。
「今、本当に必要な情報は何か」を考えて列を選ぶ——これは、SQLを書くうえでの基本の姿勢として、ここでしっかり身につけておきましょう。
SELECT role, name FROM crew; を実行すると、結果の列はどんな順番で並ぶでしょう?
答えを見る
role が先、name が後という、SELECT句に書いた順番で並びます。crew テーブル自体での列の並び順とは関係ありません。SELECT句は「見せてほしい順番」を自分で指定できる場所です。
* と、列を名指しする書き方、両方の感覚をSQL DIVERで確かめてみましょう。SELECT name, role FROM crew; や SELECT age, home FROM crew; など、組み合わせを変えて何度もタイプしてみるのがおすすめです。
* は「全部」、列名を並べれば「それだけ」。しかも並び順は自分で決められる——地味だけどよく使う技だよ。次は、重複を消したり、列に別名をつけたりする方法を見ていこう!