八、用正则表达式进行搜索
正则表达式的作用:用来匹配文本的特殊的串(字符集合)。
关键词: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;