OracleBronze 3章

選択

SELECT文にWHERE句を指定すると、抽出対象を絞れます。
FROM句の後に指定がルールです。

SELECT [何を]
FROM  [どのテーブルから]
WHERE [条件] ;

WHERE句はどうやって書かれるのか、の構文は以下です。

WHERE 列名 比較演算子 {定数|値のリスト|式|列名}

いまいち意味わかんないでしょうが、まずは比較演算子を説明します。

比較演算子 説明
= 等しい
> , < 大きい、小さい
>= , <= 以上、以下
<> , != , ^= 等しくない
BETWEEN a AND b a以上b以下
IN(値1,値2…) 値のリストのいずれかに一致
LIKE 文字パターン一致
IS NULL 値がNULLの場合にTRUE

等号(=)とか

最も基本的な形といえますね。先程の基本形に当てはめてみると…。

WHERE 列名 比較演算子 {定数|値のリスト|式|列名;
WHERE ENAME = '佐藤'

佐藤はいいとして、’ ‘(シングルクォーテーション)はなんだ?ってことになりますよね。
WHERE句の条件で、文字や日付を指定する場合は’ ‘(シングルクォーテーション)で囲むというルールがあります。この時は大文字小文字が区別されるので注意してください。

あえて、>, <, <=, >=, <>, != などはやりませんが、ルールは同じようなものです。

BETWEEN

WHERE 列名 BETWEEN 下限値 AND 上限値

列値が下限値以上かつ上限値以下、がTRUEとなります。

WHERE 列名 NOT BETWEEN 下限値 AND 上限値

列値が下限値以下または上限値以上、がTRUEとなります。

かつがNOTでまたはになるし、AND使われてるし、でちょっとややこしいかもしれませんが、BETWEENを正しく理解していればなんてことはないでしょう。

IN

WHERE 列名 IN( 値1, 値2,… )

列値が指定した値のいずれかと一致、がTRUEとなります。

WHERE 列名 NOT IN( 値1, 値2,… )

列値が指定した値の全てと一致しない、がTRUEとなります。

LIKE

WHERE 列名 LIKE '文字パターン'

列値が指定した文字パターンと一致したものを抽出できます。
文字パターンは、以下のワイルドカードを使えます。

ワイルドカード 説明
% 0文字以上の任意の文字と一致する
_ 任意の一文字と一致する

ワイルドカードについては、LPICでやっているので詳しくは割愛します。
使っている記号は違いますが、内容はよく見るやつです。

LIKEにもNOTがあります。

WHERE 列名 NOT LIKE '文字パターン'

列値が指定した文字パターンと一致しないものを抽出できます。

IS NULL

WHERE 列名 IS NULL
WHERE 列名 IS NOT NULL

列にNULL値が含まれる場合、TRUEとなります。
NOTは、列に値が格納されている場合、TRUEとなります。

NULL値の検索は等号(=)ではできず、IS NULLでしか出来ません。

 

論理演算子

WHERE句の中に論理演算子(AND、OR、NOT)を使用できます。

論理演算子 説明
AND 前後の条件がどちらもTRUEの場合、TRUE
OR 前後の条件のどちらかTRUEの場合、TRUE
NOT 後ろに指定された条件がFALSEの場合、TRUE
WHERE 条件1 AND 条件2
WHERE 条件1 OR 条件2
WHERE NOT 条件

想像通りですよね。

 

ソート

ソートつまり並べ替えをした状態でデータ抽出したいときは、ORDER BYを使います。

SELECT 列名
FROM  テーブル名
WHERE [条件] 
ORDER BY 列名 ;

WHERE句の後ろ、一番最後に記載します。
この場合は、指定列のデータが昇順(小さい順)で表示されます。
降順(大きい順)で表示したい場合は、DESCを付けます。

SELECT 列名
FROM  テーブル名
WHERE [条件] 
ORDER BY 列名 DESC;

昇順がデフォルトですが、ASCが省略されていると思ってください。
勿論、明示することも可能です。

この時、ORDER BYをした時にデータにNULLがあるとOracleでは大きな数値扱いを受けるのですが、MySQLではどうでしょうか?
確認しておきましょう。

複数列をORDER BYすることも出来ます。
その時は、列名1が最初にソートされ、その中で列名2がソートされます。
列名2だけ降順で表示したい場合はその列名にDESCすることもできます。

SELECT 列名
FROM  テーブル名
WHERE [条件] 
ORDER BY 列名1, 列名2 DESC ;

 

以下をやっておきましょう。

・EMPLOYEESから、DEPTNOが30のレコードのみ抽出
・EMPLOYEESから、ENAMEが田中のレコードのみ抽出
・EMPLOYEESから、SALが300,000以下のレコードのみ抽出
・EMPLOYEESから、SALが350,000より大きいレコードのみ抽出
・EMPLOYEESから、年収が2,000,000以上のレコードのみ抽出
・EMPLOYEESから、営業職以外のレコードを抽出
・EMPLOYEESから、給与が200,000以上300,000以下のレコードを抽出
・EMPLOYEESから、DEPTNOが20もしくは30のレコードを抽出
・EMPLOYEESから、社長もしくは部長のレコードをワイルドカードを使って抽出
・EMPLOYEESから、EMPNOの下一桁が1の社員ををワイルドカードを使って抽出
・EMPLOYEESから、DEPTNOが30、且つ給与が300,000以上のレコードを抽出
・EMPLOYEESから、DEPTNOが30、もしくは給与が300,000以上のレコードを抽出
・EMPLOYEESから、ENAMEが佐藤ではないレコードをNOTを使って抽出 
・EMPLOYEESから、給与で降順にソートしたレコードを抽出
・EMPLOYEESから、COMM(歩合給)を低い順にソートしたレコードを抽出
・EMPLOYEESから、DEPTNOが30で入社日順にレコードを抽出
・EMPLOYEESから、DEPTNOでソートし同じDEPTNOの場合は給与でソートしレコードを抽出