1. 程式人生 > >MySQL學習筆記 8-12

MySQL學習筆記 8-12

日期和時間函數 替換 數據庫表 數據處理 select語句 minute sel () 進制

八、用正則表達式進行搜索

正則表達式的作用:用來匹配文本的特殊的串(字符集合)。

關鍵詞:REGEXP

1、 基本字符匹配

SELECT prod_name

FROM products

WHERE prod_name REGEXP ‘1000’

ORDER BY prod_name;

檢索列prod_name包含文本1000的所有行

.是正則表達式語言中一個特殊的字符。它表示匹配任意一個字符

SELECT prod_name

FROM products

WHERE prod_name REGEXP ‘.000’

ORDER BY prod_name;

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

2、 進行OR匹配

為搜索兩串之一,使用 | ,如下所示:

SELECT prod_name

FROM products

WHERE prod_name REGEXP ‘1000|2000’

ORDER BY prod_name;

也可以給出兩個以上OR條件:’1000|2000|3000’

3、 匹配幾個字符之一

匹配任何單個字符。可通過指定一組用[ 和 ]括起來的字符來完成。

SELECT prod_name

FROM products

WHERE prod_name REGEXP ‘[123] Ton’

ORDER BY prod_name

[123] 定義一組字符,它的意思是匹配1或2或3,因此,1 ton 和2 ton都匹配

4、 匹配範圍

集合可用來定義要匹配的一個或多個字符。例如[0-9]將匹配數字0到9、[a-z]將匹配任何字母字符

5、 匹配特殊字符

為了匹配特殊字符,必須用//為前導。//- 表示查找-,//. 表示查找. 。

SELECT vend_name

FROM vendors

WHERE vend_name REGEXP ‘//.’

ORDER BY vend_name;

這種處理就是所謂的轉義

6、 匹配字符類

預定義的字符集,稱為字符類。

[: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])

九、創建計算字段

1、 計算字段

計算字段並不實際存在於數據庫表中計算字段是運行時在SELECT語句內創建的

2、 拼接字段

在MySQL的SELECT語句中,可使用Concat()函數來拼接兩個列

SELECT Concat(vend_name, ‘ (’ , vend_country, ‘)’)

FROM vendors

ORDER BY vend_name;

Concat()拼接串,即把多個串連接起來形成一個較長的串。

Concat()需要一個或多個指定的串,各個串之間用逗號分隔

使用別名:別名是一個字段或值的替換名。別名用AS關鍵字賦予

十、使用數據處理函數

1、 使用函數

大多數SQL實現支持以下類型的函數

  • 用於處理文本串(如刪除或填充值,轉換值為大寫或小寫)的文本函數
  • 用於在數值數據上進行算術操作(如返回絕對值,進行代數運算)的數值函數
  • 用於處理日期和時間值並從這些值中提取特定成分(例如,返回兩個日期之差,檢查日期有效性等)的日期和時間函數
  • 返回DBMS正使用的特殊信息(如返回用戶登陸信息,檢查版本細節)的系統函數

(1)、文本處理函數

SELECT vebd_name, Upper(vend_name) AS vend_name_upcase

FROM vendors

ORDER BY vend_name;

Upper()將文本轉換為大寫

一些常用的文本處理函數:

Left() 返回串左邊的字符

Length() 返回串的長度

Locate() 找出串的一個子串

Lower() 將串轉換為小寫

LTrim() 去掉串左邊的空格

Right() 返回串右邊的字符

RTrim() 去掉串右邊的空格

Soundex() 返回串的DOUNDEX值

SubString() 返回子串的字符

Upper() 將串轉換為大寫

(2)、日期和時間處理函數

常用日期和時間處理函數

AddDate() 增加一個日期(天、周等)

AddTime() 增加一個時間(時、分等)

CurDate() 返回當前日期

CurTime() 返回當前時間

Date() 返回日期時間的時間部分

DateDiff() 計算兩個日期之差

Date_Add() 高度靈活的日期運算函數

Date_Format() 返回一個格式化的日期或時間串

Day() 返回一個日期的天數部分

DayOfWeek() 對於一個日期,返回對應的星期幾

