SQL入門 第4回 レコードの検索

前回は、テーブルに対してレコードを追加・更新・削除するSQLについて説明しました。

今回は、テーブルに存在するレコードを検索・取得するSQLについて説明する回になります。

レコードの検索

レコードを検索するには、SELECT文を使います。

SELECT文の使い方を完全に説明しようとすると、1日ではとても説明しきれないくらい多くのパターンがあります。

本シリーズは「SQL入門」ですので、よく使う基本的なパターンとして例のパターンをいくつか挙げて説明します。

テーブルを指定しない単純なSELECT

SELECT文はテーブルからレコードを検索するSQLクエリ(※)だと説明しましたが、最も単純なパターンはテーブルすら指定しないパターンです。

※DBMSに対して実行するSQL文のことを「クエリ(Query)」と呼びます

以下のようなSQLです。

SELECT 1+2

この場合、結果には「3」が返ってきます。

関数の結果を表示する

1+2のような単純な計算結果以外に、DBMSで用意された関数を使ってその結果を表示することもできます。

例えば現在時刻を取得するGETDATE()関数(Microsoft SQL Server)を使うと、現在の時刻を取得することができます。

また、SELECT文には複数の値を取得するよう指定出来たり、取得する列に名前を付けることができます。

SELECT
    1+2 AS 合計,
    GETDATE() AS 現在時刻

上記のように、カンマ区切りで複数指定、
ASで名前をつけることができます。

From句でテーブルを指定

テーブルを指定してデータを取得するにはFrom句を使用します。

SELECT
    列名1,
    列名2,
  ・・・・
FROM
    テーブル名

例として以下のような「生徒」という名前のテーブルがあるとします。

このテーブルから出席番号を取りだしたい場合は、以下のように書きます

SELECT
    出席番号, 姓
FROM
    生徒

また、全ての列を取得したい場合は「*」を使います

SELECT * FROM 生徒

WHERE句で条件を指定

WHERE句を使うことで取得するデータを絞り込むことができます。

SELECT
    列名1, 列名2, ・・・・
FROM
    テーブル名
WHERE
    [条件]

例えば、クラスが1組の生徒だけ取得したい場合は以下のように記述します。

SELECT
    *
FROM
    生徒
WHERE
    クラス = '1組'

出席番号が4番以降のレコードを取得したい場合

SELECT
    *
FROM
    生徒
WHERE
    出席番号 >= 4

クラスが1組で、出席番号が4番以降にレコードを取得する場合

SELECT
    *
FROM
    生徒
WHERE
    クラス = '1組'
    AND 出席番号 >= 4

ORDER BY句で並べ替える

ORDER BY句を使うことで、取得結果のレコード順序を並べ替えることができます。

SELECT
    *
FROM
    テーブル名
WHERE
    [条件]
ORDER BY
    列名 ASC(または DESC)

ORDER BY句に指定した列名で並べ替えを行います。
ASCを付加すると昇順に、DESCを付与すると降順に並びます。

例えば、出席番号の降順で取得したい場合は、以下のように書きます。

SELECT
    *
FROM
    生徒
ORDER BY
    出席番号 DESC

GROUP BY句でグループにまとめる

GROUP BY句を使って、取得するデータをグループにまとめることができます。

使い方の例としては、特定の列にどんな値が含まれているかを調べるときなどに使います。

例えば、「クラス」列にどんな値が含まれているかを調べるためにGROUP BYを使う場合は、以下のように記述します。

SELECT
    クラス
FROM
    生徒
GROUP BY
    クラス

※GROUP BYを使用する場合は、GROUP BY句で指定した列しかSELECTで指定できないことに注意してください。

GROUP BY句でグループにまとめ、集計関数を使用する

先ほど注意書きとして、GROUP BY句で指定した列以外はSELECTで指定することが出来ないと説明しました。

それは、グループでまとめられたどの値を表示するかが定まらないからです。

例えば、クラスが1組のレコードは出席番号が(1, 3, 5)と3つ存在しているため、どの値を表示するかが定まらずにエラーになります。

※My SQLではエラーにはならないですが、表示される値が不確定なので非推奨の書き方です

そこで、どの値を表示させるかを指定するときに使用するのが集計関数です。

例えば、グルーピングされた中で最大値を取得して表示するにはMAX()関数を、最小値を取得して表示するにはMIN()関数を使用します。

SELECT
    クラス,
    MAX(出席番号) AS 出席番号最大値,
    MIN(出席番号) AS 出席番号最小値
FROM
    生徒
GROUP BY
    クラス

HAVING句でグループにまとめたレコードを条件指定する

条件指定は通常WHERE句を使用しますが、GROUP BYでグルーピングした値や集計関数の結果を使って条件指定したい場合は、HAVING句を使用します。

例えば、クラスでグルーピングして出席番号の最大値が5になるデータを取得したい場合は、以下のように書きます。

SELECT
    クラス,
    MAX(出席番号) AS 出席番号最大値,
    MIN(出席番号) AS 出席番号最小値
FROM
    生徒
GROUP BY
    クラス
HAVING
    MAX(出席番号) = 5

SQLの構文まとめ

これまでに示した例を1つの構文にまとめると以下のようになります。

これさえ頭に入れておけば、大体のSELECTクエリは記述できるようになりますよ。

SELECT
    列1, 列2, ・・・・
FROM
    テーブル名
WHERE
    [条件1]
    AND [条件2]
    AND ・・・
GROUP
    列1, 列2, ・・・
HAVING
    [条件1]
    AND [条件2]
    AND ・・・

よく使う関数や演算子のまとめ

関数のまとめ

関数の種類関数説明
集計関数SUM指定された列の値でグルーピングされた行の合計値
集計関数ANG指定された列の値でグルーピングされた行の平均値
集計関数MAX指定された列の値でグルーピングされた行の中の最大値
集計関数MIN指定された列の値でグルーピングされた行の中の最大値
集計関数COUNT指定された列の値でグルーピングされた行数
文字列関数LENGTH文字列の長さ
文字列関数TRIM左右の空白文字を消去
日付関数DATE_ADD日付の加算
その他IFNULLNULL値だった場合に指定した値に変換する
その他COALESCE複数項目を対象としたNULL値の変換

演算子のまとめ

■比較演算子

< , > , =< , => ※NULLは対象外

■論理演算子

AND ※NULLは対象外

OR ※NULLは対象外

NOT ※NULLは対象外

練習問題

以下のような「テスト得点」テーブルがあります。

問題

Q1. 点数が90点以上のレコードの全ての列を取得しなさい。

Q2. 各出席番号の人の最高得点の点数を表示しなさい。



解答

A1.

SELECT
    *
FROM
    テスト得点
WHERE
    点数 >= 90

A2.

SELECT
    出席番号,
    MAX(点数) AS 最高得点 
FROM
    テスト得点
GROUP BY
    出席番号

第4回「レコードの検索」は以上です。

次回、第5回は「テーブルの結合」です。

→SQL学習の入門・初心者にオススメの書籍3選