MariaDB講座 / WHERE・AND・OR・IN・BETWEEN・LIKEで絞り込む

WHEREは、条件が真になる行だけを結果に含めます。AND・OR、IN、BETWEEN、LIKEを使うときは、括弧、境界、ワイルドカードとNULLの扱いを確認して意図した行を選びます。

出力列と対象条件を分ける

SELECT product_nameは表示する列、WHERE price >= 8000は対象行です。偽だけでなく未知のNULLもWHEREを通りません。数値は適切な数値、文字は引用符で囲んだ文字列と比較し、不必要な暗黙変換を避けます。

ANDは両方、ORはどちらか、INは値の一覧、BETWEENは両端を含む範囲です。LIKEは文字列の模様を表します。NULLの条件、順序と件数は別の基準として組み合わせます。

比較用データを作る

SQLファイルの実行方法でcourse_userとして学習サーバーへ接続し、SELECT VERSION(), DATABASE();とSHOW TABLES;で対象を確認します。通常例はUTF-8の.sqlファイルで実行できます。同名の実習表がある場合は定義と行を調べ、必要なデータを保存してから判断します。既存のアプリケーション表を置き換えません。

USE shopcourse;
CREATE TABLE products_15_lab (
  product_id INT NOT NULL AUTO_INCREMENT,
  product_name VARCHAR(100) NOT NULL,
  category VARCHAR(30) NOT NULL,
  price DECIMAL(10,2) NOT NULL,
  stock INT NOT NULL DEFAULT 0,
  note VARCHAR(100) NULL DEFAULT NULL,
  PRIMARY KEY (product_id),
  CONSTRAINT ck_p15_price CHECK (price >= 0),
  CONSTRAINT ck_p15_stock CHECK (stock >= 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO products_15_lab
  (product_id, product_name, category, price, stock, note)
VALUES (1, '노트', '문구', 3500.00, 20, NULL),
  (2, '볼펜', '문구', 1500.00, 0, ''),
  (3, '머그컵', '생활', 8000.00, 12, '선물 포장'),
  (4, '스탠드', '생활', 25000.00, 5, NULL),
  (5, '파일', '문구', 1500.00, 50, ''),
  (6, '케이블', '전자', 8000.00, 0, '호환 확인');

SQLの文字列はUTF-8実習の条件をそろえるため、原文の韓国語サンプルを維持しています。ID1~6はノート、ペン、マグカップ、スタンドライト、ファイル、ケーブルです。分類は文具・生活用品・電子用品で、結果はIDと数値を基準に照合できます。ファイルはUTF-8、接続もutf8mb4を使ってください。

文具はID1・2・5、生活用品は3・4、電子用品は6で、在庫0は2・6です。固定したデータで条件を一つずつ変えます。

境界と括弧を比較する

8000を含む比較です。

SELECT product_id, product_name, price FROM products_15_lab
WHERE price >= 8000 ORDER BY product_id;

ID3・4・6が返り、>=だけを>に変えるとID4だけになります。比較したら元へ戻します。次は括弧の有無だけを比べます。

SELECT product_id FROM products_15_lab
WHERE (category = '문구' OR category = '생활') AND stock > 0
ORDER BY product_id;
SELECT product_id FROM products_15_lab
WHERE category = '문구' OR category = '생활' AND stock > 0
ORDER BY product_id;

括弧付きは1・3・4・5です。括弧なしはANDが先に結び付き、在庫0の文具ID2も入ります。「文具または生活用品で、かつ在庫あり」という意図は括弧で明示します。

INとBETWEENの範囲を確認する

次を実行します。

SELECT product_id FROM products_15_lab
WHERE category IN ('문구', '전자') ORDER BY product_id;
SELECT product_id FROM products_15_lab
WHERE price BETWEEN 1500 AND 8000 ORDER BY product_id;

INは1・2・5・6、BETWEENは1・2・3・5・6です。1500と8000の両方を含みます。日時では終了日の00時を上端にするとその日の残りを除外するため、日付の期間条件のように開始以上・翌境界未満も検討します。

LIKEとNULLの違いを確認する

パターン検索の例です。%は0文字以上、_は一文字のワイルドカードで、文字そのものを探す場合とは区別します。

SELECT product_id, product_name FROM products_15_lab
WHERE product_name LIKE '%컵%' ORDER BY product_id;
SELECT product_id, product_name FROM products_15_lab
WHERE product_name LIKE '__' ORDER BY product_id;

最初はマグカップのID3、二文字のパターンはID1・2・5が対象です。%という記号自体を探す場合はエスケープを明示します。

SELECT '진행률 10%' LIKE '%!%%' ESCAPE '!' AS has_percent;

has_percentは1です。!をエスケープ文字とし、!%がリテラルの%を意味します。文字比較は照合順序の影響も受けます。結果が想定外なら主キーと各条件を表示し、括弧、境界、NULL、引用符を分けて調べます。否定条件でも欠損行が自動で入るとは限りません。アプリケーションでは値を直接連結せずパラメーターを使います。

実習表だけを再作成する

やり直すときは、選択中のDB・実際の表定義・保存行を確認し、必要なものをバックアップします。削除してよいこの記事の実習表だけに次を実行します。DROP TABLEは定義と行を削除し、通常のROLLBACKでは戻せないため、トランザクションの実験とは分けます。

DROP TABLE shopcourse.products_15_lab;

関連する公式リファレンス