检索数据
- 检索的行有很多相同的数据,想要显示同值
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'
只会出现一位的匹配
- 使用通配符的技巧
- 不要过度使用通配符。如果其他操作符能达到相同的目的,应该
使用其他操作符。 - 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用
在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起
来是最慢的。 - 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
用正则表达式进行搜索
正则表达式是用来匹配文本的特殊的串(字符集合)
- 基本字符匹配
下面的语句检索列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\\.]'