1. 使用通配符进行过滤
通配符:用来匹配值的一部分的特殊字符。
搜索模式:由字面值、通配符或两者组合构成的搜索条件。
通配符本身实际是SQL的WHERE子句中有特殊含义的字符。
SQL支持几种通配符,为了在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
百分号%通配符:
%表示任何字符出现任意次数。
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'jet%'; //此例使用搜索模式'jet%'。将检索任意以jet起头的词。%告诉MySQL接受jet之后的任意字符。
MySQL的搜索可以是区分大小写的。
匹配模式中的空格是有意义的。
下划线(_)操作符:
下划线的用途是匹配单个字符而不是多个字符。
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '_ ton anvil'; //这里的_只且必须匹配一个字符,满足条件才被显示
2. 正则表达式
WHERE子句中使用正则表达式。匹配文本。REGEXP
基本字符匹配:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name; //检索prod_name包含文本1000的所有行
相比于通配符匹配,正则匹配在WHERE子句中的命令用的是REGEX关键字。
正则表达式中的 . :
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;
. 是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符,因此可以匹配1000、2000这样的。
进行OR匹配:使用 |
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name; //检索prod_name包含1000或2000的行记录
正则表达式中的“或”使用 |。多个或是:'1000|2000|3000'
匹配几个字符之一:是用中括号
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORDER BY prod_name;
[123]定义了一组字符,它的意思是匹配1或2或3。[]相当于另一种或命令。等同于 ’[1|2|3] Ton'。加[]防止误认为1|2|3 Ton,这时3 Ton是一个整体。
匹配范围:
也是使用中括号,如[123456789]可以简写为[1-9]。9个数字的或。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5] Ton'
ORDER BY prod_name;
匹配特殊字符:
因为正则表达式中有些字符有特殊的功能,如( . 、|、[]、-)。为了匹配这些字符的原来形式,使用\为前导,\-表示查找-,\.表示查找 . 。
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\.'
ORDER BY vend_name;
\相当于转义。为了匹配反斜杠()本身,需要使用\。
匹配字符类:
[:alnum:] 任意字母和数字
[:alpha:] 任意字符
[:blank:] 空格和制表
[:cntrl:] ASCII控制字符
[:digit:] 任意数字
[:graph:] 与[:print:]相同,但不包含空格
[:lower:] 任意小写字母
[:print:] 任意可打印字符·
[:punct:] 即不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:] 包括空格在内的任意空白字符
[:upper:] 任意大写字母
[:xdigit:] 任意十六进制数字
匹配多个实例:以下是正则表达式中的元字符
元字符 说明
* 0或多个匹配
+ 1或多个匹配(等于{1,})
? 0个或1个匹配(等于{0,1})
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\([0-9] sticks?\)'
ORDER BY prod_name;
这里的\匹配括号,然后?匹配其前面的字符s
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;
此处[:digit:]作为一个子集合。某个数字连续4次出现。
定位符:
前面讨论的匹配是字符串中任意位置的匹配,如果需要指明位置,则要使用定位符。
元字符 说明
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[0-9\.]'
ORDER BY prod_name;
匹配以任意数字或.为开头字符的字符串。
3. 计算字段
存储在数据库表中的数据一般不是应用程序所需要的格式。我们有时需要直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化。
计算字段是运行时在SELECT语句内创建的。
字段:基本上与列的意思相同,经常是互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。
拼接字段:
如vendors表包含供应商和位置信息。假如要生成一个供应商报表,需要在供应商的名字中按照name(location)这样的格式列出供应商的位置。
拼接:将值联结到一起构成单个值。
方法是把两个列拼接起来。在MySQL的SELECT语句中,可使用Concat()函数来拼接两个列。
SELECT Concat( vend_name, ' (', vend_country, ') ')
FROM vendors
ORDER BY vend_name;
Concat()拼接串,即把多个串连接起来形成一个较长的串。
Concat()需要一个或多个指定的串,各个串之间用逗号分隔。
MySQL的RTrim()函数来删除数据右侧多余的空格来整理数据。
SELECT Concat( RTrim(vend_name), ' (', RTrim(vend_country), ') ')
FROM vendors
ORDER BY vend_name;
RTrim()函数去掉值右边的所有空格。
LTrim()函数去掉左边空格,Trim()函数去掉串左右两边的空格。
使用别名:
别名是一个字段或值的替换名。别名用AS关键字。
SELECT Concat( RTrim(vend_name), ' (', RTrim(vend_country), ') ') AS
vend_title
FROM vendors
ORDER BY vend_name;
上面个将拼接值用一个别名替换。显示的列名称为这个别名。
执行算术计算:
MySQL中的SQL中支持一些算术操作符。
操作符 说明
+ 加
- 减
* 乘
/ 除
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;
将两项相乘并赋一个别名。
Now()函数返回当前日期和时间。