
SQL Silverを受けようと思うんですが、本を読んでも『で、どう書くんだっけ?』と手が止まってしまいます…。SELECTとWHEREの基本なのに、毎回あやふやになります。



それは普通です。
SQLはスポーツと同じで、素振りをしないと身につかないのと同様で、SQLは読むだけでは身につきません。まずはSELECT、WHERE、ORDER BYのような“基本の型”を、ドリルで反射的に書けるようにしましょう。
当ブログの「SQL Silver対策アウトプット」シリーズ第1回へようこそ。
このシリーズでは、試験で頻出のテーマを1つずつ区切りながら、読むだけで終わらず、必ず手を動かして定着させることを目的に進めていきます。
第1回で扱うのは、SQLの土台になる SELECT / WHERE / ORDER BY / AS / DISTINCT です。
どれも「基本構文」と呼ばれる部分ですが、逆に言えば、ここが曖昧なままだと後半のJOINや集計、サブクエリに進んだときに一気に苦しくなります。
つまり、この回はただの入門ではなく、今後の学習全体を支える土台作りです。
とくに初学者がつまずきやすいのは、次のようなポイントです。
- 必要な列だけ選ぶつもりが、つい
SELECT *に頼ってしまう WHEREの条件を書きたいのに、BETWEENとINとLIKEの使い分けが曖昧になるANDとORを混ぜた途端に、自分の意図通りの結果が返ってこなくなるORDER BYを書く位置や、昇順・降順、NULLの並び方で混乱するDISTINCTを使ったものの、何を重複とみなしているのか分からなくなる
こうした悩みは、あなたの理解が足りないから起きるのではありません。
むしろ、SQLをちゃんと学ぼうとしている人ほど、一度は必ずぶつかるポイントです。
だからこの記事では、長い理論説明よりも、まずは型をつかんで、自分の手で書けるようになることを優先します。
細かい構文知識を丸暗記するのではなく、実際にSQLを書いて、動かして、間違えて、直していく。
その流れの中で、「ああ、SELECTってこう書けばいいのか」「WHEREはこうやって絞るのか」が自然に身についていくはずです。
今回のゴールは、ひとことで言うとこれです。
「SELECTとWHEREの基本構文を、迷わず1発で書ける状態にする」こと。
等号や不等号、BETWEEN、IN、LIKE を使った絞り込みから、ORDER BY による並べ替え、AS による別名、DISTINCT による重複除外まで、試験の土台になる部分をここで固めます。
最初から全部を完璧に覚える必要はありません。
まずは「書いてみること」、そして「止まった場所を確認すること」がいちばん大事です。
では、学習用データを作るところから、一緒に進めていきましょう。
- まずは学習用データを作成する
- 次に、本文の解説をざっと読んで全体像をつかむ
- その後、
01_select_where_drill.sqlの問題を答えを見ずに解く - 詰まったら解答を見て、もう一度自分で書き直す
- 最後に、間違えた問題だけを解き直す
準備:学習用データの作成(コピペで動きます)



練習したいんですが、そもそもテーブルやデータを自分で作るところで止まりそうです…。



そこは心配いりません。この記事ではコピペで使える学習用データを用意しています。まずは環境に貼り付けて、実際にSELECTを打てる状態を作りましょう。
このシリーズ全10回を貫く「共通の学習用データ」を用意しました。
お使いのOracle環境(Oracle Live SQLやローカル環境など)に以下のコードをコピペして実行し、テーブルを作ってください。
▼ まずはSQLを動かす環境を用意する(1分)
すぐ試したい人:Oracleのブラウザ実行環境(Free SQL / Live SQL系)
ローカルでやりたい人:SQL Developer + Oracle Database Free
※リンクは別タブで開いて、戻ってきたら “Drill 01” から始めてください。
① ブラウザでSQLを実行(最優先)
Oracle Free SQL(旧Live SQL系)
https://livesql.oracle.com/ (Oracleが提供するSQL実行環境)
② ローカルでやりたい人向け:SQL Developer(公式DL)
https://www.oracle.com/database/sqldeveloper/technologies/download/
③ ローカルDB:Oracle Database Free(公式DL)
https://www.oracle.com/database/free/
▼ 学習用テーブルの作成スクリプトを開く
SQL
-- テーブル作成
CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(50),
dept_id NUMBER,
job_title VARCHAR2(50),
salary NUMBER,
hire_date DATE,
commission_pct NUMBER
);
-- データ挿入
INSERT INTO employees VALUES (101, '佐藤', 10, 'MANAGER', 500000, TO_DATE('2020-04-01', 'YYYY-MM-DD'), NULL);
INSERT INTO employees VALUES (102, '鈴木', 10, 'STAFF', 300000, TO_DATE('2021-10-15', 'YYYY-MM-DD'), 0.1);
INSERT INTO employees VALUES (103, '高橋', 20, 'MANAGER', 600000, TO_DATE('2019-01-10', 'YYYY-MM-DD'), NULL);
INSERT INTO employees VALUES (104, '田中', 20, 'STAFF', 280000, TO_DATE('2022-04-01', 'YYYY-MM-DD'), 0.05);
INSERT INTO employees VALUES (105, '伊藤', 30, 'STAFF', 320000, TO_DATE('2023-06-20', 'YYYY-MM-DD'), 0.15);
INSERT INTO employees VALUES (106, '渡辺', NULL, 'TEMP', 200000, TO_DATE('2024-01-05', 'YYYY-MM-DD'), NULL);
COMMIT;
準備ができたら、さっそく解説とドリルに進みましょう!
1. WHERE句の基本(等号・不等号・範囲・複数条件)





