この記事について
この記事では、それぞれのデータを SELECT文でどう扱うか に焦点を当てます。
- 数値データと算術演算子
- 文字列と連結演算子
- 日時データと書式モデル
数値データと算術演算子
数値リテラルとは
SQLの中に直接書いた数値そのもののことを 数値リテラル と言います。クォートで囲む必要はなく、そのまま記述できます。
SELECT 100 FROM DUAL; -- 数値リテラル
SELECT 1.5 * 2 FROM DUAL; -- 算術式
算術演算子の種類と優先順位
SELECT句やWHERE句の中で算術演算子を使えます。
| 演算子 | 意味 | 優先順位 |
|---|---|---|
* |
乗算 | 高い(先に計算) |
/ |
除算 | 高い(先に計算) |
+ |
加算 | 低い |
- |
減算 | 低い |
優先順位のルール
-
*(乗算)・/(除算)が先に計算される - 同じ優先順位の演算子は、左から右の順に計算される
-
()(括弧)で囲むと、優先順位を変更できる
-- 優先順位の違いを確認する例
SELECT 2 + 3 * 4 FROM DUAL; -- 結果: 14(3*4=12が先)
SELECT (2 + 3) * 4 FROM DUAL; -- 結果: 20(括弧内が先)
SELECTリストでの算術式
列値に対して算術式を適用し、計算結果を取得できます。
-- 月給を年収に変換して表示
SELECT employee_id,
last_name,
salary,
salary * 12 AS annual_salary
FROM employees;
WHERE句での算術式
WHERE句でも算術式や数値リテラルを使って条件を指定できます。
-- 年収(月給×12)が600万以上の社員
SELECT last_name, salary
FROM employees
WHERE salary * 12 >= 6000000;
算術式を使用できる句まとめ(試験頻出)
算術式(列名や数値リテラルを演算子で組み合わせた式)は、Oracle SQL の複数の句で使用できます。
| 句 | 使用可否 | 使用例 |
|---|---|---|
| SELECT リスト | ✅ 可 | salary * 12 AS annual_salary |
| WHERE 句 | ✅ 可 | WHERE salary * 12 >= 6000000 |
| ORDER BY 句 | ✅ 可 | ORDER BY salary * 12 DESC |
| GROUP BY 句 | ✅ 可 | GROUP BY salary * 12 |
| HAVING 句 | ✅ 可 | HAVING SUM(salary * 12) > 60000000 |
| UPDATE の SET 句 | ✅ 可 | SET salary = salary * 1.1 |
| INSERT の VALUES 句 | ✅ 可 | VALUES (salary_seq.NEXTVAL, 300000 * 12) |
| CHECK 制約の条件式 | ✅ 可 | CHECK (max_salary >= min_salary * 2) |
| JOIN の ON 句 | ✅ 可(等値・非等値とも) | ON e.salary BETWEEN j.min_salary AND j.max_salary |
🔑 試験ポイント
ORDER BY句では SELECT リストの列別名または列位置番号を使うことが多いが、算術式を直接記述することも可能GROUP BY句に算術式を書く場合は、SELECT リストにも同じ式を書く必要がある(列別名は使用不可)HAVING句は GROUP BY の結果に対して条件を絞り込む句であり、集計関数との組み合わせで算術式を使うことが多い
FROM句は 算術式を使用できない
文字列と連結演算子
文字リテラルとは
SQLの中に直接書いた文字列のことを 文字リテラル と言います。一重引用符 '(シングルクォーテーション) で囲んで指定します。二重引用符ではありません。
SELECT 'Hello, Oracle!' FROM DUAL;
SELECT '東京' FROM DUAL;
🔑 試験ポイント:文字リテラルは
'で囲む。列別名で使う"とは区別しましょう。
連結演算子「||」
|| を使うことで、複数の文字列を1つにつなげられます。連結できる対象は次のとおりです。
- 文字データ型の列
- 文字リテラル
-- 姓名を「姓 名」の形式で表示
SELECT last_name || ' ' || first_name AS full_name
FROM employees;
-- 固定文字を組み合わせる例
SELECT employee_id || 'さんの部署は' || department_id AS info
FROM employees;
一重引用符 ' を文字として表示する方法
文字リテラルの中で '(一重引用符)そのものを表示したい場合、以下の2つの方法があります。
① 一重引用符を2つ続けて書く
-- 「It's Oracle」と表示したい
SELECT 'It''s Oracle' FROM DUAL;
-- 結果: It's Oracle
② 代替引用符(q)演算子を使う
q' に続けて、任意の区切り文字でテキストを囲む方法です。
SELECT q'[It's Oracle]' FROM DUAL; -- [ ] で囲む
SELECT q'{It's Oracle}' FROM DUAL; -- { } で囲む
SELECT q'(It's Oracle)' FROM DUAL; -- ( ) で囲む
SELECT q'<It's Oracle>' FROM DUAL; -- < > で囲む
SELECT q'#It's Oracle#' FROM DUAL; -- 任意の同じ文字で囲む
🔑 書き方のルール:
q'のあとに区切り文字を指定し、最後を'で閉じます。[・{・(・<を使う場合は、対応する閉じ括弧]・}・)・>で終わります。同じ文字を開始と終了に使うことも可能です。
大文字の英字と小文字の英字は区別されるので、大文字か小文字どちらかに統一する必要があります。
日時データと書式モデル
日時リテラルとは
数値や文字列と異なり、日時には専用のリテラルがあります。
| リテラル | 書式例 | 特徴 |
|---|---|---|
| 日付リテラル | DATE '2026-03-28' |
日付のみ(時刻は 00:00:00 固定) |
| TIMESTAMPリテラル | TIMESTAMP '2026-03-28 12:00:00' |
日付と時刻を指定可能 |
-- 日付リテラルの使用例
SELECT * FROM employees WHERE hire_date >= DATE '2020-01-01';
-- TIMESTAMPリテラルの使用例
SELECT TIMESTAMP '2026-03-28 12:00:00' FROM DUAL;
🔑 試験ポイント:日付リテラルは
DATE '...'の形式で使います。文字列の日付('2026-03-28')と日付リテラル(DATE '2026-03-28')は異なります。
文字列を日時データに変換する方法
文字列を日時データとして扱う方法は4つあります。
| 方法 | 内容 |
|---|---|
| ① TO_DATE(書式を明示) |
TO_DATE('2026-03-28', 'YYYY-MM-DD') のように書式を指定して明示的に変換 |
| ② TO_DATE(書式を省略) | 書式を省略すると NLS_DATE_FORMAT の設定に基づいて変換 |
| ③ 暗黙的な変換 |
NLS_DATE_FORMAT に合った文字列は自動的に日時データとして解釈される |
| ④ 日付リテラル |
DATE '2026-03-28' の形式で指定。時刻は 00:00:00 になる |
-- ① TO_DATEで書式を明示
SELECT TO_DATE('2026-03-28 12:00:00', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
-- ② 書式省略(NLS_DATE_FORMATに依存)
SELECT TO_DATE('2026-03-28 12:00:00') FROM DUAL;
-- ④ 日付リテラル
SELECT * FROM employees WHERE hire_date = DATE '2020-04-01';
🔑 試験ポイント:暗黙的な変換(③)はNLS設定に依存するため予期しない動作を招くことがあります。実務・試験ともに
TO_DATEで書式を明示する方法(①)を基本とします。
日時の書式モデル
書式モデルは、日時データを「どのように表示するか」または「文字列をどのように日時として解釈するか」を定義する文字列です。
主な書式要素一覧
| 要素 | 意味 | 例 |
|---|---|---|
YYYY |
4桁の西暦年 | 2026 |
YY |
年の下2桁(現在の世紀に解釈) | 26 |
RR |
年の下2桁(世紀をスマートに判定) | 26 |
MM |
月(01〜12) | 03 |
MONTH |
月の名前 | MARCH |
MON |
月の省略名 | MAR |
DD |
日(01〜31) | 28 |
D |
曜日番号(1=日曜〜7=土曜) | 7 |
DAY |
曜日名 | SATURDAY |
DY |
曜日省略名 | SAT |
HH24 |
時(24時間表記) | 14 |
HH |
時(12時間表記) | 02 |
MI |
分 | 30 |
SS |
秒 | 00 |
FF |
秒の小数部(TIMESTAMP用) | 123456 |
AM / PM
|
午前・午後の表示 | PM |
TZR |
タイムゾーン領域 | Asia/Tokyo |
YYとRRの違い
| 現在の年(下2桁) | 指定値 |
YY での解釈 |
RR での解釈 |
|---|---|---|---|
| 00〜49 | 50〜99 | 現在の世紀(2050〜2099) | 前の世紀(1950〜1999) |
| 00〜49 | 00〜49 | 現在の世紀(2000〜2049) | 現在の世紀(2000〜2049) |
🔑 試験ポイント:
RRは「過去の日付を現代に入力する」ための書式です。TO_DATE('95-01-01', 'RR-MM-DD')は1995年と解釈されますが、TO_DATE('95-01-01', 'YY-MM-DD')は2095年と解釈されます。OracleはYYYYの使用を推奨しています。
代表的な日時書式の例
| 書式モデル | 表示例 | 主な用途 |
|---|---|---|
YYYY/MM/DD HH24:MI:SS |
2026/03/28 12:00:00 |
日本語環境でよく使われる |
RR-MM-DD |
26-03-28 |
日本語環境のデフォルト(時刻なし) |
DD-MON-YYYY HH24:MI:SS |
28-MAR-2026 12:00:00 |
英語環境でよく使われる |
DD-MON-RR |
28-MAR-26 |
英語環境のデフォルト(時刻なし) |
NLS_DATE_FORMAT パラメータ
NLS_DATE_FORMAT は、日時データの表示形式と文字列から日時への変換書式を決める初期化パラメータです。
| 項目 | 内容 |
|---|---|
| 役割① | 日時データを表示するときの形式 |
| 役割② | 文字列を日時データに変換するときの書式(TO_DATEで書式省略時) |
| デフォルト値 |
NLS_TERRITORY の地域設定により異なる |
| AMERICA の場合 |
DD-MON-RR(例:28-MAR-26) |
| JAPAN の場合 |
RR-MM-DD(例:26-03-28) |
🔑 注意点:デフォルト値は日付のみを表示し、時刻は表示されません。時刻まで表示するには
TO_CHARで書式を明示的に指定する必要があります。
日付型まとめ(DATE vs TIMESTAMP)
| 項目 | DATE | TIMESTAMP |
|---|---|---|
| 格納内容 | 年月日・時分秒(整数秒まで) | 年月日・時分秒・小数秒 |
| 書式パラメータ | NLS_DATE_FORMAT |
NLS_TIMESTAMP_FORMAT |
| 変換ファンクション | TO_DATE |
TO_TIMESTAMP |
| リテラル | DATE '2026-03-28' |
TIMESTAMP '2026-03-28 12:00:00' |
| 小数秒の格納 | ❌ 不可 | ✅ 可能(FF 要素で指定) |
本章のまとめ
| テーマ | 試験で押さえるポイント |
|---|---|
| 算術演算子の優先順位 |
*・/ が先。括弧で変更できる |
| 文字リテラル |
' で囲む(二重引用符ではない) |
| 連結演算子 |
|| で文字列をつなぐ |
' の表示方法 |
'' と2つ続けるか、q'[...]' の代替引用符を使う |
| 日付リテラル |
DATE '2026-03-28'。時刻は 00:00:00 固定 |
| TO_DATE の使い方 | 書式を明示するのが推奨。省略時は NLS_DATE_FORMAT に依存 |
| YY と RR の違い |
YY は現在の世紀。RR は入力値に応じて世紀を判定 |
| NLS_DATE_FORMAT | 日本環境は RR-MM-DD、英語環境は DD-MON-RR がデフォルト |
| DATE vs TIMESTAMP | 小数秒を格納できるのは TIMESTAMP のみ |
次回
次の記事では以下を扱います。
- NULLの扱い
- DISTINCTによる重複データの除外
「値がない」状態の扱い方は、算術演算・比較・関数に広く影響するため、試験でも頻出のテーマです。


















