《MySQL必知必會》讀書筆記(二) 8~14章

一、like mysql

搜索模式:由字面值,通配符或二者組合構成的搜索條件。 git

like指示MySQL,後跟的搜索模式利用通配符匹配而不是直接相等匹配進行比較。 正則表達式

%表示任何字符出現任意次數: sql

select prod_id,prod_name from products where prod_name like 'jet%'; 數據庫

表示搜素prod_name以jet起頭的詞。 函數

通配符可在搜索模式中任意位置使用,而且可使用屢次: 測試

select prod_id,prod_name from products where prod_name like '%anvil%'; spa

雖然%彷佛能夠匹配任何東西,但沒法匹配NULL。即便是where prod_name like '%'也不能匹配用NULL做爲產品名的行。 日誌

通配符「_」用法「%」相同,但只匹配單個字符: orm

SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '_ ton avil';

二、使用通配符的技巧

通配符搜索的處理時間通常比較長,因此有一些技巧:


  • 不要過分使用通配符。若是其餘操做符能達到相同的目的,應該使用其餘操做符;
  • 在確實須要使用通配符時,除非絕對有必要,不然不要把它們用在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起來是最慢的。

三、使用正則表達式

SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;

REGEXP在列值內進行匹配,若是被匹配的文本在列值中出現,相應的行將被返回。

MySQL中的正則表達式匹配不區分大小寫,爲區分大小寫可以使用BINARY關鍵字,如WHERE prod_name REGEXP  BINARY 'JetPack .000'

四、|爲正則表達式的OR操做符:

SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;

五、匹配幾個字符之一

WHERE prod_name REGEXP '[123] Ton'

至關於 ‘1 Ton|2 Ton|3 Ton’

而 '1|2|3 Ton' 不等於上述表達式,它表示匹配 1,2,3 Ton。

字符集合也能夠被否認,它們將匹配除指定字符外的任何東西。爲否認一個字符集,在集合的開始處放置一個^。[^123]匹配除123以外的任何東西。

六、匹配範圍

[0123456789]能夠寫成[0-9]

七、匹配特殊字符

用\\爲前導,.、|、[]、-、^須要如此匹配。

\\也能夠用來引用元字符:


  • \\f    換頁;
  • \\n    換行;
  • \\r    回車;
  • \\t    製表;
  • \\v    縱向製表。

爲了匹配\自己,須要使用\\\。

多數正則表達式實現使用單個反斜槓轉義特殊字符,但MySQL要求兩個反斜槓。

八、字符類

字符類是預約義的字符集

  • [:alnum:]    任意字母和數字;
  • [:alpha:]    任意字符
  • [:blank:]    空格和製表符;
  • [:cntrl:]    ASCII控制字符 ASCII0到31和127;
  • [:digit:]    任意數字;
  • [:graph:]    任意可打印字符,但不包括空格;
  • [:lower:]    任意小寫字母;
  • [:print:]    任意可打印字符;
  • [:punct:]    既不在[:alnum:]又不在[:cntrl:]中的任意字符;
  • [:space:]    包括空格在內的任意空白字符;
  • [:upper:]    任意大寫字母;
  • [:xdigit:]    任意十六進制數字。

九、重複元字符

  • *    0個或多個匹配;
  • +    1個或多個匹配;
  • ?    0個或1個匹配;
  • {n}    指定數目的匹配;
  • {n,}    很多於指定數目的匹配;
  • {n,m}    匹配數目的範圍m不超過255。

十、定位元字符

  • ^    文本的開始;
  • $    文本的結尾;
  • [[:<:]]    詞的開始;
  • [[:>:]]    此的結尾。

^有兩種用法,在集合中(用[和]定義)表示否認該集合;不然,用來指串的開始處。

簡單的正則表達式測試,能夠在不適用數據庫表的狀況下用SELECT來測試正則表達式,REGEXP檢測老是返回0(沒有匹配)或1(匹配):

SELECT 'hello' REGEXP '[0-9]';返回0。

十一、拼接字段

SELECT語句中可適用Concat()函數拼接幾個列:

SELECT Concat(vend_name, '(', vend_country, ')') FROM vendors ORDER BY vend_name;

不一樣於MySQL,多數DBMS使用+或||實現拼接。

十二、Trim()函數去掉左右邊的空格,LTrim()和RTrim()分別去掉左右邊的空格。

1三、用AS關鍵字給列賦予別名:

SELECT Concat(vend_name, '(', vend_country, ')') AS vend_title FROM vendors ORDER BY vend_name;

1四、SELECT語句中能夠對列執行算數運算:

SELECT prod_id, quantity, quantity * item_price AS expanded_price FROM orderitems;

1五、使用SELECT Now() 利用Now()函數返回當前的日期和時間。

