SQL ServerのSELECT文の使い方:基礎から応用まで徹底解説

SQL Serverはデータベース管理システムの1つで、多くの企業やシステムで利用されています。

その中でも、SELECT文はデータを取得するための最も基本的なSQL文です。

この記事では、SQL ServerでのSELECT文の基本から、実務で役立つ応用的な使い方までを解説します。

最後には演習問題と解答例も用意していますので、ぜひ実践しながら学んでみてください。


SELECT文の基本構文

SELECT文の基本的な構文は次のようになります:

SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 条件;
構文の各要素
  • SELECT: 取得したい列(カラム)を指定します。
  • 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. 単一行サブクエリ
    • 1行の結果を返すサブクエリです。
    • 比較演算子(=、<、>など)で使います。
  2. 複数行サブクエリ
    • 複数の行を結果として返すサブクエリです。
    • INやANY、ALLなどの演算子と組み合わせて使います。
  3. 相関サブクエリ
    • メインクエリとサブクエリが互いに関連しているクエリです。
    • サブクエリがメインクエリ内のデータを参照します。

サブクエリの基本的な使用例

例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の学習は一度に理解するのが難しいかもしれませんが、実際に手を動かして練習することで確実に身につきます。

この記事で学んだ内容をもとに、さらに応用的なクエリの作成に挑戦してみてください。