SQL入門 第4章補足

4章に入る前に

条件に合う特定の行を取り出すWHERE句についてのの補足です。

WHERE句では、取り出す行の条件を指定します。条件は列名と列名、列名と数値、列名と文字列、列名と日付のように比較できることは2−6で説明したとおりです。

ここでは、比較条件の演算について補足しておきます。

比較条件は、右辺でも左辺でも演算式を記述することができます。

(例)

SELECT * FROM 社員表
WHERE 給与 + 歩合給 >= 250000;

この例では給与+歩合給が250000以上の行を抽出します。
社員表が下表のとおりだったとすると、例文を実行した場合、実行結果のようなデータが表示されます。

社員表

社員コード 氏名 給与 歩合給
10001 山田 栄二 245000  
10002 渡邉 学 260000 50000
10003 大石 建児 195000 40000
10004 伊与田 茂 358000 30000
10005 清水 義徳 280000  
10006 安藤 巧 420000 20000

結果

結 果

社員コード 氏名 給与 歩合給
10002 渡邉 学 260000 50000
10004 伊与田 茂 358000 30000
10006 安藤 巧 420000 20000

★さて、この結果をみて「あれ?」と思ったアナタ!鋭いです。「清水義徳」のデータが出力されていません。
これには理由があります。
実は、清水義徳はOracleに嫌われており、・・・。うそです。

歩合給に数値が入っていないときは、0(ゼロ)ではなく、NULL(ヌル)として扱われます。Oracleでは、演算にNULL値が使われる場合、演算結果はすべてNULLになります。従って、WHERE句の比較結果がNULLとなります。ですから結果には「清水義徳」のデータは表示されません。(詳しくは6章で学習します。)

 