1六、文本處理函數

  • Left()    返回串左邊的字符;
  • Length()    返回串的長度;
  • Locate()    找出串的一個子串;
  • Lower()    將串轉換爲小寫;
  • Right()    返回串右邊的字符;
  • Soundex()    查找元音發音相似的;
  • SubString()    返回子串的字符;
  • Upper()    將串轉換爲大寫。

1七、日期和時間處理函數

  • AddDate()    增長一個日期;
  • AddTime()    增長一個時間;
  • CurDate()    返回當前日期;
  • CurTime()    返回當前時間;
  • Date()    返回日期時間的日期部分;
  • DateDiff()    計算兩個日期之差;
  • Date_Add()    高度靈活的日期運算函數;
  • Date_Format()    返回一個格式化的日期或時間串;
  • Day()    返回一個日期的天數部分;
  • DayOfWeek() 對於一個日期,返回對應的星期幾;
  • Hour()    返回一個時間的小時部分;
  • Minute()    返回一個時間的分鐘部分;
  • Month()    返回一個日期的月份部分;
  • Now()    返回當前日期和時間;
  • Second()    返回一個時間的秒部分;
  • Time()    返回一個日期時間的時間部分;
  • Year()    返回一個日期的年份部分。

不管何時指定一個日期,不論是插入、更新仍是用WHERE子句進行過濾,日期必須爲yyyy-mm-dd格式。若是想要的僅僅是日期,則使用Date()函數,若是想要時間則使用Time()函數。

可使用BETWEEN AND函數定義日誌範圍。

1八、數值處理函數

  • Abs()    絕對值;
  • Cos()    角度的餘弦;
  • Exp()    數的指數值;
  • Mod()    除的餘數;
  • Pi()    圓周率;
  • Rand()    返回一個隨機數;
  • Sin()   角度的正弦;
  • Sqrt()    數的平方根;
  • Tan()    角度的正切。

1九、聚類函數

AVG()計算特定列的平均值,只能用來肯定特定數值列的平均值,列名必須做爲函數參數給出,爲了獲取多個列的平均值,必須使用多個AVG()函數。會忽略列值爲NULL的行。

COUNT()函數,有兩種用法:

  • COUNT(*)對錶中行的數目進行計數,不論表列中包含的是空置仍是非空值;
  • COUNT(column)對特定列中具備值的行進行計數,忽略NULL值。

MAX()函數,返回指定列中的最大值。通常用來找出最大的數值或日期值,但MySQL容許將它用來返回任意列中的最大值,包括文本列中的最大值。MAX()忽略列值爲NULL的行。

MIN()函數的功能和MAX()相反。

SUM()函數返回指定列值的和,也能夠用來合計計算值。

以上5個聚類函數均可以以下使用:

  • 對全部符合條件的行進行計算,指定ALL參數或不指定(默認行爲);
  • 只包含不一樣的值,指定DISTINCT參數,如AVG(DISTINCT prod_price)。

20、分組數據 GROUP BY

SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id;

一些規定:

  • GROUP BY能夠包含任意數目的列,按照多列合併後的值進行分組
  • GROUP BY子句中列出的每一個列都必須是檢索列或有效的表達式(但不能是聚類函數)。若是在SELECT中使用表達式,則必須在GROUP BY子句中指定相同的表達式,不能使用別名;
  • 除聚類計算語句外,SELECT語句中的每一個列都必須在GROUP BY子句中給出;
  • 若是分組列中具備NULL值,則NULL將做爲一個分組返回。
  • GROUP BY子句必須出如今WHERE子句以後,ORDER BY子句以前。

使用WITH ROLLUP關鍵字 查詢的結果最後有一行統計的彙總結果,非統計列用NULL給出,如:

mysql> select name,sum(miles) as 'miles/driver'

    -> from driver_log group by name with rollup;

+-------+--------------+

| name  | miles/driver |

+-------+--------------+

| Ben   |          362 |

| Henry |          911 |

| Suzi  |          893 |

| NULL  |         2166 |

+-------+--------------+

4 rows in set (0.00 sec)

最後一行就是with rollup的輸出。

用HAVING語句實現分組過濾,HAVING支持全部WHERE操做符,能夠認爲HAVING和WHERE執行方式都相同,只是一個針對行另外一個針對行分組。

另外一種理解方法,WHERE在數據分組前進行過濾,HAVING在數據分組後進行過濾。

2一、SELECT子句順序(從前至後):

  1. SELECT
  2. FROM
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. ORDER BY
  7. LIMIT

2二、子查詢

利用子查詢進行過濾

SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2');

做爲計算字段使用子查詢

SELECT cust_name, cust_state, (SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders FROM customers ORDER BY cust_name;

相關文章
相關標籤/搜索