正则表达式
正则表达式通常用来检索或替换符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。例如,从一个文本文件中提取电话号码,查找一篇文章中重复的单词或者替换用户输入的某些词语等,正则表达式强大而且灵活,可以应用于非常复杂的查询当中
在MySQL中使用regexp关键字指定正则表达式的字符匹配模式,其基本语法如下
where 字段名 regepx '操作符';
选项 | 说明 | 示例 |
^ | 匹配文本的开始字符 | ^b: 匹配以字母b开头的字符串,例如:book、big、banana |
$ | 匹配文本的结束字符 | st$:匹配以字符st结尾的字符串,例如:test、resist、persist |
. | 匹配任何单个字符 | b.t:匹配任何b和t之间有一个字符的字符串,例如:bit、bat、but、 |
* | 匹配零个或多个在它前面的字符 | *n:匹配字符串n前面有任意多个字符的字符串,例如:fn、ann、faan、abcdn |
+ | 匹配前面的字符1次或多次 | ba+:匹配以b开头后面紧跟至少一个a的字符串,例如:ba、bay、bare、battle |
<字符串> | 匹配包含指定字符串的文本 | fa:字符串至少包含fa,例如:fan、afa、faad |
[字符集合] | 匹配字符集合中的任何一个字符 | [xz]:匹配x或z,例如:dizzy、zebra、x-ray、extra |
[^] | 匹配不在括号中的任何字符 | [^abc]:匹配不包含a、b、c的字符串 |
字符串{n,} | 匹配单面的字符串至少n次 | b{2,}:匹配两个或更多的b,例如bb、bbbbb、bbbbbb |
字符串{m,n} | 匹配前面的字符串至少m次,至多n次。如果n为0,则m为可选参数 | b{2,4}:匹配至少2个b,最多4个b,如bb、bbb、bbbb |
举例
查询家庭住址以“济”开头的学生信息
select *
from stundet
where saddress regexp '济';
查询家庭住址以“号”结尾的学生信息
select *
from stundet
where saddress regepx '号$';
查询学生电话号码出现“66”数字的学生信息
select *
from student
where sphone regexp '66';
列表运算
在where子句中,如果需要确定表达式的取值是否属于某一列表值之一时,可以使用关键字in或not in来限定查询条件。
语法格式如下
where 表达式 [not] in 值列表
其中,not为可选项,当值不止一个时,需要将这些值用括号括起来,各列表之间使用逗号(,)隔开
举例
查询信息工程系、软件工程系和计算机工程系学生的姓名和性别
select sname,ssex
from stundet
where sdpet in('计算机工程系','软件工程系','信息工程系');
其中,条件表达式的另一种表示方法是sdpet='计算机工程系'or sdpet='软件工程系' or sdpet='信息工程系';
涉及null查询
当数据表中值为null时,可以使用is null关键字的where子句查询,反之要查询数据表的值不为null时,可以使用is not null关键字
语法格式如下
where 字段 is [not] null;
举例
因为某些学生选修课程后没有参加考试,所以有选修记录,但没有考试,查询缺少成绩的学生的学号和相应的课程号
select sno,con
from sc
where degrree is null;
这里的 is 不能用 = 代替
查询所有有成绩的学生学号和课程号
select sno,con
from sc
where dergree is not null;