MENU

【SQL Silver対策 #1】SELECTとWHEREの基礎ドリル30(抽出・並べ替え・別名)

【SQL Silver対策 #1】SELECTとWHEREの基礎ドリル30(抽出・並べ替え・別名)

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 の条件を書きたいのに、BETWEENINLIKE の使い分けが曖昧になる
  • ANDOR を混ぜた途端に、自分の意図通りの結果が返ってこなくなる
  • ORDER BY を書く位置や、昇順・降順、NULLの並び方で混乱する
  • DISTINCT を使ったものの、何を重複とみなしているのか分からなくなる

こうした悩みは、あなたの理解が足りないから起きるのではありません。
むしろ、SQLをちゃんと学ぼうとしている人ほど、一度は必ずぶつかるポイントです。

だからこの記事では、長い理論説明よりも、まずは型をつかんで、自分の手で書けるようになることを優先します。
細かい構文知識を丸暗記するのではなく、実際にSQLを書いて、動かして、間違えて、直していく。
その流れの中で、「ああ、SELECTってこう書けばいいのか」「WHEREはこうやって絞るのか」が自然に身についていくはずです。

今回のゴールは、ひとことで言うとこれです。

「SELECTとWHEREの基本構文を、迷わず1発で書ける状態にする」こと。

等号や不等号、BETWEENINLIKE を使った絞り込みから、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句の基本

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 FIRSTNULLS 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問をまとめたファイルです。学習の復習や、実務でのカンペとしてコピペして使ってください。

本日学習した全パターンの解答SQL30問の1問目
Screenshot

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はちゃんと身につきます。

今日の暗記事項(3つだけ)
  1. LIKEのワイルドカード: %は0文字以上、_は1文字。
  2. 別名の囲み記号: スペース等を含む別名は " "(ダブルクォート)で囲む。
  3. 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/

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

立命館生命科学部生命医科学科卒業➡️ドラッグストアへ就職 ♢大学で分子生物学を学び、薬・栄養の情報を発信。健康系を12年勉強、現在も継続中❗️ 国家資格取得済、薬機法に関する情報提供可能です。SNS運用代行(LINE、Instagram, TikTok)【薬機法、健康関係の構築代行承ります】お気軽にご相談ください

コメント

コメントする

目次