データベースからデータを引っ張るとき、全部のカラムが欲しいことってほとんどないよね。例えば、従業員テーブル employees には15個くらいカラムがあるかも。名前、苗字、生年月日、役職、給料、入社日とか色々。でも知りたいのは名前と役職だけだったりする。全部引っ張るのは無駄だし効率悪い。ここで「必要なカラムだけ選ぶ」テクが登場するってわけ!
例えるなら、オレンジ、リンゴ、バナナが入ったカゴからリンゴだけ取り出す感じ。イケてるでしょ?じゃあやってみよう!
シンタックス
ちなみに、SQLはめっちゃuser-friendlyに設計されてるよ。
まず、クエリの大文字小文字は気にしなくてOK。SELECTでもSelectでもselectでも全部動く。それから、改行も気にしなくていい。DBMSは全部1行にまとめてくれるから、好きなように書いて大丈夫。
もう分かってると思うけど、SELECTとFROMだけじゃSQLは終わらない。だからみんなSQLで盛り上がるんだよね。拡張版のSQLクエリはこんな感じ:
SELECT カラム
FROM テーブル
WHERE 条件
GROUP BY カラム
HAVING カラム
ORDER BY ソート
それぞれ:
カラム— 取得したいカラム名。テーブル— データを取るテーブル名。条件— 行を絞り込む条件。ソート— 並び順やソート方法。
簡単そう?じゃあ実際の例で見てみよう。でもまずはシンプルな例から!
基本クエリの例
例えば、students っていう学生データのテーブルがあるとする。テーブルの構造はこんな感じ:
| id | first_name | last_name | age | grade |
|---|---|---|---|---|
| 1 | Alex | Lin | 20 | A |
| 2 | Anna | Song | 22 | B |
| 3 | Otto | Art | 19 | A |
今度は全員のlast_name(苗字)とgrade(成績)だけ知りたいとする。
クエリはこうなる:
SELECT last_name, grade
FROM students;
実行結果:
| last_name | grade |
|---|---|
| Lin | A |
| Song | B |
| Art | A |
おめでとう!DBのリソースを節約できたし、結果も見やすくなった!
文字列の結合
データを選ぶのはもうできるから、ちょっと面白いことやってみよう。今のテーブルだと名前と苗字が別カラムになってる。じゃあ、フルネームのカラムを作るクエリを書いてみよう。
PostgreSQLで2つの文字列をくっつけるには||演算子を使う。SELECTクエリはこうなる:
SELECT first_name || last_name, grade
FROM students;
実行結果:
| first_name || last_name | grade |
|---|---|
| AlexLin | A |
| AnnaSong | B |
| OttoArt | A |
うーん。なんか足りないよね。例えば名前と苗字の間にスペースがない!これ直そう。
SELECT first_name || ' ' || last_name, grade
FROM students;
実行結果:
| first_name || ' ' || last_name | grade |
|---|---|
| Alex Lin | A |
| Anna Song | B |
| Otto Art | A |
いい感じ!テーブルの中身は気に入ったけど、ヘッダーがちょっと…。full nameとかnameって表示したいよね。first_name || ' ' || last_nameはちょっとダサいし実用的じゃない。これも解決できる!
エイリアス(別名)を使った選択
SQLクエリはエイリアスを使うともっと読みやすくできる。これはクエリ内だけでカラムに新しい名前をつける方法。エイリアスはASキーワードを使う(省略もできるけど、読みやすさのために書いた方がいいよ)。
例を見てみよう:
SELECT first_name AS "名前", last_name AS "苗字", grade AS "成績"
FROM students;
実行結果:
| 名前 | 苗字 | 成績 |
|---|---|---|
| Alex | Lin | A |
| Anna | Song | B |
| Otto | Art | A |
ここで:
- カラム名を日本語で分かりやすくリネームした。
ASを使ってエイリアスを指定した。
上司やクライアントにユーザー情報を見せるとき、テーブルが分かりやすいと助かるよね。エイリアスはマジで便利!
じゃあ、フルネーム取得クエリももうちょい良くしよう。
SELECT first_name || ' ' || last_name AS "フルネーム", grade AS "成績"
FROM students;
実行結果:
| フルネーム | 成績 |
|---|---|
| Alex Lin | A |
| Anna Song | B |
| Otto Art | A |
バッチリ!思った通り!
なぜ一部のカラムだけ選ぶの?
- パフォーマンス
例えば、何百万行・何百カラムもある巨大テーブルでSELECT *したら、何分も何時間もかかるし、サーバーのリソースも食う。でも必要なものだけ取れば超効率的!
- 読みやすさ
必要なカラムだけ抜き出すと、結果がめっちゃ分かりやすくなる。全部出すと金曜夜のニュースフィードみたいにゴチャゴチャになるよ。
- ミスの最小化
クエリで扱うデータが少なければ少ないほど、変なミスも減る。特にその後データを加工する場合は大事!
覚えておきたいこと
テーブルのエイリアス
テーブル名が長いときは、テーブルにもエイリアスを付けると便利。元のテーブル名に似てたり、内容に関連した短縮名にしよう。
SELECT sa05.first_name, sa05.course_id
FROM students_archive_2005 AS sa05
この方法は、university_students_enrollments_recordsみたいな長いテーブル名のときに特に便利。usrやusとかにできるよ。
特定カラム選択でありがちなミス
カラム名のミス。カラム名を間違えると、
ERROR: column "lastname" does not existみたいなエラーが出る。スペルをちゃんと確認しよう!名前の衝突。複数テーブルを使うときは、どのテーブルのカラムか必ず指定しよう。例:
students.first_name。SELECT *の使いすぎは初心者の罠。確かに楽だけど、大きなプロジェクトではNG!本当に必要なカラムだけ選ぼう。
GO TO FULL VERSION