LoginSignup
2

More than 3 years have passed since last update.

【SQL】絞り込み条件:対象レコードをどのように絞り込むか(各種演算子, IN, LIKE, AND, OR, NOT)

Last updated at Posted at 2020-03-24

はじめに

SQLはデータベースを操作するためのプログラムです。
プログラムをどのように分解するかは賛否あると思いますが、
ここでは以下の4つに分類して基本の構文をまとめます。

このページでは絞り込み条件の基本構文をまとめます。
絞り込みの条件には「演算子」「複数指定」「曖昧検索」「条件結合」「条件否定」などがあります。
基本的にWHERE句の中で使います。

例として、こちらに掲載しているテーブルを使って、各条件の動きを解説します。

演算子

演算子を使って条件を指定する方法です。

演算子 意味
= 等しい
<> 等しくない
< 左辺が右辺より小さい
> 左辺が右辺より大きい
<= 左辺が右辺以下
>= 左辺が右辺以上
Operator
SELECT * FROM MEMBER_LIST_2ND
   WHERE STATUS_ID = '2'

STATUS_IDが「2」のものだけ抽出されるので、実行結果は1レコードのみです。
*2をシングルクォーテーションで囲っていますが、仮にSTATUS_IDが数値型なら囲っても囲わなくても同じ結果を得られます。

ID FAMIRY_NAME FIRST_NAME BIRTH_DAY GENDER STATUS_ID NOTE
0002 山田 太郎 1981/3/1 M 2

複数指定(IN)

演算子の"="は一致する値を1つしか指定することはできませんが、INを使うことで複数指定することができます。

IN
SELECT * FROM MEMBER_LIST_1ST
   WHERE ID IN ('0001', '0003')

IDが"0001","0003"のデータを抽出することができるので、実行結果は2レコードが抽出されます。

ID FAMIRY_NAME FIRST_NAME BIRTH_DAY GENDER STATUS_ID NOTE
0001 鈴木 太郎 1980/10/25 M 1
0003 佐藤 長次郎 1980/4/2 M 1

曖昧検索(LIKE)

特定の語句を含むデータを検索することができます。
LIKEの十件に指定できるのは2つあり、
"%"が0文字以上の任意の文字列でいわゆるワイルドカード、
"_"は1文字の任意の文字となります。

LIKE
SELECT * FROM MEMBER_LIST_2ND
   WHERE FIRST_NAME LIKE '%朗%'

この結果は名前に「朗」を含む3レコード

ID FAMIRY_NAME FIRST_NAME BIRTH_DAY GENDER STATUS_ID NOTE
0001 鈴木 太郎 1980/10/25 M 1
0002 山田 太郎 1981/3/1 M 2
0003 佐藤 長次郎 1980/4/2 M 1
LIKE_2
SELECT * FROM MEMBER_LIST_2ND
   WHERE FAMIRY_NAME LIKE '_朗'

この場合は"_"が一文字分しか表さないため、「長次郎」さんは抽出されなくなり、2レコードのみとなります。

ID FAMIRY_NAME FIRST_NAME BIRTH_DAY GENDER STATUS_ID NOTE
0001 鈴木 太郎 1980/10/25 M 1
0002 山田 太郎 1981/3/1 M 2

条件結合(AND, OR)

複数の条件を検証する方法になります。

AND
SELECT * FROM MEMBER_LIST_2ND
   WHERE GENDER= 'M'
   AND STATUS_ID = '2'

「GENDERがM」かつ「STATUS_IDが2」なので1レコードのみ抽出されます。

ID FAMIRY_NAME FIRST_NAME BIRTH_DAY GENDER STATUS_ID NOTE
0002 山田 太郎 1981/3/1 M 2
OR
SELECT * FROM MEMBER_LIST_2ND
   WHERE GENDER= 'F'
   OR STATUS_ID = '1'

「GENDERがF」または「STATUS_IDが1」なので4レコードが抽出されます。

ID FAMIRY_NAME FIRST_NAME BIRTH_DAY GENDER STATUS_ID NOTE
0001 鈴木 太郎 1980/10/25 M 1
0003 佐藤 長次郎 1980/4/2 M 1
0004 鈴木 定子 1980/8/2 F 1
0005 鈴本 花子 1980/12/14 F 1

条件否定(NOT)

これまで記載してきた条件を否定の意味に変えるNOT条件です。

NOT
SELECT * FROM MEMBER_LIST_2ND
   WHERE ID NOT IN ('0001', '0004')

IDが"0001","0004"以外のデータになるため、3レコード抽出されます。

ID FAMIRY_NAME FIRST_NAME BIRTH_DAY GENDER STATUS_ID NOTE
0002 山田 太郎 1981/3/1 M 2
0003 佐藤 長次郎 1980/4/2 M 1
0005 鈴本 花子 1980/12/14 F 1
NOT_2
SELECT * FROM MEMBER_LIST_2ND
   WHERE STATUS_ID = '1'
   AND NOT( GENDER= 'M'
      OR FAMILY_NAME LIKE '_木')

「STATUSが"1"」かつ「GENDERがMまたは姓が"?木"」ではないので、1レコードのみ抽出されます。

ID FAMIRY_NAME FIRST_NAME BIRTH_DAY GENDER STATUS_ID NOTE
0005 鈴本 花子 1980/12/14 F 1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2