WHEREって単純そうに見えるのに、BETWEENとかINとかLIKEが混ざると急に不安になります…。



WHEREは“絞り込みの道具箱”だと思うと整理しやすいです。範囲ならBETWEEN、候補の列挙ならIN、あいまい検索ならLIKE。まずは役割ごとに型で覚えましょう。
WHERE句はデータの「絞り込み」を行います。試験でよく問われるのは、ANDとORの優先順位や、特殊な演算子(BETWEEN、IN、LIKE)の書き方です。
BETWEEN と IN の使い分け
- BETWEEN A AND B: AからBまでの「範囲」を指定します(AとBを含みます)。
- IN (A, B, C…): 指定したリストの「どれかに一致する」ものを探します。
SQL
-- 給与が30万〜50万の社員(BETWEEN)
SELECT emp_name, salary FROM employees WHERE salary BETWEEN 300000 AND 500000;
-- 部門が10または30の社員(IN)
SELECT emp_name, dept_id FROM employees WHERE dept_id IN (10, 30);
LIKE演算子(曖昧検索)
文字列の一部が一致するものを探します。ワイルドカードの使い方が命です。
%:0文字以上の任意の文字列_(アンダースコア):任意の1文字
【SWELL指示:ボックス(メモ)/タイトル:LIKEの鉄板パターン】
LIKE '藤%'(藤で始まる)LIKE '%藤'(藤で終わる)LIKE '%藤%'(藤を含む)LIKE '_藤%'(2文字目が藤)
2. ORDER BYの並べ替え(複数キーとNULLの扱い)



ORDER BYは最後に付ける、というのは分かるんですが、複数列で並べ替えると毎回自信がなくなります。



最初の列が第1キー、次の列が第2キーです。まずは『部門で並べて、その中を給与順にする』みたいに、日本語で言える形をそのままSQLにする感覚を持つと整理しやすいですよ。
結果の表示順を整えるのが ORDER BY です。必ずクエリの一番最後に書きます。
複数列での並べ替え
カンマで区切ることで、第1キー、第2キーを設定できます。
昇順は ASC(省略可能)、降順は DESC です。
SQL
-- 部門IDの昇順で並べ、同じ部門なら給与の降順にする
SELECT emp_name, dept_id, salary
FROM employees
ORDER BY dept_id ASC, salary DESC;
NULLはどこに並ぶ?
Oracleでは、並べ替え時に「NULLは最も大きい値」として扱われます。したがって、昇順(ASC)で並べるとNULLは一番下になり、降順(DESC)で並べると一番上に来ます。これを防ぐには NULLS FIRST や NULLS LAST を明記します。
3. 別名(AS)と重複除外(DISTINCT)



ASはなんとなく使えますが、DISTINCTは“どこまで重複を消すのか”で毎回混乱します。



そこは大事なポイントです。DISTINCTは“行全体”で重複を消します。だから1列だけなら分かりやすくても、2列3列と増えると結果の意味が変わります。ここは試験でも実務でもよく引っかかります。
列の別名(エイリアス)
計算結果や見にくい列名に、新しい名前をつけます。AS は省略可能です。
別名にスペースや特殊記号を含める場合は、**二重引用符(” “)**で囲む必要があります(シングルクォーテーションではありません)。
SQL
-- 給与に12を掛けて「年収」という別名をつける
SELECT emp_name, salary * 12 AS "年収" FROM employees;
DISTINCT(重複除外)
結果から重複した行を取り除きます。必ず SELECT の直後に1回だけ書きます。
SQL
-- 存在する役職(job_title)の一覧を重複なしで出す
SELECT DISTINCT job_title FROM employees;
腕試し!ミニ演習(5問)



