当前位置: 首页 > 面试题库 >

不带百分号且WHERE子句中等于(=)的SQL LIKE之间的差异

端木令雪
2023-03-14
问题内容

除了性能,这两个查询的结果是否有其他差异?

SELECT * FROM pet WHERE name LIKE 'Spot';
SELECT * FROM pet WHERE name = 'Spot';

我问的原因是真实的脚本将类似于以下内容,并且API用户有责任提出该模式。通常不会提供LIKE模式,但是总有可能仅提供一个字符串,结果为SELECT * FROM pet WHERE name LIKE "Spot"

$stmt = $this->pdo->prepare('SELECT * FROM pet WHERE name LIKE ?');
$stmt->execute([$_GET['name']]); //Spot
return [$stmt->fetchAll(),200];

问题答案:

实践中
LIKE没有通配符功能上等同于=。但是,它们不一样!最明显的区别是,=不能治疗\%以及_以任何特殊的方式,但LIKE确实。

该文档对此非常清楚:

根据SQL标准,LIKE在每个字符的基础上执行匹配,因此它可以产生与=比较运算符不同的结果:

除了排序规则差异外,尾随空格也很重要:

特别是,尾随空格很重要,这不适用于 =运算符CHARVARCHAR使用=运算符进行比较:

在实践中,被比较的字符串通常具有相同的排序规则,没有尾部空格,并且特殊字符被忽略,因此LIKE有时被用作替代=(特别是因为LIKE在模式开头没有通配符的情况下,也可以使用索引)。



 类似资料:
  • 问题内容: 说我有一个表作为 是外键回到桌子 是回到表的外键 只是或 是一个整数 和一张桌子作为 我需要从获取的所有行,对于同样的在同一个具有相对值。请记住,只能有两个值之一-或。在上面的示例中,这将是行和。 另一个限制是的相应行必须用于。 到目前为止我的查询 问题: 将join子句保留为as会减慢查询速度。如果将其移至WHERE子句,则性能会更好。这激起了我的兴趣, 我想知道为什么 。 主键和相

  • 问题内容: 我可以在C#中做到这一点: 例如在Java中 我如何查询这样的ArrayList?谢谢。 问题答案: Java 8引入了Stream API ,该API允许与Linq中的构造类似的构造。 例如,您的查询可以表示为: 如果存在默认值,您显然需要锻炼,在这种情况下,这似乎很奇怪,但是我已经展示了它,因为这就是您问题中的代码所做的。

  • 问题内容: 是否可以在WHERE子句中使用LIMIT x? 如果是这样,怎么办? 我正在尝试这样做: 但我收到以下错误: 问题答案: 应该在之后。 句法 :

  • 问题内容: 我将如何在没有硬编码值的情况下编写此sql语句? 宁愿有这样的事情: 提前致谢.. 问题答案: 用您当前的方式构造SQL查询是一个糟糕的主意,因为它为各种SQL注入攻击打开了大门 。为了正确执行此操作,您必须改为使用“ 预备语句”。这也将解决您目前显然遇到的各种逃避问题。 请注意,这是一个昂贵的调用(除非您的应用程序服务器使用语句缓存和其他类似的功能)。从理论上讲,最好先准备一次语句,

  • 例如,我想做这样的事情: 新建Select().from(Table).where(“id in?”,list).execute()

  • 问题内容: 我有一个包含多个搜索条件的搜索页面 员工姓名 员工ID 入职日期 部门 等等 用户可以提供一个或多个搜索条件。我需要查询数据库以获取搜索结果。 使用纯JDBC,有两种方法可以实现此目的。 通过附加用户提供的搜索条件来准备SQL查询。 例如: 使用 例如: 此答案说明,像上面的ex 1一样,可以修改ex2,如下所示 然后仔细地(牢记参数索引)将输入设置为准备好的语句。听起来这不是一个非常