404 Not Found

404 Not Found


nginx

MySQL の演算子と式に関する詳細な解説

演算子はSQLクエリの基礎であり、WHERE句のすべての条件はこれらに依存しています。

このレッスンでは、MySQLのすべての演算子とその使用例について、体系的に解説します。

100%
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. 学習内容


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=3WHERE a=1 OR (b=2 AND c=3)と同等です。分かりやすくするために、括弧を使用することをお勧めします。
Q NULL を含む演算の結果はどうなりますか?
A NULL を含む演算の結果はすべて NULL になります。1 + NULL = NULL'abc' || NULL = NULL

📖 まとめ


📝 練習問題

  1. 基本問題(難易度 ⭐):販売価格が100から500の間で、在庫数が0より大きく、商品名に「phone」が含まれる商品を検索するクエリを作成してください。

  2. 上級問題(難易度 ⭐⭐):過去7日間の注文のうち、金額が200以上で、ステータスが「支払済み」または「発送済み」であり、顧客のメールアドレスが空でないものを抽出するクエリを作成してください。

  3. 課題(難易度:⭐⭐⭐):ビット演算を用いて、ユーザーの読み取り、書き込み、実行権限を保存・確認する権限管理システムを設計してください。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%