my_table
id name
1 Sam
4 Ben
7 Amy
8 Samantha
我要搜索名称包含Sa
的记录。
我的查询是
select * from my_table where 'Sa' like '%name%'
但没有返回结果
什么是正确的查询?
答案 0 :(得分:2)
尝试
select * from my_table where name like '%sa%'
答案 1 :(得分:2)
您正在查询的是在“ Sa”列中搜索文本“ name”,则应按以下方式反转
从my_table中选择*,其中的名称类似于'%Sa%'
答案 2 :(得分:1)
我以为我会添加一个解释该问题的答案,因为一些赞成的答案没有任何解释,甚至弄错了。
SQL中的单引号表示字符串文字(字符串常量)。所以
where 'Sa' like '%name%'
询问字符串“ Sa”是否包含字符串“ name”,情况并非如此,因此查询不返回任何行。
不幸的是,某些DBMS对分隔符不严格,并允许以下内容而不会引起错误:
select 1 as 'myalias'
在MySQL中(即使在当前版本8中),您可以执行以下操作:
select 1 as 'myalias'
union all
select 3 as 'myalias'
union all
select 2 as 'myalias'
order by 'myalias';
并获得无序结果。为什么是这样?因为虽然没有抱怨as 'myalias'
,MySQL却正确地将order by 'myalias'
解释为字符串常量“ myalias”的排序,这对所有行都是相同的,因此不会进行排序。
结论:在定界符时要格外小心。单引号用于字符串文字。对于名称,我们通常不需要定界符,因此as myalias
是有效的。但是,如果别名或名称包含特殊字符(如空格)或等于保留的SQL字,则需要定界符。这是标准SQL(例如as "my alias"
)中的双引号,但是某些DBMS使用反引号或方括号来代替。我建议您完全避免使用此类名称。您可以使用下划线获取可读的名称,而无需使用分隔符,例如as my_alias
。
SQL的LIKE
将一个字符串(在左侧)与一个模式字符串(在右侧)进行比较:
some_string LIKE some_pattern
两者都可以是列,表达式或字符串常量。大多数情况下,我们希望一列中的内容匹配恒定模式。就您而言:
where name like '%Sa%'
但是请注意,LIKE
是否区分大小写取决于DBMS和排序规则。因此,在某些具有某些字符集的DBMS中,尽管小写的'Elsa'
也可能与名称s
匹配。有关此信息,请参阅DBMS的文档。
“ Sa”中的大写字母“ S”表示您正在寻找以“ Sa”开头的名称。在这种情况下,您可能要查找模式'Sa%'
而不是'%Sa%'
。但这找不到'Uncle Sam'
,因为此字符串不是以'Sa'开头。下定决心,要选择两种模式中的哪一种。
答案 3 :(得分:0)
在单引号而不是列中使用字符串值
select * from my_table where name like '%Sa%'
您的搜索值将包含在带有%的单引号内,而column
将位于where
之后
答案 4 :(得分:0)
您的列名用引号引起来,按照惯例,
我们在where
子句之后的条件左侧使用列名。您宁愿使自己的查询变得复杂并且要引起关注。
select * from my_table
where name --column_names
like
'%Sa%' -- your expression