前回は、テーブルに対してレコードを追加・更新・削除する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 | 日付の加算 |
その他 | IFNULL | NULL値だった場合に指定した値に変換する |
その他 | 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回は「テーブルの結合」です。
最近のコメント