読むと分かった気になるんですが、自分で書こうとすると急に止まります…。



それが普通です。だからこそ、ここでは“分かったつもり”を卒業するために、短い問題を自力で解いてみましょう。1回止まったところが、そのまま伸びしろです。
ここからは、今回の学習を定着させるためのアウトプット用コンテンツです。
自力で解いてみましょう。答えはアコーディオンを開くと確認できます。
▼ 例題と解答を開く
Q1. employees 表から、給与が300,000より大きい社員の名前と給与を抽出しなさい。
解答: SELECT emp_name, salary FROM employees WHERE salary > 300000;
Q2. 給与が200,000から300,000の間の社員を抽出しなさい(BETWEENを使用)。
解答: SELECT emp_name, salary FROM employees WHERE salary BETWEEN 200000 AND 300000;
Q3. 名前が「藤」で終わる社員を抽出しなさい。
解答: SELECT emp_name FROM employees WHERE emp_name LIKE '%藤';
Q4. 役職(job_title)の重複を除外して一覧表示しなさい。
解答: SELECT DISTINCT job_title FROM employees;
Q5. 部門ID(dept_id)の降順で並べ替えなさい。ただし部門IDがNULLのデータは最後に表示すること。
解答: SELECT emp_name, dept_id FROM employees ORDER BY dept_id DESC NULLS LAST;
01_select_where_drill.sql



30問もあると少し圧倒されますが、ここまで来たらやるしかないですね…!



その意気です。全部を一気に完璧にしなくて大丈夫です。まずは前半10問だけでも書いてみて、SELECTとWHEREの型を体に入れていきましょう。
本日学習した全パターンの解答SQL30問をまとめたファイルです。学習の復習や、実務でのカンペとしてコピペして使ってください。


SQL
-- === 01_select_where_drill.sql ===
-- 1. 全列抽出
SELECT * FROM employees;
-- 2. 特定列の抽出
SELECT emp_id, emp_name FROM employees;
-- 3. 四則演算
SELECT emp_name, salary, salary * 1.1 FROM employees;
-- 4. 列の別名(AS省略)
SELECT emp_name 名前 FROM employees;
-- 5. 列の別名(ダブルクォート必須)
SELECT emp_name AS "社員の 名前" FROM employees;
-- 6. 重複除外
SELECT DISTINCT dept_id FROM employees;
-- 7. 複数列の重複除外
SELECT DISTINCT dept_id, job_title FROM employees;
-- 8. WHERE(等号)
SELECT * FROM employees WHERE dept_id = 10;
-- 9. WHERE(不等号)
SELECT * FROM employees WHERE salary >= 300000;
-- 10. WHERE(等しくない)
SELECT * FROM employees WHERE dept_id <> 20;
-- 11. BETWEEN(範囲)
SELECT * FROM employees WHERE salary BETWEEN 250000 AND 350000;
-- 12. IN(複数指定)
SELECT * FROM employees WHERE dept_id IN (10, 20);
-- 13. NOT IN
SELECT * FROM employees WHERE dept_id NOT IN (10, 20);
-- 14. LIKE(前方一致)
SELECT * FROM employees WHERE emp_name LIKE '佐%';
-- 15. LIKE(後方一致)
SELECT * FROM employees WHERE emp_name LIKE '%藤';
-- 16. LIKE(中間一致)
SELECT * FROM employees WHERE emp_name LIKE '%田%';
-- 17. LIKE(1文字指定)
SELECT * FROM employees WHERE emp_name LIKE '_藤';
-- 18. AND条件
SELECT * FROM employees WHERE dept_id = 10 AND salary >= 300000;
-- 19. OR条件
SELECT * FROM employees WHERE dept_id = 10 OR dept_id = 20;
-- 20. ANDとORの混在(ANDが優先されるためカッコを使う)
SELECT * FROM employees WHERE (dept_id = 10 OR dept_id = 20) AND salary > 300000;
-- 21. ORDER BY(昇順:ASC省略)
SELECT * FROM employees ORDER BY salary;
-- 22. ORDER BY(降順)
SELECT * FROM employees ORDER BY salary DESC;
-- 23. ORDER BY(複数キー)
SELECT * FROM employees ORDER BY dept_id ASC, salary DESC;
-- 24. ORDER BY(列番号での指定:2番目の列で並べ替え)
SELECT emp_name, salary FROM employees ORDER BY 2 DESC;
-- 25. ORDER BY(別名での指定)
SELECT emp_name, salary * 12 AS annual_salary FROM employees ORDER BY annual_salary;
-- 26. ORDER BY(NULLを先頭に)
SELECT * FROM employees ORDER BY commission_pct ASC NULLS FIRST;
-- 27. ORDER BY(NULLを末尾に)
SELECT * FROM employees ORDER BY commission_pct DESC NULLS LAST;
-- 28. 日付の比較(そのまま文字列比較でも動く環境はあるが、TO_DATEが確実)
SELECT * FROM employees WHERE hire_date >= TO_DATE('2023-01-01', 'YYYY-MM-DD');
-- 29. 行の制限(Oracle 12c以降の構文)
SELECT * FROM employees ORDER BY salary DESC FETCH FIRST 3 ROWS ONLY;
-- 30. WHERE句で別名は使えない(エラーになる例の正しい書き方)
SELECT emp_name, salary * 12 AS annual_salary FROM employees WHERE salary * 12 > 3000000;
WHERE句で「列の別名」は使えない!
SELECT文は「FROM → WHERE → SELECT → ORDER BY」の順に処理されます。そのため、SELECT句で作った「別名」は、それより前に実行されるWHERE句ではまだ存在しておらず、エラーになります。(※ORDER BY句では別名が使えます)
まとめ



