MY_TABLE
id name
1 Sam
4 Ben
7 Amy
8 Samantha
我想搜索名称包含Sa
的记录。
我的疑问是
select * from my_table where 'Sa' like '%name%'
但没有返回结果
什么是正确的查询?
试试吧
select * from my_table where name like '%sa%'
您正在查询在“Sa”列中搜索文本“名称”,这应该如下所示
从my_table中选择*,其中名称为'%Sa%'
我想我只是添加一个解释这个问题的答案,因为一些赞成的答案缺乏任何解释,甚至没有错。
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 qazxsw poi比较一个字符串(在左侧)和一个模式字符串(在右侧):
LIKE
两者都可以是列,表达式或字符串常量。通常,我们希望列中的内容与常量模式匹配。在你的情况下:
some_string LIKE some_pattern
但请注意,它取决于DBMS和校对是否where name like '%Sa%'
区分大小写。因此,在某些DBMS中,上面某些字符集可能也会匹配名称LIKE
,尽管有小写的'Elsa'
。请参阅您的DBMS文档。
'Sa'中的大写'S'表示您正在寻找以'Sa'开头的名字。在这种情况下,你可能想要寻找模式s
而不是'Sa%'
。但那不会找到'%Sa%'
,因为这个字符串不是以'Sa'开头的。请记住,你想要的两种模式中的哪一种。
您的列名称是引号,不应该有效。按照惯例,我们在'Uncle Sam'
子句之后的条件左侧使用列名。您宁愿将自己的查询复杂化并在聚光灯下进行处理。
where
在单引号内使用字符串值而不是列
select * from my_table
where name --column_names
like
'%Sa%' -- your expression
你的搜索值将在单引号内,%和select * from my_table where name like '%Sa%'
将在column
之后