- 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
文をご紹介しました。
ちょっと複雑なクエリもありましたが、一つ一つ丁寧に追っていけば必ず理解できるはずです。
ぜひ、マスターまでクエリを書きつつ粘り強く挑戦してみてください。
コメント