🐈

ORACLE MASTER Silver SQL 独習第6章

2024/04/11に公開

はじめに

この記事は、資格「ORACLE MASTER Silver SQL」を取得するために、オラクル認定資格試験学習書の「オラクルマスター教科書 Silver SQL Oracle Datavase SQL」を用いた学習したことをまとめています。主に各章の知識のまとめ、備忘録目的で記載していますのであらかじめご了承ください。

なお、資格取得のための学習としては練習問題をひたすら繰り返し解くことが最も効果的なので、是非この学習書の練習問題をひたすら繰り返し解くのを勧めます。私はこの方法でORACLE MASTER Bronze DBA10日間の学習で取得しました。※テキストに掲載された練習問題を5回解き直しました。

定義

SUMファンクション

合計をもとめる。

例1
-- employment表のsalary列の合計を求める
SELECT
  SUM(employment)
FROM
  salary;
例2
-- employment表のsalary列のうち、job列が'SALESMAN'である行の合計を求める。
SELECT
  SUM(employment)
FROM
  salary
WHERE
  job = 'SALESMAN';

単一行ファンクションで処理された値を集計ファンクションで集計する。

例3
-- table1表のnumber列の小数点を取り除いたものの合計を求める。
SELECT
  SUM(ROUND(n))
FROM
  table1;

AVG, MAX, MINファンクション

AVG:平均値を求める。
MAX:最大値を求める。
MIN:最小値を求める。

-- employment表のsalary列の平均値、最大値、最小値をそれぞれ求める。
SELECT
  AVG(salary),
  MAX(salary),
  MIN(salary)
FROM
  employment

なお、日時データ型や文字データ型などの数値型以外のデータ型に対しても使用できる。

COUNT(*)ファンクション

表の行数を数える。通常集計ファンクション(複数件のデータを集計するためのファンクション)の引数に指定した列にNULLが含まれる場合、NULLは集計しないが、引数に「*」を指定した場合は、NULLも対象に含める。

例1
-- employment表の行数を数える。
SELECT
  COUNT(*)
FROM
  employment;

DISTINCT

集計ファンクションの列名にDISTINCTを指定すると、重複データを取り除いて集計する。

-- employment表のsalary列のうち、job列が'SALESMAN'である行の平均を求める。
-- ただし、重複したものを除く。
SELECT
  AVG(DISTINCT salary)
FROM
  employment
WHERE
  job = 'SALESMAN';

GROUP BY句

ある列の値に従い、データをグループ分けして、それぞれのグループごとに集計を行う。

例1
-- employment表のjob列の種類ごとにカウントする。
SELECT
  job,
  COUNT(*)
FROM
  employment
GROUP BY
  job;
例2
-- employment表からdeptno(部門番号)列の種類, job列の種類別にsalary列の最大値を求める。
SELECT
  deptno,
  job,
  MAX(salary)
FROM
  employment
GROUP BY
  deptno,
  job;

GROUP BY句を用いてグループごとに集計したデータを、さらに集計ファンクションで処理することができる。

例3
SELECT
  MAX(AVG(salary))
FROM
  employment
GROUP BY
  deptno;

WHERE句

WHERE句でデータを絞り込んだ後にGROUP BY句を使ってグループごとの集計を行うこともできる。

SELECT
  job,
  COUNT(*)
FROM
  emp
WHERE
  salary > 700
GROUP BY
job;

HAVING句

GROUP BY句によるグループごとの集計のに、データを絞り込むことができる。

SELECT
  job,
  COUNT(*)
FROM
  employment
GROUP BY
  job
HAVING
  COUNT(*) > 1;

Discussion