小谈LIKE中的ESCAPE

来源:互联网 发布:ubuntu创建一个文件夹 编辑:程序博客网 时间:2024/06/14 10:21

今天考了四级数据库工程师,加上最近复习SQL,所以赶紧记录下来一些考点也是必备的SQL只是。

以MYSQL为例,MYSQL里的SQL语句与四级数据库里要求的SQL SERVER 2000的SQL语句虽同属T-SQL,但略有不同。

表:dage

CREATE TABLE IF NOT EXISTS `dage` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

测试数据:

INSERT INTO `dage` (`id`, `name`) VALUES(2, '铜锣湾'),(3, '铜锣_湾1'),(4, '铜锣_湾2'),(5, '铜锣_湾%2'),(6, '铜锣_湾%_%2');

 

现在要查找前两位是“铜锣”的字符串,这样的SQL语句太简单了,只要加个LIKE就行了,但往往实际应用的时候肯定不会这么简单。

mysql> SELECT *    -> FROM `dage`    -> WHERE name LIKE '铜锣%'    -> LIMIT 0 , 30    -> ;+----+-------------+| id | name        |+----+-------------+|  2 | 铜锣湾      ||  3 | 铜锣_湾1    ||  4 | 铜锣_湾2    ||  5 | 铜锣_湾%2   ||  6 | 铜锣_湾%_%2 |+----+-------------+5 rows in set (0.06 sec)

那如果我要前三位是“铜锣_”,按上面的方法看看能不能用。

mysql> SELECT *    -> FROM `dage`    -> WHERE name LIKE '铜锣_'    -> LIMIT 0,30;+----+--------+| id | name   |+----+--------+|  2 | 铜锣湾 |+----+--------+1 row in set (0.00 sec)

从上面的结果看,_和%是SQL里的通配符,所以,被系统默认得拿去通配了。上面的SQL意思是:取前两个字符为“铜锣”,第三个任意,共取三个字符。

要如何才能取到前三个字符是:“铜锣_”的数据呢。用ESCAPE 转译!网上说ESCAPE 是将要转译的东西转译成字符,我看了半天没明白,自己动手试,才懂,通俗的讲:ESCAPE 可以转译任何字符(MYSQL里\不让转译,不知为何?),但它只作用于最靠近它的右边的那个字符,而且只能作用一个字符!
看看例子:

mysql> SELECT *    -> FROM `dage`    -> WHERE name LIKE '铜锣%/%2'    -> ESCAPE '/'    -> LIMIT 0 , 30;+----+-------------+| id | name        |+----+-------------+|  5 | 铜锣_湾%2   ||  6 | 铜锣_湾%_%2 |+----+-------------+2 rows in set (0.00 sec)

很复杂吧啊,中间竟然有三个通配符。/%2 转译了百分号%,让它不成为通配符,而只是个普通的字符串,所以上面的SQL意思是:只匹配前面两个字为:“铜锣”,最后两个字为:“%2”的所有数据。
这样也看不出来它只能转译一个最靠近它的右边的通配符啊。看下面:

mysql> SELECT *    -> FROM `dage`    -> WHERE name LIKE '铜锣%/_%2'    -> ESCAPE '/'    -> LIMIT 0 , 30    -> ;+----+-------------+| id | name        |+----+-------------+|  4 | 铜锣_湾2    ||  5 | 铜锣_湾%2   ||  6 | 铜锣_湾%_%2 |+----+-------------+3 rows in set (0.00 sec) 
看到什么了?上面的SQL意思是:前两位为:“铜锣”,最后一位是2,倒数第三位是_,倒数第二位是任意。其实也不能算是倒数第二位,它可以匹配任意多位。
原创粉丝点击