Oracle SELECT文の基本を解説

Oracle Master Silver

SELECT文はOracleデータベースを操作する上で最も基本的かつ重要なSQL文です。この文を使用することで、テーブルから必要な情報を抽出したり、条件を指定してデータを絞り込むことができます。本記事では、SELECT文の構文、基本例、応用例に加え、ベストプラクティスや注意点も詳しく解説します。

本記事ではSCOTTサンプルスキーマを使用した例で解説します。
SCOTTサンプルスキーマは以下を実行することでインポートおよび使用が可能です。

$ sqlplus / as sysdba
SQL> @?/rdbms/admin/utlsampl.sql
$ sqlplus scott/tiger

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


SELECT文の基本構文

以下がSELECT文の基本的な構文です。

SELECT カラム名1, カラム名2, ...
FROM テーブル名
WHERE 条件
ORDER BY カラム名 [ASC|DESC];

各キーワードの詳細

  1. SELECT:取得したいカラムを指定します。*を使用するとすべてのカラムを取得可能ですが、必要最小限のカラムを指定することを推奨します。
  2. FROM:データを抽出する元となるテーブルを指定します。
  3. WHERE:条件を設定することでデータを絞り込みます。効率的なクエリにはインデックスを考慮した条件設定が重要です。
  4. ORDER BY:結果を指定したカラムで並び替えます。デフォルトは昇順(ASC)です。
  5. DISTINCT:重複を排除したデータを取得します。

SELECT文の基本使用例

以下に、SELECT文を使用した具体的な例を示します。

1. テーブルの全データを取得

「EMP」テーブルの全てのデータを取得します。ただし、実際の運用では*を避け、必要なカラムを明示することが推奨されます。

SELECT *
FROM EMP;

2. 必要なカラムのみを取得

「ENAME」と「JOB」カラムのみを取得します。特定のカラムを明示することで、パフォーマンスが向上します。

SELECT ENAME, JOB
FROM EMP;

3. WHERE句を使用したデータの絞り込み

SQLのWHERE句は、テーブルからデータを取得(SELECT)する際に、特定の条件に一致する行だけを絞り込むための強力なフィルター機能です。SELECT * FROM SCOTT.EMP;が全社員のデータを無条件に取得するのに対し、WHERE句は「このデータだけが欲しい」という具体的な要求に応えるために必須の構文です。

データの抽出条件は、=(等しい)だけでなく、様々な比較演算子を用いて柔軟に指定することができます。

1. 基本的な比較(=, >, !=)

最もよく使われるのが、数値や文字列を比較する演算子です。

-- SCOTT.EMP表から部署番号(DEPTNO)が10の社員のみを抽出
SELECT ENAME, JOB, SAL
FROM SCOTT.EMP
WHERE DEPTNO = 10;

-- 給与(SAL)が2000より多い社員を抽出
SELECT ENAME, JOB, SAL
FROM SCOTT.EMP
WHERE SAL > 2000;

-- 職種(JOB)が 'MANAGER' ではない社員を抽出
-- (<> も != と同じ意味で使えます)
SELECT ENAME, JOB
FROM SCOTT.EMP
WHERE JOB != 'MANAGER';

2. 範囲を指定する (BETWEEN, >=, <=)

特定の範囲内に収まるデータを抽出します。

-- 給与(SAL)が1000以上2000以下の社員を抽出
SELECT ENAME, SAL
FROM SCOTT.EMP
WHERE SAL BETWEEN 1000 AND 2000;

-- 上記は以下のようにも書けます
SELECT ENAME, SAL
FROM SCOTT.EMP
WHERE SAL >= 1000 AND SAL <= 2000;

3. 複数の値を指定する (IN)

複数の「どれかに一致すれば良い」という条件を指定します。

-- 部署番号(DEPTNO)が10または30の社員を抽出
SELECT ENAME, DEPTNO
FROM SCOTT.EMP
WHERE DEPTNO IN (10, 30);

4. あいまい検索 (LIKE)

文字列の一部が一致するデータを検索します。%は「0文字以上の任意の文字列」を意味します。

-- 名前(ENAME)が 'S' で始まる社員を抽出
SELECT ENAME
FROM SCOTT.EMP
WHERE ENAME LIKE 'S%';

このようにWHERE句と比較演算子を使いこなすことで、膨大なデータが格納されたテーブルから、必要な情報だけを自在かつ効率的に抜き出すことが可能になります。

4. ORDER BY句を使用した並び替え

部門番号順(昇順)で社員データを並び替えます。

SELECT ENAME, JOB, DEPTNO
FROM EMP
ORDER BY DEPTNO ASC;

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

5. DISTINCTを使用した重複の排除

部門番号(DEPTNO)の重複を排除して取得します。

SELECT DISTINCT DEPTNO
FROM EMP;

6. 別名(ALIAS)を使用したカラム名の変更

カラム名を分かりやすく変更して表示します。

SELECT ENAME AS “社員名”, JOB AS “職種”
FROM EMP;

SELECT文の応用例

1. 集計関数を使用したデータの要約

「EMP」テーブルの社員数を取得します。

SELECT COUNT(*) AS “社員数”
FROM EMP;

2. GROUP BY句を使用したグループ化

部門ごとの平均給与を計算します。

SELECT DEPTNO, AVG(SAL) AS “平均給与”
FROM EMP
GROUP BY DEPTNO;

3. HAVING句を使用したグループ化条件の設定

平均給与が3000以上の部門を取得します。

SELECT DEPTNO, AVG(SAL) AS “平均給与”
FROM EMP
GROUP BY DEPTNO
HAVING AVG(SAL) >= 2000;

4. サブクエリを使用した条件の設定

最高給与の社員を取得します。

SELECT ENAME, SAL
FROM EMP
WHERE SAL = (SELECT MAX(SAL) FROM EMP);

5. JOINを使用した複数テーブルの結合

「EMP」テーブルと「DEPT」テーブルを結合して、部門名を取得します。

SELECT E.ENAME, E.JOB, D.DNAME
FROM EMP E
JOIN DEPT D ON E.DEPTNO = D.DEPTNO;

ベストプラクティスと注意点

  1. カラムの明示
    • SELECT *を避け、必要なカラムのみを指定することで、クエリの効率を向上させます。
  2. インデックスの活用
    • WHERE句やJOIN条件でインデックスが使用されるように設計すると、性能が向上します。
  3. 実行計画の確認
    • EXPLAIN PLANを使用してクエリの実行計画を確認し、最適化を行いましょう。
  4. 適切な権限設定
    • SELECT文を使用するユーザーには必要最小限の権限を付与することで、セキュリティを確保します。

まとめ

SELECT文は、データベース操作の基本でありながら、さまざまな応用が可能な強力なツールです。本記事では基本構文から応用例、そしてベストプラクティスまでを詳しく解説しました。実践を通じてこれらの技術を習得し、データベース操作スキルを向上させましょう。さらなる学びの一歩として、複雑なクエリの構築やパフォーマンスチューニングにも挑戦してみてください。

[参考]
Oracle Database SQL言語リファレンス 19c

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました