「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

データベースとSQL(14/20)

はじめに

 データ分析を行う場合、データの管理運用、蓄積も重要な論点となる。そのためにはSQLやデータベースの知識が求められる。そこでまずは

を基にSQLの勉強をしていく。

11. 述語

  • 述語とは「戻り値が真理値であるような関数」のことを指す。
  • \mathrm{LIKE}には3つの使い方がある。
  • \mathrm{BETWEEN}は3つの引数を持つ。
  • \mathrm{NULL}を選択するためには\mathrm{IS\ NULL}を用いる。
  • \mathrm{IN},\ \mathrm{EXISTS}

11.1 述語とは

 戻り値が真理値であるような関数述語という。すなわち述語は\mathrm{TRUE},\mathrm{FALSE},\mathrm{UNKNOWN}のいずれかを返す。

11.2 LIKE述語

 文字列の部分一致検索を行うには\mathrm{LIKE}述語を用いる。

-- LIKE述語
SELECT *
FROM ABC
WHERE ABC.CONDITON LIKE 'abc__' -- 「abc+任意の2文字」であるような値をABCテーブルのCONDITION列から抽出(=検索)される。

11.2 BETWEEN述語

 範囲検索を行うには\mathrm{BETWEEN}述語を用いる。

-- BETWEEN述語
SELECT *
FROM ABC
WHERE ABC.CONDTITION BETWEEN 'abc' AND 'cab' --'abc','abd',…,'caa','cab'のうち、指定した列に存在するものが抽出(=検索)される。
11.3 IS NULL/IS NOT NULL

 ある列が\mathrm{NULL}の行を選択するには、\mathrm{NULL}は通常の=が利用できないため、\mathrm{IS\ NULL}(イズ・ナル((ヌルはドイツ語読み。)))述語を扱う。逆に\mathrm{NULL}でない行を選択するには、\mathrm{IS\ NOT\ NULL}述語を扱う。

-- IS NULL/IS NOT NULL述語
SELECT *
FROM ABC
WHERE ABC.CONDITION2 IS NULL -- ABCテーブルのCONDITION2列内のNULLであるような行を抽出(=検索)する

SELECT *
FROM ABC
WHERE ABC.CONDITION2 IS NOT NULL -- ABCテーブルのCONDITION2列内のNULLであるような行を抽出(=検索)する

11.4 IN

 複数の検索値の少なくとも1つに合致するものを検索するには\mathrm{IN}述語を用いる。いずれにも合致しないものを扱うならば\mathrm{NOT\ IN}述語を用いる。検索対象値は()で囲む。ただし\mathrm{NULL}は検索できないため\mathrm{IS\ NULL}述語または\mathrm{IS\ NOT\ NULL}述語を扱う。

-- IN述語
SELECT *
FROM ABC
WHERE ABC.CONDITION3 IN ('abc','cde','efg') -- ABC.CONDITION3列がabc,cde,またはefgであるような行のみを検索する。

-- 上と同値:しかし、書きぶりが煩雑になる
SELECT *
FROM ABC
WHERE ABC.CONDITION3 = 'abc'
       OR ABC.CONDITION3 = 'cde'
       OR ABC.CONDITION3 = 'efg'
-- ABC.CONDITION3列がabc,cde,またはefgであるような行のみを検索する。

-- IN述語とNULLを併用する例
SELECT *
FROM ABC
WHERE ABC.CONDITION3 IN ('abc','cde','efg') -- ABC.CONDITION3列がabc,cde,またはefgであるような行のみを検索する。
       OR ABC.CONDITION3 IS NULL

 \mathrm{IN}はサブクエリと併用できる。

-- IN述語
SELECT A1.*
FROM A1
WHERE A1.id IN (SELECT A2.id
                            FROM A AS [A2] -- OracleではASを抜くこと:文法上誤りのため
                            WHERE A2.id = 'abc')

11.5 EXISTS述語

 「ある条件に合致するレコードの存在有無」を調べるには\mathrm{EXISTS}述語または\mathrm{NOT\ EXISTS}述語を用いる。\mathrm{EXISTS}述語は引数として常に(相関)サブクエリを取る。

SELECT P1.a, P1.b
FROM PRODUCT P1
WHERE EXISTS (SELECT *
                          FROM PRODUCT2 P2
                          WHERE P2.id = 'A1'
                              AND P2.product_id = 'B1')

 \mathrm{EXISTS}述語は\mathrm{IN}述語で代用できる場面が多い一方で、厳密には一致しない*1

*1:ただしここでは詳細を述べない。

プライバシーポリシー お問い合わせ