Oracle SQL SELECT1 : SELECT文の基礎
おすすめ書籍
本書用のWebアプリを使ってSQLを実行し学習していきます。初心者の方に分かりやすく、図表を多く使って解説されています。 学習の最後には200問越えのドリルが付いていてSQLのスキルが試せる様になっています。
SELECT文の基本的な構文
SELECT <列名リスト> FROM <表名リスト>
SELECT句では検索したい表の列の名前を、FROM句には検索される表の名前を記述する。
<<句(フレーズ)と文(ステートメント)について>>
SQLではSELECT,FROMの語はキーワードと呼ばれ、キーワードはその他の語と一体となり
句(フレーズ)と呼ばれる単位になります。また、いくつかの句が組み合わさり1個の命令
となったものを文(ステートメント)よ呼びます。
但し、句同士の連結の順序は定義されていて、上の例ではFROM句とSELECT句の順番が
入れ替わることはありません。
特定の列を検索する場合
特定の列を検索する場合は<列名リスト>にカンマ(,)を区切り記号として列記します。
<列名リスト>の記述順番に列の表示がされます。
SQL> SELECT ENAME , EMPNO , JOB , MGR FROM EMP; |
MARTIN 7654 SALESMAN 7698 |
TURNER 7844 SALESMAN 7698 |
(EMP表はOracleをインスト-ルした時にサンプルDBとして作成されているもので
Oracleの説明書などではよく利用されているものです。)
この例の出力結果では、JOBが"PRESIDENT"のMGRの部分は空白ですがこれは
この項目がNULL(DBにデータが設定されていない状態を示す)になっています。
今後このNULL値はいろんなところで問題となるDB上の特別な値です。
表の列全てを検索する場合
表の列全てを検索する場合は<列名リスト>にアスタリスク(*)を記述します。
列の表示される順番は、表の定義された順に表示される。
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 |
重複する行を表示しない場合
重複する行を表示しないようにするにはDISTINCTキーワードを列名の前に記述する。
SQL> SELECT DEPTNO FROM EMP; |
SQL> SELECT DISTINCT DEPTNO FROM EMP; |
最初の例では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 |
例④ (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 |
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 |
例⑦ (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 |
この例はENAMEに"A"を含むものを検索しています。
本書用のWebアプリを使ってSQLを実行し学習していきます。初心者の方に分かりやすく、図表を多く使って解説されています。 学習の最後には200問越えのドリルが付いていてSQLのスキルが試せる様になっています。