関数とSELECT文の句

(2012/05 更新)

レポートフォルダから、第5回の資料をコピーし、各自で演習に取り組む。


今回の内容:

 ・テーブルのレコードの特定のフィールドを集計する関数
 ・
SQLの SELECT文文法の全て

SELECT による処理は、今後紹介するSQLの他の文(insert や delect など)でも利用でき、応用範囲が広い。十分な理解が求められる。


式と関数

SELECT文では、テーブルのレコードからフィールドの値を直接取得する他、フィールドの値を使用した計算式の計算結果や、文字列の処理(結合など)が可能である。
また、式では、集計関数 や 文字列関数 、算術関数 が使用できる。

例)
・式
select A*2 from T;
select A*B , A+3 , A+B+C from T;
select '\ '&A , A&' + '&B from T;

・集計関数
select sum(A) from T;
select sum(A) , avg(A) , MAX(A) from T;

・算術関数と文字列関数


(復習) select文では、表示するフィールドはコンマ記号「,」で区切る。
以下の差は何か?
select A,B,C from T;
select A+B+C from T;

・集計関数

テーブルのレコードについて、複数のレコードの集計結果を計算して表示します。
集計するレコードの範囲は、テーブル中の全レコード、WHEREで指定されたレコード、後述するGROUP BY 句によるレコードの分類ごとなどがあります。

SQL関数名 機能 MS-Accessの関数名
 COUNT レコードの数を数える  COUNT(フィールド名)
 SUM 合計を求める  SUM(フィールド名)
 AVG 平均  AVG(フィールド名)
 MAX 最大値  MAX(フィールド名)
 MIN 最小値  MIN(フィールド名)

テーブルの指定したフィールドについて、全データを集計します。
集計するフィールドのデータ型はCOUNT以外の集計関数では、数値型でなければなりません。

例)

テーブルT

A B C
1 10 5
2 9 4
8 3
4 7 5

SELECT COUNT(*) AS NO FROM T;

結果:

NO
4

例) フィールドを指定してレコード数を数える

SELECT COUNT(A) AS NO FROM T;

A B C
1 10 5
2 9 4
8 3
4 7 5

3番目のレコードで、フィールドAの値は、NULL(空値)である。

結果:

NO
3

フィールドを指定した場合COUNTは、NULL(空値)のデータは数えない


例) 条件に合ったレコードの値を合計する

SELECT SUM(B) FROM T
WHERE C >= 5;

A B C
1 10 5
2 9 4
8 3
4 7 5

結果:

B
17

平均・合計の求め方についてはCOUNTと同様であるの省略


平均の求め方に関する注意: 平均の平均を求めると?


・文字列関数

文字列関数では、指定したフィールドの値について、文字の変換、追加、削除、抽出などの処理を行うことができる。
MS-ACCESSで使用可能な関数については、ACCESSのHELPを参照のこと。

※集計関数と異なりレコードを1件づつ処理する。

SQL関数名 機能 MS-Access
UPPER 文字列を大文字に変換  UCASE
LOWER 文字列を小文字に変換  LCASE
LTRIM 左側の空白文字を除去
RTRIM 右側の空白文字を除去
SUBSTR 文字列の一部を取り出す(部分文字列)  MID 例題で使用するのでよく覚えておく事

部分文字列を求める: SUBSTR の文法

SUBSTR(NAME,4,4) は、

NAMEが'ABCDEFGHIJKLMN'のとき、'DEFG'になる


・ 算術関数

数学の関数のほか、端数処理などを行うことができる。
MS-ACCESSで使用可能な関数については、ACCESSのHELPを参照のこと。

※集計関数と異なりレコードを1件づつ処理する。

SQL関数名 機能 MS-Access
ABS 絶対値を求める
CEIL 端数の処理  なし
FLOOR 端数の処理  INT
SIGN 符号を求める  SGN
SQRT 平方根(ルート)を求める  SQR

端数処理について:

端数を切り上げるのが、 CEIL

例)
0.5 → 1.0
-1.5 → -1.0

端数を切り下げるのが、 FLOOR

例)
0.5 →0.0
-1.5 → -2.0

端数処理については、マイナスの値の扱いに注意が必要。




SELECT文の句

SELECT FROM に加えて、以下のSQLキーワードを利用できる。

MS-ACCESS SQL 構文
SELECT [all | distinct] { * | table.* | [table.]field1 [AS alias1] [, [table.]field2 [AS alias2] [, ...]]}
FROM tableexpression [, ...]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ] ;
読み方:
 [ aaaa ] とある箇所は省略もしくは記述なしでもOKな部分。
 [ aaaa | bbbb ] とある箇所は、 aaaa または bbbb のどちらかを選んで記述する部分。
 tableexpression の部分は、今のところ テーブル名をコンマで区切って記したもののみ。次回以降で、拡張された文法について解説する。

・ ORDER BY

ORDERとBYは、空白で区切る。

SQLの実行結果を、指定したフィールドのデータの順に並べ替える。

重要: ORDER BYでは、元のテーブルが並び替わるのではない。あくまで、SQLで求めたテーブルを並べ替えるだけである。

SELECT 名前
FROM 名簿
ORDER BY クラス番号 ASC, 名前 DESC;

名簿の名前を、クラス番号の昇順に並べ替え、同じクラスでは名前の辞書の逆順に並べ替えるて表示する。

ASC →昇順(小さい順・abc・五十音順)
DESC →降順(大きい順・昇順の逆順)

ASCは省略可能。

以下の説明では、テーブル T を使用すする。

T

A B C
1 1 4
2 2 6
3 1 5
4 2 7
5 1 4
6 3 8

SELECT A,B,C
FROM T
ORDER BY B;

A B C
1 1 4
3 1 5
5 1 4
2 2 6
4 2 7
6 3 8

 


5.4 GROUP BY

テーブルのレコードを グループ ごとに分類する。 さらに分類した項目ごとに 集計関数 で結果を求める事も出来る。

GROUPとBYは、空白で区切る。

以下の説明では、テーブル T を使用すする。

T

A B C
1 1 4
2 2 6
3 1 5
4 2 7
5 1 4
6 3 8

SELECT A,B,C
FROM T
GROUP BY B;

A B C
1 1 4
3 1 5
5 1 4
2 2 6
4 2 7
6 3 8

Bについて3グループに分れた。


SELECT A,B,C
FROM T
GROUP BY B,C;

A B C
1 1 4
5 1 4
3 1 5
2 2 6
4 2 7
6 3 8

Bを更にCで分類し、5グループに分れた。

(コメント)

データベースによっては、SQLで、GROUP BYの句で、ORDER BY と同様、分類に従った並べ替えが可能なものもある。

例) select B from T group by B desc

また、group by でグループ分けをした結果、並べ替えが行われている場合もあるが、必ずそうなるとは限らない。(グループ分け作業の処理の都合で並べ変わる場合が有る)


集計関数を利用した場合、ORDER BY と異なり、グループごとに集計が計算される。

SELECT B,SUM(C)
FROM T
GROUP BY B;

B C
1 13
2 13
3 8

集計関数を、通常のフィールド(列)と同時に指定する場合の注意

SELECT A,SUM(B)
FROM T;

上記はエラー(集計関数SUMと、列Aを同時に指定している為。)

Aについてグループ化が必要となる。

SELECT A,SUM(B)
FROM T
GROUP BY A;


5.5 HAVING

WHEREと同様、SQLで条件指定を行う。
違いは、
集計関数を条件に指定できる」
「グループ化して集計関数を計算後、選択条件で判定する」
点である。
例)
 HAVING AVG(A)>50

WHEREでは、グループ化の前に条件判定を行い、さらに集計関数を条件に利用できない。


重要:句を解釈する順序について

SQLの実行では、記述したSQL文の先頭から順にデータベースが操作されるのではない。
以下に、SQLで作成したクエリーの処理がどのような順でDBMSに実行されるのかの概要を記す。

解釈順序 処理内容
1 FROM テーブルの選択
2 WHERE 条件によるレコードの選択
3 GROUP BY グループ化
4 HAVING 条件によるレコードの選択
5 SELECT 式・関数・集計関数の計算、表示データの指定
6 ORDER BY 並べ替え

演習課題:

注意:AccessのSQLの文法に注意する。
テーブル名 → 名前に特殊文字が含まれる場合、[ ]で囲む。例) [CHECK#]

文字の結合 → & または + を使用する
例) FIRSTNAME & LASTNAME

列名の名前の付け替え → 列名 AS 別名 のASは省略できない。 付け替えた名前には、元の名前は利用できない

ワイルドカード → LIKEによるパターン検索で、%→* _→? を使用する。

ファイル名を「第5#学籍番号」として、レポートフォルダに提出する。
※ファイル名で、#数字番号全て半角文字を使用すること。