(NOT) LIKE 運算子 (SQL (NOT) LIKE Operator)
LIKE 運算子搭配 WHERE 子句可以依一特定模式 (Pattern) 為條件來搜尋資料表中的特定資料。
LIKE 語法 (SQL LIKE Syntax)
SELECT table_column1, table_column2, table_column3...
FROM table_name
WHERE column_name LIKE pattern;
LIKE 運算子查詢用法 (Example)
假設我們想從下面的 customers 資料表中取得住在台北縣市的顧客資料:
| C_Id | Name | Address | Phone |
|---|---|---|---|
| 1 | 張一 | 台北市XX路100號 | 02-12345678 |
| 2 | 王二 | 新竹縣YY路200號 | 03-12345678 |
| 3 | 李三 | 高雄縣ZZ路300號 | 07-12345678 |
| 4 | 陳四 | 台北縣AA路400號 | 02-87654321 |
我們可以使用這樣的 LIKE 查詢語句:
SELECT * FROM customers WHERE Address LIKE '台北%';
查詢結果如下:
| C_Id | Name | Address | Phone |
|---|---|---|---|
| 1 | 張一 | 台北市XX路100號 | 02-12345678 |
| 4 | 陳四 | 台北縣AA路400號 | 02-87654321 |
NOT LIKE
相反的,NOT LIKE 就是不包含在條件裡的的資料我通通要了,如上例多加上 NOT:
SELECT * FROM customers
WHERE Address NOT LIKE '台北%';
查詢後返回的結果會是:
| C_Id | Name | Address | Phone |
|---|---|---|---|
| 2 | 王二 | 新竹縣YY路200號 | 03-12345678 |
| 3 | 李三 | 高雄縣ZZ路300號 | 07-12345678 |
常用字串函數 (SQL String Functions)
除了 LIKE 用於模糊查詢之外,SQL 還提供了許多實用的字串函數,可以對文字資料進行各種操作,例如串接、擷取、取代等。以下整理了常用的字串函數:
| 函數 | 說明 |
|---|---|
| CONCAT() | 串接兩個或多個字串 |
| SUBSTRING() | 擷取字串中的一部分 |
| REPLACE() | 取代字串中的指定內容 |
| UPPER() | 將字串轉為大寫 |
| LOWER() | 將字串轉為小寫 |
| TRIM() | 移除字串前後的空白 |
| LENGTH() | 取得字串的長度 |
假設我們有一個員工資料表 employees 如下:
| Name | Department | |
|---|---|---|
| 張一 | 業務部 | zhang@example.com |
| 王二 | 資訊部 | wang@example.com |
| 李三 | 業務部 | li@example.com |
| 趙四 | 資訊部 | zhao@example.com |
CONCAT() 函數
CONCAT() 用來將多個字串串接在一起。例如,將員工姓名與部門組合成一個完整的描述:
SELECT CONCAT(Name, ' - ', Department) AS NameWithDept
FROM employees;
查詢結果如下:
| NameWithDept |
|---|
| 張一 – 業務部 |
| 王二 – 資訊部 |
| 李三 – 業務部 |
| 趙四 – 資訊部 |
SUBSTRING() 函數
SUBSTRING() 用來從字串中擷取指定位置與長度的子字串。語法為 SUBSTRING(string, start, length),其中 start 從 1 開始計算。例如,擷取 Email 中 @ 符號前的使用者名稱:
SELECT Name, SUBSTRING(Email, 1, LOCATE('@', Email) - 1) AS Username
FROM employees;
查詢結果如下:
| Name | Username |
|---|---|
| 張一 | zhang |
| 王二 | wang |
| 李三 | li |
| 趙四 | zhao |
REPLACE() 函數
REPLACE() 用來將字串中的指定內容取代為新的內容。語法為 REPLACE(string, old_string, new_string)。例如,將 Email 的網域從 example.com 改為 company.com:
SELECT Name, REPLACE(Email, 'example.com', 'company.com') AS NewEmail
FROM employees;
查詢結果如下:
| Name | NewEmail |
|---|---|
| 張一 | zhang@company.com |
| 王二 | wang@company.com |
| 李三 | li@company.com |
| 趙四 | zhao@company.com |
UPPER() 與 LOWER() 函數
UPPER() 將字串轉為全部大寫,LOWER() 則轉為全部小寫。這在進行不區分大小寫的比對時特別有用:
SELECT Name, UPPER(Email) AS UpperEmail
FROM employees;
查詢結果如下:
| Name | UpperEmail |
|---|---|
| 張一 | ZHANG@EXAMPLE.COM |
| 王二 | WANG@EXAMPLE.COM |
| 李三 | LI@EXAMPLE.COM |
| 趙四 | ZHAO@EXAMPLE.COM |
善用這些字串函數可以讓你在查詢時更靈活地處理文字資料。搭配 LIKE 模糊查詢與這些字串函數,就能滿足大部分的文字資料處理需求。
延伸閱讀
- SQL 教學 — 完整 SQL 語法教學
- SQL WHERE — 條件篩選查詢
- SQL Wildcards — SQL 萬用字元教學
- SQL BETWEEN — 範圍查詢教學
- SQL IN — 多值查詢教學
- SQL SELECT — 資料查詢語法