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

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

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

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

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


  1. SELECT文の基本構文
  2. 基本的なSELECT文の例
    1. 全ての列を取得する
    2. 特定の列を取得する
  3. 行数の制限
    1. TOP を使う方法
    2. OFFSET … FETCH を使う方法(SQL Server 2012 以降)
  4. サブクエリの基本構文
  5. サブクエリの種類
  6. サブクエリの基本的な使用例
    1. 例1:単一行サブクエリ
    2. 例2:複数行サブクエリ
  7. 相関サブクエリの使用
    1. 例:各社員の給与が部署の平均給与より高い社員を取得する
  8. サブクエリを使ったSELECT句の例
    1. 例:各社員の名前と部署の社員数を一緒に表示する
  9. サブクエリを使ったFROM句の例
    1. 例:部署ごとの平均給与を計算して、平均給与が5000以上の部署を取得する
  10. サブクエリを使ったネストクエリの例
    1. 例:最高給与の社員を取得する
  11. 演習問題
    1. 問題1:営業部に所属する年齢30歳以上の社員の名前を取得してください。
    2. 問題2:営業部に所属する社員の中で、部署の平均給与より高い給与を持つ社員を取得してください。
    3. 問題3:IT部門に所属する社員の中で、給与が平均以上の社員の名前と給与を取得してください。
  12. 演習問題の解答例
    1. 解答例1:営業部に所属する年齢30歳以上の社員の名前を取得するSQL
    2. 解答例2:営業部に所属する社員の中で、部署の平均給与より高い給与を持つ社員を取得するSQL
    3. 解答例3:IT部門に所属する社員の中で、給与が平均以上の社員の名前と給与を取得するSQL
  13. まとめ

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 には MySQL や PostgreSQL のような LIMIT キーワードはありません。その代わりに、主に以下の2つの方法で結果行数を制限します。

TOP を使う方法

基本構文

SELECT TOP (取得する行数)
    カラム1, カラム2, …
FROM テーブル名
[WHERE 条件]
[ORDER BY ソート列];

例:上位 10 行を取得

SELECT TOP (10) *
FROM Employees
ORDER BY HireDate DESC;

TOP (10) で最新採用日上位 10 件を取得します。

ORDER BY を併用しない場合は “任意の先頭 10 行” が返ってきます(順序は保証されません)。

オプション

TOP (n) PERCENT

テーブル全体の n% にあたる行数を取得します。

SELECT TOP (5) PERCENT *
FROM Sales
ORDER BY Amount DESC;
WITH TIES

境界の値が同じ行をすべて含めたい場合に使用します。

SELECT TOP (5) WITH TIES *
FROM Products
ORDER BY Price DESC;

価格が 5 位と同じ商品の行もすべて返します。

OFFSET … FETCH を使う方法(SQL Server 2012 以降)

ページング処理やオフセットを指定した取得に使えます。

基本構文

SELECT カラム1, カラム2, …
FROM テーブル名
[WHERE 条件]
ORDER BY ソート列
OFFSET オフセット行数 ROWS
FETCH NEXT 取得行数 ROWS ONLY;
  • OFFSET X ROWS:最初の X 行をスキップ
  • FETCH NEXT Y ROWS ONLY:次の Y 行を取得

※OFFSET/FETCH を使うには必ず ORDER BY が必要です。

例:11 行目から 10 行分を取得(1 ページあたり 10 件想定で 2 ページ目)

SELECT *
FROM Orders
ORDER BY OrderDate
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;

サブクエリの基本構文

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

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