4-1 上限と下限を指定して探す(BETWEEN

BETWEEN 〜と〜との間という意味。

教科書訂正

■BETWEENを使わないで記述すると

SELECT *
FROM EMP
WHERE (HIREDATE <= >= '82-01-01')
  AND (HIREDATE >= <= '83-01-01')

操作例@、操作例Aの結果
7566のJONESさんのJOBはMANAGER

基本構文

SELECT <選択リスト> FROM <表名>
WHERE <列名> BETWEEN <値1> AND <値2>

SELECT  *  FROM  商品表
WHERE  単価 BETWEEN 800 AND 1200

解説

・商品表の「単価」項目が800以上1200以下のレコードを検索する。
・BETWEENは境界の値を含みます。

・表(例)

商品表

商品コード 商品名 単価
10001 オラクルTシャツ白 1200
10002 オラクルTシャツ赤 1200
10003 オラクルパラソル 4000
10004 オラクルめざまし 3000
10005 オラクルクッキー 850
10006 ハイディぬいぐるみ 3500

・結果

商品コード 商品名 単価
10001 オラクルTシャツ白 1200
10002 オラクルTシャツ赤 1200
10005 オラクルクッキー 850

 

4-2 候補リストの中から探す(IN

選択条件を指定するときに、単一の値だけでなく、候補がいくつかある場合に用います。

基本構文

SELECT <選択リスト> FROM <表名>
WHERE <列名> IN ( <値1> [, <値2>, <値3>,・・・] )

SELECT  商品名, 分類, 単価  FROM  商品表
WHERE  分類 IN ( '食品' , '雑貨')

※WHERE 分類 = IN ( '食品' , '雑貨');
 のように「=」をつけないようにしよう!

INを使わずに記述すると

SELECT  商品名, 分類, 単価  FROM  商品表
WHERE    ( 分類 = '食品')
     OR   ( 分類
 = '雑貨')

INの中身をORでつなげる!

おまけ

SELECT  商品名, 分類, 単価  FROM  商品表
WHERE  分類 = ANY ( '食品' , '雑貨')

ANY句を使っても結果は同じなのだ!
ANY句を使う場合は「=」が必要だよ。

解説

・商品表の「分類」項目が「食品」または「雑貨」のレコードを検索する。

・表(例)

商品表

商品コード 商品名 分類 単価
10001 オラクルパラソル 雑貨 4000
10002 オラクルめざまし 雑貨 3000
10003 オラクルTシャツ白 衣類 1200
10004 オラクルTシャツ赤 衣類 1200
10005 オラクルクッキー 食品 850
10006 ハイディぬいぐるみ 玩具 3500

・結果

商品名 分類 単価
オラクルパラソル 雑貨 4000
オラクルめざまし 雑貨 3000
オラクルクッキー 食品 850

 

4-3 パターンマッチ(% _

検索条件を指定するとき、比較する値の一部を指定する場合、パターンを使って比較する。

教科書訂正

■自分で指定した’#’の直後の文字  が 、「特殊記号」ではなく・・・

基本構文

SELECT <選択リスト> FROM <表名>
WHERE <列名> LIKE <パターン> [ESCAPE ’エスケープ文字’]

※パターンとは

パターンとは、値の一部を指定するときにワイルドカード(%または_)を使って表される文字列のこと。

% ・・・ 値の中の複数文字(0文字以上)に相当
_ ・・・ 値の中の1文字に相当(検索文字数がわかっているときに使用)

(例)

パターンの例 書き方
Sから始まる文字列 ’S%’
Qで終わる文字列 ’%Q’
Aから始まってZで終わる ’A%Z’
水から始まる5文字 ’水_ _ _ _’
二で終わる4文字 ’_ _ _二’
Tを含み、Tの後は2文字 ’%T_ _’

※検索条件としてパターンを使用する場合は必ずLIKE句の後にパターンを指定します。

表(例)

商品表

商品コード 商品名 分類 単価
10001 オラクルパラソル 雑貨 4000
10002 オラクルめざまし 雑貨 3000
10003 オラクルTシャツ白 衣類 1200
10004 オラクルTシャツ赤 衣類 1200
10005 オラクルクッキー 食品 850
10006 ハイディぬいぐるみ 玩具 3500

(SQL例)

@商品表から「商品名がハから始まる」商品の商品名、単価を表示する。

SELECT 商品名,単価 FROM 商品表
WHERE 商品名 LIKE ’ハ%’

結果

商品名 単価
ハイディぬいぐるみ 3500


A商品表から「商品名にTを含む」商品の商品名、分類を表示する。

SELECT 商品名,分類 FROM 商品表
WHERE 商品名 LIKE ’%T%’

結果

商品名 分類
オラクルTシャツ白 衣類
オラクルTシャツ赤 衣類


B商品表から「商品名が白で終わる」商品の商品名、分類、単価を表示する。

SELECT 商品名,分類,単価 FROM 商品表
WHERE 商品名 LIKE ’%白’

結果

商品名 分類 単価
オラクルTシャツ白 衣類 1200


C商品表から「商品名がオラクルで始まる8文字の」商品の商品名、単価を表示する。

SELECT 商品名,単価 FROM 商品表
WHERE 商品名 LIKE ’オラクル_ _ _ _’

結果

商品名 単価
オラクルパラソル 4000
オラクルめざまし 3000
オラクルクッキー 850

 

★注意

「LIKE」ではなく「=」を使うと、検索結果が違ってしまいます。

(例)

SELECT 商品名,単価 FROM 商品表
WHERE 商品名 = ’A%’;

このSQL文は
商品名が「A%」のデータを検索する
という意味になります。「%」がワイルドカードとしてでなく、文字そのものとして扱われてしまうのです。

 

4-4 「列」の値が「空」のデータを探す(NULL

列の値に何も入っていない状態である「空」を表す「NULL」を使用して検索を行う。

教科書訂正

例@ EMP表からコミッション(歩合給)がNULLの・・・

基本構文

SELECT <選択リスト> FROM <表名>
WHERE <列名> IS  NULL

・列の値に何も入っていないことを「空」であるという。「空白」や「0(ゼロ)」は値であり、これらが入っている場合は「空」ではない。

・NULLに四則演算を行っても結果はNULLとなる。

・NULLかどうかを判断するには「IS NULL」句を使わないと何も表示されない


   SELECT  ename  FROM  emp  WHERE  comm  =  NULL;  ・・・何も表示されない

   SELECT  ename  FROM  emp  WHERE  comm  IS  NULL;  ・・・OK

 

4-5 否定「〜でないもの」を探す(NOT

選択条件を否定して「〜でないもの」を探すときNOTを使う。

基本構文

SELECT <選択リスト> FROM <表名>
WHERE NOT <条件>;

SELECT <選択リスト> FROM <表名>
WHERE <列名> IS NOT NULL;

比較条件文の前にNOTを付けることで条件の否定となる。ただし、IS NULL句の否定をする場合はIS NOT NULLとなるので要注意。

商品表

商品コード 商品名 分類 単価
10001 オラクルパラソル 雑貨 4000
10002 オラクルめざまし 雑貨 3000
10003 オラクルTシャツ白 衣類 1200
10004 オラクルTシャツ赤 衣類 1200
10005 オラクルクッキー 食品 850
10006 ハイディぬいぐるみ 玩具 3500

★BETWEEN句の例

単価が\1,000以上\3,000以下ではないものの商品名、単価を表示する。
(\1,000未満または\3,000より高いもの)
BETWEEN 1000 AND 3000      ・・・ 1000 <= 単価 <= 3000
NOT BETWEEN 1000 AND 3000  ・・・ 単価<1000 または 単価>3000

SELECT 商品名,単価 FROM 商品表
WHERE 単価 NOT BETWEEN 1000 AND 3000;

結果

商品名 単価
オラクルパラソル 4000
オラクルクッキー 850
ハイディぬいぐるみ 3500

★IN句の例

分類が衣類、雑貨以外の商品名、分類、単価を表示する。

SELECT 商品名,分類,単価 FROM 商品表
WHERE 分類 NOT IN (’衣類’,’雑貨’);

結果

商品名 分類 単価
オラクルクッキー 食品 850
ハイディぬいぐるみ 玩具 3500

 

★LIKE句の例

商品名に「Tシャツ」が含まれていない商品の商品名、分類、単価を表示する。

SELECT 商品名,分類,単価 FROM 商品表
WHERE 分類 NOT LIKE ’%Tシャツ%’;

結果

商品名 分類 単価
オラクルパラソル 雑貨 4000
オラクルめざまし 雑貨 3000
オラクルクッキー 食品 850
ハイディぬいぐるみ 玩具 3500

 

★IS NULL句の例

社員表より、備考がNULLでない社員の社員名、免許分類、備考を表示する。

SELECT 社員名,免許分類,備考 FROM 社員表
WHERE 備考 IS NOT NULL;

※NOTの位置に注意!

社員表

社員コード 社員名 免許分類 備考
10001 安藤 巧 普通・自二 眼鏡等
10002 渡邉 学 普通・自二  
10003 清水 義徳 小型特殊  
10004 山田 栄二 普通 眼鏡等
10005 薮木 潤一 自二 眼鏡等
10006 仁池 麻衣子 普通  

結果

社員名 免許分類 備考
安藤 巧 普通・自二 眼鏡等
山田 栄二 普通 眼鏡等
薮木 潤一 自二 眼鏡等

 

4-6 複合条件(AND OR

複数の条件を指定して検索を行いたい場合にAND ORを使う。

基本構文

SELECT <選択リスト> FROM <表名>
WHERE <条件1> 論理演算子 <条件2> 論理演算子 <条件3> ・・・ ;

・複数の条件を指定する場合は論理演算子の優先順位に注意しよう!

優先度1 NOT
優先度2 AND
優先度3 OR

( )を利用することで優先度を変えることができる。( )の中身が最優先となる。

★記述例

SELECT ENAME FROM EMP
WHERE SAL>1500 AND JOB=’MANAGER’ OR JOB=’SALESMAN’;

上記SQLで表示されるのは次の@Aどちらかの条件を満たすレコード。
@給与(SAL)が1500より多いMANAGER
ASALESMAN

SELECT ENAME FROM EMP
WHERE SAL>1500 AND JOB=’MANAGER’ OR JOB=’SALESMAN’

上記SQLで表示されるのは次の@Aどちらかの条件を満たすレコード。
@給与(SAL)が1500より多いMANAGER
A給与(SAL)が1500より多いSALESMAN

( )内の演算が最優先です。( )が多重化されている場合は内側の( )ほど優先順位が上です。また、同順位の場合は左から演算が行われます。

 

4-7 結果の順序を並び替える(ORDER BY

結果を表示する際に、指定した順序で並べ替えを行う場合ORDER BY句を使う。

基本構文

SELECT <選択リスト> FROM <表名> [ WHERE <条件> ]
ORDER BY <列名1> [ ,<列名2>,・・・] [DESC]

(例)
SELECT EMPNO,ENAME,SAL FROM EMP
WHERE SAL > 1200
ORDER BY SAL DESC

EMP表からSALが1200より多い社員のEMPNO、ENAME、SALをSALの多い順に表示する。

DESC=DESCENDING=降順=多い順です。PL/SQLコマンドのDESC(DESCRIBE)とは全く違うので注意しましょう
※DESCを指定しない場合は昇順=小さい順=ASC=ASCENDINGとなります。省略時はASCを指定したのと同じ扱いです。

・ORDER BY句には並べ替えの対象となる列を指定します。表示しない列で並べ替えを行うこともできます。

(例)
SELECT ENAME,SAL FROM EMP
ORDER BY EMPNO

EMPNOの昇順で並べ替えを行うが、表示するのはENAME,SAL列である。

・ORDER BY句の列指定は、列名だけでなく、列番号、列見出しでも指定できます。

(列番号で並べ替えの例)

SELECT EMPNO,ENAME,SAL + COMM FROM EMP
ORDER BY 3

選択列リストの3番目の列(SAL + COMM)で並べ替えを行います。
表の3番目の列ではないことに注意しましょう!

(列見出しで並べ替えの例)

SELECT EMPNO,ENAME,SAL + COMM TOTAL FROM EMP
ORDER BY TOTAL

SAL + COMMの列見出しであるTOTALで並べ替えを行います。

 

4-8 置換変数を利用する(

SQL文入力時でなく実行時に値をキーボードから指定する場合、置換変数(&)を使う。

使い方の例

SELECT * FROM EMP
WHERE DEPTNO = &部門番号

SQL文が実行されるときに部門番号を入力します。

(SQL*Plusでの実行例)

SELECT * FROM EMP
WHERE DEPTNO = &部門番号;
部門番号に値を入力してください:20
旧 2:WHERE DEPTNO = &部門番号
新 2:WHERE DEPTNO = 20

・文字列、日付型の入力をする場合は、入力する値を「’」で囲むか、&変数名を「’」で囲みます。

(入力値を「’」で囲む例)

SELECT * FROM EMP
WHERE HIREDATE <= &入社日;
入社日に値を入力してください:’98-10-26’
旧 2: WHERE HIREDATE <= &入社日
新 2: WHERE HIREDATE <= ’98-10-26’

(&変数名を「’」で囲む例)

SELECT * FROM EMP
WHERE HIREDATE <= &入社日
入社日に値を入力してください:98-10-26
旧 2: WHERE HIREDATE <= &入社日
新 2: WHERE HIREDATE <= ’98-10-26’

・SQL文を保存しておき、実行するたびに値を変えたい場合などに活用できます。

・&の後には入力する値がわかるような名前を付けましょう。(任意の名前がつけられます。)

・SELECT以外のSQL文でも利用できます。