MySQL 運算符實戰:9 道經典練習題解析
運算符是 MySQL 查詢的 “靈魂”,靈活運用各類運算符能讓數據篩選更加精準高效。本文通過 9 道實戰練習題,詳解邏輯運算符、比較運算符及模糊匹配的用法,幫你快速掌握運算符的核心應用場景。
一、范圍查詢:NOT BETWEEN 與 OR 的靈活運用
題目 1:選擇工資不在 5000 到 12000 的員工的姓名和工資
解決方案
-- 方法1:使用OR邏輯運算符
SELECT last_name, salary
FROM employees
WHERE salary < 5000 OR salary > 12000;-- 方法2:使用NOT BETWEEN(更簡潔)
SELECT last_name, salary
FROM employees
WHERE salary NOT BETWEEN 5000 AND 12000;
知識點解析
-
BETWEEN AND:表示閉區間范圍(包含邊界值),salary BETWEEN 5000 AND 12000 等價于 salary >= 5000 AND salary <= 12000;
-
NOT 取反:NOT BETWEEN 直接排除范圍內的數據,比 OR 更簡潔,可讀性更高;
-
適用場景:連續范圍的反向篩選,優先用 NOT BETWEEN。
二、集合查詢:IN 與 OR 的效率對比
題目 2:選擇在 20 或 50 號部門工作的員工姓名和部門號
解決方案
-- 方法1:使用OR邏輯運算符
SELECT last_name, department_id
FROM employees
WHERE department_id = 20 OR department_id = 50;-- 方法2:使用IN集合運算符(推薦)
SELECT last_name, department_id
FROM employees
WHERE department_id IN (20, 50);
知識點解析
-
IN 運算符:用于匹配離散的多個值,IN (20,50) 等價于 =20 OR =50,但代碼更簡潔;
-
性能優勢:當集合元素較多(如 10 個以上),IN 的執行效率通常高于多個 OR 拼接;
-
注意:IN 列表中若包含 NULL,不會影響非 NULL 值的匹配,但結果可能包含 NULL。
三、NULL 值處理:IS NULL 與 IS NOT NULL
題目 3:選擇公司中沒有管理者的員工姓名及 job_id
解決方案
SELECT last_name, job_id
FROM employees
WHERE manager_id IS NULL;
題目 4:選擇公司中有獎金的員工姓名、工資和獎金級別
解決方案
SELECT last_name, salary, commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;
知識點解析
-
NULL 的特殊性:NULL 表示 “未知值”,不能用 = 或 != 判斷,必須用 IS NULL(為空)或 IS NOT NULL(非空);
-
應用場景:判斷字段是否未填寫(如管理者 ID、獎金比例),避免因 NULL 導致的篩選遺漏;
-
注意:IFNULL(commission_pct, 0) 可將 NULL 轉換為 0(如計算年薪時),但篩選時仍需用 IS NOT NULL。
四、模糊匹配:LIKE 通配符的精準用法
題目 5:選擇員工姓名的第三個字母是 a 的員工姓名
解決方案
SELECT last_name
FROM employees
WHERE last_name LIKE '__a%';
解析
-
LIKE 通配符:_ 匹配單個任意字符,% 匹配 0 個或多個任意字符;
-
模式說明:a% 表示前兩個字符任意,第三個字符為a,后續字符不限( 對應兩個位置)。
題目 6:選擇姓名中有字母 a 和 k 的員工姓名
解決方案
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%k%' OR last_name LIKE '%k%a%';
解析
-
多條件模糊匹配:需考慮兩種順序(a在前k在后或k在前a在后),用 OR 連接;
-
注意:% 可匹配任意長度字符(包括 0),確保不遺漏包含兩個字符的所有情況。
題目 7:顯示表 employees 中 first_name 以 ‘e’ 結尾的員工信息
解決方案
-- 方法1:使用LIKE
SELECT employee_id, first_name, last_name
FROM employees
WHERE first_name LIKE '%e';-- 方法2:使用REGEXP正則(更靈活)
SELECT employee_id, first_name, last_name
FROM employees
WHERE first_name REGEXP 'e$';
解析
-
結尾匹配:%e 表示以e結尾(LIKE),e$ 表示以e結尾(REGEXP正則);
-
REGEXP 優勢:支持更復雜的模式(如多字符結尾),適合高級字符串匹配。
五、區間與集合綜合運用
題目 8:顯示表 employees 部門編號在 80-100 之間的姓名、工種
解決方案
SELECT last_name, job_id
FROM employees
WHERE department_id BETWEEN 80 AND 100;
解析
-
連續區間優選 BETWEEN:BETWEEN 80 AND 100 等價于 >=80 AND <=100,代碼更簡潔;
-
注意:區間包含邊界值(80 和 100),若需排除邊界需用 > 和 <。
題目 9:顯示表 employees 的 manager_id 是 100、101、110 的員工姓名、工資、管理者 id
解決方案
SELECT last_name, salary, manager_id
FROM employees
WHERE manager_id IN (100, 101, 110);
解析
-
離散值集合用 IN:IN (100,101,110) 清晰表達 “屬于指定集合”,比 =100 OR =101 OR =110 更易讀;
-
擴展:若集合元素來自子查詢,可寫成 IN (SELECT …),實現動態匹配。
總結:運算符核心用法速查表
運算符 / 語法 | 作用 | 典型場景 |
---|---|---|
BETWEEN A AND B | 匹配 A 到 B 的閉區間 | 工資、年齡等連續范圍查詢 |
NOT BETWEEN | 排除 A 到 B 的區間 | 反向范圍篩選 |
IN (值1,值2…) | 匹配離散集合中的值 | 部門 ID、管理者 ID 等固定選項 |
IS NULL | 判斷字段為空 | 查找未分配管理者、無獎金的記錄 |
IS NOT NULL | 判斷字段非空 | 查找有獎金、已填寫信息的記錄 |
LIKE ‘%a%’ | 模糊匹配包含 a 的字符串 | 姓名、職位等包含特定字符的查詢 |
LIKE ‘__a%’ | 匹配第三個字符為 a 的字符串 | 固定位置字符匹配 |
REGEXP ‘e$’ | 正則匹配以 e 結尾的字符串 | 復雜模式的字符串匹配 |
通過這 9 道題,可掌握運算符在實際場景中的靈活應用。記住:優先用 IN 替代多 OR、用 BETWEEN 簡化連續范圍、用 IS NULL 處理空值,能讓你的 SQL 更簡潔高效。