- SQL でデータを取得したい!
- できればちょっと複雑な条件で取得したい。
このような方に向けて書きました。
SQL 操作の中でも「基本」かつ「最重要」なのが今回ご紹介するSELECT文です。
データベースからデータを取得してくるクエリで、単にデータを取得してくるほか条件や並び替え、集計などを行うことができます。
必ずマスターすべきクエリの一つなので、一つずつ丁寧に確認していきましょう!
SELECT 文の基本

データベースからデータを取得する時に使うのがSELECT文です。
基本構文
基本構文は以下の通りです。
SELECT 列1, 列2, ...
FROM テーブル名
WHERE 条件
GROUP BY 列1
HAVING 集計条件
ORDER BY 列1
LIMIT 件数 OFFSET オフセット;それぞれの句を詳しく説明すると、以下の通りです。
| 句 | 効果 |
|---|---|
| SELECT | 取得する列を指定 全列取得には *を使用 |
| FROM | 取得するテーブルを指定 |
| WHERE | 取得条件を指定 |
| GROUP BY | 特定の列でグループ化 |
| HAVING | GROUP BYのデータに条件指定 |
| ORDER BY | 特定の列で並び替える |
| LIMIT | 取得する行数を制限 |
すべての行を取得
すべての行を取得するクエリはシンプルです。
SELECT *
FROM employees;employeesテーブルからすべての列のデータを取得します。
SELECTはデータベースからデータを選択するために使います。
さらにすべての列を表す*(アスタリスク)を使うことで、SELECTの対象がすべての行になります。
特定の列を取得
特定の列だけを抽出する場合、SELECTにの後に取得したい列名を続けます。
SELECT name, age
FROM employees;元々、employeesテーブルが次のようなものだったとします。
| id | name | age | position | salary |
|---|---|---|---|---|
| 1 | Alice | 30 | Manager | 70000 |
| 2 | Bob | 25 | Developer | 60000 |
| 3 | Carol | 28 | Designer | 55000 |
クエリの実行結果は以下になります。
| name | age |
|---|---|
| Alice | 30 |
| Bob | 25 |
| Carol | 28 |
条件に一致する行を取得
条件の指定はWHERE句に書きます。
SELECT name, age
FROM employees
WHERE age > 30;上記では、employeesテーブルからage列の値が30より大きい異形のnameとage列のデータだけを取得します。
employeesテーブルが次のようだったとします。
| id | name | age | position | salary |
|---|---|---|---|---|
| 1 | Alice | 35 | Manager | 70000 |
| 2 | Bob | 25 | Developer | 60000 |
| 3 | Carol | 40 | Designer | 55000 |
| 4 | Dave | 30 | Tester | 50000 |
クエリの実行結果は以下です。
| name | age |
|---|---|
| Alice | 35 |
| Carol | 40 |
データをグループ化して集計
GROUP BYでは、指定した列を基準として集計が行えます。
SELECT department, COUNT(*)
FROM employees
GROUP BY department;employeesテーブルが以下だったとします。
| id | name | age | department | position | salary |
|---|---|---|---|---|---|
| 1 | Alice | 35 | HR | Manager | 70000 |
| 2 | Bob | 25 | IT | Developer | 60000 |
| 3 | Carol | 40 | IT | Designer | 55000 |
| 4 | Dave | 30 | HR | Tester | 50000 |
| 5 | Eve | 28 | Sales | Sales Rep | 45000 |
クエリの実行結果は以下の通りです。
| department | COUNT(*) |
|---|---|
| HR | 2 |
| IT | 2 |
| Sales | 1 |
つまりemployeesテーブルから各部門ごとに従業員の数をカウントし、各部門名と従業員数を取得します。
集計データに条件をつける場合
GROUP BYの条件指定にはHAVINGを使います。
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;employeesテーブルが以下だったとします。
| id | name | age | department | position | salary |
|---|---|---|---|---|---|
| 1 | Alice | 35 | HR | Manager | 70000 |
| 2 | Bob | 25 | IT | Developer | 60000 |
| 3 | Carol | 40 | IT | Designer | 55000 |
| 4 | Dave | 30 | HR | Tester | 50000 |
| 5 | Eve | 28 | Sales | Sales Rep | 45000 |
| 6 | Frank | 32 | IT | Developer | 60000 |
| 7 | Grace | 29 | IT | Designer | 55000 |
| 8 | Heidi | 27 | IT | Developer | 60000 |
| 9 | Ivan | 26 | IT | Developer | 60000 |
| 10 | Judy | 31 | Sales | Sales Rep | 45000 |
以下がクエリの実行結果です。
| department | COUNT(*) |
|---|---|
| IT | 6 |
このように、employeesテーブルから各部門ごとに従業員の数をカウントし、その結果が5より多い部門だけが取得されます。
今回は5より大きいのはITのみなので、このような結果になりました。
データを並び替える
データの並び替えにはORDER BYを使います。
SELECT name, age
FROM employees
ORDER BY age DESC;高い順(降順)に並び替える場合にはDESCを、低い順(昇順)に並び替える場合にはASCを使います。
employeesテーブルが以下だったとします。
| id | name | age | department | position | salary |
|---|---|---|---|---|---|
| 1 | Alice | 35 | HR | Manager | 70000 |
| 2 | Bob | 25 | IT | Developer | 60000 |
| 3 | Carol | 40 | IT | Designer | 55000 |
| 4 | Dave | 30 | HR | Tester | 50000 |
| 5 | Eve | 28 | Sales | Sales Rep | 45000 |
以下がクエリの実行結果です。
| name | age |
|---|---|
| Carol | 40 |
| Alice | 35 |
| Dave | 30 |
| Eve | 28 |
| Bob | 25 |
employeesテーブルからnameとage列のデータを取得し、age列の値が高い順に並べ替えた結果が出力されます。
取得する行数を制限
ページネーションをする場合やデータの一部だけ取得してパフォーマンスを上げたい場合などに便利なのがLIMITというクエリです。
SELECT name, age
FROM employees
LIMIT 10;employeesテーブルが以下だったとします。
| id | name | age | department | position | salary |
|---|---|---|---|---|---|
| 1 | Alice | 35 | HR | Manager | 70000 |
| 2 | Bob | 25 | IT | Developer | 60000 |
| 3 | Carol | 40 | IT | Designer | 55000 |
| 4 | Dave | 30 | HR | Tester | 50000 |
| 5 | Eve | 28 | Sales | Sales Rep | 45000 |
| 6 | Frank | 32 | IT | Developer | 60000 |
| 7 | Grace | 29 | IT | Designer | 55000 |
| 8 | Heidi | 27 | IT | Developer | 60000 |
| 9 | Ivan | 26 | IT | Developer | 60000 |
| 10 | Judy | 31 | Sales | Sales Rep | 45000 |
| 11 | Kevin | 33 | IT | Developer | 60000 |
| 12 | Laura | 24 | HR | Assistant | 40000 |
以下がクエリの実行結果です。
| name | age |
|---|---|
| Alice | 35 |
| Bob | 25 |
| Carol | 40 |
| Dave | 30 |
| Eve | 28 |
| Frank | 32 |
| Grace | 29 |
| Heidi | 27 |
| Ivan | 26 |
| Judy | 31 |
employeesテーブルからnameとage列のデータを取得し、その中から最初の10行までのデータが返されます。
複雑なクエリの例
複雑なクエリの例を示します。
SELECT department, AVG(salary)
FROM employees
WHERE age > 30
GROUP BY department
HAVING AVG(salary) > 50000
ORDER BY AVG(salary) DESC
LIMIT 5 OFFSET 10;このクエリは、30歳以上の従業員のデータから、部門ごとの平均給与を計算し、平均給与が50,000を超える部門を取得し、給与の高い順に並べ替え、11番目から15番目までの部門を取得します。
employeesテーブルが以下だったとします。
| id | name | age | department | position | salary |
|---|---|---|---|---|---|
| 1 | Alice | 35 | HR | Manager | 70000 |
| 2 | Bob | 45 | IT | Developer | 60000 |
| 3 | Carol | 40 | IT | Designer | 55000 |
| 4 | Dave | 32 | HR | Tester | 50000 |
| 5 | Eve | 38 | Sales | Sales Rep | 45000 |
| 6 | Frank | 42 | IT | Developer | 65000 |
| 7 | Grace | 29 | IT | Designer | 55000 |
| 8 | Heidi | 27 | IT | Developer | 60000 |
| 9 | Ivan | 26 | IT | Developer | 60000 |
| 10 | Judy | 31 | Sales | Sales Rep | 47000 |
| 11 | Kevin | 33 | IT | Developer | 60000 |
| 12 | Laura | 24 | HR | Assistant | 40000 |
| 13 | Mike | 55 | HR | Consultant | 80000 |
| 14 | Nina | 36 | Sales | Sales Rep | 48000 |
以下がクエリの実行結果です。
| department | AVG(salary) |
|---|---|
| IT | 62500 |
| HR | 60000 |
ただし、LIMIT 5 OFFSET 10によって適用されるデータが上記の例に適用される場合は、スキップされたり表示されたりするデータ量に応じて部分的な結果のみが表示される可能性があります。
まとめ:SELECT 文を理解してSQLの超基本をマスターしよう!

SQL の基本かつ超重要なSELECT文をご紹介しました。
ちょっと複雑なクエリもありましたが、一つ一つ丁寧に追っていけば必ず理解できるはずです。
ぜひ、マスターまでクエリを書きつつ粘り強く挑戦してみてください。

コメント