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];
各キーワードの詳細
- SELECT:取得したいカラムを指定します。
*を使用するとすべてのカラムを取得可能ですが、必要最小限のカラムを指定することを推奨します。 - FROM:データを抽出する元となるテーブルを指定します。
- WHERE:条件を設定することでデータを絞り込みます。効率的なクエリにはインデックスを考慮した条件設定が重要です。
- ORDER BY:結果を指定したカラムで並び替えます。デフォルトは昇順(ASC)です。
- DISTINCT:重複を排除したデータを取得します。
SELECT文の基本使用例
以下に、SELECT文を使用した具体的な例を示します。
1. テーブルの全データを取得
「EMP」テーブルの全てのデータを取得します。ただし、実際の運用では*を避け、必要なカラムを明示することが推奨されます。
SELECT * FROM EMP;
SQL> SELECT * FROM EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
2. 必要なカラムのみを取得
「ENAME」と「JOB」カラムのみを取得します。特定のカラムを明示することで、パフォーマンスが向上します。
SELECT ENAME, JOB FROM EMP;
SQL> SELECT ENAME, JOB FROM EMP;
ENAME JOB
---------- ---------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
JONES MANAGER
MARTIN SALESMAN
BLAKE MANAGER
CLARK MANAGER
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK
14 rows selected.
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';
SQL> SELECT ENAME, JOB, SAL FROM SCOTT.EMP WHERE DEPTNO = 10;
ENAME JOB SAL
---------- --------- ----------
CLARK MANAGER 2450
KING PRESIDENT 5000
MILLER CLERK 1300
SQL> SELECT ENAME, JOB, SAL FROM SCOTT.EMP WHERE SAL > 2000;
ENAME JOB SAL
---------- --------- ----------
JONES MANAGER 2975
BLAKE MANAGER 2850
CLARK MANAGER 2450
SCOTT ANALYST 3000
KING PRESIDENT 5000
FORD ANALYST 3000
6 rows selected.
SQL> SELECT ENAME, JOB FROM SCOTT.EMP WHERE JOB != 'MANAGER';
ENAME JOB
---------- ---------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
MARTIN SALESMAN
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK
11 rows selected.
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;
SQL> SELECT ENAME, SAL FROM SCOTT.EMP
2 WHERE SAL BETWEEN 1000 AND 2000;
ENAME SAL
---------- ----------
ALLEN 1600
WARD 1250
MARTIN 1250
TURNER 1500
ADAMS 1100
MILLER 1300
6 rows selected.
SQL> SELECT ENAME, SAL FROM SCOTT.EMP
2 WHERE SAL >= 1000 AND SAL <= 2000;
ENAME SAL
---------- ----------
ALLEN 1600
WARD 1250
MARTIN 1250
TURNER 1500
ADAMS 1100
MILLER 1300
6 rows selected.
3. 複数の値を指定する (IN)
複数の「どれかに一致すれば良い」という条件を指定します。
-- 部署番号(DEPTNO)が10または30の社員を抽出
SELECT ENAME, DEPTNO FROM SCOTT.EMP
WHERE DEPTNO IN (10, 30);
SQL> SELECT ENAME, DEPTNO FROM SCOTT.EMP
2 WHERE DEPTNO IN (10, 30);
ENAME DEPTNO
---------- ----------
ALLEN 30
WARD 30
MARTIN 30
BLAKE 30
CLARK 10
KING 10
TURNER 30
JAMES 30
MILLER 10
9 rows selected.
4. あいまい検索 (LIKE)
文字列の一部が一致するデータを検索します。%は「0文字以上の任意の文字列」を意味します。
-- 名前(ENAME)が 'S' で始まる社員を抽出
SELECT ENAME FROM SCOTT.EMP WHERE ENAME LIKE 'S%';
SQL> SELECT ENAME FROM SCOTT.EMP WHERE ENAME LIKE 'S%';
ENAME
----------
SMITH
SCOTT
このようにWHERE句と比較演算子を使いこなすことで、膨大なデータが格納されたテーブルから、必要な情報だけを自在かつ効率的に抜き出すことが可能になります。
4. ORDER BY句を使用した並び替え
部門番号順(昇順)で社員データを並び替えます。
SELECT ENAME, JOB, DEPTNO FROM EMP
ORDER BY DEPTNO ASC;
SQL> SELECT ENAME, JOB, DEPTNO FROM EMP;
ENAME JOB DEPTNO
---------- --------- ----------
SMITH CLERK 20
ALLEN SALESMAN 30
WARD SALESMAN 30
JONES MANAGER 20
MARTIN SALESMAN 30
BLAKE MANAGER 30
CLARK MANAGER 10
SCOTT ANALYST 20
KING PRESIDENT 10
TURNER SALESMAN 30
ADAMS CLERK 20
JAMES CLERK 30
FORD ANALYST 20
MILLER CLERK 10
14 rows selected.
SQL> SELECT ENAME, JOB, DEPTNO FROM EMP
2 ORDER BY DEPTNO ASC;
ENAME JOB DEPTNO
---------- --------- ----------
CLARK MANAGER 10
KING PRESIDENT 10
MILLER CLERK 10
JONES MANAGER 20
FORD ANALYST 20
ADAMS CLERK 20
SMITH CLERK 20
SCOTT ANALYST 20
WARD SALESMAN 30
TURNER SALESMAN 30
ALLEN SALESMAN 30
JAMES CLERK 30
BLAKE MANAGER 30
MARTIN SALESMAN 30
14 rows selected.
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
5. DISTINCTを使用した重複の排除
部門番号(DEPTNO)の重複を排除して取得します。
SELECT DISTINCT DEPTNO FROM EMP;
SQL> SELECT DEPTNO FROM EMP;
DEPTNO
----------
20
30
30
20
30
30
10
20
10
30
20
30
20
10
14 rows selected.
SQL> SELECT DISTINCT DEPTNO FROM EMP;
DEPTNO
----------
30
10
20
6. 別名(ALIAS)を使用したカラム名の変更
カラム名を分かりやすく変更して表示します。
SELECT ENAME AS "社員名", JOB AS "職種" FROM EMP;
SQL> SELECT ENAME AS "社員名", JOB AS "職種" FROM EMP;
社員名 職種
---------- ---------
SMITH CLERK
ALLEN SALESMAN
WARD SALESMAN
JONES MANAGER
MARTIN SALESMAN
BLAKE MANAGER
CLARK MANAGER
SCOTT ANALYST
KING PRESIDENT
TURNER SALESMAN
ADAMS CLERK
JAMES CLERK
FORD ANALYST
MILLER CLERK
14 rows selected.
SELECT文の応用例
1. 集計関数を使用したデータの要約
「EMP」テーブルの社員数を取得します。
SELECT COUNT(*) AS "社員数" FROM EMP;
SQL> SELECT COUNT(*) AS "社員数" FROM EMP;
社員数
---------------
14
2. GROUP BY句を使用したグループ化
部門ごとの平均給与を計算します。
SELECT DEPTNO, AVG(SAL) AS "平均給与" FROM EMP GROUP BY DEPTNO;
SQL> SELECT DEPTNO, AVG(SAL) AS "平均給与" FROM EMP GROUP BY DEPTNO;
DEPTNO 平均給与
---------- ------------------
30 1566.66667
10 2916.66667
20 2175
3. HAVING句を使用したグループ化条件の設定
平均給与が3000以上の部門を取得します。
SELECT DEPTNO, AVG(SAL) AS "平均給与" FROM EMP
GROUP BY DEPTNO HAVING AVG(SAL) >= 2000;
SQL> SELECT DEPTNO, AVG(SAL) AS "平均給与" FROM EMP
2 GROUP BY DEPTNO HAVING AVG(SAL) >= 2000;
DEPTNO 平均給与
---------- ------------------
10 2916.66667
20 2175
4. サブクエリを使用した条件の設定
最高給与の社員を取得します。
SELECT ENAME, SAL FROM EMP
WHERE SAL = (SELECT MAX(SAL) FROM EMP);
SQL> SELECT ENAME, SAL FROM EMP
2 WHERE SAL = (SELECT MAX(SAL) FROM EMP);
ENAME SAL
---------- ----------
KING 5000
5. JOINを使用した複数テーブルの結合
「EMP」テーブルと「DEPT」テーブルを結合して、部門名を取得します。
SELECT E.ENAME, E.JOB, D.DNAME FROM EMP E
JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
SQL> SELECT E.ENAME, E.JOB, D.DNAME FROM EMP E
2 JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
ENAME JOB DNAME
---------- --------- --------------
SMITH CLERK RESEARCH
ALLEN SALESMAN SALES
WARD SALESMAN SALES
JONES MANAGER RESEARCH
MARTIN SALESMAN SALES
BLAKE MANAGER SALES
CLARK MANAGER ACCOUNTING
SCOTT ANALYST RESEARCH
KING PRESIDENT ACCOUNTING
TURNER SALESMAN SALES
ADAMS CLERK RESEARCH
JAMES CLERK SALES
FORD ANALYST RESEARCH
MILLER CLERK ACCOUNTING
14 rows selected.
ベストプラクティスと注意点
- カラムの明示
SELECT *を避け、必要なカラムのみを指定することで、クエリの効率を向上させます。
- インデックスの活用
- WHERE句やJOIN条件でインデックスが使用されるように設計すると、性能が向上します。
- 実行計画の確認
EXPLAIN PLANを使用してクエリの実行計画を確認し、最適化を行いましょう。
- 適切な権限設定
- SELECT文を使用するユーザーには必要最小限の権限を付与することで、セキュリティを確保します。
まとめ
SELECT文は、データベース操作の基本でありながら、さまざまな応用が可能な強力なツールです。本記事では基本構文から応用例、そしてベストプラクティスまでを詳しく解説しました。実践を通じてこれらの技術を習得し、データベース操作スキルを向上させましょう。さらなる学びの一歩として、複雑なクエリの構築やパフォーマンスチューニングにも挑戦してみてください。
[参考]
Oracle Database SQL言語リファレンス 19c
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント