(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 FROM に加えて、以下のSQLキーワードを利用できる。
MS-ACCESS SQL 構文 |
SELECT [all | distinct] { * | table.* | [table.]field1 [AS alias1] [, [table.]field2 [AS alias2] [, ...]]} |
読み方: [ aaaa ] とある箇所は省略もしくは記述なしでもOKな部分。 [ aaaa | bbbb ] とある箇所は、 aaaa または bbbb のどちらかを選んで記述する部分。 tableexpression の部分は、今のところ テーブル名をコンマで区切って記したもののみ。次回以降で、拡張された文法について解説する。 |
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 |
テーブルのレコードを グループ ごとに分類する。 さらに分類した項目ごとに 集計関数 で結果を求める事も出来る。
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;
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 | 並べ替え |
INITIALS | CODE |
K. A. P. | 32 |
CHECK# | PAYEE | AMOUNT |
1 | Ma Bell | 150 |
注意:AccessのSQLの文法に注意する。
テーブル名 → 名前に特殊文字が含まれる場合、[ ]で囲む。例) [CHECK#]
文字の結合 → & または + を使用する
例) FIRSTNAME & LASTNAME
列名の名前の付け替え → 列名 AS 別名 のASは省略できない。 付け替えた名前には、元の名前は利用できない
ワイルドカード → LIKEによるパターン検索で、%→* _→? を使用する。
ファイル名を「第5回#学籍番号」として、レポートフォルダに提出する。
※ファイル名で、#、数字、番号は全て半角文字を使用すること。