\ お問い合わせはこちら! /

【SQL】SELECT でデータ取得するための基礎講座

  • SQL でデータを取得したい!
  • できればちょっと複雑な条件で取得したい。

このような方に向けて書きました。

SQL 操作の中でも「基本」かつ「最重要」なのが今回ご紹介するSELECT文です。

データベースからデータを取得してくるクエリで、単にデータを取得してくるほか条件や並び替え、集計などを行うことができます。

必ずマスターすべきクエリの一つなので、一つずつ丁寧に確認していきましょう!

SELECT 文の基本

データベースからデータを取得する時に使うのがSELECT文です。

基本構文

基本構文は以下の通りです。

SELECT 列1, 列2, ...
FROM テーブル名
WHERE 条件
GROUP BY 列1
HAVING 集計条件
ORDER BY 列1
LIMIT 件数 OFFSET オフセット;

それぞれの句を詳しく説明すると、以下の通りです。

効果
SELECT取得する列を指定
全列取得には*を使用
FROM取得するテーブルを指定
WHERE取得条件を指定
GROUP BY特定の列でグループ化
HAVINGGROUP BYのデータに条件指定
ORDER BY特定の列で並び替える
LIMIT取得する行数を制限
句の説明

すべての行を取得

すべての行を取得するクエリはシンプルです。

SELECT *
FROM employees;

employeesテーブルからすべての列のデータを取得します。

SELECTはデータベースからデータを選択するために使います。

さらにすべての列を表す*(アスタリスク)を使うことで、SELECTの対象がすべての行になります。

特定の列を取得

特定の列だけを抽出する場合、SELECTにの後に取得したい列名を続けます。

SELECT name, age
FROM employees;
クエリ実行例

元々、employeesテーブルが次のようなものだったとします。

idnameagepositionsalary
1Alice30Manager70000
2Bob25Developer60000
3Carol28Designer55000
クエリ実行前

クエリの実行結果は以下になります。

nameage
Alice30
Bob25
Carol28
クエリ実行結果

条件に一致する行を取得

条件の指定はWHERE句に書きます。

SELECT name, age
FROM employees
WHERE age > 30;

上記では、employeesテーブルからage列の値が30より大きい異形のnameage列のデータだけを取得します。

クエリ実行例

employeesテーブルが次のようだったとします。

idnameagepositionsalary
1Alice35Manager70000
2Bob25Developer60000
3Carol40Designer55000
4Dave30Tester50000
元々のテーブル

クエリの実行結果は以下です。

nameage
Alice35
Carol40
クエリ実行結果

データをグループ化して集計

GROUP BYでは、指定した列を基準として集計が行えます。

SELECT department, COUNT(*)
FROM employees
GROUP BY department;
クエリ実行例

employeesテーブルが以下だったとします。

idnameagedepartmentpositionsalary
1Alice35HRManager70000
2Bob25ITDeveloper60000
3Carol40ITDesigner55000
4Dave30HRTester50000
5Eve28SalesSales Rep45000
元々のテーブル

クエリの実行結果は以下の通りです。

departmentCOUNT(*)
HR2
IT2
Sales1
クエリ実行結果

つまりemployeesテーブルから各部門ごとに従業員の数をカウントし、各部門名と従業員数を取得します。

集計データに条件をつける場合

GROUP BYの条件指定にはHAVINGを使います。

SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;
クエリ実行例

employeesテーブルが以下だったとします。

idnameagedepartmentpositionsalary
1Alice35HRManager70000
2Bob25ITDeveloper60000
3Carol40ITDesigner55000
4Dave30HRTester50000
5Eve28SalesSales Rep45000
6Frank32ITDeveloper60000
7Grace29ITDesigner55000
8Heidi27ITDeveloper60000
9Ivan26ITDeveloper60000
10Judy31SalesSales Rep45000
元々のテーブル

以下がクエリの実行結果です。

departmentCOUNT(*)
IT6
クエリ実行結果

このように、employeesテーブルから各部門ごとに従業員の数をカウントし、その結果が5より多い部門だけが取得されます。

今回は5より大きいのはITのみなので、このような結果になりました。

データを並び替える

データの並び替えにはORDER BYを使います。

SELECT name, age
FROM employees
ORDER BY age DESC;

高い順(降順)に並び替える場合にはDESCを、低い順(昇順)に並び替える場合にはASCを使います。

クエリ実行例

employeesテーブルが以下だったとします。

idnameagedepartmentpositionsalary
1Alice35HRManager70000
2Bob25ITDeveloper60000
3Carol40ITDesigner55000
4Dave30HRTester50000
5Eve28SalesSales Rep45000
元々のテーブル

以下がクエリの実行結果です。

nameage
Carol40
Alice35
Dave30
Eve28
Bob25
クエリ実行結果

employeesテーブルからnameage列のデータを取得し、age列の値が高い順に並べ替えた結果が出力されます。

取得する行数を制限

ページネーションをする場合やデータの一部だけ取得してパフォーマンスを上げたい場合などに便利なのがLIMITというクエリです。

SELECT name, age
FROM employees
LIMIT 10;
クエリ実行例

employeesテーブルが以下だったとします。

idnameagedepartmentpositionsalary
1Alice35HRManager70000
2Bob25ITDeveloper60000
3Carol40ITDesigner55000
4Dave30HRTester50000
5Eve28SalesSales Rep45000
6Frank32ITDeveloper60000
7Grace29ITDesigner55000
8Heidi27ITDeveloper60000
9Ivan26ITDeveloper60000
10Judy31SalesSales Rep45000
11Kevin33ITDeveloper60000
12Laura24HRAssistant40000
元々のテーブル

以下がクエリの実行結果です。

nameage
Alice35
Bob25
Carol40
Dave30
Eve28
Frank32
Grace29
Heidi27
Ivan26
Judy31
クエリ実行結果

employeesテーブルからnameage列のデータを取得し、その中から最初の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テーブルが以下だったとします。

idnameagedepartmentpositionsalary
1Alice35HRManager70000
2Bob45ITDeveloper60000
3Carol40ITDesigner55000
4Dave32HRTester50000
5Eve38SalesSales Rep45000
6Frank42ITDeveloper65000
7Grace29ITDesigner55000
8Heidi27ITDeveloper60000
9Ivan26ITDeveloper60000
10Judy31SalesSales Rep47000
11Kevin33ITDeveloper60000
12Laura24HRAssistant40000
13Mike55HRConsultant80000
14Nina36SalesSales Rep48000
元々のテーブル

以下がクエリの実行結果です。

departmentAVG(salary)
IT62500
HR60000
クエリ実行結果

ただし、LIMIT 5 OFFSET 10によって適用されるデータが上記の例に適用される場合は、スキップされたり表示されたりするデータ量に応じて部分的な結果のみが表示される可能性があります。

まとめ:SELECT 文を理解してSQLの超基本をマスターしよう!

SQL の基本かつ超重要なSELECT文をご紹介しました。

ちょっと複雑なクエリもありましたが、一つ一つ丁寧に追っていけば必ず理解できるはずです。

ぜひ、マスターまでクエリを書きつつ粘り強く挑戦してみてください。

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

karo@プログラマのアバター karo@プログラマ プログラマ

「書くことで人の役にたつ」をモットーに活動中。
本職はプログラマで、Python(Django)が得意。最近ではフロント側の技術に触れる機会も増えてきました。
基本情報技術者試験合格。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)