1、like
搜索模式:由字面值,通配符或两者组合构成的搜索条件。
like指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
%表示任何字符出现任意次数:
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%';
虽然%似乎可以匹配任何东西,但无法匹配NULL。即使是where prod_name like '%'也不能匹配用NULL作为产品名的行。
通配符“_”用法“%”相同,但只匹配单个字符:
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '_ ton avil';
2、使用通配符的技巧
通配符搜索的处理时间一般比较长,所以有一些技巧:
3、使用正则表达式
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,相应的行将被返回。
MySQL中的正则表达式匹配不区分大小写,为区分大小写可使用BINARY关键字,如WHERE prod_name REGEXP BINARY 'JetPack .000'
4、|为正则表达式的OR操作符:
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;
5、匹配几个字符之一
WHERE prod_name REGEXP '[123] Ton'
相当于 ‘1 Ton|2 Ton|3 Ton’
而 '1|2|3 Ton' 不等于上述表达式,它表示匹配 1,2,3 Ton。
字符集合也可以被否定,它们将匹配除指定字符外的任何东西。为否定一个字符集,在集合的开始处放置一个^。[^123]匹配除123之外的任何东西。
6、匹配范围
[0123456789]可以写成[0-9]
7、匹配特殊字符
用\\为前导,.、|、[]、-、^需要如此匹配。
\\也可以用来引用元字符:
为了匹配\本身,需要使用\\\。
多数正则表达式实现使用单个反斜杠转义特殊字符,但MySQL要求两个反斜杠。
8、字符类
字符类是预定义的字符集
9、重复元字符
10、定位元字符
^有两种用法,在集合中(用[和]定义)表示否定该集合;否则,用来指串的开始处。
简单的正则表达式测试,可以在不适用数据库表的情况下用SELECT来测试正则表达式,REGEXP检测总是返回0(没有匹配)或1(匹配):
SELECT 'hello' REGEXP '[0-9]';返回0。
11、拼接字段
SELECT语句中可适用Concat()函数拼接几个列:
SELECT Concat(vend_name, '(', vend_country, ')') FROM vendors ORDER BY vend_name;
不同于MySQL,多数DBMS使用+或||实现拼接。
12、Trim()函数去掉左右边的空格,LTrim()和RTrim()分别去掉左右边的空格。
13、用AS关键字给列赋予别名:
SELECT Concat(vend_name, '(', vend_country, ')') AS vend_title FROM vendors ORDER BY vend_name;
14、SELECT语句中可以对列执行算数运算:
SELECT prod_id, quantity, quantity * item_price AS expanded_price FROM orderitems;
15、使用SELECT Now() 利用Now()函数返回当前的日期和时间。
16、文本处理函数
17、日期和时间处理函数
无论什么时候指定一个日期,不管是插入、更新还是用WHERE子句进行过滤,日期必须为yyyy-mm-dd格式。如果想要的仅仅是日期,则使用Date()函数,如果想要时间则使用Time()函数。
可以使用BETWEEN AND函数定义日志范围。
18、数值处理函数
19、聚类函数
AVG()计算特定列的平均值,只能用来确定特定数值列的平均值,列名必须作为函数参数给出,为了获取多个列的平均值,必须使用多个AVG()函数。会忽略列值为NULL的行。
COUNT()函数,有两种用法:
MAX()函数,返回指定列中的最大值。一般用来找出最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括文本列中的最大值。MAX()忽略列值为NULL的行。
MIN()函数的功能和MAX()相反。
SUM()函数返回指定列值的和,也可以用来合计计算值。
以上5个聚类函数都可以如下使用:
20、分组数据 GROUP BY
SELECT vend_id,COUNT(*) AS num_prods FROM products GROUP BY vend_id;
一些规定:
使用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在数据分组后进行过滤。
21、SELECT子句顺序(从前至后):
22、子查询
利用子查询进行过滤
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;