まだ全部を完璧に覚えたわけではないですが、少なくとも前より“どこからどう書き始めればいいか”は分かってきました。読むだけだったときより、かなり手が動きやすくなった気がします。



それで十分です。最初に必要なのは、完璧な暗記ではありません。基本構文を見たときに『たぶんこう書けばいい』と手を動かせることです。その感覚ができてくると、次の単元でも止まりにくくなります。
最後に、今回の内容を整理します。
この第1回では、SQLの基礎の中でも、とくに使用頻度が高く、試験でも何度も問われる SELECT / WHERE / ORDER BY / AS / DISTINCT を確認しました。
一つひとつはシンプルに見えますが、実際には「条件の書き方」「並び替えの順番」「NULLの扱い」「重複除外の粒度」など、初学者が止まりやすいポイントがいくつもあります。
しかし逆に言えば、ここをしっかり押さえられると、SQLの勉強がかなり安定します。
今回の学習で押さえたいことは、次の5つです。
- SELECT は「必要な列を選ぶ」ための基本形である
- WHERE は「どの行を残すか」を決める条件式である
- ORDER BY は「どの順番で見るか」を整える
- AS は列を見やすくするための別名である
- DISTINCT は重複を取り除くが、何を重複とみなすかは列の組み合わせで変わる
ここまで理解できると、SQLは単なる記号の並びではなく、
「表の中から、必要な情報を選び、条件で絞り、見やすい形に並べる道具」
として見えてきます。
そして、今回いちばん大事なのは、読んで分かったことより、実際に自分で書いてみたことです。
もしドリルの途中で手が止まった問題があったとしても、それは失敗ではありません。
むしろ、「そこが今の自分の弱点だ」と分かった時点で、大きく前進しています。
勉強を続けるときは、全部を何度もやり直す必要はありません。
まずは、今回つまずいた問題だけをもう一度解いてみてください。
それだけでも、SELECTやWHEREの型はかなり定着します。
次回は、今回の範囲と同じくらい多くの人が引っかかる NULL対策(NVL / COALESCE / NULLIF) に進みます。= NULL がなぜダメなのか、COUNT(*) と COUNT(列名) はなぜ違うのか、NOT IN でなぜ混乱が起きるのか。
そうした「分かったつもりで止まりやすい部分」を、次はドリル形式で整理していきます。
まずは今日、01_select_where_drill.sql の中から 前半10問だけでも手を動かしてみてください。
そこを乗り切れれば、この先のSQL学習はかなり進めやすくなります。
土台が固まると、難しい単元に進んでも「何を書いているのか分からない」という状態が減っていきます。
焦らなくて大丈夫です。
1本ずつ書いて、1つずつ慣れていけば、SQLはちゃんと身につきます。
- LIKEのワイルドカード:
%は0文字以上、_は1文字。 - 別名の囲み記号: スペース等を含む別名は
" "(ダブルクォート)で囲む。 - ORDER BYのNULL: OracleではNULLは「最大値」扱い。
▼ 次回の範囲
次回は、試験でも実務でも事故りやすい「NULL対策(NVL / COALESCE / NULLIF)」*を完全攻略します!
公式リファレンス
Oracle Database SQL Language Reference(SELECT)
(上のTOCからSELECTに飛べます)
https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/

コメント