我现在正在学习MySQL。我需要你帮助理解这些查询之间的区别:
select id from tab where id like '000';
select id from tab where id regex '000';
答案 0 :(得分:12)
您的第一个查询使用like
运算符,但不使用任何通配符。所以它相当于:
select id from tab where id = '000';
仅列出id
id
为000
的{{1}}。
第二个查询使用regex
运算符,它会列出id
中000
的行
示例:它会列出这些id
:1000
,2000
,000
,0001
要使您的第一个查询行为与第二个查询相同,您必须使用匹配零个或多个字符的通配符%
:
select id from tab where id like '%000%';
要让您的第二个查询表现得像拳头,您将不得不使用起始锚点(^
)和结束锚点($
):
select id from tab where id regex '^000$';
答案 1 :(得分:3)
以防万一你的第一个陈述是:
select id from tab where id like '%000%';
这意味着:任何东西(或什么都没有),然后是'000',后跟任何东西(或什么都没有)。
这恰好是id regex '000'
所做的。
基本上,LIKE
执行非常简单的通配符匹配,REGEX
能够进行非常复杂的通配符匹配。
事实上,正则表达式(REGEX
)是如此强大,以至于它们本身就是一个完整的研究[2],这是一种引入非常微妙的错误的简单方法。玩得开心。
答案 2 :(得分:1)
like 运算符允许使用%运算符指定通配符。
例如,如果您需要指定以字符 a 开头的所有字词,则可以使用值“a%”来执行此操作。您还可以使用字符串指定单词结尾。例如。可以使用“%ing”指定以 ing 结尾的字词
您还可以使用参数指定包含包含特定字符串的值的列。例如。可以使用like参数“%fish%”
指定包含字符 fish 的字词 另一方面,Regexp (我认为没有正则表达式运算符)允许您在比较列中的值和参数时指定正则表达式。例如,如果您需要检索与格式为555-666-7777的电话号码匹配的所有记录,则可以使用参数“[[:digit:]] {3} \ - [[:digit:] ] {3} \ - [[:位:]] {4}“强>
E.g。 SELECT * FROM电话簿WHERE电话REGEXP“[[:数字:]] {3} \ - [[:数字:]] {3} \ - [[:数字:]] {4}”
有关 REGEXP 运算符的详情,请参阅http://dev.mysql.com/doc/refman/5.1/en/regexp.html。