检索数据

  • 检索的行有很多相同的数据,想要显示同值
select DISTINCT status from tb_category

DISTINCT 关键字

  • 限制结果
    限制只能出现5行
select status,sortb_order from tb_category LIMIT 5

LIMIT 关键字

select status,sortb_order from tb_category LIMIT 5,5

返回从行5开始的5行

  • 使用完全限定的表名
select prod.status from tb_category.prod

排序检索数据

  • 排序
select  status,sortb_order from tb_category order by sortb_order
  • 排序多个列
select status,sortb_order,name from tb_category order by name,sortb_order
  • 指定排序方向
select status,sortb_order,name from tb_category order by sortb_order DESC

降序

  • 例子
    使用ORDER BY和LIMIT的组合,能够找出一个列中最高或最低的值。
    找出最昂贵物品的值:
select name from tb_prod order by sortb_order DESC LIMIT 1

过滤数据

数据库表一般包含大量的数据,很少需要检索表中所有行。通常只
会根据特定操作或报告的需要提取表数据的子集。只检索所需数据需要
指定搜索条件(search criteria),搜索条件也称为过滤条件(filter
condition)。

  • 检查单个值
select prod_name WHERE prod_name=‘fuses’
  • 不匹配检查
select prod_name WHERE prod_name <>‘fuses’

<> 用!=也行

  • 范围值检查
select prod_price WHERE prod_price betwen 5 and 10
  • 空值检查
select prod_name WHERE prod_name IS NULL

数据过滤

为了进行更强的过滤控制,MySQL允许给出多个WHERE子句。这些子
句可以两种方式使用:以AND子句的方式或OR子句的方式使用。

  • AND操作符
select status,sortb_order,name from tb_category where status=1 and sortb_order <= 10
  • OR操作符
    在处理OR操作符前,优先处理AND操作符
  • IN操作符
    圆括号在WHERE子句中还有另外一种用法。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中
select status,sortb_order,name from tb_category where  ortb_order IN (10,100)
  • NOT操作符
    WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。NOT WHERE子句中用来否定后跟条件的关键字。
select status,sortb_order,name from tb_category whereor tb_order  NOT IN  (10,100)

用通配符进行过滤

前面介绍的所有操作符都是针对已知值进行过滤的。不管是匹配一个还是多个值,测试大于还是小于已知值,或者检查某个范围的值,共同点是过滤中使用的值都是已知的。但是,这种过滤方法并不是任何时候都好用。例如,怎样搜索产品名中包含文本anvil的所有产品?用简单的比较操作符肯定不行,必须使用通配符。利用通配符可创建比较特定数据的搜索模式。
通配符(wildcard) 用来匹配值的一部分的特殊字符。
搜索模式(search pattern)由字面值、通配符或两者组合构成的搜索条件。

  • 百分号(%)通配符
    最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现任意次数。例如,为了找出所有以词jet起头的产品
select status,sortb_order,name from tb_category where name LIKE 'jet%'

注意:这里区分大小写

通配符可在搜索模式中任意位置使用,并且可以使用多个通配符。下面的例子使用两个通配符,它们位于模式的两端:

select status,sortb_order,name from tb_category where name LIKE '%whi%'

%在中间也行

  • 下划线()通配符
    另一个有用的通配符是下划线(
    )。下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。
select status,sortb_order,name from tb_category where prod_name LIKE '_ ton'

只会出现一位的匹配

  • 使用通配符的技巧
  1. 不要过度使用通配符。如果其他操作符能达到相同的目的,应该
    使用其他操作符。
  2. 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用
    在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起
    来是最慢的。
  3. 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

用正则表达式进行搜索

正则表达式是用来匹配文本的特殊的串(字符集合)

  • 基本字符匹配
    下面的语句检索列name包含文本1000的所有行:
select status,sortb_order,name from tb_category where name REGEXP '1000'

这里使用了正则表达式.000。.是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符,因此,1000和2000都匹配且返回。

select status,sortb_order,name from tb_category where name REGEXP '.000'

正则表达式匹配不区分大小写

  • 进行OR匹配
    为搜索两个串之一(或者为这个串,或者为另一个串),使用|
REGEXP '1000|2000'
  • 匹配几个字符之一
REGEXP '[123] Ton'

[123]定义一组字符,它的意思是匹配1或2或3,因此,1 ton和2 ton都匹配且返回。
[]是另一种形式的OR语句,和|区别是:尽管[123]匹配字符1、2或3,但[^123]却匹配除这些字符外的任何东西。除非把字符|括在一个集合中,否则它将应用于整个串。

  • 匹配范围
    集合可用来定义要匹配的一个或多个字符。例如,下面的集合将匹配数字0到9:[0123456789]
    为简化这种类型的集合,可使用-来定义一个范围。下面的式子功能上等同于上述数字列表:[0-9]
REGEXP '[1-5] Ton'
  • 匹配特殊字符
    找. 或者 |
REGEXP \\|'  OR REGEXP \\.'
  • 匹配字符类

[: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:]中的任意字符

[:upper:]

包括空格在内的任意空白字符(同[\f\n\r\t\v])

[:upper:]

任意大写字母(同[A-Z])

[:xdigit:]

任意十六进制数字(同[a-fA-F0-9])

  • 匹配多个实例

目前为止使用的所有正则表达式都试图匹配单次出现。如果存在一个匹配,该行被检索出来,如果不存在,检索不出任何行。但有时需要对匹配的数目进行更强的控制。例如,你可能需要寻找所有的数,不管数中包含多少数字,或者你可能想寻找一个单词并且还能够适应一个尾随的s(如果存在),等等。
正则表达式重复元字符

*

0个或多个匹配

+

1个或多个匹配(等于{1,})

?

0个或1个匹配(等于{0,1})

{n}

指定数目的匹配

{n,}

不少于指定数目的匹配

{n,m}

匹配数目的范围(m不超过255)

REGEXP '\\([0-9] sticks?\\'

\(匹配),[0-9]匹配任意数字(这个例子中为1和5),sticks?匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现),\)匹配)。没有?,匹配stick和sticks会非常困难。

REGEXP '[[:digit:]]{4}'

[:digit:]匹配任意数字,因而它为数字的一个集合。{4}确切地要求它前面的字符(任意数字)出现4次,所以[[:digit:]]{4}匹配连在一起的任意4位数字。
也可以写成

REGEXP '[0-9][0-9][0-9][0-9]'

定位符

目前为止的所有例子都是匹配一个串中任意位置的文本。为了匹配特定位置的文本需要使用列出的定位符。

^

文本的开始

$

文本的结尾

[[:<:]]

词的开始

[[:>:]]

词的结尾

你想找出以一个数(包括以小数点开始的数)开始的所有产品,怎么办?简单搜索[0-9\.](或[[:digit:]\.])不行,因为它将在文本内任意位置查找匹配。解决办法是使用^定位符,

REGEXP '[^[0-9\\.]'