MySQL數據過濾和搜索

操作符

AND操作符

mysql> SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id=1003 AND prod_price<=10;
+---------+------------+----------------+
| prod_id | prod_price | prod_name      |
+---------+------------+----------------+
| FB      |      10.00 | Bird seed      |
| FC      |       2.50 | Carrots        |
| SLING   |       4.49 | Sling          |
| TNT1    |       2.50 | TNT (1 stick)  |
| TNT2    |      10.00 | TNT (5 sticks) |
+---------+------------+----------------+
5 rows in set (0.00 sec)
  • 此SQL語句檢索由供應商1003製造且價格小於等於10美元的所有產品的名稱和價格。

OR操作符

mysql> SELECT prod_name,prod_price FROM products WHERE vend_id=1002 OR vend_id=1003;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| Fuses          |       3.42 |
| Oil can        |       8.99 |
| Detonator      |      13.00 |
| Bird seed      |      10.00 |
| Carrots        |       2.50 |
| Safe           |      50.00 |
| Sling          |       4.49 |
| TNT (1 stick)  |       2.50 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
9 rows in set (0.00 sec)
  • 此SQL語句檢索由任一個指定供應商製造的所有產品的產品名和價格。

IN 操作符

mysql> SELECT prod_name,prod_price FROM products WHERE vend_id IN (1002,1003) ORDER BY prod_name;
+----------------+------------+
| prod_name      | prod_price |
+----------------+------------+
| Bird seed      |      10.00 |
| Carrots        |       2.50 |
| Detonator      |      13.00 |
| Fuses          |       3.42 |
| Oil can        |       8.99 |
| Safe           |      50.00 |
| Sling          |       4.49 |
| TNT (1 stick)  |       2.50 |
| TNT (5 sticks) |      10.00 |
+----------------+------------+
9 rows in set (0.00 sec)
  • 此SELECT語句檢索供應商1002和1003製造的所有產品。

NOT 操作符

mysql> SELECT prod_name,prod_price FROM products WHERE vend_id NOT IN(1002,1003) ORDER BY prod_name;
+--------------+------------+
| prod_name    | prod_price |
+--------------+------------+
| .5 ton anvil |       5.99 |
| 1 ton anvil  |       9.99 |
| 2 ton anvil  |      14.99 |
| JetPack 1000 |      35.00 |
| JetPack 2000 |      55.00 |
+--------------+------------+
5 rows in set (0.01 sec)
  • 此SELECT語句檢索供應商不是1002和1003製造的所有產品;
  • MySQL中NOT支持NOT對IN,BETWEEN和EXISTS子句取反。

運算符優先級

優 先 級 由 低 到 高 排 列 運 算 符
1 =(賦值運算)、:=
2 II、OR
3 XOR
5 NOT
6 BETWEEN、CASE、WHEN、THEN、ELSE
7 =(比較運算)、<=>、>=、>、<=、<、<>、!=、 IS、LIKE、REGEXP、IN
8 |
9 &
10 <<、>>
11 -(減號)、+
12 *、/、%
13 ^
14 -(負號)、〜(位反轉)
15

LIKE操作符

百分號(%)通配符

mysql> SELECT prod_id,prod_name FROM products WHERE prod_name LIKE 'jet%';
+---------+--------------+
| prod_id | prod_name    |
+---------+--------------+
| JP1000  | JetPack 1000 |
| JP2000  | JetPack 2000 |
+---------+--------------+
2 rows in set (0.00 sec)
  • 將檢索任意以jet起頭的詞,%告訴MySQL接受jet之後的任意字符。

下劃線(—)通配符

mysql> SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '_ ton anvil';
+---------+-------------+
| prod_id | prod_name   |
+---------+-------------+
| ANV02   | 1 ton anvil |
| ANV03   | 2 ton anvil |
+---------+-------------+
2 rows in set (0.00 sec)
  • 下劃線(—)總是匹配一個字符。

正則表達式

基礎字符匹配

mysql> SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.04 sec)

mysql> SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)

  • REGEXP後所跟的東西作爲正則表達式(與文字正文1000匹配的一個正則表達式)處理;
  • .它表示匹配任意一個字符。

進行OR匹配

mysql> SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)

匹配幾個字符之一

mysql> SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;
+-------------+
| prod_name   |
+-------------+
| 1 ton anvil |
| 2 ton anvil |
+-------------+
2 rows in set (0.00 sec)
  • [123]定義一組字符,它的意思是匹配1或2或3。

匹配範圍

mysql> SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;
+--------------+
| prod_name    |
+--------------+
| .5 ton anvil |
| 1 ton anvil  |
| 2 ton anvil  |
+--------------+
3 rows in set (0.00 sec)
  • [1-5]定義了一個範圍,這個表達式意思是匹配1到5。

匹配特殊字符

mysql> SELECT prod_name FROM products WHERE prod_name REGEXP '\\.' ORDER BY prod_name;
+--------------+
| prod_name    |
+--------------+
| .5 ton anvil |
+--------------+
1 row in set (0.00 sec)
  • \.匹配.,所以只檢索出一行。這種處理就是所謂的轉義(escaping),正則表達式內具有特殊意義的所有字符都必須以這種方式轉義。這包括.、|、[]以及迄今爲止使用過的其他特殊字符。
元 字 符 說 明
\\f 換頁
\\n 換行
\\r 回車
\\t 製表
\\v 縱向製表

匹配字符類

  • 爲更方便工作,可以使用預定義的字符集,稱爲字符類(character class)。
說明
[:alnum:] 任意字母和數字(同[a-zA-Z0-9])
[:alpha:] 任意字符(同[a-zA-Z])
[:blank:] 空格和製表(同[\t])
[:cntrl:] ASCII控制字符(ASCII 0到31和127)
[:digit:] 任意數字(同[0-9])
[:graph:] 與[:print:]相同,但不包括空格
[:lower:] 任意小寫字母(同[a-z])
[:print:] 任意可打印字符
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:] 包括空格在內的任意空白字符(同[\f\n\r\t\v])
[:upper:] 任意大寫字母(同[A-Z])
[:xdigit:] 任意十六進制數字(同[a-fA-F0-9])

匹配多個實例

元 字 符 說 明
* 0個或多個匹配
+ 1個或多個匹配(等於{1,})
? 0個或1個匹配(等於{0,1})
{n} 指定數目的匹配
{n,} 不少於指定數目的匹配
{n,m} 匹配數目的範圍(m不超過255)
mysql> SELECT prod_name FROM products WHERE prod_name REGEXP '\\([0-9] sticks?\\)' ORDER BY prod_name;
+----------------+
| prod_name      |
+----------------+
| TNT (1 stick)  |
| TNT (5 sticks) |
+----------------+
2 rows in set (0.00 sec)
  • \\([0-9] sticks?\\):\\(匹配),[0-9]匹配任意數字(這個例子中爲1和5),sticks?匹配stick和sticks(s後的?使s可選,因爲?匹配它前面的任何字符的0次或1次出現),\\)匹配)。沒有?,匹配stick和sticks會非常困難。

定位符

元 字 符 說 明
^ 文本的開始
$ 文本的結尾
[[:<:]] 詞的開始
[[:>:]] 詞的結尾
mysql> SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]';
+--------------+
| prod_name    |
+--------------+
| .5 ton anvil |
| 1 ton anvil  |
| 2 ton anvil  |
+--------------+
3 rows in set (0.00 sec)
  • ^匹配串的開始。因此,^[0-9\\.]只在.或任意數字爲串中第一個字符時才匹配它們。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章