Hour() 返回一個日期的小時部分

Minute() 返回一個日期的分鐘部分

Month() 返回一個日期的月份部分

Now() 返回當前日期和時間

Second() 返回一個時間的秒部分

Time() 返回一個日期的時間部分

Year() 返回一個日期的年份部分

MySQL的日期格式為:yyyy-mm-dd

SELECT cust_id, order_num

FROM orders

WHERE Date(order_date) = ‘2005-09-01’

註意:如果要的是日期,盡量使用Date()

要檢索出2005年9月下的所有訂單,有以下兩種方法

WHERE Date(order_date) BETWEEN ‘2005-09-01’ AND ‘2005-09-30’

WHERE Year(order_date) = 2005 AND Month(order_date) = 9

(3)、數值處理函數

常用數值處理函數

Abs() 返回一個數的絕對值

Cos() 返回一個數的余弦

Exp() 返回一個數的指數值

Mod() 返回除操作的余數

Pi() 返回圓周率

Rand() 返回一個隨機數

Sin() 返回一個角度的正弦

Sqrt() 返回一個數的平方值

Tan() 返回一個角度的正切

十一、匯總函數

1、 聚集函數

聚集函數:運行在行組上,計算和返回單個值的函數

五個SQL聚集函數

AVG() 返回某列的平均值

COUNT() 返回某列的行數

MAX() 返回某列的最大值

MIN() 返回某列的最小值

SUM() 返回某列值之和

(1)、AVG()函數

AVG()通過對表中行數計數並計算特定列值之和,求得該列的平均值。AVG()可以返回所有列的平均值,也可以用來返回特定列或行的平均值

SELECT AVG(prod_price) AS avg_price

FROM products;

SELECT AVG(prod_price) AS avg_price

FROM products

WHERE vend_id = 1003;

(2)、COUNT()函數

COUNT()函數進行計數,可利用COUNT()確定表中行的數目或符合特定條件的行的數目。

COUNT()函數有兩種使用方式:

使用COUNT(*) 對表中行的數目進行計數,不管表列中包含的是空值(NULL)還是非空值

使用COUNT(colum)對特定列中具有值的行進行計數,忽略NULL值

下面的例子返回customers表中客戶的總數:

SELECT COUNT(*) AS num_cust

FROM customers;

下面例子只對具有電子郵件地址的客戶計數:

SELECT COUNT(cust_email) AS num_cust

FROM customers;

(3)、MAX()函數

MAX()返回指定列中的最大值。MAX()要求指定列名。

SELECT MAX(prod_price) AS max_price

FROM products;

(4)、MIN()函數

MIN()的功能與MAX()正好相反。

(5)、SUM()函數

SUM()用來返回指定列值的和(合計)

SELECT SUM(quantity) AS items_ordered

FROM orderitems

WHERE order_num = 20005;

十二、分組數據

1、 創建分組

分組是在SELECT語句的GROUP BY子句中建立的。

在具體使用GROUP BY子句之前,需要知道一些重要的規定

  • GROUP BY子句可以包含任意數目的列。這使得能對分組進行嵌套,為數據分組提供更細致的控制。
  • 如果在GROUP BY子句中嵌套了分組,數據將在最後規定的分組上進行匯總。換句話說,在建立分組時,指定的所有列都一起計算。
  • GROUP By子句中列出的每個列都必須是檢索列或有效的表達式(不能是聚集函數)。如果在SELECT中使用表達式,則必須在GROUP BY子句中指定相同的表達式。不能使用別名。
  • 除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出。
  • 如果分組列中具有NULL值,則NULL將作為一個分組返回。如果列中有多個NULL值,它們將分為一組。
  • GROUP BY子句必須出現在WHERE子句之後,ORDER BY子句之前。

2、過濾分組

HAVING支持所有的WHERE操作符,唯一的差別是WHERE過濾行,HAVING過濾分組。WHERE在數據分組前過濾,HAVING在數據分組後過濾。

SELECT cust_id, COUNT(*) AS orders

FROM orders

GROUP BY cust_id

HAVING COUNT(*) >= 2;

MySQL學習筆記 8-12