SQLのSELECT文とは?列の選び方を元の表と実行結果で解説
SELECTは、表から見たいデータを取り出すSQLです。たとえば社員の表から、名前だけを表示したり、名前と月給を並べたりできます。小さな表を使って、SQLを書くと何が表示されるのかを見ていきましょう。
例で使う表
employeesは社員の情報を保存した表(テーブル)です。横の1行が社員1人分、縦の列が名前や月給といった項目です。このページでは、次の3人をすべての例で使います。結果表の行の並びは一例です。SQLで並び順を指定しない場合、表示順が変わることがあります。
| id(社員ID) | name(名前) | department(部署) | salary(月給) |
|---|---|---|---|
| 1 | 青木 | 営業 | 300000 |
| 2 | 北野 | 開発 | 400000 |
| 3 | 中央 | 営業 | 350000 |
SELECTの基本構文
SELECT name
FROM employees;SELECTとFROMで社員名だけを取り出す
社員の名前だけを見たいときは、SELECTの後ろにname、FROMの後ろにemployeesと書きます。SELECTは「どの列を表示するか」、FROMは「どの表から取り出すか」です。元の表のname列が取り出され、3人の名前が表示されます。末尾のセミコロン(;)はSQL文の終わりを示します。
SELECT name
FROM employees;| name |
|---|
| 青木 |
| 北野 |
| 中央 |
複数の列をカンマで並べる
名前と月給を一緒に見たいときは、name, salaryのように列名をカンマで区切ります。結果の列はSELECTに書いた順に並びます。この例では左が名前、右が月給です。社員は3人のままで、表示する列が1つから2つに増えます。
SELECT name, salary
FROM employees;| name | salary |
|---|---|
| 青木 | 300000 |
| 北野 | 400000 |
| 中央 | 350000 |
SELECT *で全列を表示する
列を1つずつ書く代わりに*を書くと、表の全列を表示できます。この表ではid・name・department・salaryの4列です。まず表にどんなデータがあるかを確認するときに使えます。
SELECT *
FROM employees;| id | name | department | salary |
|---|---|---|---|
| 1 | 青木 | 営業 | 300000 |
| 2 | 北野 | 開発 | 400000 |
| 3 | 中央 | 営業 | 350000 |
ASで結果の列名を変える
salaryを「月給」と表示したいときは、salary AS "月給"と書きます。ASの後ろが結果の列名です。下の例では見出しだけが変わり、金額は変わりません。元のemployeesの列名もsalaryのままです。
SELECT name, salary AS "月給"
FROM employees;| name | 月給 |
|---|---|
| 青木 | 300000 |
| 北野 | 400000 |
| 中央 | 350000 |
SELECTに計算式を書いて12か月分の給与を求める
SELECTには列名だけでなく計算式も書けます。salary * 12は月給を12倍する式です。ここでは毎月同じ月給とし、賞与を含まない12か月分の給与を求めます。青木さんは300000 × 12で3600000円です。ASで計算結果の列に名前を付けています。
SELECT name, salary * 12 AS "12か月分の給与"
FROM employees;| name | 12か月分の給与 |
|---|---|
| 青木 | 3600000 |
| 北野 | 4800000 |
| 中央 | 4200000 |
部署だけを表示すると同じ値もそのまま出る
部署の一覧を作る前に、department列だけを取り出してみます。青木さんと中央さんはどちらも営業なので、営業が2回表示されます。通常のSELECTは、表示する値が同じでも社員それぞれの行を残します。
SELECT department
FROM employees;| department |
|---|
| 営業 |
| 開発 |
| 営業 |
DISTINCTで部署の重複を除く
どんな部署があるかを知りたいときは、SELECTの直後にDISTINCTを付けます。前の結果に2回出ていた営業が1行にまとまり、営業と開発の2行になります。社員データを削除する処理ではなく、検索結果の重複を除く指定です。
SELECT DISTINCT department
FROM employees;| department |
|---|
| 営業 |
| 開発 |
実際に1問解いてみる
SELECT *で全列を取得する
usersテーブルの全列を取得してください。
テーブル
読み込み中…
実行結果
関連構文
SELECTについてよくある質問
- SELECT *と列名の指定はどう使い分けますか?
- 表の中身をひとまず確認するならSELECT *が便利です。使う列が決まっている処理では列名を書いておくと、表に列が増えても結果の列構成が変わりません。
- DISTINCTで複数の列を指定するとどうなりますか?
- 指定した列の組み合わせが同じ行を1行にまとめます。たとえばdepartmentとnameを指定すると、この例は部署と名前の組み合わせがすべて違うため、3行のままです。
参考文献
内容はPostgreSQL公式ドキュメントを参照し、初めて学ぶ人向けに日本語で整理しています。
- PostgreSQL公式:テーブルへの問い合わせ — SELECT、全列の取得、計算、行順とDISTINCTの基本
- PostgreSQL公式:選択リスト — 列の指定、列ラベル、DISTINCTの仕様
- PostgreSQL公式:SELECT — FROMを省略したSELECT文の仕様