Oracle SQL SELECT1 : SELECT文の基礎


SELECT文の基本的な構文

SELECT <列名リスト> FROM <表名リスト>

SELECT句では検索したい表の列の名前を、FROM句には検索される表の名前を記述する。

<<句(フレーズ)と文(ステートメント)について>>

  SQLではSELECT,FROMの語はキーワードと呼ばれ、キーワードはその他の語と一体となり
句(フレーズ)と呼ばれる単位になります。また、いくつかの句が組み合わさり1個の命令
となったものを文(ステートメント)よ呼びます。
 但し、句同士の連結の順序は定義されていて、上の例ではFROM句とSELECT句の順番が
入れ替わることはありません。

特定の列を検索する場合

特定の列を検索する場合は<列名リスト>にカンマ(,)を区切り記号として列記します。
<列名リスト>の記述順番に列の表示がされます。

SQL>SELECT ENAME , EMPNO , JOB , MGR FROM EMP;

ENAME          EMPNO JOB             MGR
---------- --------- --------- ---------
SMITH           7369 CLERK          7902
ALLEN           7499 SALESMAN       7698
WARD            7521 SALESMAN       7698
JONES           7566 MANAGER        7839
MARTIN          7654 SALESMAN       7698
BLAKE           7698 MANAGER        7839
CLARK           7782 MANAGER        7839
SCOTT           7788 ANALYST        7566
KING            7839 PRESIDENT
TURNER          7844 SALESMAN       7698
ADAMS           7876 CLERK          7788
JAMES           7900 CLERK          7698
FORD            7902 ANALYST        7566
MILLER          7934 CLERK          7782

14行が選択されました。


(EMP表はOracleをインスト-ルした時にサンプルDBとして作成されているもので
Oracleの説明書などではよく利用されているものです。)
 この例の出力結果では、JOBが"PRESIDENT"のMGRの部分は空白ですがこれは
この項目がNULL(DBにデータが設定されていない状態を示す)になっています。
今後このNULL値はいろんなところで問題となるDB上の特別な値です。

表の列全てを検索する場合

表の列全てを検索する場合は<列名リスト>にアスタリスク(*)を記述します。
 列の表示される順番は、表の定義された順に表示される。

SQL>SELECT * FROM EMP;

    EMPNO ENAME      JOB             MGR HIREDATE       SAL      COMM    DEPTNO
--------- ---------- --------- --------- -------- --------- --------- ---------
     7369 SMITH      CLERK          7902 80-12-17       800                  20
     7499 ALLEN      SALESMAN       7698 81-02-20      1600       300        30
     7521 WARD       SALESMAN       7698 81-02-22      1250       500        30
     7566 JONES      MANAGER        7839 81-04-02      2975                  20
     7654 MARTIN     SALESMAN       7698 81-09-28      1250      1400        30
     7698 BLAKE      MANAGER        7839 81-05-01      2850                  30
     7782 CLARK      MANAGER        7839 81-06-09      2450                  10
     7788 SCOTT      ANALYST        7566 82-12-09      3000                  20
     7839 KING       PRESIDENT           81-11-17      5000                  10
     7844 TURNER     SALESMAN       7698 81-09-08      1500         0        30
     7876 ADAMS      CLERK          7788 83-01-12      1100                  20
     7900 JAMES      CLERK          7698 81-12-03       950                  30
     7902 FORD       ANALYST        7566 81-12-03      3000                  20
     7934 MILLER     CLERK          7782 82-01-23      1300                  10

14行が選択されました。

重複する行を表示しない場合

重複する行を表示しないようにするにはDISTINCTキーワードを列名の前に記述する。

>SELECT DEPTNO FROM EMP;

   DEPTNO
---------
       20
       30
       30
       20
       30
       30
       10
       20
       10
       30
       20
       30
       20
       10

14行が選択されました
SQL>SELECT DISTINCT DEPTNO FROM EMP;

   DEPTNO
---------
       10
       20
       30

最初の例ではDISTINCTの指定なしで、その次の例ではDISTINCTの指定を行っています。


SELECT文での条件付検索

SELECT <列名リスト> FROM <表名リスト> WHERE <条件式>

条件付検索を行う場合はWHERE句を用いて、表の検索の条件を指示します。

<条件式>は比較演算子を使用して以下の様に記述します。

<式> <比較演算子> <値>

<式>は列名そのものの場合もあれば、列名に対して演算等を施した場合もあります。

比較演算子については以下の表にまとめました。一般的なプログラム言語の比較演算子
と同じ様な感じです。

例① (=)

SQL> SELECT * FROM EMP WHERE DEPTNO = 10;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7782 CLARK      MANAGER         7839 81-06-09       2450                    10
      7839 KING       PRESIDENT            81-11-17       5000                    10
      7934 MILLER     CLERK           7782 82-01-23       1300                    10

この例ではDEPTNOが10と等しいレコードを選択する。

例② (>=)

