如何选择包含关键字的行?

时间:2019-02-25 07:32:40

标签: sql

my_table

id  name
1   Sam
4   Ben
7   Amy
8   Samantha

我要搜索名称包含Sa的记录。

我的查询是

select * from my_table where 'Sa' like '%name%'

但没有返回结果

什么是正确的查询?

5 个答案:

答案 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