SELECT文 – 条件指定、各種演算子

条件指定、各種演算子


はじめに


SELECT文で、テーブルの情報を抽出できるようになりました。
ただいつも全レコードが出てきてしまいます。
SQL文でも、条件を指定することで、抽出したものを選定できます。
この章では、 必要な情報 を抜き出す方法を学んで行きましょう!

Step1: WHERE(条件)


条件を指定するには、WHERE句 を記述します。

SELECT xxxxx FROM xxxxx WHERE 列名 = 値

さて、ここで重要な事柄があります。
他のプログラミング言語と同様にDBにも データの型 があります。
各DBに特有の型もありますが、おおまかに以下が存在します。

  種類    データ型名
文字列型 CHAR、VARCHAR、VARCHAR2、・・・
数値型 NUMBER、NUMERIC、INT、DECIMAL、・・・
日付型 DATE、TIMESTAMP、・・・

DBによりデータ型名に相違があるため、ここでの詳細な記述はしません。
実際に使用するデータベースについて各自調べてみて下さい。

SQL文に数値型を記述する際は、そのまま数値を記述します。
文字列型の場合は ' シングルクォート で囲みます。
文字列型の数字などは、シングルクォートで囲まなくてもDB側で自動的に解釈して結果を返しますが、
データ型指定をきちんと行わないと後で不具合の原因になります。
テーブルが、どのようなデータ型で構成されているかをいつも意識するとよいでしょう。

Step2 : 演算子


条件はANDでつなげることで複数指定できます。
次のSELECT文では入社年度が1999年以前の総務部に在籍している社員名を抽出します。

SELECT name FROM staff
    WHERE entrance_year <= 1999 AND section = '総務部'

上記の例では3つの演算子が現れました。SQLでは以下の演算子が使えます。

   比較演算子    内容
= 等しい
> 大きい
< 小さい
>= 以上
<= 以下
<> または != 等しくない
   論理演算子    内容
AND かつ
OR または
NOT ではない

Step3 : IN演算子


それでは総務部か経理部の社員の名前と部署を抽出してみましょう。

SELECT name, section FROM staff
    WHERE section = '総務部' OR section = '経理部'

また、IN演算子を使って以下のように記述することもできます。

SELECT name, section FROM staff
    WHERE section IN('総務部', '経理部')

BETWEEN演算子


次は入社年度が1998年から2000年までの社員名を抽出してみましょう。

SELECT name FROM staff
    WHERE entrance_year >= 1998 AND entrance_year <= 2000

この場合は範囲を指定するBETWEEN演算子で書き換えることができます。

SELECT name FROM staff
    WHERE entrance_year BETWEEN 1998 AND 2000

LIKE演算子


「鈴木」という苗字の全社員情報が知りたいです。どうしましょう。

SELECT * FROM staff WHERE name = '鈴木'

と記述した結果、一件もヒットしませんでした。「’鈴木一郎’ = ‘鈴木’」ではないからです。
このような場合はLIKE演算子を使います。

SELECT * FROM staff WHERE name LIKE '鈴木%'

今度は表示されましたね。
「 % 」はワイルドカードと言って任意の文字列を表します。
任意の一文字を表すワイルドカードは「 _(アンダースコア) 」です。

SELECT * FROM staff WHERE id LIKE '000_'

ワイルドカードを使用した指定方法をパターンマッチ(ング)と言います。

IS NULL演算子


最後の演算子はNULLを判定する演算子です。 DBにもNULL値が存在します。
概念的には「値がない」か「未知な値」を意味します。 NULLに対して比較演算子は使えません
(比較を行なった場合、結果は全て偽になります)。

SELECT * FROM staff WHERE section = NULL

これではNULLを判定することはできません。IS NULL演算子を使用します。

SELECT * FROM staff WHERE section IS NULL

NOT(否定)


ここまでさまざまなパターンのWHERE文を紹介してきましたが、どれも NOT を付け加えると逆の結果になります。 実際に実行して、先の結果と比較してみましょう。

SELECT name FROM staff
    WHERE NOT(section = '総務部' OR section = '経理部')

SELECT name FROM staff
    WHERE section NOT IN('総務部', '経理部')

SELECT name FROM staff
    WHERE NOT(entrance_year >= 1998 AND entrance_year <= 2000)

SELECT name FROM staff
    WHERE entrance_year NOT BETWEEN 1998 AND 2000

SELECT * FROM staff WHERE name NOT LIKE '鈴木%'

SELECT * FROM staff WHERE id NOT LIKE '000_'

SELECT * FROM staff WHERE section IS NOT NULL

 (ここだけNOT IS NULLでないことに気をつけてください。英語の文法通りです。)

カテゴリー

アーカイブ

Close Bitnami banner
Bitnami