SQL> SELECT * FROM EMP WHERE SAL >= 5000;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7839 KING       PRESIDENT            81-11-17       5000                    10

例③ (!=)

SQL> SELECT * FROM EMP WHERE DEPTNO != 10;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80-12-17        800                    20
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30
      7521 WARD       SALESMAN        7698 81-02-22       1250        500         30
      7566 JONES      MANAGER         7839 81-04-02       2975                    20
      7654 MARTIN     SALESMAN        7698 81-09-28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81-05-01       2850                    30
      7788 SCOTT      ANALYST         7566 82-12-09       3000                    20
      7844 TURNER     SALESMAN        7698 81-09-08       1500          0         30
      7876 ADAMS      CLERK           7788 83-01-12       1100                    20
      7900 JAMES      CLERK           7698 81-12-03        950                    30
      7902 FORD       ANALYST         7566 81-12-03       3000                    20

10行が選択されました。

例④ (BETWEEN)

SQL> SELECT * FROM EMP WHERE SAL BETWEEN 1000 AND 2000;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30
      7521 WARD       SALESMAN        7698 81-02-22       1250        500         30
      7654 MARTIN     SALESMAN        7698 81-09-28       1250       1400         30
      7844 TURNER     SALESMAN        7698 81-09-08       1500          0         30
      7876 ADAMS      CLERK           7788 83-01-12       1100                    20
      7934 MILLER     CLERK           7782 82-01-23       1300                    10

6行が選択されました。

WHERE句は以下の様にも書き換えが可能ですが、私はBETWEENの方を良く用います。

 SELECT * FROM EMP WHERE (SAL >= 1000) AND (SAL <= 2000);
このWHERE句には"AND"という条件式同士を結合する論理演算子が出てきましたが、
これもVBの様にIF文で用いられる論理演算子と考え方は同様のものです。

論理演算子については以下のものがあります。
論理演算子 演算処理
<条件式1> AND <条件式2> 条件式1の値が真で、かつ、条件式2が真であるか
<条件式1> OR <条件式2> 条件式1の値が真か、または、条件式2が真であるか
NOT <条件式1> 条件式1の値が真ではない(値が偽)
楽天市場

例⑤ (IN):数値の場合

SQL> SELECT * FROM EMP WHERE EMPNO IN (7369,7499,7521);

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7521 WARD       SALESMAN        7698 81-02-22       1250        500         30
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30
      7369 SMITH      CLERK           7902 80-12-17        800                    20

例⑥ (IN):文字列の場合

IN演算子で文字列を指定する場合は、シングルコーテーション(')で文字列を囲んで 指示します。

SQL> SELECT * FROM EMP WHERE JOB IN ('CLERK','ANALYST');

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80-12-17        800                    20
      7788 SCOTT      ANALYST         7566 82-12-09       3000                    20
      7876 ADAMS      CLERK           7788 83-01-12       1100                    20
      7900 JAMES      CLERK           7698 81-12-03        950                    30
      7902 FORD       ANALYST         7566 81-12-03       3000                    20
      7934 MILLER     CLERK           7782 82-01-23       1300                    10

6行が選択されました。

例⑦ (IS NULL)

SQL> SELECT * FROM EMP WHERE MGR IS NULL;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7839 KING       PRESIDENT            81-11-17       5000                    10
NULL値はDBの値の中で特殊な値として定義されています。NULL値とは数値項目であれば0でも無く、 また文字項目であれば文字長がゼロの文字でも無く、値が未設定という状態を示します。 この為、項目がNULLであるかを判定するものとして"IS NULL"演算子が用いられます。 尚、NULL値ではない場合の条件式は"IS NOT NULL"となります。 ところで数値項目であればNULL値はゼロという値でもない為、計算結果には関係してこなくなります。


例⑧ (LIKE)

SQL> SELECT * FROM EMP WHERE ENAME LIKE 'A%';

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30
      7876 ADAMS      CLERK           7788 83-01-12       1100                    20
この例ではENAMEの先頭の1文字が"A"であるものを検索しています。 LIKE演算子の後のシングルコーテーションで囲まれた中に検索したい文字列のパターンを 指示します。パターンの中の記号"%"はワイルドカードと呼ばれるもので、この中はどの様な 文字列でもパターンマッチングすると言うことです。
SQL> SELECT * FROM EMP WHERE ENAME LIKE '%TT';

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 82-12-09       3000                    20
この例はENAMEの最後2文字が"TT"のものを検索しています。
SQL> SELECT * FROM EMP WHERE ENAME LIKE '%A%';

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30
      7521 WARD       SALESMAN        7698 81-02-22       1250        500         30
      7654 MARTIN     SALESMAN        7698 81-09-28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81-05-01       2850                    30
      7782 CLARK      MANAGER         7839 81-06-09       2450                    10
      7876 ADAMS      CLERK           7788 83-01-12       1100                    20
      7900 JAMES      CLERK           7698 81-12-03        950                    30

7行が選択されました。

この例はENAMEに"A"を含むものを検索しています。



ページのトップへ戻る