LIKE は、テキストがパターンに一致するかどうかを判定します。% は任意の長さの文字列、_ はちょうど1文字を表します。あるテキストを含む値、で始まる値、で終わる値を探すときに使います。例は PostgreSQL、MySQL、SQLite、SQL Server で動作します。
LIKE の使い方
LIKE は値をパターンと比較します。パターンは値全体に一致する必要があり、隙間を埋めるために2つのワイルドカードを使います。% は任意の数の文字(0文字を含む)に、_ はちょうど1文字に一致します。NOT LIKE はその逆を返します。
expression [NOT] LIKE pattern [ESCAPE escape_character]
-- In SQL Server, LIKE only works in a condition, such as a WHERE clause
SELECT 'Joe Bloggs' LIKE 'Jo%';
-- Output: true
SELECT 'Joe Bloggs' LIKE 'J_e%';
-- Output: true
SELECT 'Joe Bloggs' LIKE 'Bloggs';
-- Output: false
最後の例が false になるのは、ワイルドカードがない場合、パターンが値全体と等しくなければならないからです。クエリでは、LIKE は通常 WHERE 句に書きます。
-- Input: customers
-- id | name
-- ---+-------------
-- 1 | Joe Bloggs
-- 2 | Jane Doe
-- 3 | Joanna Smith
-- 4 | Bob Jones
SELECT name
FROM customers
WHERE name LIKE 'Jo%';
-- Output:
-- name
-- ------------
-- Joe Bloggs
-- Joanna Smith
知っておくべきルール
-
PostgreSQL の LIKE は大文字と小文字を区別します。他のデータベースはデフォルトで大文字・小文字を区別しませんが、PostgreSQL では
'Smith' LIKE 'smith'は false になります。区別したくない場合は、LOWER(name) LIKE '%smith%'のように両辺を小文字にしてください。 -
NULL は決して一致しません。
NULL LIKE '%'は true ではなく NULL になるため、列が NULL の行は LIKE でも NOT LIKE でも除外されます。それらの行も含めたい場合はOR column IS NULLを追加してください。
SELECT NULL LIKE '%';
-- Output: NULL
-
%や_を文字どおりに一致させるにはエスケープします。ワイルドカードの前にエスケープ文字を置き、ESCAPEでその文字を指定します。
-- Input: discounts
-- id | description
-- ---+---------------------
-- 1 | 50% off winter coats
-- 2 | Spend 50, save 10
-- 3 | Up to 25% off shoes
-- Without escaping, the % after 50 is a wildcard
SELECT * FROM discounts
WHERE description LIKE '%50%%';
-- Output:
-- id | description
-- ---+---------------------
-- 1 | 50% off winter coats
-- 2 | Spend 50, save 10
-- With ESCAPE '\', the \% matches a real percent sign
-- (in MySQL, write ESCAPE '\\': a single backslash escapes the quote)
SELECT * FROM discounts
WHERE description LIKE '%50\%%' ESCAPE '\';
-- Output:
-- id | description
-- ---+---------------------
-- 1 | 50% off winter coats
-
先頭の
%ではインデックスが使えません。LIKE 'INV-2026-%'のような前方一致検索は列のインデックスを使えますが、LIKE '%widget%'はすべての行を調べる必要があります。大量のテキストから単語を検索するなら、代わりにデータベースの全文検索を使ってください。
代替構文
データベース固有の次のような拡張もよく見かけます。
-- PostgreSQL: ILIKE ignores case
SELECT 'SMITH' ILIKE 'smith';
-- Output: true
-- SQL Server: [ ] in a LIKE pattern matches one character from a set or range
SELECT CASE WHEN 'B12' LIKE '[A-C]%' THEN 'match' ELSE 'no match' END;
-- Output: match
-- MySQL: REGEXP for regular expressions (PostgreSQL uses ~)
SELECT 'A12-345' REGEXP '^A[0-9]{2}-[0-9]{3}$';
-- Output: 1
パターンを使わずに、テキストが固定の文字列を含むかどうかを調べるには、その位置を求めます。文字列が含まれない場合、結果は 0 になります。
SELECT INSTR('FinTech Corp', 'Tech');
-- Output: 4
-- PostgreSQL: POSITION('Tech' IN 'FinTech Corp')
-- SQL Server: CHARINDEX('Tech', 'FinTech Corp')
SQL Server の CONTAINS() は部分文字列の判定ではありません。全文インデックスを必要とする全文検索の述語です。
LIKE はいつ使うべきか?
値の一部はわかっているけれど全体はわからない、というときに LIKE を使います。ほとんどの用途は次の4つのいずれかに当てはまります。
単語を含むテキストを探す
単語の両側に % を付けます。'%Tech%' は長い単語の中にも一致するため、「Tech Solutions Inc」「FinTech Corp」「Technology Partners」のいずれにも一致します。
値の先頭または末尾に一致させる
前方一致には 'INV-2026-%' のように末尾だけに、後方一致には '%.pdf' や '%@gmail.com' のように先頭だけに % を付けます。インデックスで高速化できるのは前方一致検索です。
固定の形式に一致させる
_ はちょうど1文字を表すので、パターンで値の形を表現できます。電話番号なら '___-___-____'、製品コードなら 'A__-___' です。NOT LIKE を使えば、同じパターンで形式に合わない値を見つけられます。
大文字・小文字を気にせず検索する
ユーザーは「smith」と入力しても、データは「Smith」かもしれません。LOWER() で両辺を小文字にすれば、PostgreSQL でも大文字・小文字を区別せずに検索できます。
LIKE の実例
複数の単語のいずれかを検索する
OR でパターンを組み合わせると、いずれかに一致する製品を探せます。
-- Input: products
-- id | name
-- ---+-----------------
-- 1 | Gaming laptop
-- 2 | Spiral notebook
-- 3 | Desk lamp
-- 4 | Desktop computer
SELECT * FROM products
WHERE name LIKE '%laptop%'
OR name LIKE '%notebook%'
OR name LIKE '%computer%';
-- Output:
-- id | name
-- ---+-----------------
-- 1 | Gaming laptop
-- 2 | Spiral notebook
-- 4 | Desktop computer
今年の請求書を探す
請求書番号は種別と年で始まるため、前方一致パターンで2026年の請求書を抽出し、クレジットノートを除外できます。
-- Input: invoices
-- invoice_no | customer
-- --------------+----------
-- INV-2026-0012 | Northwind
-- INV-2025-0981 | Contoso
-- CN-2026-0003 | Northwind
-- INV-2026-0040 | Fabrikam
SELECT * FROM invoices
WHERE invoice_no LIKE 'INV-2026-%';
-- Output:
-- invoice_no | customer
-- --------------+----------
-- INV-2026-0012 | Northwind
-- INV-2026-0040 | Fabrikam
形式が誤っている電話番号を探す
1文字ごとに _ を1つ使って期待する形式を表し、NOT LIKE で修正が必要な行を一覧にします。
-- Input: customers
-- name | phone
-- ----------+---------------
-- Ana Lima | 555-010-1234
-- Ben Ode | (555) 010-9876
-- Cara Diaz | 5550104321
-- Dev Rao | 555-010-5555
SELECT name, phone FROM customers
WHERE phone NOT LIKE '___-___-____';
-- Output:
-- name | phone
-- ----------+---------------
-- Ben Ode | (555) 010-9876
-- Cara Diaz | 5550104321
大文字・小文字を問わず姓を探す
両辺を小文字にすれば、大文字や小文字で入力された名前も見つかります。
-- Input: customers
-- id | name
-- ---+------------
-- 1 | Anna Smith
-- 2 | BEN SMITH
-- 3 | Dana Jones
-- 4 | carla smith
SELECT * FROM customers
WHERE LOWER(name) LIKE '%smith%';
-- Output:
-- id | name
-- ---+------------
-- 1 | Anna Smith
-- 2 | BEN SMITH
-- 4 | carla smith
LIKE についてさらに学ぶ
このブログの記事:
- SQL SUBSTRING ガイド: 見つけた文字列の一部を抽出する
- SQL 不等号ガイド: NOT LIKE と、行を除外するその他の方法
- SQL CASE 文ガイド: LIKE パターンを含む条件で行にラベルを付ける
- PostgreSQL でのインデックス作成: 前方一致検索を高速にするインデックス
- MySQL CREATE INDEX チュートリアル: MySQL の場合
公式ドキュメント:
Beekeeper Studioは無料のオープンソースのデータベースGUIです
これまで使った中で最高のSQLクエリ&エディタツールです。データベースの管理に必要なものがすべて揃っています。 - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studioは高速で直感的、そして使いやすいツールです。多数のデータベースに対応し、Windows、Mac、Linuxで快適に動作します。
Beekeeper Studio 利用者の声
「Beekeeper Studio は以前の SQL ワークフローを完全に置き換えてくれました。高速で直感的で、データベース作業がまた楽しくなりました。」
「多くのデータベース GUI を試しましたが、Beekeeper は機能とシンプルさのバランスが絶妙です。とにかくちゃんと動きます。」