この記事について
Oracle Database SQL 試験(1Z0-071-JPN)第2章の前半にあたる「SELECT文の基本」と「データ型・表の確認方法」を整理した記事です。試験でよく問われるポイントを中心に、単なる構文の羅列ではなく「なぜそうなるのか」を意識しながら説明します。
SELECT文の基本構文
SELECT文の役割と基本形
SELECT文は、表からデータを取り出すための命令です。最小の形は以下のとおりです。
SELECT 列名1 [, 列名2, ...] FROM 表名;
-
SELECTの後に書く列名のリストを SELECTリスト(選択リスト) と呼びます -
*(アスタリスク)を指定すると、すべての列を取得できます
-- 全列を取得
SELECT * FROM employees;
-- 特定の列だけ取得
SELECT employee_id, last_name, salary FROM employees;
SELECT文の3つの機能
① 射影(投影)
表から特定の列を取得します。
② 選択
表から特定の行を取得します
③ 結合
複数の表のデータを関連付けて取得します
WHERE句による条件絞り込み
WHERE句を使うことで、取得する行を条件で絞り込めます。
SELECT 列名 FROM 表名 WHERE 条件;
① 等価条件(=)
値が一致する行だけを表示します。
SELECT * FROM employees WHERE department_id = 10;
② 比較条件(<・>・<=・>=・<>)
大小関係で絞り込みます。
SELECT * FROM employees WHERE salary >= 500000;
書く順序と実行順序の違い
SELECT文を書く順序と、DBが実際に処理する実行順序は異なります。これは試験でもよく問われるポイントです。
| 書く順序(構文順) | 実行順序(処理順) |
|---|---|
| ① SELECT(列の指定) | ① FROM(表を読み込む) |
| ② FROM(表の指定) | ② WHERE(行を絞り込む) |
| ③ WHERE(条件) | ③ GROUP BY(グループ化) |
| ④ GROUP BY(グループ化) | ④ HAVING(集計後の絞り込み) |
| ⑤ HAVING(集計後の条件) | ⑤ SELECT(列を選ぶ) |
| ⑥ ORDER BY(並び替え) | ⑥ ORDER BY(並び替える) |
処理の流れを一言で言うと「FROMで表を読み込み→WHEREで行を絞り込み→最後にSELECTで表示列を選ぶ」です。
🔑 試験ポイント:列別名はWHERE句で使えない
SELECT salary * 12 AS annual_sal FROM employees WHERE annual_sal > 60000;この書き方はエラーになります。列別名(
annual_sal)が定義されるのはSELECT句の処理タイミング(実行順⑤)ですが、WHERE句は実行順②(SELECT処理より前)に実行されるため、別名がまだ存在しないためです。
列別名(AS句)
SELECT句では、列に別名を付けて表示名を変えられます。
SELECT last_name AS "社員名", salary AS "月給" FROM employees;
覚えておきたいルール
| ルール | 内容 |
|---|---|
AS は省略可能 |
last_name "社員名" とも書ける |
" "(二重引用符)が必要な場合 |
スペースや$・_・#以外の記号を含む場合 |
" "が必要な場合(続き) |
大文字小文字を区別したい場合、先頭が数字・記号の場合、Oracleの予約語と同じ名前の場合 |
| ORDER BYでの使用 | スペースを含んだ列別名の場合、 " "(二重引用符)で囲む |
| 算術式での使用 | 算術式で列別名を指定することはできるが、列別名を使用して計算することはできない |
列別名を使える句・使えない句
| 句 | 列別名の使用 |
|---|---|
SELECT |
✅ 使える(ここで定義する) |
ORDER BY |
✅ 使える(SELECT処理より後に実行されるため) |
WHERE |
❌ 使えない(SELECT処理より前に実行されるため) |
GROUP BY |
❌ 使えない(Oracle 19cまで) |
DUAL表
DUAL表は、Oracleのインストール時に自動的に作成されるダミー表です。
| 項目 | 内容 |
|---|---|
| 列構成 |
DUMMY という名前の VARCHAR2(1) 型の列を1つ持つ |
| 行数 | 1行のみ(X という値が格納されている) |
| スキーマ | SYSスキーマに属するが、スキーマ名なしでアクセス可能 |
| アクセス権 | すべてのユーザーが読み取り可能(PUBLICロールにREAD権限が付与されているため) |
主な用途
- 定数や式の評価結果を確認したいとき
- 関数の動作確認(表を参照せずにSELECT文を実行したいとき)
-- 現在日付を取得
SELECT SYSDATE FROM DUAL;
-- 計算結果を確認
SELECT 1 + 1 FROM DUAL;
-- 関数の動作確認
SELECT UPPER('hello') FROM DUAL;
🔑 試験ポイント:OracleはFROM句を省略できないため、「表は不要だが式や関数を試したい」場面でDUAL表を使います。これはOracle特有の知識です。
データ型と表の構造確認
データ型とは
データ型とは、その列にどのような種類のデータを格納するかを定義するためのものです。型を正しく設定することで、格納できる値・比較の動作・ストレージの使い方が変わります。
文字列型
VARCHAR2(n)
可変長の文字列を格納します。
-
nはバイト数(最大4000バイト) - 格納した文字列の長さだけ領域を使う(
ABCD→ 4文字、XY→ 2文字) - 桁数の指定が必須(省略するとエラー)
CHAR(n)
固定長の文字列を格納します。
-
nバイトに満たない文字列を格納した場合、残りを空白文字で埋める -
ABCD(4文字)もXY(2文字)も、CHAR(10)の場合はどちらも10文字で格納される
🔑 試験ポイント:CHARとVARCHAR2で同じ文字列を比較すると、空白埋めの影響で一致しないことがあります。
CLOB
CHAR型やVARCHAR2型では対応できない大きなテキストデータを格納します。
- サイズを指定しない
- 最大4GB相当のテキストデータを格納可能
数値型
NUMBER(p, s)
整数・小数問わず数値を格納します。
-
p:全体の最大有効桁数(精度)。1〜38まで指定可能 -
s:小数点以下の最大桁数(スケール) -
NUMBERのみ(指定なし)は最大精度で格納
| 指定例 | 格納できる値の例 |
|---|---|
NUMBER(5) |
最大5桁の整数 |
NUMBER(5, 2) |
全体5桁・小数2桁(最大 999.99) |
NUMBER |
対応できる最大精度 |
注意点①:整数部分の桁数を超えるとエラー
-- NUMBER(5, 2)→整数部は最大3桁
INSERT INTO test VALUES (5, 1234.56); -- ORA-01438 エラー
注意点②:小数部分の桁数を超えると四捨五入
-- NUMBER(5, 2)→小数部は2桁まで
INSERT INTO test VALUES (6, 12.345); -- 12.35 として格納される
🔑 試験ポイント:整数部超過はエラー(ORA-01438)、小数部超過はエラーにならず四捨五入。この違いは頻出の引っかけ問題です。
日付・時刻型
DATE
「年月日時分秒」の6要素を格納します。
- ミリ秒(小数秒)は格納できない
-
SYSDATE関数で現在日時を取得
TIMESTAMP
DATEの機能に加えて小数秒(ミリ秒以下)も格納できます。
TIMESTAMP WITH TIME ZONE
日付・時刻(小数秒含む)に加えてタイムゾーン情報も格納します。
TIMESTAMP WITH LOCAL TIME ZONE
日付・時刻(小数秒含む)を格納します。データはDB標準のタイムゾーンで保存され、取得時にセッションのタイムゾーンに変換されます。
INTERVAL YEAR TO MONTH / INTERVAL DAY TO SECOND
期間を表すデータ型です。
| 型 | 格納できる期間 |
|---|---|
INTERVAL YEAR TO MONTH |
年・月の期間 |
INTERVAL DAY TO SECOND |
日・時・分・秒の期間 |
🔑 試験ポイント:「ミリ秒(小数秒)を格納できるのはTIMESTAMP型であり、DATE型では格納できない」は頻出です。
その他のデータ型
| データ型 | 用途 |
|---|---|
BLOB |
画像・音声などのバイナリデータ(サイズ指定なし) |
LONG |
可変長文字データ(最大2GB)。現在はCLOB推奨 |
RAW(size) |
バイナリデータ。sizeは1〜2000バイト |
LONG RAW |
バイナリデータ(最大2GB)。現在はBLOB推奨 |
BFILE |
外部ファイルに格納されるバイナリデータ(最大4GB) |
💡
LONGやLONG RAWは旧来の型で、現在はCLOB/BLOBの使用が推奨されています。
表構造の確認:DESCRIBEコマンド
SQL*Plus で表の列定義を確認するには DESCRIBE コマンドを使います。
DESCRIBE employees;
-- または省略形
DESC employees;
実行すると以下の情報が表示されます。
- 列名
- NULL許容かどうか(
NOT NULLかどうか) - データ型と桁数
🔑 試験ポイント:
DESCはDESCRIBEの省略形として使えますが、これはSQL文ではなくSQL*Plusのコマンドです。SQLのキーワード(SELECTなど)は省略できませんが、DESCRIBEはDESCと略せます。
本章のまとめ
| テーマ | 試験で押さえるポイント |
|---|---|
| SELECT基本構文 |
SELECT 列 FROM 表 が最小形。* で全列取得 |
| 書く順序 vs 実行順序 | 書く順:SELECT→FROM→WHERE、処理順:FROM→WHERE→SELECT
|
| 列別名(AS) |
ORDER BY では使えるが WHERE・GROUP BY(Oracle)では使えない |
" "が必要な別名 |
スペース・特殊記号・予約語・数字始まり・大小文字区別が必要な場合 |
| DUAL表 | 1行1列のダミー表。PUBLICロールで全ユーザーからアクセス可能 |
| VARCHAR2 vs CHAR | CHARは空白埋めの固定長、VARCHAR2は可変長 |
| NUMBER(p, s) | 整数部超過→エラー(ORA-01438)、小数部超過→四捨五入 |
| DATE vs TIMESTAMP | 小数秒を扱えるのはTIMESTAMPのみ |
| DESCRIBE | SQL*PlusのコマンドでSQL文ではない。DESC と省略可能 |













