MySQL命令學習筆記(二)

一、過濾數據

1.1 使用WHERE子句

  在SELECT語句中,數據根據WHERE子句中指定的搜索條件進行過濾。WHERE子句在表名(FROM子句)之後給出,如下所示:

SELECT id, home FROM table1 WHERE name = "TN6";

**WHERE子句的位置:**在同時使用ORDER BY和WHERE子句時,應該讓ORDER BY位於WHERE之後, 否則將會產生錯誤。

1.2 WHERE子句操作符

MySQL支持下標列出的所有條件操作符:

操作符 說明
= 等於
<> 不等於
!= 不等於
< 小於
<= 小於等於
> 大於
>= 大於等於
BETWEEN 指定的兩個值之間

上述指令使用示例如下:
範圍檢查

SELECT id, home FROM table1 WHERE id < 6;
SELECT id, home FROM table1 WHERE id <= 6;

不匹配檢查

SELECT id, home FROM table1 WHERE name <> "TN6";

範圍值檢查

SELECT id, home FROM table1 WHERE id BETWEEN 4 AND 6;

空值檢查
SELECT語句有一個特殊的WHERE子句,可用來檢查具有NULL值的列。這個WHERE子句就是IS NULL子句。其語法如下:

SELECT id FROM table1 WHERE home IS NULL;

二、數據過濾

2.1 組合WHERE子句

mysql允許給出多個WHERE子句,這些子句可以兩種方式使用:以AND子句的方式或OR子句的方式使用。

2.1.1 AND操作符

SELECT id,phone FROM table1 WHERE name = "TN6" ADN id <= 5;

2.1.2 OR操作符

OR操作符與AND操作符不同,它指示mysql檢索匹配任一條件的行,命令如下

SELECT id,phone FROM table1 WHERE name = "TN6" OR id <= 5;

2.1.3 計算次序

WHERE可包含任意數目的AND和OR操作符。允許兩者結合以進行復雜和高級的過濾。SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操作符。可使用圓括號明確地分組相應的操作符。

任何時候使用具有AND和OR操作符的WHERE子句,都應該使用圓括號明確地分組操作符。

2.2 IN操作符

圓括號在WHERE子句中還有另外一種用法。 IN操作符用來指定條件範圍,範圍中的每個條件都可以進行匹配。 IN取合法值的由逗號分隔的清單,全都括在圓括號中。

SELECT id,phone FROM table1 WHERE id IN (2,5) ORDER BY name;

使用IN操作符的優點具體如下:

  • 在使用長的合法選項清單時, IN操作符的語法更清楚且更直觀。
  • 在使用IN時,計算的次序更容易管理(因爲使用的操作符更少)。
  • IN操作符一般比OR操作符清單執行更快。
  • IN的最大優點是可以包含其他SELECT語句,使得能夠更動態地建立WHERE子句。

2.3 NOT操作符

WHERE子句中的NOT操作符有且只有一個功能,那就是否定它之後所跟的任何條件。

SELECT id,phone FROM table1 WHERE id NOT (2,5) ORDER BY name;

MySQL支持使用NOT對IN、 BETWEEN 和EXISTS子句取反,這與多數其他DBMS允許使用NOT對各種條件取反有很大的差別。

三、用通配符進行過濾

3.1 LIKE操作符

爲在搜索子句中使用通配符,必須使用LIKE操作符。 LIKE指示mysql,後跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較

3.1.1 百分號(%)通配符

最常使用的通配符是百分號(%),在搜索串中, %表示任何字符出現任意次數。例如,爲了找出所有以詞12起頭的產品,可使用以下SELECT語句:

SELECT id,home FROM table1 WHERE phone LIKE '12%';

區分大小寫 根據MySQL的配置方式,搜索可以是區分大小寫的

3.1.1 下劃線(_)通配符

另一個有用的通配符是下劃線(_)。下劃線的用途與%一樣,但下劃線只匹配單個字符而不是多個字符。

SELECT id,home FROM table1 WHERE name LIKE 'TN_';

3.2 使用通配符的技巧

  • 不要過度使用通配符。如果其他操作符能達到相同的目的,應該 使用其他操作符。
  • 在確實需要使用通配符時,除非絕對有必要,否則不要把它們用在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起來是最慢的。
  • 仔細注意通配符的位置。如果放錯地方,可能不會返回想要的數

四、使用正則表達式進行搜索

4.1 使用mysql正則表達式

4.1.1 基本字符匹配

下面的語句檢索列name包含文本TN的所有行:

SELECT id,home FROM table1 WHERE name REGEXP 'TN';

此命令告訴MySQL: REGEXP後所跟的東西作爲正則表達式(與文字正文TN匹配的一個正則表達式)處理。

匹配不區分大小寫 MySQL中的正則表達式匹配(自版本3.23.4後)不區分大小寫(即,大寫和小寫都匹配)

4.1.2 進行OR匹配

爲搜索兩個串之一(或者爲這個串,或者爲另一個串),使用|,如下所示:

SELECT id,home FROM table1 WHERE name REGEXP 'TN|李';

4.1.3 匹配幾個字符之一

匹配任何單一字符。若只想匹配特定的字符,可通過指定一組用[和]括起來的字符來完成,如下所示:

SELECT id,home FROM table1 WHERE name REGEXP 'TN[26]';

這裏,使用了正則表達式TN[26]。 [26]定義一組字符,它的意思是匹配2或6,因此, TN2和TN6都匹配且返回。字符集合也可以被否定,即,它們將匹配除指定字符外的任何東西。爲否定一個字符集,在集合的開始處放置一個即可。因此,[26]卻匹配除這些字符外的任何東西。

4.1.4 匹配範圍

集合可用來定義要匹配的一個或多個字符。例如,下面的集合將匹配數字0到9:
[0123456789]
爲簡化這種類型的集合,可使用-來定義一個範圍。下面的式子功能上等同於上述數字列表:
[0-9]

SELECT id,home FROM table1 WHERE name REGEXP 'TN[2-6]';

4.1.5 匹配範圍

SELECT id,home FROM table1 WHERE name REGEXP '.';

.匹配任意字符,因此每個行都被檢索出來
爲了匹配特殊字符,必須用\爲前導。\\-表示查找-\\.表示查找.

\\也用來引用元字符(具有特殊含義的字符),如下表所示:

元字符 說明
\\f 換頁
\\n 換行
\\r 回車
\\t 製表
\\v 縱向製表

匹配\ 爲了匹配反斜槓(\)字符本身,需要使用\\\

4.1.6 匹配字符類

爲更方便工作,可以使用預定義的字符集,稱爲字符類(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]

4.1.7 匹配多個實例

下表列出的正則表達式重複元字符來完成

元字符 說明
* 0個或多個匹配
+ 1個或多個匹配(等於{1,})
0個或1個匹配(等於{0,1})
{n} 指定數目的匹配
{n,} 不少於指定數目的匹配
{n,m} 匹配數目的範圍(m不超過255)

匹配連在一起的4位數字:

SELECT id,home FROM table1 WHERE name REGEXP '[[:digit:]]{4}';

4.1.8 定位符

爲了匹配特定位置的文本,需要使用下表列出的定位符:

元字符 說明
^ 文本的開始
$ 文本的結尾
[[:<:]] 詞的開始
[[:>:]] 詞的結尾

若想找出以一個數(包括以小數點開始的數)開始的所有內容,可使用^定位符,如下所示:

SELECT id,home FROM table1 WHERE name REGEXP '^[0-9\\.]';

^匹配串的開始。因此,^[0-9\\.]只在.或任意數字爲串中第一個字符時才匹配它們。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章