SQL Serverはデータベース管理システムの1つで、多くの企業やシステムで利用されています。
その中でも、SELECT文はデータを取得するための最も基本的なSQL文です。
この記事では、SQL ServerでのSELECT文の基本から、実務で役立つ応用的な使い方までを解説します。
最後には演習問題と解答例も用意していますので、ぜひ実践しながら学んでみてください。
SELECT文の基本構文
SELECT文の基本的な構文は次のようになります:
SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 条件;
基本的なSELECT文の例
全ての列を取得する
テーブルの全ての列を取得する場合は、*を使用します:
SELECT *
FROM Employees;
上記のクエリでEmployeesテーブルのすべての行・列を取得できます。
特定の列を取得する
必要な列のみを指定して取得する方法です:
SELECT EmployeeID, FirstName, LastName
FROM Employees;
上記のクエリでEmployeesテーブルから「社員ID」「名」「姓」のみを取得できます。
サブクエリの基本構文
SQL Serverにおけるサブクエリは、他のSELECT文の中に含まれる入れ子のクエリのことです。
以下はサブクエリの一般的な構文です。
SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 列名 条件演算子 (SELECT 列名 FROM テーブル名 WHERE 条件);
サブクエリはWHERE句やSELECT句、FROM句で使用され、メインクエリにデータを提供します。
サブクエリの種類
SQL Serverで使えるサブクエリには、以下の3種類があります:
- 単一行サブクエリ
- 1行の結果を返すサブクエリです。
- 比較演算子(=、<、>など)で使います。
- 複数行サブクエリ
- 複数の行を結果として返すサブクエリです。
- INやANY、ALLなどの演算子と組み合わせて使います。
- 相関サブクエリ
- メインクエリとサブクエリが互いに関連しているクエリです。
- サブクエリがメインクエリ内のデータを参照します。
サブクエリの基本的な使用例
例1:単一行サブクエリ
特定の条件を持つ値と一致するデータを取得します。
SELECT FirstName, LastName
FROM Employees
WHERE DepartmentID = (SELECT DepartmentID FROM Departments WHERE DepartmentName = 'Sales');
上記のクエリでDepartmentsテーブルから「Sales」という部署のDepartmentIDを取得し、その部署IDを持つ社員の名前を取得できます。
例2:複数行サブクエリ
複数の値に一致するデータを取得します。
SELECT FirstName, LastName
FROM Employees
WHERE DepartmentID IN (SELECT DepartmentID FROM Departments WHERE Location = 'Tokyo');
上記のクエリで「Tokyo」にある部署に所属するすべての社員の名前を取得できます。
相関サブクエリの使用
相関サブクエリは、メインクエリの各行に対してサブクエリが実行される構造です。
例:各社員の給与が部署の平均給与より高い社員を取得する
SELECT FirstName, LastName, Salary
FROM Employees E
WHERE Salary > (SELECT AVG(Salary) FROM Employees WHERE DepartmentID = E.DepartmentID);
上記のクエリでEmployeesテーブルから、部署ごとの平均給与を超える給与を持つ社員を取得できます。
サブクエリを使ったSELECT句の例
サブクエリはSELECT句でも使われ、他のデータと一緒に集計や計算結果を取得できます。
例:各社員の名前と部署の社員数を一緒に表示する
SELECT FirstName, LastName,
(SELECT COUNT(*) FROM Employees WHERE DepartmentID = E.DepartmentID) AS DepartmentEmployeeCount
FROM Employees E;
上記のクエリで各社員の名前と、所属部署の社員数を取得できます。
サブクエリを使ったFROM句の例
FROM句でサブクエリを使うと、サブクエリの結果を仮のテーブルとして利用できます。
例:部署ごとの平均給与を計算して、平均給与が5000以上の部署を取得する
SELECT DepartmentID, AvgSalary
FROM (SELECT DepartmentID, AVG(Salary) AS AvgSalary
FROM Employees
GROUP BY DepartmentID) AS DepartmentAvgSalaries
WHERE AvgSalary >= 5000;
上記のクエリでまず、Employeesテーブルから部署ごとの平均給与を計算し、5000以上の平均給与を持つ部署を取得できます。
サブクエリを使ったネストクエリの例
サブクエリはさらに別のサブクエリを含むことができます。
例:最高給与の社員を取得する
SELECT FirstName, LastName, Salary
FROM Employees
WHERE Salary = (SELECT MAX(Salary) FROM Employees WHERE DepartmentID = (SELECT DepartmentID FROM Departments WHERE DepartmentName = 'Engineering'));
上記のクエリで「Engineering」部署に所属する社員の中で、最高給与を持つ社員を取得できます。
演習問題
問題1:営業部に所属する年齢30歳以上の社員の名前を取得してください。
- テーブル名:Employees
- 必要な列:社員の「FirstName」「LastName」
- 条件:部署「Department」が「Sales」、年齢「Age」が30歳以上
問題2:営業部に所属する社員の中で、部署の平均給与より高い給与を持つ社員を取得してください。
- テーブル名:Employees、Departments
- 必要な列:社員の「FirstName」「LastName」「Salary」
- 条件:部署名「DepartmentName 」が「Sales」、給与「Salary」がその部署ID「DepartmentID」の平均給与を上回る
問題3:IT部門に所属する社員の中で、給与が平均以上の社員の名前と給与を取得してください。
- テーブル名:Employees、Departments
- 必要な列:社員の「FirstName」「LastName」「Salary」
- 条件:部署名「DepartmentName 」が「IT」、給与「Salary」がその部署ID「DepartmentID」の平均給与以上
演習問題の解答例
解答例1:営業部に所属する年齢30歳以上の社員の名前を取得するSQL
SELECT FirstName, LastName
FROM Employees
WHERE Department = 'Sales' AND Age >= 30;
解答例2:営業部に所属する社員の中で、部署の平均給与より高い給与を持つ社員を取得するSQL
SELECT FirstName, LastName, Salary
FROM Employees E
WHERE DepartmentID = (SELECT DepartmentID FROM Departments WHERE DepartmentName = 'Sales')
AND Salary > (SELECT AVG(Salary) FROM Employees WHERE DepartmentID = E.DepartmentID);
解答例3:IT部門に所属する社員の中で、給与が平均以上の社員の名前と給与を取得するSQL
SELECT FirstName, LastName, Salary
FROM Employees E
WHERE DepartmentID = (SELECT DepartmentID FROM Departments WHERE DepartmentName = 'IT')
AND Salary >= (SELECT AVG(Salary) FROM Employees WHERE DepartmentID = E.DepartmentID);
まとめ
この記事では、SQL ServerのSELECT文の基本から応用までを解説しました。
SELECT文は、単にデータを取得するだけでなく、条件で絞り込み、並べ替え、集計、複数のテーブルを結合するなど、さまざまな操作が可能です。
SQLの学習は一度に理解するのが難しいかもしれませんが、実際に手を動かして練習することで確実に身につきます。
この記事で学んだ内容をもとに、さらに応用的なクエリの作成に挑戦してみてください。