選択
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の場合は給与でソートしレコードを抽出