データベースを使うシーンで一番よくあるのが、レポート用のデータ準備だよね。例えば、君が大学で働いてて、上司(もちろんSQLなんて全然わかってない人)が「学生の名前と苗字をくっつけて、生年月日をDD-MM-YYYY形式で出して」って頼んできたとしよう。やることはシンプル:データをキレイに見せること。SQLはこういう時の頼れる相棒だよ!
例1:名前と苗字の結合
まずは、テーブルstudentsから学生の名前(first_name)と苗字(last_name)をくっつけてみよう。
SELECT
CONCAT(first_name, ' ', last_name) AS full_name
FROM
students;
ここで何が起きてる?
CONCAT()は文字列を結合する関数。名前と苗字の間にスペースを入れて見やすくしてるよ。- 結果は新しいカラム
full_nameに保存される。
結果はこんな感じ:
| full_name |
|---|
| Otto Art |
| Anna Song |
| Pol Mac |
例2:日付のフォーマット
次は、生年月日をフォーマットしてクエリに追加しよう。
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students;
ここが新しいポイント:
TO_CHAR()関数をbirth_dateフィールドに使ってる。'DD-MM-YYYY'フォーマットで日付を見やすく変換(例:25-12-2001)。
結果:
| full_name | formatted_birth_date |
|---|---|
| Otto Art | 12-04-1995 |
| Anna Song | 03-08-1996 |
| Pol Mac | 21-11-1997 |
できた!これでキレイなレポートが完成だね。
データエクスポート用のフォーマット
例えば、同僚が注文データをCSVでエクスポートしてExcelで使いたいって言ってきたとしよう。でも、DBのデータはそのままだと見にくいし、営業部の人たちは「この形で出して!」ってうるさい。例えばtotal_priceフィールドは、$100.00みたいな形で見せてほしいって。
例3:数字を通貨フォーマットに変換
テーブルordersの注文データをエクスポート用に整えるよ:
SELECT
order_id,
TO_CHAR(total_price, 'FM$999,999.00') AS formatted_price
FROM
orders;
TO_CHAR()はここで何してる?
FM(Fill Mode)は余計なスペースを消してくれる。$は通貨記号を追加。999,999.00は千区切りと小数点2桁のフォーマット。
結果:
| order_id | formatted_price |
|---|---|
| 1 | $1,000.00 |
| 2 | $2,500.50 |
| 3 | $10.00 |
これで同僚もExcelにインポートしやすいし、会議で褒められるかもね。
最終課題
ここからが本番。今まで覚えたスキルを全部使ってみよう!
課題
テーブルstudentsに対して、次のクエリを作ってみて:
- 名前と苗字を
full_nameカラムに結合する。 - 生年月日を
DD-MM-YYYY形式に変換する。 - 学生の現在の年齢を表示する。
クエリはこんな感じになるよ:
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date,
DATE_PART('year', AGE(birth_date)) AS age
FROM
students;
新しいポイント:
AGE(birth_date)は今の日付と生年月日の間の期間(年・月・日)を返す。DATE_PART('year', AGE(birth_date))でその期間から年だけを取り出す。
結果:
| full_name | formatted_birth_date | age |
|---|---|---|
| Otto Art | 12-04-1995 | 28 |
| Anna Song | 03-08-1996 | 27 |
| Pol Mac | 21-11-1997 | 25 |
こんなレポートなら、どんな細かい同僚も納得してくれるはず!
特定条件でのフォーマット
時には、条件やフィルタのためにデータをフォーマットすることもあるよ。例えば、今月が誕生日の学生だけを取り出したい場合とか。
例4:月でフィルタリング
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students
WHERE
DATE_PART('month', birth_date) = DATE_PART('month', CURRENT_DATE);
どうやって動いてる?
DATE_PART('month', birth_date)で生年月日から月だけを取り出す。CURRENT_DATEは今日の日付。そこからDATE_PART()で月を取る。
フォーマットとソートの組み合わせ
じゃあ今までの知識を組み合わせて、ソートも追加してみよう。例えば、学生を生年月日順に並べるリストを作るとか。
例5:生年月日でソート
SELECT
CONCAT(first_name, ' ', last_name) AS full_name,
TO_CHAR(birth_date, 'DD-MM-YYYY') AS formatted_birth_date
FROM
students
ORDER BY
birth_date ASC;
ASC(昇順)だと年上から順に、DESC(降順)だと若い順に並ぶよ。
ユニーク値との組み合わせ
最後にちょっと応用問題。大学に複数の都市にキャンパスがあるとして、学生がいる都市のリストを重複なしで、アルファベット順に出したいとしよう。
例6:ユニーク値とソート
SELECT DISTINCT
city
FROM
students
ORDER BY
city ASC;
DISTINCTは何してる?
重複する都市名を省いて、1つずつだけ結果に出してくれる。
なんでこんなことするの?
便利さと見た目の良さ。 データがキレイだと作業しやすいし、上司からの質問も減るよ。
リアルな現場対応力。 レポートを自動生成したり、エクスポートやプレゼン資料も楽勝になる。
自分の価値アップ。 SQLはただのデータ操作じゃなくて、分かりやすくて役立つ形にするためのものなんだ。
このスキルを使って、ただのクエリじゃなくて“作品”を作ろう!次のレクチャーではPostgreSQLの魔法をもっと深掘りしていくよ。
GO TO FULL VERSION