MySQL の演算子と式に関する詳細な解説
演算子はSQLクエリの基礎であり、WHERE句のすべての条件はこれらに依存しています。
このレッスンでは、MySQLのすべての演算子とその使用例について、体系的に解説します。
graph TB
A[MySQL Operators] --> B[Arithmetic Operators<br/>+ - * / DIV %]
A --> C[Comparison Operators<br/>= != > < BETWEEN LIKE IN]
A --> D[Logical Operators<br/>AND OR NOT XOR]
A --> E[Bitwise operators<br/>& | ^ ~ << >>]
C --> C1[BETWEEN Scope]
C --> C2[IN List]
C --> C3[LIKE Blurred]
C --> C4[IS NULL Null value]
C --> C5[<=> Safety equals]
1. 学習内容
- 算術演算子(+−×÷)
- 比較演算子(=/>/</BETWEEN/LIKE/IN)
- 論理演算子(AND/OR/NOT)
- ビット演算子(&/|/^)
- 演算子の優先順位
2. ある報告書の裏にある実話
(1) 課題:フィルタ条件の誤入力
ある運用担当者が、「過去30日間の注文のうち、金額が100以上で、ステータスが『キャンセル』以外のも」を検索したいと考えています:
SQL
-- Incorrect Formulation
SELECT * FROM orders
WHERE order_date > '2026-06-03' AND amount > 100 AND status != 'cancelled';
-- Missed: status could be NULL
(2) 演算子の解法
SQL
-- Correct Way: Handle NULL
SELECT * FROM orders
WHERE order_date > DATE_SUB(CURDATE(), INTERVAL 30 DAY)
AND amount > 100
AND (status != 'cancelled' OR status IS NULL);
利点: NULL 値が除外されることがなく、正確なクエリ結果が保証されます。
3. 算術演算子
| 演算子 | 説明 | 例 |
|---|---|---|
+ |
加算 | SELECT 1 + 1; → 2 |
- |
引き算 | SELECT 5 - 3; → 2 |
* |
乗算 | SELECT 2 * 3; → 6 |
/ |
部門 | SELECT 10 / 3; → 3.3333 |
DIV |
整数の除算 | SELECT 10 DIV 3; → 3 |
% |
モジュラス | SELECT 10 % 3; → 1 |
MOD |
モジュラス | SELECT MOD(10, 3); → 1 |
▶ 例:算術演算
SQL
-- Calculate the total order amount
SELECT
product_name,
price,
quantity,
price * quantity AS total
FROM order_items;
-- Calculate the discounted price
SELECT
product_name,
original_price,
discount_rate,
original_price * (1 - discount_rate / 100) AS sale_price
FROM products;
出力:
TEXT
+--------------+-------+----------+-------+
| product_name | price | quantity | total |
+--------------+-------+----------+-------+
| iPhone | 999 | 2 | 1998 |
| MacBook | 1999 | 1 | 1999 |
+--------------+-------+----------+-------+
4. 比較演算子
| 演算子 | 説明 | 例 |
|---|---|---|
= |
は | WHERE id = 1 |
<> または != |
異なる | WHERE status != 'deleted' |
< |
未満 | WHERE age < 18 |
> |
より大きい | WHERE price > 100 |
<= |
以下 | WHERE score <= 60 |
>= |
以上 | WHERE amount >= 1000 |
| 範囲 | BETWEEN |
WHERE age BETWEEN 18 AND 30 |
IN |
リスト | WHERE status IN ('active', 'pending') |
LIKE |
あいまい検索 | WHERE name LIKE 'J%' |
IS NULL |
null | WHERE email IS NULL |
IS NOT NULL |
nullではない | WHERE email IS NOT NULL |
<=> |
安全= | NULL <=> NULL → 1 |
▶ 例:BETWEEN 範囲クエリ
SQL
-- Check prices between 100 and 500
SELECT * FROM products WHERE price BETWEEN 100 AND 500;
-- Equivalent to
SELECT * FROM products WHERE price >= 100 AND price <= 500;
-- Query orders within a specific date range
SELECT * FROM orders WHERE order_date BETWEEN '2026-01-01' AND '2026-06-30';
▶ 例:INリストのクエリ
SQL
-- Query Orders with a Specific Status
SELECT * FROM orders WHERE status IN ('pending', 'paid', 'shipped');
-- Equivalent to
SELECT * FROM orders WHERE status = 'pending' OR status = 'paid' OR status = 'shipped';
-- Search for employees in a specific department
SELECT * FROM employees WHERE department_id IN (1, 3, 5, 7);
▶ 例:LIKEによるあいまい検索
SQL
-- % Match any number of characters
SELECT * FROM users WHERE name LIKE 'J%'; -- Starts with J
SELECT * FROM users WHERE name LIKE '%son'; -- Ends with son
SELECT * FROM users WHERE name LIKE '%john%'; -- Contains john
-- _ Match a single character
SELECT * FROM users WHERE phone LIKE '138____1111'; -- Positions 4-7 can be any digit
-- ESCAPE Escape
SELECT * FROM files WHERE name LIKE '%\%%' ESCAPE '\\'; -- Contains %
▶ 例:NULL値の比較
SQL
-- NULL cannot be compared with =
SELECT * FROM users WHERE email = NULL; -- Wrong, returns null
SELECT * FROM users WHERE email IS NULL; -- Correct
-- NULL cannot be compared with !=
SELECT * FROM users WHERE email != NULL; -- Wrong
SELECT * FROM users WHERE email IS NOT NULL; -- Correct
-- Safe equals <=>
SELECT NULL = NULL; -- NULL (Uncertain)
SELECT NULL <=> NULL; -- 1 (Determines if equal)
5. 論理演算子
| 演算子 | 説明 | 例 |
|---|---|---|
AND |
論理AND | WHERE a = 1 AND b = 2 |
OR |
論理OR | WHERE a = 1 OR b = 2 |
NOT |
論理NOT | WHERE NOT (status = 'deleted') |
XOR |
排他的論理和 | WHERE a = 1 XOR b = 2 |
▶ 例:AND/ORの組み合わせ
SQL
-- AND: Both conditions must be met
SELECT * FROM employees
WHERE department = 'Engineering' AND salary > 8000;
-- OR: Meets any one of the conditions
SELECT * FROM employees
WHERE department = 'Sales' OR department = 'Marketing';
-- Combination: Note priority (AND > OR)
SELECT * FROM employees
WHERE (department = 'Sales' OR department = 'Marketing')
AND salary > 5000;
▶ 例:NOT(否定)
SQL
-- NOT IN
SELECT * FROM products WHERE category_id NOT IN (1, 2, 3);
-- NOT BETWEEN
SELECT * FROM orders WHERE amount NOT BETWEEN 100 AND 500;
-- NOT LIKE
SELECT * FROM users WHERE email NOT LIKE '%@test.com';
-- NOT EXISTS
SELECT * FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
6. ビット演算子
| 演算子 | 説明 | 例 |
|---|---|---|
& |
ビット単位のAND | SELECT 5 & 3; → 1 |
| |
ビット単位のOR | SELECT 5 | 3; → 7 |
^ |
ビット単位のXOR | SELECT 5 ^ 3; → 6 |
~ |
ビット単位のNOT | SELECT ~5; → -6 |
<< |
左シフト | SELECT 1 << 3; → 8 |
>> |
右シフト | SELECT 8 >> 2; → 2 |
▶ 例:ビット演算の応用
SQL
-- Permission system (Bit mask)
-- Read=1, Write=2, Execute=4
CREATE TABLE permissions (
user_id INT,
permission TINYINT
);
-- User has Read+Write permissions = 1|2 = 3
INSERT INTO permissions VALUES (1, 3);
-- Check for write permission (3 & 2 = 2, non-zero means "yes")
SELECT * FROM permissions WHERE permission & 2;
7. 演算子の優先順位
高い順から低い順に:
| 優先度 | 演算子 |
|---|---|
| 1 | ! (NOT) |
| 2 | -(負の符号)、~(ではない) |
| 3 | ^ (XOR) |
| 4 | *, /, DIV, %, MOD |
| 5 | +, - |
| 6 | <<, >> |
| 7 | & |
| 8 | | |
| 9 | =, <=>, <>, !=, <, <=, >, >=, LIKE, IN, BETWEEN |
| 10 | AND, && |
| 11 | OR, ||, XOR |
💡 ヒント: 優先順位がわからない場合は、角括弧
() を使って実行順序を指定してください。
❓ よくある質問
Q
= と <=> の違いは何ですか?A
= は NULL と比較すると NULL を返しますが、<=> は NULL と比較すると 1(等価であることを示す)を返します。<=> は MySQL 独自の安全な等価演算子です。Q LIKEとREGEXP、どちらが高速ですか?
A LIKEの方が高速です(インデックスを利用できるため)。一方、REGEXPは柔軟性が高いです(正規表現を使用するため)。単純な一致検索にはLIKEを使用してください。
Q ANDとORの優先順位はどのようになっていますか?
A ANDはORよりも優先順位が高くなります。
WHERE a=1 OR b=2 AND c=3はWHERE a=1 OR (b=2 AND c=3)と同等です。分かりやすくするために、括弧を使用することをお勧めします。Q NULL を含む演算の結果はどうなりますか?
A NULL を含む演算の結果はすべて NULL になります。
1 + NULL = NULL、'abc' || NULL = NULL。📖 まとめ
- 算術演算子は数値計算に使用されます:
+−×÷ DIV % - 比較演算子は、条件付きフィルタリングに使用されます:
= / != / < / > / BETWEEN / LIKE / IN / IS NULL - 論理演算子:条件の組み合わせ:
AND / OR / NOT / XOR - ビット演算子:2進数のビットに対して演算を行う:
& / | / ^ / ~ / << / >> - NULL:NULLを含む演算の結果はNULLとなります。比較を行う場合は、
IS NULLまたは<=>を使用してください。 - 優先順位が不明な場合は、括弧を使用する
📝 練習問題
-
基本問題(難易度 ⭐):販売価格が100から500の間で、在庫数が0より大きく、商品名に「phone」が含まれる商品を検索するクエリを作成してください。
-
上級問題(難易度 ⭐⭐):過去7日間の注文のうち、金額が200以上で、ステータスが「支払済み」または「発送済み」であり、顧客のメールアドレスが空でないものを抽出するクエリを作成してください。
-
課題(難易度:⭐⭐⭐):ビット演算を用いて、ユーザーの読み取り、書き込み、実行権限を保存・確認する権限管理システムを設計してください。



