Oracle SQL SELECT1 : SELECT文の基礎
おすすめ書籍
- 図解入門よくわかる最新Oracleデータベースの基本と仕組み[第4版] (How‐nual Visual Guide Book)
- Oracleの基本 ~データベース入門から設計/運用の初歩まで
- [改訂第4版]SQLポケットリファレンス
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キーワードを列名の前に記述する。
SQL>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句を用いて、表の検索の条件を指示します。
<条件式>は比較演算子を使用して以下の様に記述します。
<式> <比較演算子> <値>
<式>は列名そのものの場合もあれば、列名に対して演算等を施した場合もあります。
比較演算子については以下の表にまとめました。一般的なプログラム言語の比較演算子
と同じ様な感じです。
演算子 | 比較処理 |
---|---|
= | 等しい |
> | より大きい |
>= | 以上 |
< | より小さい |
<= | 以下 |
!= , <> | 等しくない |
BETWEEN A AND B | (A)以上で(B)以下の範囲 |
IN (値リスト) |
値リストのどれかを照合 (値リストは"値1,値2,値3..."の様な記述) |
IS NULL | NULL値である |
LIKE 検索文字列 | 文字列パターンを照合 |
例① (=)
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 10NULL値は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"を含むものを検索しています。