WHERE 句を使用すると、SELECT の FROM 句から取得されるデータをフィルタリングできます。
WHERE 句がある場合は、その後に UInt8 型の式が続く必要があります。
この式が 0 と評価される行は、それ以降の変換処理や結果から除外されます。
WHERE 句に続く式では、多くの場合、比較 や 論理演算子、あるいは多数の通常の関数のいずれかが使用されます。
基盤となるテーブルエンジンが対応している場合、WHERE 式は索引やパーティションプルーニングを利用できるように評価されます。
PREWHERE
PREWHERE と呼ばれるフィルタリング最適化もあります。
Prewhere は、フィルタリングをより効率的に適用するための最適化です。
PREWHERE 句が明示的に指定されていない場合でも、これはデフォルトで有効になっています。NULL の判定
NULL かどうかを調べる必要がある場合は、次を使用します。
IS NULLまたはisNullIS NOT NULLまたはisNotNull
NULL を含む式は決して条件を通過しません。
論理演算子でデータを絞り込む
WHERE 句とあわせて次の論理関数を使用できます。
条件として UInt8 カラムを使用する
UInt8 カラムをブール条件として直接使用でき、0 は false、0 以外の値 (通常は 1) は true を表します。
その例を以下のセクションに示します。
比較演算子の使用
| 演算子 | 関数 | 説明 | 例 |
|---|---|---|---|
a = b | equals(a, b) | 等しい | price = 100 |
a == b | equals(a, b) | 等しい (別の構文) | price == 100 |
a != b | notEquals(a, b) | 等しくない | category != 'Electronics' |
a <> b | notEquals(a, b) | 等しくない (別の構文) | category <> 'Electronics' |
a < b | less(a, b) | より小さい | price < 200 |
a <= b | lessOrEquals(a, b) | 以下 | price <= 200 |
a > b | greater(a, b) | より大きい | price > 500 |
a >= b | greaterOrEquals(a, b) | 以上 | price >= 500 |
a LIKE s | like(a, b) | パターン照合 (大文字と小文字を区別) | name LIKE '%top%' |
a NOT LIKE s | notLike(a, b) | パターンに一致しない (大文字と小文字を区別) | name NOT LIKE '%top%' |
a ILIKE s | ilike(a, b) | パターン照合 (大文字と小文字を区別しない) | name ILIKE '%LAPTOP%' |
a BETWEEN b AND c | a >= b AND a <= c | 範囲チェック (両端を含む) | price BETWEEN 100 AND 500 |
a NOT BETWEEN b AND c | a < b OR a > c | 範囲外のチェック | price NOT BETWEEN 100 AND 500 |
パターンマッチングと条件式
WHERE句ではパターンマッチングと条件式も使用できます。
| 機能 | 構文 | 大文字と小文字の区別 | パフォーマンス | 適した用途 |
|---|---|---|---|---|
LIKE | col LIKE '%pattern%' | はい | 高速 | 大文字と小文字を区別するパターンマッチング |
ILIKE | col ILIKE '%pattern%' | いいえ | 低速 | 大文字と小文字を区別しない検索 |
if() | if(cond, a, b) | 該当なし | 高速 | 単純な二者択一条件 |
multiIf() | multiIf(c1, r1, c2, r2, def) | 該当なし | 高速 | 複数の条件 |
CASE | CASE WHEN ... THEN ... END | 該当なし | 高速 | SQL標準の条件ロジック |
リテラル、カラム、またはサブクエリを含む式
WHERE 句の後に続く式には、リテラル、カラム、またはサブクエリを含めることもできます。サブクエリは、条件で使用される値を返す、ネストされた SELECT ステートメントです。
| Type | Definition | Evaluation | Performance | Example |
|---|---|---|---|---|
| Literal | 固定の定数値 | クエリ記述時 | 最速 | WHERE price > 100 |
| Column | テーブルデータへの参照 | 行ごと | 高速 | WHERE price > cost |
| Subquery | ネストされた SELECT | クエリ実行時 | 状況による | WHERE id IN (SELECT ...) |
例
NULL の判定
NULL 値を含むクエリ:
論理演算子を使用したデータのフィルタリング
AND - 両方の条件を満たす必要があります:
OR - 少なくとも1つの条件が真である必要があります:
NOT - 条件を否定する:
XOR - ちょうど1つの条件だけが真である必要があります (両方は不可) :
AND, OR, NOT, XOR) は一般に読みやすいですが、複雑な式や動的なクエリを組み立てる場合には、関数構文が便利なこともあります。
UInt8カラムを条件として使用する
比較演算子の使用
= 1 または = true) :
= 0 または = false) :
!= 0 または != false) :
IN 演算子の使用:
以下の例では、(1, true) は Tuple 型です。