ここではORACLEデータベースのSQLで、集計関数の使い方を紹介しています。
AVG関数
AVG関数では、平均値を計算したい数値または列名を指定します。
・DISTINCT/ALL
DISTINCTを指定すると重複値を除いた平均値を求めます。ALLを指定すると全ての値の平均値を求めます。デフォルト値はALLです。
AVG([DISTINCT | ALL]式)
AVG:レコード全体から平均値を求める
レコード全体から平均値を求める場合は、GROUP BYを指定せずにAVG関数を使います。
GROUP BYを使わずにAVG関数を記述した場合、SELECT結果全体を1つのグループとして捉え、SELECT結果全体から平均値を計算します。
SELECT AVG(age) FROM employee;
AVG:グループごとの平均値を求める
次のSQLでは、EMPLOYEE表でdept_cdでグループ化し、AGE列の平均値を計算しています。
SELECT dept_cd,AVG(age) FROM employee GROUP BY dept_cd;
複数の列でグループ化した結果の平均値を求めることもできます。
次のSQLでは、DEPT_CDとJOB_IDごとのAGE列の平均値を計算しています。
SELECT dept_cd,job_id,AVG(age) FROM employee GROUP BY dept_cd,job_id;
AVG:重複値を除いた平均値を求める
重複値を除く場合は、AVG関数でDISTINCTを指定します。
SELECT AVG(DISTINCT age) FROM employee;
AVG:特定のレコードから平均値を求める
AVG関数を使うSQLでも、通常のSELECT文と同じようにWHERE句に条件を書くことが出来ます。
次のSQLでは、WHERE句でDEPT_CDが001または002のレコードを対象として、DEPT_CDグループ化し、平均値を求めています。
SELECT AVG(age) FROM employee WHERE dept_cd in ('001','002');
WHERE句の条件には、EXISTSや副問合せを使うこともできます。
次のSQLではEMPLOYEE表のレコードで、SALES表に該当するレコードが存在するレコードを対象として、AGE列の平均値を求めています。
--EXISTSの例
SELECT
AVG(a.age)
FROM
employee a
WHERE
EXISTS (SELECT
'x'
FROM
sales b
WHERE
a.id = b.id);
--サブクエリーの例
SELECT
AVG(a.age)
FROM
employee a
WHERE
a.id (SELECT DISTINCT
b.id
FROM
sales b);
AVG:(注意点)NULL値のレコードについて
AVG関数では、NULL値のレコードは平均値の計算に含まれません。
グループ内のレコードが全てNULLの場合は、NULLが返されます。
COUNT関数
COUNT関数では、行数をカウントしたい式または列名を指定します。
・DISTINCT/ALL
DISTINCTを指定すると重複値を除いた行数を求めます。ALLを指定すると全ての行数を求めます。デフォルト値はALLです。
COUNT([DISTINCT | ALL] 式)
COUNT:テーブル全体の行数を求める
テーブル全体から行数を求める場合は、GROUP BYを指定せずにCOUNT関数を使います。
SELECT COUNT(*) FROM employee;
COUNT:グループごとの行数を求める
次のSQLでは、EMPLOYEE表でdept_cdでグループ化し、行数を計算しています。
SELECT dept_cd,COUNT(*) FROM employee GROUP BY dept_cd;
複数の列でグループ化した結果の行数を求めることもできます。
次のSQLでは、DEPT_CDとJOB_IDごとの行数を計算しています。
SELECT dept_cd,job_id,COUNT(*) FROM employee GROUP BY dept_cd,job_id;
COUNT:特定の列の行数を求める
次のSQLでは、AGE列の行数を求めています。
COUNT関数では、NULL値は無視されるので、NULL値以外の値の個数が返されます。
SELECT COUNT(age) FROM employee;
COUNT:重複値を除いた行数を求める
重複値を除く場合は、COUNT関数でDISTINCTを指定します。
SELECT COUNT(DISTINCT age) FROM employee;
COUNT:特定のレコードから行数を求める
COUNT関数を使うSQLでも、通常のSELECT文と同じようにWHERE句に条件を書くことが出来ます。
次のSQLでは、WHERE句でDEPT_CDが001または002のレコードを対象として、DEPT_CDグループ化し、行数を求めています。
SELECT COUNT(*) FROM employee WHERE dept_cd in ('001','002');
WHERE句の条件には、EXISTSや副問合せを使うこともできます。
次のSQLではEMPLOYEE表のレコードで、SALES表に該当するレコードが存在するレコードを対象として、AGE列の行数を求めています。
--EXISTSの例
SELECT
COUNT(*)
FROM
employee a
WHERE
EXISTS (SELECT
'x'
FROM
sales b
WHERE
a.id = b.id);
--サブクエリーの例
SELECT
COUNT(*)
FROM
employee a
WHERE
a.id (SELECT DISTINCT
b.id
FROM
sales b);
COUNT:(注意点)NULL値のレコードについて
COUNT関数では、NULL値のレコードは行数の計算に含まれません。
全てのレコードがNULLの場合は0を返します。
MAX関数
MAX関数では、最大値を計算したい式または列名を指定します。
MAX関数では数値、文字列、日付型を指定することが出来ます。
GROUP BYを指定しない場合は、SELECT結果全体を1つのグループとして集計します。
MAX(式)
MAX:レコード全体から最大値を求める
レコード全体から最大値を求める場合は、GROUP BYを指定せずにMAX関数を使います。
GROUP BYを使わずにMAX関数を記述した場合、SELECT結果全体を1つのグループとして捉え、SELECT結果全体から最大値を計算します。
SELECT MAX(age) FROM employee;
MAX:グループごとの最大値を求める
次のSQLでは、EMPLOYEE表でdept_cdでグループ化し、AGE列の最大値を計算しています。
SELECT dept_cd,MAX(age) FROM employee GROUP BY dept_cd;
複数の列でグループ化した結果の最大値を求めることもできます。
次のSQLでは、DEPT_CDとJOB_IDごとのAGE列の最大値を計算しています。
SELECT dept_cd,job_id,MAX(age) FROM employee GROUP BY dept_cd,job_id;
MAX:特定のレコードから最大値を求める
MAX関数を使うSQLでも、通常のSELECT文と同じようにWHERE句に条件を書くことが出来ます。
次のSQLでは、WHERE句でDEPT_CDが001または002のレコードを対象として、DEPT_CDグループ化し、最大値を求めています。
SELECT MAX(age) FROM employee WHERE dept_cd in ('001','002');
WHERE句の条件には、EXISTSや副問合せを使うこともできます。
次のSQLではEMPLOYEE表のレコードで、SALES表に該当するレコードが存在するレコードを対象として、AGE列の最大値を求めています。
--EXISTSの例
SELECT
MAX(a.age)
FROM
employee a
WHERE
EXISTS (SELECT
'x'
FROM
sales b
WHERE
a.id = b.id);
--サブクエリーの例
SELECT
MAX(a.age)
FROM
employee a
WHERE
a.id (SELECT DISTINCT
b.id
FROM
sales b);
MAX:(注意点)NULL値のレコードについて
MAX関数では、NULL値のレコードは最大値の計算に含まれません。
グループ内のレコードが全てNULLの場合は、NULLが返されます。
MIN関数
MIN関数では、最小値を計算したい式または列名を指定します。
MIN関数では数値、文字列、日付型を指定することが出来ます。
GROUP BYを指定しない場合は、SELECT結果全体を1つのグループとして集計します。
MIN(式)
MIN:レコード全体から最小値を求める
レコード全体から最小値を求める場合は、GROUP BYを指定せずにMIN関数を使います。
GROUP BYを使わずにMIN関数を記述した場合、SELECT結果全体を1つのグループとして捉え、SELECT結果全体から最小値を計算します。
SELECT MIN(age) FROM employee;
MIN:グループごとの最小値を求める
次のSQLでは、EMPLOYEE表でdept_cdでグループ化し、AGE列の最小値を計算しています。
SELECT dept_cd,MIN(age) FROM employee GROUP BY dept_cd;
MIN:特定のレコードから最小値を求める
MIN関数を使うSQLでも、通常のSELECT文と同じようにWHERE句に条件を書くことが出来ます。
次のSQLでは、WHERE句でDEPT_CDが001または002のレコードを対象として、DEPT_CDグループ化し、最小値を求めています。
SELECT MIN(age) FROM employee WHERE dept_cd in ('001','002');
WHERE句の条件には、EXISTSや副問合せを使うこともできます。
次のSQLではEMPLOYEE表のレコードで、SALES表に該当するレコードが存在するレコードを対象として、AGE列の最小値を求めています。
--EXISTSの例
SELECT
MIN(a.age)
FROM
employee a
WHERE
EXISTS (SELECT
'x'
FROM
sales b
WHERE
a.id = b.id);
--サブクエリーの例
SELECT
MIN(a.age)
FROM
employee a
WHERE
a.id (SELECT DISTINCT
b.id
FROM
sales b);
MIN:(注意点)NULL値のレコードについて
MIN関数では、NULL値のレコードは最小値の計算に含まれません。
グループ内のレコードが全てNULLの場合は、NULLが返されます。
SUM関数
SUM関数では、合計値を計算したい数値または列名を指定します。
・DISTINCT/ALL
DISTINCTを指定すると重複値を除いた合計値を求めます。ALLを指定すると全ての値の合計値を求めます。デフォルト値はALLです。
SUM([DISTINCT | ALL]式)
MIN:レコード全体から合計値を求める
レコード全体から合計値を求める場合は、GROUP BYを指定せずにSUM関数を使います。
GROUP BYを使わずにSUM関数を記述した場合、SELECT結果全体を1つのグループとして捉え、SELECT結果全体から合計値を計算します。
SELECT SUM(age) FROM employee;
MIN:グループごとの合計値を求める
次のSQLでは、EMPLOYEE表でdept_cdでグループ化し、AGE列の合計値を計算しています。
SELECT dept_cd,SUM(age) FROM employee GROUP BY dept_cd;
複数の列でグループ化した結果の合計値を求めることもできます。
次のSQLでは、DEPT_CDとJOB_IDごとのAGE列の合計値を計算しています。
SELECT dept_cd,job_id,SUM(age) FROM employee GROUP BY dept_cd,job_id;
MIN:重複値を除いた合計値を求める
重複値を除く場合は、SUM関数でDISTINCTを指定します。
SELECT SUM(DISTINCT age) FROM employee;
MIN:特定のレコードから合計値を求める
SUM関数を使うSQLでも、通常のSELECT文と同じようにWHERE句に条件を書くことが出来ます。
次のSQLでは、WHERE句でDEPT_CDが001または002のレコードを対象として、DEPT_CDグループ化し、合計値を求めています。
SELECT SUM(age) FROM employee WHERE dept_cd in ('001','002');
WHERE句の条件には、EXISTSや副問合せを使うこともできます。
次のSQLではEMPLOYEE表のレコードで、SALES表に該当するレコードが存在するレコードを対象として、AGE列の合計値を求めています。
--EXISTSの例
SELECT
SUM(a.age)
FROM
employee a
WHERE
EXISTS (SELECT
'x'
FROM
sales b
WHERE
a.id = b.id);
--サブクエリーの例
SELECT
SUM(a.age)
FROM
employee a
WHERE
a.id (SELECT DISTINCT
b.id
FROM
sales b);
MIN:(注意点)NULL値のレコードについて
SUM関数では、NULL値のレコードは合計値の計算に含まれません。
グループ内のレコードが全てNULLの場合は、NULLが返されます。