MySQL 3 通配符、正则、计算字段

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()函数返回当前日期和时间。

原文地址:https://www.cnblogs.com/cjj-ggboy/p/12532788.html