その他
SELECT
TO_CHAR(TO_DATE('95/12/31', 'RR/MM/DD'), 'YYYY/MM/DD') RR,
TO_CHAR(TO_DATE('95/12/31', 'YY/MM/DD'), 'YYYY/MM/DD') YY
FROM
dual;
1995/12/31 2095/12/31
SELECT
TO_CHAR(TO_DATE('2012-Apr-25','YYYY-Mon-DD'), 'DDTH "of" FMMonth, YyyySP')
FROM
dual;
25TH of April, Two Thousand Twelve
- 埋め込みモードを無効にするには、日付書式に「FM」を指定します。
設問では、「01st」ではなく「1st」、また「June」の後ろにスペースがないことから、埋め込みモードを無効にして問合せを実行したことがわかる。
SELECT
TO_CHAR(SYSDATE, 'fmDdth "of" Month, YYYY')
FROM
dual;
1st of June, 2012
SELECT
TO_CHAR(7777.777, 'L9,999')
FROM
dual;
¥7,778
グループ関数
グループ関数は複数件の入力データをグループ化して、集計処理を行った結果を1つだけ戻す関数で、複数行関数や集計関数と呼ばれることもある。
LISTAGG
LISTAGG(連結して表示する列名 [, 'デリミタ'])
WITHIN GROUP(ORDER BY ソートする項目 [ASC | DESC])
- グループ関数は2レベルまでしかネストできません。しかも、GROUP BY句を指定した場合に限る。
SELECT
MAX(MIN(AVG(salary))) "Sal"
FROM
employees
GROUP BY
department_id,
job_id;
- グループ関数を使用できるのは、SELECT句、ORDER BY句、HAVING句のみです。WHERE句ではグループ関数を使用することはできない。
SELECT
employee_id,
employee_name,
salary
FROM
employees
WHERE
AVG(salary) > 350000;
GROUP BY句と同様、HAVING句を使用する際にはいくつかの要件を満す必要がある。
- HAVING句に列別名を指定することはできない
- HAVING句にはGROUP BY句で指定した列、もしくはグループ関数のみ指定できる
HAVING句で取り出すグループを制限するのは、以下の4のタイミング。
- WHERE句がある場合は、グループ化する前にWHERE句の条件で行を制限する
- GROUP BY句に従ってグループ化する
- グループ関数を適用する
- HAVING句の条件で取り出すグループを制限する
- GROUP BY句ではRR書式に変換しています。このようにSELECT句とGROUP BY句のデータ型の変換が異なると、エラーになる。
SELECT
TO_CHAR(order_date, 'YYYY')
,SUM(order_total)
FROM
orders
GROUP BY
TO_CHAR(order_date, 'RR');
- グループ関数をネストする場合は、必ずGROUP BY句を指定しなければなりません。
SELECT
AVG(MIN(salary))
FROM
employees;
-
グループ関数では、COUNT関数に引数に*(アスタリスク)が指定された場合を除き、NULL値を無視して集計処理を行う。
-
HAVING句にはグループ関数とGROUP BY句に指定されている列を指定することができます。列別名を指定することはできない。
-
条件にグループ関数を使用する場合は、WHERE句ではなくHAVING句で指定する。
-
WHERE句の条件にグループ関数を使用することはできない。
-
COUNT関数は取り出されたデータの件数を返す関数。
-
引数には列名や数値型、文字列型、日付型の値を返す式の他、*(アスタリスク)を指定できます。
-
SELECT文にWHERE句、GROUP BY句、HAVING句を同時に指定する場合は、WHERE句、GROUP BY句、HAVING句、またはWHERE句、HAVING句、GROUP BY句の順に指定する。
-
WHERE句にはGROUP BY句で指定した列は指定できないので、エラーとなる。
-
HAVING句ではグループ関数をネストできない。
-
COUNT、MAX、MIN、SUM、AVG関数の引数には、次の値を指定する。
-
COUNT関数 : 数値型、文字列型、日付型の値を返す式または列と*(アスタリスク)
-
MAX/MIN関数 : 数値型、文字列型、日付型の値を返す式または列
-
SUM/AVG関数 : 数値型の値を返す式または列
-
GROUP BY句には1つ以上の列を指定する
-
GROUP BY句に列別名を指定することはできない
-
GROUP BY句を指定したSELECT文のSELECT句には、GROUP BY句で指定した列、もしくはグループ関数のみ指定できる
(select句に指定したグループ関数以外の列はすべてgroup by句で指定する必要がある) -
GROUP BY句とORDER BY句を併用する場合、ORDER BY句にはGROUP BY句で指定した列、もしくはグループ関数のみ指定できます
(グループ化されている列の値を、グループ化されていない列の値を基準に並べ替える事はできない為)
SELECT文に指定する句の順序は、
1.SELECT句
2.FROM句
3.WHERE句
4.GROUP BY句
5.HAVING句
6.ORDER BY句
です。ただし、GROUP BY句とHAVING句は入れ替えができる。