首先先有这么一张表test,最后一行name带小数点address带下划线,按照规范,关键字用大写,这个表将在下方进行查询
mysql> SELECT * FROM test;
通配符 % _ LIKE
通配符有主要由两种 %(可表示0,1或多个字符)和_(只表示一个字符),其作用在于查询出带有某些子串的行,与LIKE一起使用
查出name中以c开头的行
SELECT * FROM test WHERE name LIKE ‘c%’;
表示输出name的首字母为c的所有行
同理
- %c% 查询含有c的行
- %c查询最后一个字母为c的行
- s%c查询字母中含有s和c的行(%也可表示0个字符,所以sc可以连在一起)
与之相应的,_只表示一个字符(如果超过一个,将不显示,但是,可以连续使用,也可以分开使用)
SELECT *FROM test WHERE name LIKE 'z__'
SELECT *FROM test WHERE name LIKE 'z_'
可看出z_输出空,而z__输出,当然_和%可以混合使用
通配符虽然好用,但是过多使用会降低速度,所以最好能不用就不用
正则表达式 REGEXP,^,\,以及各种特殊用法
也是用与查找,在条件较少时和通配符起到的效果一样,使用他的原因在于如果我们添加的条件比较多,或者条件比较抽象的情况下,按照我们之前的知识,只能大量使用AND,OR,%等等,很不方便,所以引入正则表达式、
我们用REGEXP代替LIKE
LIKE与REGEXP的区别在于LIKE匹配的是整个列,如上面的LIKE 'z_'查出的列名必须是z开头且后面是一个字符的行
而REGEXP只关心列名是否含有这个子串
比如我们要查找前面为数字1或2或3的cs
SELECT * FROM test WHERE name REGEXP ‘[123]cs’;
[123]cs也可表示为(1|2|3)cs
也可以用^表示否定
SELECT * FROM test WHERE name REGEXP '[^123]cs';//输出前面字符不为1,2,3,后面为cs的name
如果数字比较多我们还可以用-的形式省略
SELECT * FROM test WHERE name REGEXP '[1-3]cs';
如果我们想查找特殊字符,我们必须加上\ \,比如查找./’;等等
SELECT * FROM test WHERE name REGEXP '\\.';查找点
你以为正则表达式就这点作用吗?先看这个表
我们选取其中的[:digit:]来举例
SELECT * FROM test WHERE name REGEXP '[[:digit:]]{1}';表示查找出name中只带有一个数字的行
表中用法太多,就不一一举例了,先知道有这种用法,用到的时候再查最好
最后,REGEXP只针对含有子串来查询,那如果我们非要定一个位置呢?
比如我们要输出列名开头为数字或者.的行
SELECT * FROM test WHERE name REGEXP '^[1-3\\.]';
^表示定位符,定在了开头,如果放在末尾,则定在末尾
输出了列名开头为数字1,2,3或者.的所有行