MYSQL 笔记6-10
过滤数据
使用WHERE子句
根据特定操作或报告的需要提取表数据的子集,只检索所需数据指定搜索条件(search croteria),搜索条件也称为过滤条件(filter condition);
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤,WHERE子句在表名(FROM子句)之后给出:
这条语句从products表中检索两个列,但不返回所有列,只返回prod_price值为2.50的数据;
WHERE子句操作符
操作符 | 等于 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
检查单个值
检查WHERE prod_name='fuses’语句,它返回prod_name的值为Fuses的一行,MYSQL执行匹配时默认不区分大小写,所以fuses和Fuses匹配;
不匹配检查
其中<>和!=是一样的功能,它们列出不是由供应商1003制造的所有产品;
范围值检查
检查某个范围值,可以使用BETWEEN操作符,其语法与其他WHERE子句操作符不同;
在使用BETWEEN时,必须指定两个值----所需范围的低端值和高端值,着两个值必须用AND关键字分隔,BETWEEN匹配范围中所有的值,包括指定的开始值和结束值;
空值检查
在一个列不包含值时,称其为包含空值NULL;//NULL 无值,它与包含0,空字符串仅仅包含空格不同;
SELECT语句由一个特殊的WHERE子句,可用来检查具有NULL值的,这个WHERE子句就是IS NULL子句
数据过滤
组合WHERE子句
MySQL允许给出多个WHERE子句,这些子句可以两种方式:以AND子句的方式或OR子句的方式使用
AND操作符
这个SQL语句检测由1003制作价格小于等10的此商品的名称和价格;这条SELECT语句中的WHERE子句包含两个条件,并且用AND关键字连接;满足条件才会输出,并且可以再增加其他的条件,要用AND进行连接
OR操作符
OR操作符与AND不同,它指示Mysql检索匹配任一条件的行;
这条SQL语句检索由任一指定语句制造的所有产品的产品名称和价格,OR操作符匹配任一条件而不是同时匹配两个条件,只要满足一个就可以输出
计算次序
WHERE包含任意数目的AND和OR的操作符,允许两者结合以进行复杂和高级的筛选;在上面的图片中,可以看到出现了两条价格小于10的数据,为什么?因为AND在计算次序中优先级更高,操作符被错误的组合了;
解决办法:
这个SELECT语句与上面的差别是:前两个条件用圆括号括起来了,原括号具有较AND和OR操作符高的计算次序;它改变了其优先级计算次序
IN操作符
圆括号在WHERE还有另一种用法,IN操作符用来指定条件范围,范围中每个条件都可以进行匹配,IN取合法值由逗号分隔的清单,全部在圆括号中;
此SELECT 语句检索1002和1003的所有语句,IN操作符后跟由逗号分隔的合法值的清单,整个清单必须括在圆括号中;它和之前用OR操作符的条件一样;
为什么使用IN操作符:
- 在使用长的合法选项清单时,IN操作符更加直观
- 在使用IN时,计算的次序更容易管理
- IN操作符一般比OR操作符清单指向的更快
- IN的最大优点是可以包含其他的SELECT语句,使其更快的动态建立WHERE子句
NOT操作符
WHERE子句中的NOT操作符只有一个功能,就是否定它之后所有的条件;
匹配1002和1003之外的所有vend_id的数据;
用通配符进行过滤
LIKE 操作符
上面所说的都是知道其价格或者名字等内容进行的检索,那么只知道大概的数据如何进行检查?
通配符(wildcard) 用来匹配值的一部分的特殊字符
搜索模式(search pattern)由字面值,通配符或两者组合构成的搜索条件
通配符本身是由SQL的WHERE子句中的特殊字符,SQL支持通配符,想使用通配符,必须使用LIKE操作符,LIKE指示MSQL后跟搜索模式利用通配符进行比较;
百分号(%)通配符
使用搜索模式 ‘jet%’,在执行这条子句的时候,将检索任意以jet开头的字符,%告诉MYsql接受jet任意字符,不管有多少字符;
通配符可在搜索模式中任意位置取使用,也可以使用多个通配符;
注意%通配符,不能匹配NULL
下划线_通配符
_下划线通配符只能匹配单个字符而不是多个字符
使用通配符的技巧
通配符搜索的处理一般要比之前其他的搜索花时间更长;
- 不要过度使用通配符,如果其他操作符能达到相同的目的,应该使用其他操作符
- 在确实需要使用通配符时,除法绝对有必要,否则不要把它们用在搜索模式开始处,把通配符置于搜索模式开始处,搜索起来最慢;
- 仔细注意通配符的位置,放错地方,可能不会返回想要的数据;
用正则表达式进行搜索
正则表达式搜索数据
使用MYSQL正则表达式
正则表达式的作用是匹配文本,将一个模式与一个文本串进行比较,mysql的WHERE子句对正则表达式提供支持;允许使用正则表达式,过滤SELECT检索出的数据
基本字符匹配
关键字LIKE被REGEXP替代,该语句告诉MYSQL:REGEXP后跟的东西作为正则表达式处理;
使用了正则表达式,.000,. 表示匹配任意一个字符;
进行OR 匹配
为搜索两个串之一,使用 |
使用正则表达式 1000 | 2000 ,| 为正则表达式的OR操作符,它表示其中只有,因此1000 和 2000 都匹配成功;
匹配几个字符之一
只想匹配特定的字符呢?可以通过特定的[]括起来的字符完成;
使用了正则表达式[123] TON,[123]定义一组字符,意思是匹配1或2或3,因此1 ton和2 ton都匹配返回了;
这是意料之外的数据,这个语句的意思是:mysql假定你的意思是‘1’或‘2’ ‘3’TON‘ 除非把字符 | 括在一个集合中,否则它将应用于整个串;
字符集合也可以被否定,它将匹配除了知道字符外的任何东西,在集合开始加一个 ^这个字符就可以;
匹配范围
集合可用来定义要匹配的一个或多个字符
简化格式使用 - 来定义一个范围,举例 [a-z] [6-9] 都可以匹配
匹配特殊字符
想匹配特殊字符时应该怎么办?
为了匹配特殊字符,必须要有\ w为前导,进行查找
这种就是所谓的转义
\也用来引用元字符(具有特殊含有的字符)
元字符 | 说明 |
---|---|
\\f | 换页 |
\\n | 换行 |
\\r | 回车 |
\\t | 制表 |
\\v | 纵向制表 |
匹配字符类
匹配多个实例
正则表达式重复元字符
元字符 | 说明 |
---|---|
* | 0个或多个匹配 |
+ | 1个或多个匹配 |
? | 0个或1个匹配 |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围 |
举例:
[0-9]匹配任意数组,sticks?匹配stick 和 sticks;
上面的图标[:digit:]匹配任意数字,后面的{4}确切的要求前面的字符出现4此;所有[[:digit:]]{4} 匹配连在一起的任意4位数字;
定位符
之前的字符都是匹配应该一个串中的任意位置的文本,为了匹配特定位置的文本,需要这些定位符:
元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
创建计算字段
计算字段
计算字段并不实际存在数据库表中,计算字段是运行时在SELECT语句内创建的
字段(field)基本上与列的意思相同,经常互换使用,不管数据库列一般叫列;
拼接字段
拼接将值联结构到一起构成当个值
将两个列拼接在一起,可使用Concat()函数来拼接两个列
Concat()拼接串,将多个串连接起来形成一个长串;
Concat()需要一个或多个指定的串,串之间用用逗号分隔;
通过删除数据右侧多余的空格来整理数据,使用RTrim()函数来完成;
通过RTrim删除了多余的空格;
使用别名
支持别名,之前拼接的地址字段名字是什么?匿名的,我们可以给他起个别名
别名是一个字段或值的替换名,别名用AS关键字赋予;
这里AS指示SQL创建一个包含指定计算的名位vend_title的计算字段;现在它名字位vend_title,任何客户机应用都可以按别名引用这个列;
执行算术计算
对检索出的数据进行算术计算;
检索出包含订单中的每项物品的单价;
汇总物品的价格:这些SQL语句作用是:quantity*item_price 最后得到数据起别名位expanded_price;其他客户机也可以使用expanded_price;
下面表格中可以使用的基本算术操作符:
操作符 | 说明 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |